Very basic Meshtastic tunneling interface

This commit is contained in:
Chad Attermann 2024-03-04 14:00:24 -07:00
parent ace0d997d4
commit ebd77a6c7d
2 changed files with 94 additions and 0 deletions

View File

@ -0,0 +1,67 @@
from .Interface import Interface
import meshtastic
import meshtastic.serial_interface
from pubsub import pub
import time
import sys
import RNS
class MeshtasticInterface(Interface):
@staticmethod
def onReceive(packet, interface):
#print(f"Received: {packet}")
if packet['decoded']['portnum'] == "PRIVATE_APP":
interface.callback.processIncoming(packet['decoded']['payload'])
def __init__(self, owner, name, port=None, channel=0):
super().__init__()
self.rxb = 0
self.txb = 0
self.HW_MTU = 256
self.IN = True
self.OUT = False
self.owner = owner
self.name = name
self.port = port
self.channel = channel
self.online = False
# static default long-fast bitrate
self.bitrate = 5469
self.bitrate_kbps = 5.47
RNS.log("Initializing Meshtastic interface...", RNS.LOG_DEBUG)
self.interface = meshtastic.serial_interface.SerialInterface(devPath=port)
self.interface.callback = self
RNS.log("Subscribing to Meshtastic events", RNS.LOG_DEBUG)
pub.subscribe(self.onReceive, "meshtastic.receive.data")
RNS.log("Initialized Meshtastic interface!", RNS.LOG_DEBUG)
def processIncoming(self, data):
RNS.log("Received Meshtastic packet "+RNS.prettyhexrep(data), RNS.LOG_DEBUG)
self.rxb += len(data)
self.owner.inbound(data, self)
def processOutgoing(self, data):
RNS.log("Sending Meshtastic packet "+RNS.prettyhexrep(data), RNS.LOG_DEBUG)
try:
#self.interface.sendData(data)
self.interface.sendData(data, portNum=256, channelIndex=self.channel)
self.txb += len(data)
except Exception as e:
RNS.log("Could not transmit on "+str(self)+". The contained exception was: "+str(e), RNS.LOG_ERROR)
def __str__(self):
if self.port == None:
return "MeshtasticInterface["+self.name+"]"
return "MeshtasticInterface["+self.name+"/"+self.port+"]"

View File

@ -933,6 +933,33 @@ class Reticulum:
else: else:
interface.ifac_size = 8 interface.ifac_size = 8
if c["type"] == "MeshtasticInterface":
port = c["port"] if "port" in c else None
channel = int(c["channel"]) if "channel" in c else 0
interface = MeshtasticInterface.MeshtasticInterface(
RNS.Transport,
name,
port,
channel
)
if "outgoing" in c and c.as_bool("outgoing") == False:
interface.OUT = False
else:
interface.OUT = True
interface.mode = interface_mode
interface.announce_cap = announce_cap
if configured_bitrate:
interface.bitrate = configured_bitrate
if ifac_size != None:
interface.ifac_size = ifac_size
else:
interface.ifac_size = 8
if interface != None: if interface != None:
interface.announce_rate_target = announce_rate_target interface.announce_rate_target = announce_rate_target
interface.announce_rate_grace = announce_rate_grace interface.announce_rate_grace = announce_rate_grace