diff --git a/.vscode/launch.json b/.vscode/launch.json index f6e6e22..42ed1af 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -28,6 +28,14 @@ "justMyCode": true, "args": ["--tunnel", "--debug"] }, + { + "name": "meshtastic set chan", + "type": "python", + "request": "launch", + "module": "meshtastic", + "justMyCode": true, + "args": ["--setchan", "psk", "0x1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b", "--debug"] + }, { "name": "meshtastic debug", "type": "python", diff --git a/README.md b/README.md index 100d5a6..be927f2 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ To display a (partial) list of the available commands: meshtastic -h ``` +### Changing device settings + You can also use this tool to set any of the device parameters which are stored in persistent storage. For instance, here's how to set the device to keep the bluetooth link alive for eight hours (any usage of the bluetooth protcol from your phone will reset this timer) @@ -69,6 +71,24 @@ meshtastic --set wifi_ap_mode true --setstr wifi_ssid mywifissid --setstr wifi_p For a full list of preferences which can be set (and their documentation) see [here](https://github.com/meshtastic/Meshtastic-protobufs/blob/master/docs/docs.md#.RadioConfig.UserPreferences). +### Changing channel settings + +The channel settings can be changed similiarly. Either by using a standard (sharable) meshtastic URL or you can set partiular channel parameters (for advanced users). + +The URL is constructed automatically based off of the current channel settings. So if you want to customize a channel you could do something like: + +``` +meshtastic --setchan name mychan --setchan channel_num 4 --info +``` + +This will change some channel params and then show device info (which will include the current channel URL) + +You can even set the channel preshared key to a particular AES128 or AES256 sequence. + +``` +meshtastic --setchan psk 0x1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b1a1a1a1a2b2b2b2b --info +``` + ## FAQ/common problems This is a collection of common questions and answers from our friendly forum. diff --git a/docs/meshtastic/tunnel.html b/docs/meshtastic/tunnel.html index 4ffc94f..1952857 100644 --- a/docs/meshtastic/tunnel.html +++ b/docs/meshtastic/tunnel.html @@ -115,12 +115,12 @@ class Tunnel: ip = self._nodeNumToIp(node["num"]) logging.info(f"Node { nodeId } has IP address { ip }") - logging.debug("creating TUN device") + logging.debug("creating TUN device with MTU=200") # FIXME - figure out real max MTU, it should be 240 - the overhead bytes for SubPacket and Data from pytap2 import TapDevice - self.tun = TapDevice(name="mesh", mtu=200) + self.tun = TapDevice(name="mesh") self.tun.up() - self.tun.ifconfig(address=myAddr,netmask=netmask) + self.tun.ifconfig(address=myAddr,netmask=netmask,mtu=200) logging.debug(f"starting TUN reader, our IP address is {myAddr}") self._rxThread = threading.Thread(target=self.__tunReader, args=(), daemon=True) self._rxThread.start() @@ -346,12 +346,12 @@ subnet is used to construct our network number (normally 10.115.x.x)

ip = self._nodeNumToIp(node["num"]) logging.info(f"Node { nodeId } has IP address { ip }") - logging.debug("creating TUN device") + logging.debug("creating TUN device with MTU=200") # FIXME - figure out real max MTU, it should be 240 - the overhead bytes for SubPacket and Data from pytap2 import TapDevice - self.tun = TapDevice(name="mesh", mtu=200) + self.tun = TapDevice(name="mesh") self.tun.up() - self.tun.ifconfig(address=myAddr,netmask=netmask) + self.tun.ifconfig(address=myAddr,netmask=netmask,mtu=200) logging.debug(f"starting TUN reader, our IP address is {myAddr}") self._rxThread = threading.Thread(target=self.__tunReader, args=(), daemon=True) self._rxThread.start() diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 0b6bca9..50a0d69 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -52,25 +52,28 @@ def onConnection(interface, topic=pub.AUTO_TOPIC): def fromStr(valstr): """try to parse as int, float or bool (and fallback to a string as last resort) - Returns: an int, bool, float or str + Returns: an int, bool, float, str or byte array (for strings of hex digits) Args: valstr (string): A user provided string """ - try: - val = int(valstr) - except ValueError: + if(valstr.startswith('0x')): + val = bytes.fromhex(valstr[2:]) # if needed convert to string with asBytes.decode('utf-8') + else: try: - val = float(valstr) + val = int(valstr) except ValueError: - trueTerms = {"t", "true", "yes"} - falseTerms = {"f", "false", "no"} - if valstr in trueTerms: - val = True - elif valstr in falseTerms: - val = False - else: - val = valstr # Try to treat the parameter as a string + try: + val = float(valstr) + except ValueError: + trueTerms = {"t", "true", "yes"} + falseTerms = {"f", "false", "no"} + if valstr in trueTerms: + val = True + elif valstr in falseTerms: + val = False + else: + val = valstr # Try to treat the parameter as a string return val @@ -207,19 +210,18 @@ def onConnected(interface): or args.seturl or args.router != None: closeNow = True - def setPref(attributes, name, val): + def setPref(attributes, name, valStr): """Set a preferences value""" - print(f"Setting {name} to {val}") + val = fromStr(valStr) try: try: setattr(attributes, name, val) except TypeError as ex: - # The setter didn't like our arg type - try again as a byte array (so we can convert strings to bytearray) - if isinstance(val, str): - setattr(attributes, name, - codecs.decode(val, "hex")) - else: - print(f"Incorrect type for {name} {ex}") + # The setter didn't like our arg type guess try again as a string + setattr(attributes, name, valStr) + + # succeeded! + print(f"Set {name} to {valStr}") except Exception as ex: print(f"Can't set {name} due to {ex}") @@ -236,7 +238,7 @@ def onConnected(interface): # Handle the int/float/bool arguments for pref in (args.set or []): setPref( - prefs, pref[0], fromStr(pref[1])) + prefs, pref[0], pref[1]) # Handle the string arguments for pref in (args.setstr or []): @@ -252,7 +254,7 @@ def onConnected(interface): # Handle the channel settings for pref in (args.setchan or []): setPref(interface.radioConfig.channel_settings, - pref[0], fromStr(pref[1])) + pref[0], pref[1]) # Handle set URL if args.seturl: diff --git a/setup.py b/setup.py index bd0ed0f..e452a3c 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ with open("README.md", "r") as fh: # This call to setup() does all the work setup( name="meshtastic", - version="1.1.32", + version="1.1.33", description="Python API & client shell for talking to Meshtastic devices", long_description=long_description, long_description_content_type="text/markdown",