From 39872ee86b2527fdaa86c0b3b8f6259b45f3dd01 Mon Sep 17 00:00:00 2001 From: geeksville Date: Tue, 12 May 2020 17:20:12 -0700 Subject: [PATCH] put BLE experiment on back burner --- README.md | 6 -- TODO.md | 7 +- meshtastic/__init__.py | 47 +++++++++----- meshtastic/__main__.py | 3 - meshtastic/ble.py | 12 ---- meshtastic/mesh_pb2.py | 144 +++++++++++++++++++++++++++++++---------- proto | 2 +- setup.py | 2 +- 8 files changed, 149 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 745d0eb..f195f6f 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,6 @@ For the rough notes/implementation plan see [TODO](https://github.com/meshtastic This pip package will also install a "meshtastic" commandline executable, which displays packets sent over the network as JSON and lets you see serial debugging information from the meshtastic devices. The source code for this tool is also a good [example](https://github.com/meshtastic/Meshtastic-python/blob/master/meshtastic/__main__.py) of a 'complete' application that uses the meshtastic python API. -## Bluetooth support - -(Alpha level feature) -This library supports connecting to Meshtastic devices over either USB (serial) or Bluetooth. Before connecting to the device you must [pair](https://docs.ubuntu.com/core/en/stacks/bluetooth/bluez/docs/reference/pairing/outbound.html) your PC with it. -We use the Bleak library, but a very particular version (due to a bleak [bug](https://github.com/hbldh/bleak/issues/139)): python3 -m pip install git+https://github.com/pliniofpa/bleak.git@cbad754205b8dbbe1def448b18d04c65cf5a75e7 - ## Required device software version This API and tool both require that the device is running Meshtastic 0.6.0 or later. diff --git a/TODO.md b/TODO.md index 411b8e5..58c9579 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,14 @@ # TODO +## Bluetooth support + +(Alpha level feature) +This library supports connecting to Meshtastic devices over either USB (serial) or Bluetooth. Before connecting to the device you must [pair](https://docs.ubuntu.com/core/en/stacks/bluetooth/bluez/docs/reference/pairing/outbound.html) your PC with it. +We use the pip3 install "pygatt[GATTTOOL]" + ## Before beta - ./bin/run.sh --debug --ble --device 24:62:AB:DD:DF:3A -- merge my local fixes to bleak: /home/kevinh/.local/lib/python3.8/site-packages/bleak/backends/bluezdbus/ - update nodedb as nodes change - radioConfig - getter/setter syntax: https://www.python-course.eu/python3_properties.php - let user change radio params via commandline options diff --git a/meshtastic/__init__.py b/meshtastic/__init__.py index 83baf99..4b466f0 100644 --- a/meshtastic/__init__.py +++ b/meshtastic/__init__.py @@ -47,8 +47,7 @@ interface = meshtastic.StreamInterface() """ -import asyncio -from bleak import BleakClient +import pygatt import google.protobuf.json_format import serial import threading @@ -86,6 +85,7 @@ class MeshInterface: self.debugOut = debugOut self.nodes = None # FIXME self.isConnected = False + self._startConfig() def sendText(self, text, destinationId=BROADCAST_ADDR): """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. @@ -259,23 +259,37 @@ FROMNUM_UUID = "ed9da18c-a800-4f66-a670-aa7547e34453" class BLEInterface(MeshInterface): def __init__(self, address, debugOut=None): self.address = address + self.adapter = pygatt.GATTToolBackend() # BGAPIBackend() + self.adapter.start() + logging.debug(f"Connecting to {self.address}") + self.device = self.adapter.connect(address) + logging.debug("Connected to device") + # fromradio = self.device.char_read(FROMRADIO_UUID) MeshInterface.__init__(self, debugOut=debugOut) - async def close(self): - await self.client.disconnect() + self._readFromRadio() # read the initial responses - async def run(self, loop): - self.client = BleakClient(self.address, loop=loop) - try: - logging.debug(f"Connecting to {self.address}") - await self.client.connect() - logging.debug("Connected to device") - fromradio = await self.client.read_gatt_char(FROMRADIO_UUID) - print(f"****** fromradio {fromradio}") - except Exception as e: - logging.error(e) - finally: - await self.close() + def handle_data(handle, data): + self._handleFromRadio(data) + + self.device.subscribe(FROMNUM_UUID, callback=handle_data) + + def _sendToRadio(self, toRadio): + """Send a ToRadio protobuf to the device""" + logging.debug(f"Sending: {toRadio}") + b = toRadio.SerializeToString() + self.device.char_write(TORADIO_UUID, b) + + def close(self): + self.adapter.stop() + + def _readFromRadio(self): + wasEmpty = False + while not wasEmpty: + b = self.device.char_read(FROMRADIO_UUID) + wasEmpty = len(b) == 0 + if not wasEmpty: + self._handleFromRadio(b) class StreamInterface(MeshInterface): @@ -313,7 +327,6 @@ class StreamInterface(MeshInterface): self._rxThread = threading.Thread(target=self.__reader, args=()) self._rxThread.start() MeshInterface.__init__(self, debugOut=debugOut) - self._startConfig() def _sendToRadio(self, toRadio): """Send a ToRadio protobuf to the device""" diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index e3e423d..c8cb196 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -1,6 +1,5 @@ #!python3 -import asyncio import argparse from . import StreamInterface, BLEInterface, test import logging @@ -121,8 +120,6 @@ def main(): subscribe() if args.ble: client = BLEInterface(args.device, debugOut=logfile) - loop = asyncio.get_event_loop() - loop.run_until_complete(client.run(loop)) else: client = StreamInterface(args.device, debugOut=logfile) diff --git a/meshtastic/ble.py b/meshtastic/ble.py index b502ccd..e69de29 100644 --- a/meshtastic/ble.py +++ b/meshtastic/ble.py @@ -1,12 +0,0 @@ -import asyncio -from bleak import discover - - -async def run(): - devices = await discover() - for d in devices: - print(d) - -def bleScan(): - loop = asyncio.get_event_loop() - loop.run_until_complete(run()) diff --git a/meshtastic/mesh_pb2.py b/meshtastic/mesh_pb2.py index 05b1af1..6bde772 100644 --- a/meshtastic/mesh_pb2.py +++ b/meshtastic/mesh_pb2.py @@ -20,7 +20,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=_b('\n\023com.geeksville.meshB\nMeshProtos'), - serialized_pb=_b('\n\nmesh.proto\"\x93\x01\n\x08Position\x12\x12\n\nlatitude_d\x18\x01 \x01(\x01\x12\x13\n\x0blongitude_d\x18\x02 \x01(\x01\x12\x12\n\nlatitude_i\x18\x07 \x01(\x11\x12\x13\n\x0blongitude_i\x18\x08 \x01(\x11\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07\"g\n\x04\x44\x61ta\x12\x17\n\x03typ\x18\x01 \x01(\x0e\x32\n.Data.Type\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"5\n\x04Type\x12\n\n\x06OPAQUE\x10\x00\x12\x0e\n\nCLEAR_TEXT\x10\x01\x12\x11\n\rCLEAR_READACK\x10\x02\"J\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x05\"i\n\tSubPacket\x12\x1b\n\x08position\x18\x01 \x01(\x0b\x32\t.Position\x12\x13\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.Data\x12\x13\n\x04user\x18\x04 \x01(\x0b\x32\x05.User\x12\x15\n\rwant_response\x18\x05 \x01(\x08\"\x92\x01\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\r\x12\n\n\x02to\x18\x02 \x01(\r\x12\x1d\n\x07\x64\x65\x63oded\x18\x03 \x01(\x0b\x32\n.SubPacketH\x00\x12\x13\n\tencrypted\x18\x08 \x01(\x0cH\x00\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x12\n\n\x02id\x18\x06 \x01(\r\x12\x0e\n\x06rx_snr\x18\x07 \x01(\x02\x42\t\n\x07payload\"\xd4\x01\n\x0f\x43hannelSettings\x12\x10\n\x08tx_power\x18\x01 \x01(\x05\x12\x32\n\x0cmodem_config\x18\x03 \x01(\x0e\x32\x1c.ChannelSettings.ModemConfig\x12\x0b\n\x03psk\x18\x04 \x01(\x0c\x12\x0c\n\x04name\x18\x05 \x01(\t\"`\n\x0bModemConfig\x12\x12\n\x0e\x42w125Cr45Sf128\x10\x00\x12\x12\n\x0e\x42w500Cr45Sf128\x10\x01\x12\x14\n\x10\x42w31_25Cr48Sf512\x10\x02\x12\x13\n\x0f\x42w125Cr48Sf4096\x10\x03\"\xd7\x03\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x12*\n\x10\x63hannel_settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x1a\xe8\x02\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1a\n\x12num_missed_to_fail\x18\x03 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x18\n\x10keep_all_packets\x18\x64 \x01(\x08\x12\x18\n\x10promiscuous_mode\x18\x65 \x01(\x08\"V\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\x05\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\"\xc4\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\x05\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x14\n\x0cnum_channels\x18\x03 \x01(\x05\x12\x0e\n\x06region\x18\x04 \x01(\t\x12\x10\n\x08hw_model\x18\x05 \x01(\t\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12\x12\n\nerror_code\x18\x07 \x01(\r\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\"\xd5\x01\n\x0b\x44\x65viceState\x12\x1b\n\x05radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfig\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\x1a\n\x07node_db\x18\x04 \x03(\x0b\x32\t.NodeInfo\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\"\x1e\n\x0b\x44\x65\x62ugString\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xf9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12\x1d\n\x05radio\x18\x06 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12$\n\x0c\x64\x65\x62ug_string\x18\x07 \x01(\x0b\x32\x0c.DebugStringH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\t\n\x07variant\"\x8c\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12!\n\tset_radio\x18\x65 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x66 \x01(\x0b\x32\x05.UserH\x00\x42\t\n\x07variant*\x17\n\tConstants\x12\n\n\x06Unused\x10\x00\x42!\n\x13\x63om.geeksville.meshB\nMeshProtosb\x06proto3') + serialized_pb=_b('\n\nmesh.proto\"\x93\x01\n\x08Position\x12\x12\n\nlatitude_d\x18\x01 \x01(\x01\x12\x13\n\x0blongitude_d\x18\x02 \x01(\x01\x12\x12\n\nlatitude_i\x18\x07 \x01(\x11\x12\x13\n\x0blongitude_i\x18\x08 \x01(\x11\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x15\n\rbattery_level\x18\x04 \x01(\x05\x12\x0c\n\x04time\x18\t \x01(\x07\"g\n\x04\x44\x61ta\x12\x17\n\x03typ\x18\x01 \x01(\x0e\x32\n.Data.Type\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"5\n\x04Type\x12\n\n\x06OPAQUE\x10\x00\x12\x0e\n\nCLEAR_TEXT\x10\x01\x12\x11\n\rCLEAR_READACK\x10\x02\"J\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x0f\n\x07macaddr\x18\x04 \x01(\x0c\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x02 \x03(\x05\"\xfe\x01\n\tSubPacket\x12\x1d\n\x08position\x18\x01 \x01(\x0b\x32\t.PositionH\x00\x12\x15\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x05.DataH\x00\x12\x15\n\x04user\x18\x04 \x01(\x0b\x32\x05.UserH\x00\x12\"\n\x07request\x18\x06 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12 \n\x05reply\x18\x07 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12\x15\n\rwant_response\x18\x05 \x01(\x08\x12\x14\n\nsuccess_id\x18\n \x01(\rH\x01\x12\x11\n\x07\x66\x61il_id\x18\x0b \x01(\rH\x01\x12\x0c\n\x04\x64\x65st\x18\t \x01(\rB\t\n\x07payloadB\x05\n\x03\x61\x63k\"\xa5\x01\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\r\x12\n\n\x02to\x18\x02 \x01(\r\x12\x1d\n\x07\x64\x65\x63oded\x18\x03 \x01(\x0b\x32\n.SubPacketH\x00\x12\x13\n\tencrypted\x18\x08 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\r\x12\x0f\n\x07rx_time\x18\t \x01(\x07\x12\x0e\n\x06rx_snr\x18\x07 \x01(\x02\x12\x11\n\thop_limit\x18\n \x01(\rB\t\n\x07payload\"\xd4\x01\n\x0f\x43hannelSettings\x12\x10\n\x08tx_power\x18\x01 \x01(\x05\x12\x32\n\x0cmodem_config\x18\x03 \x01(\x0e\x32\x1c.ChannelSettings.ModemConfig\x12\x0b\n\x03psk\x18\x04 \x01(\x0c\x12\x0c\n\x04name\x18\x05 \x01(\t\"`\n\x0bModemConfig\x12\x12\n\x0e\x42w125Cr45Sf128\x10\x00\x12\x12\n\x0e\x42w500Cr45Sf128\x10\x01\x12\x14\n\x10\x42w31_25Cr48Sf512\x10\x02\x12\x13\n\x0f\x42w125Cr48Sf4096\x10\x03\"\xd7\x03\n\x0bRadioConfig\x12\x31\n\x0bpreferences\x18\x01 \x01(\x0b\x32\x1c.RadioConfig.UserPreferences\x12*\n\x10\x63hannel_settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x1a\xe8\x02\n\x0fUserPreferences\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12\x1b\n\x13send_owner_interval\x18\x02 \x01(\r\x12\x1a\n\x12num_missed_to_fail\x18\x03 \x01(\r\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x16\n\x0escreen_on_secs\x18\x05 \x01(\r\x12\x1a\n\x12phone_timeout_secs\x18\x06 \x01(\r\x12\x1d\n\x15phone_sds_timeout_sec\x18\x07 \x01(\r\x12\x1d\n\x15mesh_sds_timeout_secs\x18\x08 \x01(\r\x12\x10\n\x08sds_secs\x18\t \x01(\r\x12\x0f\n\x07ls_secs\x18\n \x01(\r\x12\x15\n\rmin_wake_secs\x18\x0b \x01(\r\x12\x18\n\x10keep_all_packets\x18\x64 \x01(\x08\x12\x18\n\x10promiscuous_mode\x18\x65 \x01(\x08\"h\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x07 \x01(\x02\x12\x10\n\x08next_hop\x18\x05 \x01(\r\"\xc4\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\x05\x12\x0f\n\x07has_gps\x18\x02 \x01(\x08\x12\x14\n\x0cnum_channels\x18\x03 \x01(\x05\x12\x0e\n\x06region\x18\x04 \x01(\t\x12\x10\n\x08hw_model\x18\x05 \x01(\t\x12\x18\n\x10\x66irmware_version\x18\x06 \x01(\t\x12\x12\n\nerror_code\x18\x07 \x01(\r\x12\x15\n\rerror_address\x18\x08 \x01(\r\x12\x13\n\x0b\x65rror_count\x18\t \x01(\r\"\xd5\x01\n\x0b\x44\x65viceState\x12\x1b\n\x05radio\x18\x01 \x01(\x0b\x32\x0c.RadioConfig\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\x1a\n\x07node_db\x18\x04 \x03(\x0b\x32\t.NodeInfo\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\"\x1e\n\x0b\x44\x65\x62ugString\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xf9\x01\n\tFromRadio\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12\x1d\n\x05radio\x18\x06 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12$\n\x0c\x64\x65\x62ug_string\x18\x07 \x01(\x0b\x32\x0c.DebugStringH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x08 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\t \x01(\x08H\x00\x42\t\n\x07variant\"\x8c\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x64 \x01(\rH\x00\x12!\n\tset_radio\x18\x65 \x01(\x0b\x32\x0c.RadioConfigH\x00\x12\x1a\n\tset_owner\x18\x66 \x01(\x0b\x32\x05.UserH\x00\x42\t\n\x07variant*\x17\n\tConstants\x12\n\n\x06Unused\x10\x00\x42!\n\x13\x63om.geeksville.meshB\nMeshProtosb\x06proto3') ) _CONSTANTS = _descriptor.EnumDescriptor( @@ -36,8 +36,8 @@ _CONSTANTS = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=2253, - serialized_end=2276, + serialized_start=2440, + serialized_end=2463, ) _sym_db.RegisterEnumDescriptor(_CONSTANTS) @@ -96,8 +96,8 @@ _CHANNELSETTINGS_MODEMCONFIG = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=751, - serialized_end=847, + serialized_start=920, + serialized_end=1016, ) _sym_db.RegisterEnumDescriptor(_CHANNELSETTINGS_MODEMCONFIG) @@ -326,12 +326,47 @@ _SUBPACKET = _descriptor.Descriptor( is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='want_response', full_name='SubPacket.want_response', index=3, + name='request', full_name='SubPacket.request', index=3, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='reply', full_name='SubPacket.reply', index=4, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='want_response', full_name='SubPacket.want_response', index=5, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='success_id', full_name='SubPacket.success_id', index=6, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='fail_id', full_name='SubPacket.fail_id', index=7, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='dest', full_name='SubPacket.dest', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -343,9 +378,15 @@ _SUBPACKET = _descriptor.Descriptor( syntax='proto3', extension_ranges=[], oneofs=[ + _descriptor.OneofDescriptor( + name='payload', full_name='SubPacket.payload', + index=0, containing_type=None, fields=[]), + _descriptor.OneofDescriptor( + name='ack', full_name='SubPacket.ack', + index=1, containing_type=None, fields=[]), ], - serialized_start=378, - serialized_end=483, + serialized_start=379, + serialized_end=633, ) @@ -385,15 +426,15 @@ _MESHPACKET = _descriptor.Descriptor( is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='rx_time', full_name='MeshPacket.rx_time', index=4, - number=9, type=7, cpp_type=3, label=1, + name='id', full_name='MeshPacket.id', index=4, + number=6, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='id', full_name='MeshPacket.id', index=5, - number=6, type=13, cpp_type=3, label=1, + name='rx_time', full_name='MeshPacket.rx_time', index=5, + number=9, type=7, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -405,6 +446,13 @@ _MESHPACKET = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hop_limit', full_name='MeshPacket.hop_limit', index=7, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -420,8 +468,8 @@ _MESHPACKET = _descriptor.Descriptor( name='payload', full_name='MeshPacket.payload', index=0, containing_type=None, fields=[]), ], - serialized_start=486, - serialized_end=632, + serialized_start=636, + serialized_end=801, ) @@ -473,8 +521,8 @@ _CHANNELSETTINGS = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=635, - serialized_end=847, + serialized_start=804, + serialized_end=1016, ) @@ -588,8 +636,8 @@ _RADIOCONFIG_USERPREFERENCES = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=961, - serialized_end=1321, + serialized_start=1130, + serialized_end=1490, ) _RADIOCONFIG = _descriptor.Descriptor( @@ -625,8 +673,8 @@ _RADIOCONFIG = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=850, - serialized_end=1321, + serialized_start=1019, + serialized_end=1490, ) @@ -639,7 +687,7 @@ _NODEINFO = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='num', full_name='NodeInfo.num', index=0, - number=1, type=5, cpp_type=1, label=1, + number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -665,6 +713,13 @@ _NODEINFO = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='next_hop', full_name='NodeInfo.next_hop', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -677,8 +732,8 @@ _NODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1323, - serialized_end=1409, + serialized_start=1492, + serialized_end=1596, ) @@ -764,8 +819,8 @@ _MYNODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1412, - serialized_end=1608, + serialized_start=1599, + serialized_end=1795, ) @@ -837,8 +892,8 @@ _DEVICESTATE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1611, - serialized_end=1824, + serialized_start=1798, + serialized_end=2011, ) @@ -868,8 +923,8 @@ _DEBUGSTRING = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1826, - serialized_end=1856, + serialized_start=2013, + serialized_end=2043, ) @@ -951,8 +1006,8 @@ _FROMRADIO = _descriptor.Descriptor( name='variant', full_name='FromRadio.variant', index=0, containing_type=None, fields=[]), ], - serialized_start=1859, - serialized_end=2108, + serialized_start=2046, + serialized_end=2295, ) @@ -1006,8 +1061,8 @@ _TORADIO = _descriptor.Descriptor( name='variant', full_name='ToRadio.variant', index=0, containing_type=None, fields=[]), ], - serialized_start=2111, - serialized_end=2251, + serialized_start=2298, + serialized_end=2438, ) _DATA.fields_by_name['typ'].enum_type = _DATA_TYPE @@ -1015,6 +1070,29 @@ _DATA_TYPE.containing_type = _DATA _SUBPACKET.fields_by_name['position'].message_type = _POSITION _SUBPACKET.fields_by_name['data'].message_type = _DATA _SUBPACKET.fields_by_name['user'].message_type = _USER +_SUBPACKET.fields_by_name['request'].message_type = _ROUTEDISCOVERY +_SUBPACKET.fields_by_name['reply'].message_type = _ROUTEDISCOVERY +_SUBPACKET.oneofs_by_name['payload'].fields.append( + _SUBPACKET.fields_by_name['position']) +_SUBPACKET.fields_by_name['position'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] +_SUBPACKET.oneofs_by_name['payload'].fields.append( + _SUBPACKET.fields_by_name['data']) +_SUBPACKET.fields_by_name['data'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] +_SUBPACKET.oneofs_by_name['payload'].fields.append( + _SUBPACKET.fields_by_name['user']) +_SUBPACKET.fields_by_name['user'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] +_SUBPACKET.oneofs_by_name['payload'].fields.append( + _SUBPACKET.fields_by_name['request']) +_SUBPACKET.fields_by_name['request'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] +_SUBPACKET.oneofs_by_name['payload'].fields.append( + _SUBPACKET.fields_by_name['reply']) +_SUBPACKET.fields_by_name['reply'].containing_oneof = _SUBPACKET.oneofs_by_name['payload'] +_SUBPACKET.oneofs_by_name['ack'].fields.append( + _SUBPACKET.fields_by_name['success_id']) +_SUBPACKET.fields_by_name['success_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ack'] +_SUBPACKET.oneofs_by_name['ack'].fields.append( + _SUBPACKET.fields_by_name['fail_id']) +_SUBPACKET.fields_by_name['fail_id'].containing_oneof = _SUBPACKET.oneofs_by_name['ack'] _MESHPACKET.fields_by_name['decoded'].message_type = _SUBPACKET _MESHPACKET.oneofs_by_name['payload'].fields.append( _MESHPACKET.fields_by_name['decoded']) diff --git a/proto b/proto index 4840493..bc3ecd9 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 4840493693d5799ebd451f6857ecbbc5c9157348 +Subproject commit bc3ecd97e381b724c1a28acce0d12c688de73ba3 diff --git a/setup.py b/setup.py index e728ceb..2896e29 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ setup( packages=["meshtastic"], include_package_data=True, install_requires=["pyserial>=3.4", "protobuf>=3.6.1", - "pypubsub>=4.0.3", "dotmap>=1.3.14", "bleak>=0.6.1"], + "pypubsub>=4.0.3", "dotmap>=1.3.14" ], python_requires='>=3.4', entry_points={ "console_scripts": [