├── .gitignore ├── COPYING ├── README ├── gen_proto.sh ├── main.py ├── meshtastic ├── admin_pb2.py ├── apponly_pb2.py ├── atak_pb2.py ├── cannedmessages_pb2.py ├── channel_pb2.py ├── clientonly_pb2.py ├── config_pb2.py ├── connection_status_pb2.py ├── localonly_pb2.py ├── mesh_pb2.py ├── module_config_pb2.py ├── mqtt_pb2.py ├── paxcount_pb2.py ├── portnums_pb2.py ├── remote_hardware_pb2.py ├── rtttl_pb2.py ├── storeforward_pb2.py ├── telemetry_pb2.py └── xmodem_pb2.py ├── meshview ├── 1x1.png ├── database.py ├── decode_payload.py ├── http.py ├── models.py ├── mqtt_reader.py ├── notify.py ├── store.py ├── templates │ ├── base.html │ ├── buttons.html │ ├── chat.html │ ├── chat_packet.html │ ├── datalist.html │ ├── firehose.html │ ├── index.html │ ├── net.html │ ├── net_packet.html │ ├── node.html │ ├── node_graphs.html │ ├── packet.html │ ├── packet_details.html │ ├── packet_index.html │ ├── packet_list.html │ ├── search.html │ └── search_form.html └── web.py ├── proto_def ├── LICENSE └── meshtastic │ ├── admin.options │ ├── admin.proto │ ├── apponly.options │ ├── apponly.proto │ ├── atak.options │ ├── atak.proto │ ├── cannedmessages.options │ ├── cannedmessages.proto │ ├── channel.options │ ├── channel.proto │ ├── clientonly.options │ ├── clientonly.proto │ ├── config.options │ ├── config.proto │ ├── connection_status.options │ ├── connection_status.proto │ ├── deviceonly.options │ ├── deviceonly.proto │ ├── localonly.proto │ ├── mesh.options │ ├── mesh.proto │ ├── module_config.options │ ├── module_config.proto │ ├── mqtt.options │ ├── mqtt.proto │ ├── paxcount.proto │ ├── portnums.proto │ ├── powermon.proto │ ├── remote_hardware.proto │ ├── rtttl.options │ ├── rtttl.proto │ ├── storeforward.options │ ├── storeforward.proto │ ├── telemetry.options │ ├── telemetry.proto │ ├── xmodem.options │ └── xmodem.proto └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | env/* 2 | __pycache__/* 3 | packets.db 4 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Meshview 2 | ======== 3 | 4 | This project watches a MQTT topic for meshtastic messages, imports them to a 5 | database and has a web UI to view them. 6 | 7 | Example 8 | ------- 9 | An example instance, https://meshview.armooo.net, is running with with data 10 | from the MQTT topic msh/US/bayarea/#. 11 | 12 | 13 | Running 14 | ------- 15 | $ python3 -m venv env 16 | $ ./env/bin/pip install -r requirements.txt 17 | $ ./env/bin/python main.py 18 | 19 | Now you can hit http://localhost:8080/ 20 | -------------------------------------------------------------------------------- /gen_proto.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | protoc \ 3 | -Iproto_def \ 4 | --python_out=. \ 5 | proto_def/meshtastic/admin.proto \ 6 | proto_def/meshtastic/apponly.proto \ 7 | proto_def/meshtastic/atak.proto \ 8 | proto_def/meshtastic/cannedmessages.proto \ 9 | proto_def/meshtastic/channel.proto \ 10 | proto_def/meshtastic/clientonly.proto \ 11 | proto_def/meshtastic/config.proto \ 12 | proto_def/meshtastic/connection_status.proto \ 13 | proto_def/meshtastic/localonly.proto \ 14 | proto_def/meshtastic/mesh.proto \ 15 | proto_def/meshtastic/module_config.proto \ 16 | proto_def/meshtastic/mqtt.proto \ 17 | proto_def/meshtastic/paxcount.proto \ 18 | proto_def/meshtastic/portnums.proto \ 19 | proto_def/meshtastic/remote_hardware.proto \ 20 | proto_def/meshtastic/rtttl.proto \ 21 | proto_def/meshtastic/storeforward.proto \ 22 | proto_def/meshtastic/telemetry.proto \ 23 | proto_def/meshtastic/xmodem.proto 24 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import argparse 3 | 4 | from meshview import mqtt_reader 5 | from meshview import database 6 | from meshview import store 7 | from meshview import web 8 | from meshview import http 9 | 10 | 11 | async def load_database_from_mqtt(mqtt_server, topic): 12 | async for topic, env in mqtt_reader.get_topic_envelopes(mqtt_server, topic): 13 | await store.process_envelope(topic, env) 14 | 15 | 16 | async def main(args): 17 | database.init_database(args.database) 18 | 19 | await database.create_tables() 20 | async with asyncio.TaskGroup() as tg: 21 | tg.create_task(load_database_from_mqtt(args.mqtt_server, args.topic)) 22 | tg.create_task(web.run_server(args.bind, args.port, args.tls_cert)) 23 | if args.acme_challenge: 24 | tg.create_task(http.run_server(args.bind, args.acme_challenge)) 25 | 26 | 27 | if __name__ == '__main__': 28 | parser = argparse.ArgumentParser('meshview') 29 | parser.add_argument('--bind', nargs='*', default=['::1']) 30 | parser.add_argument('--acme-challenge') 31 | parser.add_argument('--port', default=8080, type=int) 32 | parser.add_argument('--tls-cert') 33 | 34 | parser.add_argument('--mqtt-server', default='mqtt.meshtastic.org') 35 | parser.add_argument('--topic', nargs='*', default=['msh/US/#']) 36 | 37 | parser.add_argument('--database', default='sqlite+aiosqlite:///packets.db') 38 | 39 | args = parser.parse_args() 40 | 41 | asyncio.run(main(args)) 42 | -------------------------------------------------------------------------------- /meshtastic/admin_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/admin.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | from meshtastic import channel_pb2 as meshtastic_dot_channel__pb2 15 | from meshtastic import config_pb2 as meshtastic_dot_config__pb2 16 | from meshtastic import connection_status_pb2 as meshtastic_dot_connection__status__pb2 17 | from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2 18 | from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2 19 | 20 | 21 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/admin.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\"meshtastic/connection_status.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\"\xe8\x12\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12\x33\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12.\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x10.meshtastic.UserH\x00\x12\x41\n\x12get_config_request\x18\x05 \x01(\x0e\x32#.meshtastic.AdminMessage.ConfigTypeH\x00\x12\x31\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12N\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32).meshtastic.AdminMessage.ModuleConfigTypeH\x00\x12>\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b \x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c \x01(\x08H\x00\x12\x42\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f \x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 \x01(\x08H\x00\x12S\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32\".meshtastic.DeviceConnectionStatusH\x00\x12\x31\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\x19.meshtastic.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\\\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32*.meshtastic.NodeRemoteHardwarePinsResponseH\x00\x12 \n\x16\x65nter_dfu_mode_request\x18\x15 \x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tH\x00\x12\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12%\n\tset_owner\x18 \x01(\x0b\x32\x10.meshtastic.UserH\x00\x12*\n\x0bset_channel\x18! \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12(\n\nset_config\x18\" \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12\x35\n\x11set_module_config\x18# \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messages\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% \x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& \x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' \x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( \x01(\rH\x00\x12\x32\n\x12set_fixed_position\x18) \x01(\x0b\x32\x14.meshtastic.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 \x01(\x08H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\x00\x12\x1c\n\x12reboot_ota_seconds\x18_ \x01(\x05H\x00\x12\x18\n\x0e\x65xit_simulator\x18` \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 \x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 \x01(\x05H\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\xc1\x01\n\nConfigType\x12\x11\n\rDEVICE_CONFIG\x10\x00\x12\x13\n\x0fPOSITION_CONFIG\x10\x01\x12\x10\n\x0cPOWER_CONFIG\x10\x02\x12\x12\n\x0eNETWORK_CONFIG\x10\x03\x12\x12\n\x0e\x44ISPLAY_CONFIG\x10\x04\x12\x0f\n\x0bLORA_CONFIG\x10\x05\x12\x14\n\x10\x42LUETOOTH_CONFIG\x10\x06\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\"\xbb\x02\n\x10ModuleConfigType\x12\x0f\n\x0bMQTT_CONFIG\x10\x00\x12\x11\n\rSERIAL_CONFIG\x10\x01\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x02\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x03\x12\x14\n\x10RANGETEST_CONFIG\x10\x04\x12\x14\n\x10TELEMETRY_CONFIG\x10\x05\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x06\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x07\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x08\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\t\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\n\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x0b\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0c\x42\x11\n\x0fpayload_variant\"[\n\rHamParameters\x12\x11\n\tcall_sign\x18\x01 \x01(\t\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 \x01(\x02\x12\x12\n\nshort_name\x18\x04 \x01(\t\"f\n\x1eNodeRemoteHardwarePinsResponse\x12\x44\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32!.meshtastic.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 22 | 23 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 24 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.admin_pb2', globals()) 25 | if _descriptor._USE_C_DESCRIPTORS == False: 26 | 27 | DESCRIPTOR._options = None 28 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 29 | _ADMINMESSAGE._serialized_start=181 30 | _ADMINMESSAGE._serialized_end=2589 31 | _ADMINMESSAGE_CONFIGTYPE._serialized_start=2059 32 | _ADMINMESSAGE_CONFIGTYPE._serialized_end=2252 33 | _ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=2255 34 | _ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=2570 35 | _HAMPARAMETERS._serialized_start=2591 36 | _HAMPARAMETERS._serialized_end=2682 37 | _NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=2684 38 | _NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=2786 39 | # @@protoc_insertion_point(module_scope) 40 | -------------------------------------------------------------------------------- /meshtastic/apponly_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/apponly.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | from meshtastic import channel_pb2 as meshtastic_dot_channel__pb2 15 | from meshtastic import config_pb2 as meshtastic_dot_config__pb2 16 | 17 | 18 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/apponly.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"o\n\nChannelSet\x12-\n\x08settings\x18\x01 \x03(\x0b\x32\x1b.meshtastic.ChannelSettings\x12\x32\n\x0blora_config\x18\x02 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 19 | 20 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 21 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.apponly_pb2', globals()) 22 | if _descriptor._USE_C_DESCRIPTORS == False: 23 | 24 | DESCRIPTOR._options = None 25 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 26 | _CHANNELSET._serialized_start=91 27 | _CHANNELSET._serialized_end=202 28 | # @@protoc_insertion_point(module_scope) 29 | -------------------------------------------------------------------------------- /meshtastic/atak_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/atak.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/atak.proto\x12\nmeshtastic\"\xe6\x01\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12$\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x13.meshtastic.Contact\x12 \n\x05group\x18\x03 \x01(\x0b\x32\x11.meshtastic.Group\x12\"\n\x06status\x18\x04 \x01(\x0b\x32\x12.meshtastic.Status\x12\x1e\n\x03pli\x18\x05 \x01(\x0b\x32\x0f.meshtastic.PLIH\x00\x12#\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x13.meshtastic.GeoChatH\x00\x42\x11\n\x0fpayload_variant\"\\\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0bto_callsign\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x05\n\x03_toB\x0e\n\x0c_to_callsign\"M\n\x05Group\x12$\n\x04role\x18\x01 \x01(\x0e\x32\x16.meshtastic.MemberRole\x12\x1e\n\x04team\x18\x02 \x01(\x0e\x32\x10.meshtastic.Team\"\x19\n\x06Status\x12\x0f\n\x07\x62\x61ttery\x18\x01 \x01(\r\"4\n\x07\x43ontact\x12\x10\n\x08\x63\x61llsign\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\t\"_\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x0e\n\x06\x63ourse\x18\x05 \x01(\r*\xc0\x01\n\x04Team\x12\x14\n\x10Unspecifed_Color\x10\x00\x12\t\n\x05White\x10\x01\x12\n\n\x06Yellow\x10\x02\x12\n\n\x06Orange\x10\x03\x12\x0b\n\x07Magenta\x10\x04\x12\x07\n\x03Red\x10\x05\x12\n\n\x06Maroon\x10\x06\x12\n\n\x06Purple\x10\x07\x12\r\n\tDark_Blue\x10\x08\x12\x08\n\x04\x42lue\x10\t\x12\x08\n\x04\x43yan\x10\n\x12\x08\n\x04Teal\x10\x0b\x12\t\n\x05Green\x10\x0c\x12\x0e\n\nDark_Green\x10\r\x12\t\n\x05\x42rown\x10\x0e*\x7f\n\nMemberRole\x12\x0e\n\nUnspecifed\x10\x00\x12\x0e\n\nTeamMember\x10\x01\x12\x0c\n\x08TeamLead\x10\x02\x12\x06\n\x02HQ\x10\x03\x12\n\n\x06Sniper\x10\x04\x12\t\n\x05Medic\x10\x05\x12\x13\n\x0f\x46orwardObserver\x10\x06\x12\x07\n\x03RTO\x10\x07\x12\x06\n\x02K9\x10\x08\x42_\n\x13\x63om.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.atak_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _TEAM._serialized_start=622 25 | _TEAM._serialized_end=814 26 | _MEMBERROLE._serialized_start=816 27 | _MEMBERROLE._serialized_end=943 28 | _TAKPACKET._serialized_start=38 29 | _TAKPACKET._serialized_end=268 30 | _GEOCHAT._serialized_start=270 31 | _GEOCHAT._serialized_end=362 32 | _GROUP._serialized_start=364 33 | _GROUP._serialized_end=441 34 | _STATUS._serialized_start=443 35 | _STATUS._serialized_end=468 36 | _CONTACT._serialized_start=470 37 | _CONTACT._serialized_end=522 38 | _PLI._serialized_start=524 39 | _PLI._serialized_end=619 40 | # @@protoc_insertion_point(module_scope) 41 | -------------------------------------------------------------------------------- /meshtastic/cannedmessages_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/cannedmessages.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\x12\nmeshtastic\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBn\n\x13\x63om.geeksville.meshB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.cannedmessages_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _CANNEDMESSAGEMODULECONFIG._serialized_start=47 25 | _CANNEDMESSAGEMODULECONFIG._serialized_end=92 26 | # @@protoc_insertion_point(module_scope) 27 | -------------------------------------------------------------------------------- /meshtastic/channel_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/channel.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/channel.proto\x12\nmeshtastic\"\xb8\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12\x33\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32\x1a.meshtastic.ModuleSettings\"E\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x17\n\x0fis_client_muted\x18\x02 \x01(\x08\"\xa1\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12-\n\x08settings\x18\x02 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12&\n\x04role\x18\x03 \x01(\x0e\x32\x18.meshtastic.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x62\n\x13\x63om.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.channel_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _CHANNELSETTINGS.fields_by_name['channel_num']._options = None 25 | _CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001' 26 | _CHANNELSETTINGS._serialized_start=41 27 | _CHANNELSETTINGS._serialized_end=225 28 | _MODULESETTINGS._serialized_start=227 29 | _MODULESETTINGS._serialized_end=296 30 | _CHANNEL._serialized_start=299 31 | _CHANNEL._serialized_end=460 32 | _CHANNEL_ROLE._serialized_start=412 33 | _CHANNEL_ROLE._serialized_end=460 34 | # @@protoc_insertion_point(module_scope) 35 | -------------------------------------------------------------------------------- /meshtastic/clientonly_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/clientonly.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | from meshtastic import localonly_pb2 as meshtastic_dot_localonly__pb2 15 | 16 | 17 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/clientonly.proto\x12\nmeshtastic\x1a\x1ameshtastic/localonly.proto\"\x8d\x02\n\rDeviceProfile\x12\x16\n\tlong_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nshort_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12,\n\x06\x63onfig\x18\x04 \x01(\x0b\x32\x17.meshtastic.LocalConfigH\x03\x88\x01\x01\x12\x39\n\rmodule_config\x18\x05 \x01(\x0b\x32\x1d.meshtastic.LocalModuleConfigH\x04\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configBe\n\x13\x63om.geeksville.meshB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 18 | 19 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 20 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.clientonly_pb2', globals()) 21 | if _descriptor._USE_C_DESCRIPTORS == False: 22 | 23 | DESCRIPTOR._options = None 24 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 25 | _DEVICEPROFILE._serialized_start=72 26 | _DEVICEPROFILE._serialized_end=341 27 | # @@protoc_insertion_point(module_scope) 28 | -------------------------------------------------------------------------------- /meshtastic/config_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/config.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/config.proto\x12\nmeshtastic\"\xaf%\n\x06\x43onfig\x12\x31\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfigH\x00\x12\x35\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfigH\x00\x12/\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfigH\x00\x12\x33\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfigH\x00\x12\x33\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfigH\x00\x12-\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigH\x00\x12\x37\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfigH\x00\x12\x35\n\x08security\x18\x08 \x01(\x0b\x32!.meshtastic.Config.SecurityConfigH\x00\x12\x39\n\nsessionkey\x18\t \x01(\x0b\x32#.meshtastic.Config.SessionkeyConfigH\x00\x1a\xa1\x05\n\x0c\x44\x65viceConfig\x12\x32\n\x04role\x18\x01 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12\x1d\n\x11\x64\x65\x62ug_log_enabled\x18\x03 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12I\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32/.meshtastic.Config.DeviceConfig.RebroadcastMode\x12 \n\x18node_info_broadcast_secs\x18\x07 \x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x12\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\"\xae\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x15\n\rROUTER_CLIENT\x10\x03\x1a\x02\x08\x01\x12\x0c\n\x08REPEATER\x10\x04\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\"Q\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x1a\x91\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 \x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_update_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 \x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 \x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t \x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n \x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b \x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12;\n\x08gps_mode\x18\r \x01(\x0e\x32).meshtastic.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10 \x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\x84\x02\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01 \x01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 \x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 \x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 \x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t \x01(\r\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\xfe\x02\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 \x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 \x01(\t\x12\x12\n\nntp_server\x18\x05 \x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 \x01(\x08\x12\x42\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32,.meshtastic.Config.NetworkConfig.AddressMode\x12@\n\x0bipv4_config\x18\x08 \x01(\x0b\x32+.meshtastic.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x1a\x46\n\nIpV4Config\x12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 \x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 \x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\x1a\xcd\x07\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12H\n\ngps_format\x18\x02 \x01(\x0e\x32\x34.meshtastic.Config.DisplayConfig.GpsCoordinateFormat\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\r\x12\x19\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x12\x13\n\x0b\x66lip_screen\x18\x05 \x01(\x08\x12<\n\x05units\x18\x06 \x01(\x0e\x32-.meshtastic.Config.DisplayConfig.DisplayUnits\x12\x37\n\x04oled\x18\x07 \x01(\x0e\x32).meshtastic.Config.DisplayConfig.OledType\x12\x41\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32,.meshtastic.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\x12P\n\x13\x63ompass_orientation\x18\x0b \x01(\x0e\x32\x33.meshtastic.Config.DisplayConfig.CompassOrientation\"M\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03UTM\x10\x02\x12\x08\n\x04MGRS\x10\x03\x12\x07\n\x03OLC\x10\x04\x12\x08\n\x04OSGR\x10\x05\"(\n\x0c\x44isplayUnits\x12\n\n\x06METRIC\x10\x00\x12\x0c\n\x08IMPERIAL\x10\x01\"M\n\x08OledType\x12\r\n\tOLED_AUTO\x10\x00\x12\x10\n\x0cOLED_SSD1306\x10\x01\x12\x0f\n\x0bOLED_SH1106\x10\x02\x12\x0f\n\x0bOLED_SH1107\x10\x03\"A\n\x0b\x44isplayMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0c\n\x08TWOCOLOR\x10\x01\x12\x0c\n\x08INVERTED\x10\x02\x12\t\n\x05\x43OLOR\x10\x03\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\xde\x06\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12?\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x11\n\tbandwidth\x18\x03 \x01(\r\x12\x15\n\rspread_factor\x18\x04 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x05 \x01(\r\x12\x18\n\x10\x66requency_offset\x18\x06 \x01(\x02\x12\x38\n\x06region\x18\x07 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x11\n\thop_limit\x18\x08 \x01(\r\x12\x12\n\ntx_enabled\x18\t \x01(\x08\x12\x10\n\x08tx_power\x18\n \x01(\x05\x12\x13\n\x0b\x63hannel_num\x18\x0b \x01(\r\x12\x1b\n\x13override_duty_cycle\x18\x0c \x01(\x08\x12\x1e\n\x16sx126x_rx_boosted_gain\x18\r \x01(\x08\x12\x1a\n\x12override_frequency\x18\x0e \x01(\x02\x12\x17\n\x0fpa_fan_disabled\x18\x0f \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\"\xcd\x01\n\nRegionCode\x12\t\n\x05UNSET\x10\x00\x12\x06\n\x02US\x10\x01\x12\n\n\x06\x45U_433\x10\x02\x12\n\n\x06\x45U_868\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t\x12\x06\n\x02IN\x10\n\x12\n\n\x06NZ_865\x10\x0b\x12\x06\n\x02TH\x10\x0c\x12\x0b\n\x07LORA_24\x10\r\x12\n\n\x06UA_433\x10\x0e\x12\n\n\x06UA_868\x10\x0f\x12\n\n\x06MY_433\x10\x10\x12\n\n\x06MY_919\x10\x11\x12\n\n\x06SG_923\x10\x12\"\xa9\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\x12\x0f\n\x0bMEDIUM_SLOW\x10\x03\x12\x0f\n\x0bMEDIUM_FAST\x10\x04\x12\x0e\n\nSHORT_SLOW\x10\x05\x12\x0e\n\nSHORT_FAST\x10\x06\x12\x11\n\rLONG_MODERATE\x10\x07\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x1a\xd1\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12<\n\x04mode\x18\x02 \x01(\x0e\x32..meshtastic.Config.BluetoothConfig.PairingMode\x12\x11\n\tfixed_pin\x18\x03 \x01(\r\x12\"\n\x16\x64\x65vice_logging_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\"8\n\x0bPairingMode\x12\x0e\n\nRANDOM_PIN\x10\x00\x12\r\n\tFIXED_PIN\x10\x01\x12\n\n\x06NO_PIN\x10\x02\x1a\xd9\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 \x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x01(\x0c\x12\x12\n\nis_managed\x18\x04 \x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 \x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 \x01(\x08\x12!\n\x19\x62luetooth_logging_enabled\x18\x07 \x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 \x01(\x08\x1a\x12\n\x10SessionkeyConfigB\x11\n\x0fpayload_variantBa\n\x13\x63om.geeksville.meshB\x0c\x43onfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.config_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._options = None 25 | _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._serialized_options = b'\010\001' 26 | _CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._options = None 27 | _CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._serialized_options = b'\030\001' 28 | _CONFIG_DEVICECONFIG.fields_by_name['debug_log_enabled']._options = None 29 | _CONFIG_DEVICECONFIG.fields_by_name['debug_log_enabled']._serialized_options = b'\030\001' 30 | _CONFIG_DEVICECONFIG.fields_by_name['is_managed']._options = None 31 | _CONFIG_DEVICECONFIG.fields_by_name['is_managed']._serialized_options = b'\030\001' 32 | _CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._options = None 33 | _CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._serialized_options = b'\030\001' 34 | _CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._options = None 35 | _CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._serialized_options = b'\030\001' 36 | _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._options = None 37 | _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._serialized_options = b'\010\001' 38 | _CONFIG_BLUETOOTHCONFIG.fields_by_name['device_logging_enabled']._options = None 39 | _CONFIG_BLUETOOTHCONFIG.fields_by_name['device_logging_enabled']._serialized_options = b'\030\001' 40 | _CONFIG._serialized_start=40 41 | _CONFIG._serialized_end=4823 42 | _CONFIG_DEVICECONFIG._serialized_start=530 43 | _CONFIG_DEVICECONFIG._serialized_end=1203 44 | _CONFIG_DEVICECONFIG_ROLE._serialized_start=946 45 | _CONFIG_DEVICECONFIG_ROLE._serialized_end=1120 46 | _CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=1122 47 | _CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=1203 48 | _CONFIG_POSITIONCONFIG._serialized_start=1206 49 | _CONFIG_POSITIONCONFIG._serialized_end=1863 50 | _CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=1637 51 | _CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=1808 52 | _CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=1810 53 | _CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=1863 54 | _CONFIG_POWERCONFIG._serialized_start=1866 55 | _CONFIG_POWERCONFIG._serialized_end=2126 56 | _CONFIG_NETWORKCONFIG._serialized_start=2129 57 | _CONFIG_NETWORKCONFIG._serialized_end=2511 58 | _CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=2404 59 | _CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=2474 60 | _CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=2476 61 | _CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=2511 62 | _CONFIG_DISPLAYCONFIG._serialized_start=2514 63 | _CONFIG_DISPLAYCONFIG._serialized_end=3487 64 | _CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_start=3033 65 | _CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_end=3110 66 | _CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=3112 67 | _CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=3152 68 | _CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=3154 69 | _CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=3231 70 | _CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=3233 71 | _CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=3298 72 | _CONFIG_DISPLAYCONFIG_COMPASSORIENTATION._serialized_start=3301 73 | _CONFIG_DISPLAYCONFIG_COMPASSORIENTATION._serialized_end=3487 74 | _CONFIG_LORACONFIG._serialized_start=3490 75 | _CONFIG_LORACONFIG._serialized_end=4352 76 | _CONFIG_LORACONFIG_REGIONCODE._serialized_start=3975 77 | _CONFIG_LORACONFIG_REGIONCODE._serialized_end=4180 78 | _CONFIG_LORACONFIG_MODEMPRESET._serialized_start=4183 79 | _CONFIG_LORACONFIG_MODEMPRESET._serialized_end=4352 80 | _CONFIG_BLUETOOTHCONFIG._serialized_start=4355 81 | _CONFIG_BLUETOOTHCONFIG._serialized_end=4564 82 | _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=4508 83 | _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=4564 84 | _CONFIG_SECURITYCONFIG._serialized_start=4567 85 | _CONFIG_SECURITYCONFIG._serialized_end=4784 86 | _CONFIG_SESSIONKEYCONFIG._serialized_start=4786 87 | _CONFIG_SESSIONKEYCONFIG._serialized_end=4804 88 | # @@protoc_insertion_point(module_scope) 89 | -------------------------------------------------------------------------------- /meshtastic/connection_status_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/connection_status.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/connection_status.proto\x12\nmeshtastic\"\xb1\x02\n\x16\x44\x65viceConnectionStatus\x12\x33\n\x04wifi\x18\x01 \x01(\x0b\x32 .meshtastic.WifiConnectionStatusH\x00\x88\x01\x01\x12;\n\x08\x65thernet\x18\x02 \x01(\x0b\x32$.meshtastic.EthernetConnectionStatusH\x01\x88\x01\x01\x12=\n\tbluetooth\x18\x03 \x01(\x0b\x32%.meshtastic.BluetoothConnectionStatusH\x02\x88\x01\x01\x12\x37\n\x06serial\x18\x04 \x01(\x0b\x32\".meshtastic.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"g\n\x14WifiConnectionStatus\x12\x33\n\x06status\x18\x01 \x01(\x0b\x32#.meshtastic.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"O\n\x18\x45thernetConnectionStatus\x12\x33\n\x06status\x18\x01 \x01(\x0b\x32#.meshtastic.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x65\n\x13\x63om.geeksville.meshB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.connection_status_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _DEVICECONNECTIONSTATUS._serialized_start=51 25 | _DEVICECONNECTIONSTATUS._serialized_end=356 26 | _WIFICONNECTIONSTATUS._serialized_start=358 27 | _WIFICONNECTIONSTATUS._serialized_end=461 28 | _ETHERNETCONNECTIONSTATUS._serialized_start=463 29 | _ETHERNETCONNECTIONSTATUS._serialized_end=542 30 | _NETWORKCONNECTIONSTATUS._serialized_start=544 31 | _NETWORKCONNECTIONSTATUS._serialized_end=667 32 | _BLUETOOTHCONNECTIONSTATUS._serialized_start=669 33 | _BLUETOOTHCONNECTIONSTATUS._serialized_end=745 34 | _SERIALCONNECTIONSTATUS._serialized_start=747 35 | _SERIALCONNECTIONSTATUS._serialized_end=807 36 | # @@protoc_insertion_point(module_scope) 37 | -------------------------------------------------------------------------------- /meshtastic/localonly_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/localonly.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | from meshtastic import config_pb2 as meshtastic_dot_config__pb2 15 | from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2 16 | 17 | 18 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/localonly.proto\x12\nmeshtastic\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\"\xb2\x03\n\x0bLocalConfig\x12/\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfig\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfig\x12-\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfig\x12\x31\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfig\x12\x31\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfig\x12+\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfig\x12\x35\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x33\n\x08security\x18\t \x01(\x0b\x32!.meshtastic.Config.SecurityConfig\"\xfb\x06\n\x11LocalModuleConfig\x12\x31\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfig\x12\x35\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfig\x12R\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfig\x12\x42\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfig\x12<\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfig\x12;\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfig\x12\x44\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfig\x12\x33\n\x05\x61udio\x18\t \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfig\x12\x46\n\x0fremote_hardware\x18\n \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfig\x12\x42\n\rneighbor_info\x18\x0b \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfig\x12H\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfig\x12H\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfig\x12=\n\npaxcounter\x18\x0e \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBd\n\x13\x63om.geeksville.meshB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 19 | 20 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 21 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.localonly_pb2', globals()) 22 | if _descriptor._USE_C_DESCRIPTORS == False: 23 | 24 | DESCRIPTOR._options = None 25 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 26 | _LOCALCONFIG._serialized_start=100 27 | _LOCALCONFIG._serialized_end=534 28 | _LOCALMODULECONFIG._serialized_start=537 29 | _LOCALMODULECONFIG._serialized_end=1428 30 | # @@protoc_insertion_point(module_scope) 31 | -------------------------------------------------------------------------------- /meshtastic/mesh_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/mesh.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | from meshtastic import channel_pb2 as meshtastic_dot_channel__pb2 15 | from meshtastic import config_pb2 as meshtastic_dot_config__pb2 16 | from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2 17 | from meshtastic import portnums_pb2 as meshtastic_dot_portnums__pb2 18 | from meshtastic import telemetry_pb2 as meshtastic_dot_telemetry__pb2 19 | from meshtastic import xmodem_pb2 as meshtastic_dot_xmodem__pb2 20 | 21 | 22 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mesh.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\x87\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\x12\x37\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x1e.meshtastic.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\xd8\x01\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\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12+\n\x08hw_model\x18\x05 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xa4\x03\n\x07Routing\x12\x33\n\rroute_request\x18\x01 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x19.meshtastic.Routing.ErrorH\x00\"\xf2\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#B\t\n\x07variant\"\xa7\x01\n\x04\x44\x61ta\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\xc0\x04\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12#\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x10.meshtastic.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12\x31\n\x08priority\x18\x0b \x01(\x0e\x32\x1f.meshtastic.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12\x33\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x1e.meshtastic.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\x42\x11\n\x0fpayload_variant\"\xfe\x01\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12&\n\x08position\x18\x03 \x01(\x0b\x32\x14.meshtastic.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x31\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x19.meshtastic.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"P\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b \x01(\r\"\xc0\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12*\n\x05level\x18\x04 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x0bQueueStatus\x12\x0b\n\x03res\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 \x01(\r\x12\x0e\n\x06maxlen\x18\x03 \x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\xc3\x05\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12(\n\x06packet\x18\x02 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12)\n\x07my_info\x18\x03 \x01(\x0b\x32\x16.meshtastic.MyNodeInfoH\x00\x12)\n\tnode_info\x18\x04 \x01(\x0b\x32\x14.meshtastic.NodeInfoH\x00\x12$\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12+\n\nlog_record\x18\x06 \x01(\x0b\x32\x15.meshtastic.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x30\n\x0cmoduleConfig\x18\t \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12&\n\x07\x63hannel\x18\n \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12.\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32\x17.meshtastic.QueueStatusH\x00\x12*\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12.\n\x08metadata\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12(\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x14.meshtastic.FileInfoH\x00\x12<\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\x1e.meshtastic.ClientNotificationH\x00\x42\x11\n\x0fpayload_variant\"\x83\x01\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12*\n\x05level\x18\x03 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\tB\x0b\n\t_reply_id\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\x94\x02\n\x07ToRadio\x12(\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12*\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12*\n\theartbeat\x18\x07 \x01(\x0b\x32\x15.meshtastic.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"@\n\nCompressed\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x87\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\r\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\'\n\tneighbors\x18\x04 \x03(\x0b\x32\x14.meshtastic.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 \x01(\r\"\xad\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 \x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 \x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 \x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 \x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12+\n\x08hw_model\x18\t \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\"\x0b\n\tHeartbeat\"U\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12*\n\x03pin\x18\x02 \x01(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xaa\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12\x32\n\rresend_chunks\x18\x04 \x01(\x0b\x32\x19.meshtastic.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\x9a\x0b\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x14\n\x10SENSELORA_RP2040\x10\x1b\x12\x10\n\x0cSENSELORA_S3\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12 \n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xb4\x02\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\rB_\n\x13\x63om.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 23 | 24 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 25 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mesh_pb2', globals()) 26 | if _descriptor._USE_C_DESCRIPTORS == False: 27 | 28 | DESCRIPTOR._options = None 29 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 30 | _USER.fields_by_name['macaddr']._options = None 31 | _USER.fields_by_name['macaddr']._serialized_options = b'\030\001' 32 | _MESHPACKET.fields_by_name['delayed']._options = None 33 | _MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001' 34 | _HARDWAREMODEL._serialized_start=5700 35 | _HARDWAREMODEL._serialized_end=7134 36 | _CONSTANTS._serialized_start=7136 37 | _CONSTANTS._serialized_end=7180 38 | _CRITICALERRORCODE._serialized_start=7183 39 | _CRITICALERRORCODE._serialized_end=7491 40 | _POSITION._serialized_start=201 41 | _POSITION._serialized_end=1104 42 | _POSITION_LOCSOURCE._serialized_start=799 43 | _POSITION_LOCSOURCE._serialized_end=877 44 | _POSITION_ALTSOURCE._serialized_start=879 45 | _POSITION_ALTSOURCE._serialized_end=977 46 | _USER._serialized_start=1107 47 | _USER._serialized_end=1323 48 | _ROUTEDISCOVERY._serialized_start=1325 49 | _ROUTEDISCOVERY._serialized_end=1415 50 | _ROUTING._serialized_start=1418 51 | _ROUTING._serialized_end=1838 52 | _ROUTING_ERROR._serialized_start=1585 53 | _ROUTING_ERROR._serialized_end=1827 54 | _DATA._serialized_start=1841 55 | _DATA._serialized_end=2008 56 | _WAYPOINT._serialized_start=2011 57 | _WAYPOINT._serialized_end=2199 58 | _MQTTCLIENTPROXYMESSAGE._serialized_start=2201 59 | _MQTTCLIENTPROXYMESSAGE._serialized_end=2309 60 | _MESHPACKET._serialized_start=2312 61 | _MESHPACKET._serialized_end=2888 62 | _MESHPACKET_PRIORITY._serialized_start=2710 63 | _MESHPACKET_PRIORITY._serialized_end=2801 64 | _MESHPACKET_DELAYED._serialized_start=2803 65 | _MESHPACKET_DELAYED._serialized_end=2869 66 | _NODEINFO._serialized_start=2891 67 | _NODEINFO._serialized_end=3145 68 | _MYNODEINFO._serialized_start=3147 69 | _MYNODEINFO._serialized_end=3227 70 | _LOGRECORD._serialized_start=3230 71 | _LOGRECORD._serialized_end=3422 72 | _LOGRECORD_LEVEL._serialized_start=3334 73 | _LOGRECORD_LEVEL._serialized_end=3422 74 | _QUEUESTATUS._serialized_start=3424 75 | _QUEUESTATUS._serialized_end=3504 76 | _FROMRADIO._serialized_start=3507 77 | _FROMRADIO._serialized_end=4214 78 | _CLIENTNOTIFICATION._serialized_start=4217 79 | _CLIENTNOTIFICATION._serialized_end=4348 80 | _FILEINFO._serialized_start=4350 81 | _FILEINFO._serialized_end=4399 82 | _TORADIO._serialized_start=4402 83 | _TORADIO._serialized_end=4678 84 | _COMPRESSED._serialized_start=4680 85 | _COMPRESSED._serialized_end=4744 86 | _NEIGHBORINFO._serialized_start=4747 87 | _NEIGHBORINFO._serialized_end=4882 88 | _NEIGHBOR._serialized_start=4884 89 | _NEIGHBOR._serialized_end=4984 90 | _DEVICEMETADATA._serialized_start=4987 91 | _DEVICEMETADATA._serialized_end=5288 92 | _HEARTBEAT._serialized_start=5290 93 | _HEARTBEAT._serialized_end=5301 94 | _NODEREMOTEHARDWAREPIN._serialized_start=5303 95 | _NODEREMOTEHARDWAREPIN._serialized_end=5388 96 | _CHUNKEDPAYLOAD._serialized_start=5390 97 | _CHUNKEDPAYLOAD._serialized_end=5491 98 | _RESEND_CHUNKS._serialized_start=5493 99 | _RESEND_CHUNKS._serialized_end=5524 100 | _CHUNKEDPAYLOADRESPONSE._serialized_start=5527 101 | _CHUNKEDPAYLOADRESPONSE._serialized_end=5697 102 | # @@protoc_insertion_point(module_scope) 103 | -------------------------------------------------------------------------------- /meshtastic/module_config_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/module_config.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/module_config.proto\x12\nmeshtastic\"\xf0\"\n\x0cModuleConfig\x12\x33\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfigH\x00\x12\x37\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfigH\x00\x12T\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfigH\x00\x12\x44\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfigH\x00\x12>\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfigH\x00\x12=\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfigH\x00\x12\x46\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfigH\x00\x12\x35\n\x05\x61udio\x18\x08 \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfigH\x00\x12H\n\x0fremote_hardware\x18\t \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfigH\x00\x12\x44\n\rneighbor_info\x18\n \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfigH\x00\x12J\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfigH\x00\x12J\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfigH\x00\x12?\n\npaxcounter\x18\r \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfigH\x00\x1a\xb0\x02\n\nMQTTConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x1a\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x12\x14\n\x0cjson_enabled\x18\x06 \x01(\x08\x12\x13\n\x0btls_enabled\x18\x07 \x01(\x08\x12\x0c\n\x04root\x18\x08 \x01(\t\x12\x1f\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x12\x1d\n\x15map_reporting_enabled\x18\n \x01(\x08\x12G\n\x13map_report_settings\x18\x0b \x01(\x0b\x32*.meshtastic.ModuleConfig.MapReportSettings\x1aN\n\x11MapReportSettings\x12\x1d\n\x15publish_interval_secs\x18\x01 \x01(\r\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x1a\x82\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x35\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\x1a>\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x1a\xd2\x01\n\x15\x44\x65tectionSensorConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1e\n\x16minimum_broadcast_secs\x18\x02 \x01(\r\x12\x1c\n\x14state_broadcast_secs\x18\x03 \x01(\r\x12\x11\n\tsend_bell\x18\x04 \x01(\x08\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0bmonitor_pin\x18\x06 \x01(\r\x12 \n\x18\x64\x65tection_triggered_high\x18\x07 \x01(\x08\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\x1a\xe4\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12@\n\x07\x62itrate\x18\x03 \x01(\x0e\x32/.meshtastic.ModuleConfig.AudioConfig.Audio_Baud\x12\x0e\n\x06i2s_ws\x18\x04 \x01(\r\x12\x0e\n\x06i2s_sd\x18\x05 \x01(\r\x12\x0f\n\x07i2s_din\x18\x06 \x01(\r\x12\x0f\n\x07i2s_sck\x18\x07 \x01(\r\"\xa7\x01\n\nAudio_Baud\x12\x12\n\x0e\x43ODEC2_DEFAULT\x10\x00\x12\x0f\n\x0b\x43ODEC2_3200\x10\x01\x12\x0f\n\x0b\x43ODEC2_2400\x10\x02\x12\x0f\n\x0b\x43ODEC2_1600\x10\x03\x12\x0f\n\x0b\x43ODEC2_1400\x10\x04\x12\x0f\n\x0b\x43ODEC2_1300\x10\x05\x12\x0f\n\x0b\x43ODEC2_1200\x10\x06\x12\x0e\n\nCODEC2_700\x10\x07\x12\x0f\n\x0b\x43ODEC2_700B\x10\x08\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\xee\x04\n\x0cSerialConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0c\n\x04\x65\x63ho\x18\x02 \x01(\x08\x12\x0b\n\x03rxd\x18\x03 \x01(\r\x12\x0b\n\x03txd\x18\x04 \x01(\r\x12?\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12?\n\x04mode\x18\x07 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\x8a\x02\n\x0bSerial_Baud\x12\x10\n\x0c\x42\x41UD_DEFAULT\x10\x00\x12\x0c\n\x08\x42\x41UD_110\x10\x01\x12\x0c\n\x08\x42\x41UD_300\x10\x02\x12\x0c\n\x08\x42\x41UD_600\x10\x03\x12\r\n\tBAUD_1200\x10\x04\x12\r\n\tBAUD_2400\x10\x05\x12\r\n\tBAUD_4800\x10\x06\x12\r\n\tBAUD_9600\x10\x07\x12\x0e\n\nBAUD_19200\x10\x08\x12\x0e\n\nBAUD_38400\x10\t\x12\x0e\n\nBAUD_57600\x10\n\x12\x0f\n\x0b\x42\x41UD_115200\x10\x0b\x12\x0f\n\x0b\x42\x41UD_230400\x10\x0c\x12\x0f\n\x0b\x42\x41UD_460800\x10\r\x12\x0f\n\x0b\x42\x41UD_576000\x10\x0e\x12\x0f\n\x0b\x42\x41UD_921600\x10\x0f\"_\n\x0bSerial_Mode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\n\n\x06SIMPLE\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\x0b\n\x07TEXTMSG\x10\x03\x12\x08\n\x04NMEA\x10\x04\x12\x0b\n\x07\x43\x41LTOPO\x10\x05\x12\x08\n\x04WS85\x10\x06\x1a\xe9\x02\n\x1a\x45xternalNotificationConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\toutput_ms\x18\x02 \x01(\r\x12\x0e\n\x06output\x18\x03 \x01(\r\x12\x14\n\x0coutput_vibra\x18\x08 \x01(\r\x12\x15\n\routput_buzzer\x18\t \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x15\n\ralert_message\x18\x05 \x01(\x08\x12\x1b\n\x13\x61lert_message_vibra\x18\n \x01(\x08\x12\x1c\n\x14\x61lert_message_buzzer\x18\x0b \x01(\x08\x12\x12\n\nalert_bell\x18\x06 \x01(\x08\x12\x18\n\x10\x61lert_bell_vibra\x18\x0c \x01(\x08\x12\x19\n\x11\x61lert_bell_buzzer\x18\r \x01(\x08\x12\x0f\n\x07use_pwm\x18\x07 \x01(\x08\x12\x13\n\x0bnag_timeout\x18\x0e \x01(\r\x12\x19\n\x11use_i2s_as_buzzer\x18\x0f \x01(\x08\x1a\x97\x01\n\x12StoreForwardConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\theartbeat\x18\x02 \x01(\x08\x12\x0f\n\x07records\x18\x03 \x01(\r\x12\x1a\n\x12history_return_max\x18\x04 \x01(\r\x12\x1d\n\x15history_return_window\x18\x05 \x01(\r\x12\x11\n\tis_server\x18\x06 \x01(\x08\x1a@\n\x0fRangeTestConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0e\n\x06sender\x18\x02 \x01(\r\x12\x0c\n\x04save\x18\x03 \x01(\x08\x1a\xe6\x02\n\x0fTelemetryConfig\x12\x1e\n\x16\x64\x65vice_update_interval\x18\x01 \x01(\r\x12#\n\x1b\x65nvironment_update_interval\x18\x02 \x01(\r\x12\'\n\x1f\x65nvironment_measurement_enabled\x18\x03 \x01(\x08\x12\"\n\x1a\x65nvironment_screen_enabled\x18\x04 \x01(\x08\x12&\n\x1e\x65nvironment_display_fahrenheit\x18\x05 \x01(\x08\x12\x1b\n\x13\x61ir_quality_enabled\x18\x06 \x01(\x08\x12\x1c\n\x14\x61ir_quality_interval\x18\x07 \x01(\r\x12!\n\x19power_measurement_enabled\x18\x08 \x01(\x08\x12\x1d\n\x15power_update_interval\x18\t \x01(\r\x12\x1c\n\x14power_screen_enabled\x18\n \x01(\x08\x1a\xd6\x04\n\x13\x43\x61nnedMessageConfig\x12\x17\n\x0frotary1_enabled\x18\x01 \x01(\x08\x12\x19\n\x11inputbroker_pin_a\x18\x02 \x01(\r\x12\x19\n\x11inputbroker_pin_b\x18\x03 \x01(\r\x12\x1d\n\x15inputbroker_pin_press\x18\x04 \x01(\r\x12Y\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar\x12Z\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar\x12\\\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x17\n\x0fupdown1_enabled\x18\x08 \x01(\x08\x12\x0f\n\x07\x65nabled\x18\t \x01(\x08\x12\x1a\n\x12\x61llow_input_source\x18\n \x01(\t\x12\x11\n\tsend_bell\x18\x0b \x01(\x08\"c\n\x0eInputEventChar\x12\x08\n\x04NONE\x10\x00\x12\x06\n\x02UP\x10\x11\x12\x08\n\x04\x44OWN\x10\x12\x12\x08\n\x04LEFT\x10\x13\x12\t\n\x05RIGHT\x10\x14\x12\n\n\x06SELECT\x10\n\x12\x08\n\x04\x42\x41\x43K\x10\x1b\x12\n\n\x06\x43\x41NCEL\x10\x18\x1a\x65\n\x15\x41mbientLightingConfig\x12\x11\n\tled_state\x18\x01 \x01(\x08\x12\x0f\n\x07\x63urrent\x18\x02 \x01(\r\x12\x0b\n\x03red\x18\x03 \x01(\r\x12\r\n\x05green\x18\x04 \x01(\r\x12\x0c\n\x04\x62lue\x18\x05 \x01(\rB\x11\n\x0fpayload_variant\"d\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12/\n\x04type\x18\x03 \x01(\x0e\x32!.meshtastic.RemoteHardwarePinType*I\n\x15RemoteHardwarePinType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x10\n\x0c\x44IGITAL_READ\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x42g\n\x13\x63om.geeksville.meshB\x12ModuleConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.module_config_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _REMOTEHARDWAREPINTYPE._serialized_start=4615 25 | _REMOTEHARDWAREPINTYPE._serialized_end=4688 26 | _MODULECONFIG._serialized_start=47 27 | _MODULECONFIG._serialized_end=4511 28 | _MODULECONFIG_MQTTCONFIG._serialized_start=945 29 | _MODULECONFIG_MQTTCONFIG._serialized_end=1249 30 | _MODULECONFIG_MAPREPORTSETTINGS._serialized_start=1251 31 | _MODULECONFIG_MAPREPORTSETTINGS._serialized_end=1329 32 | _MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=1332 33 | _MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=1462 34 | _MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=1464 35 | _MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=1526 36 | _MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=1529 37 | _MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=1739 38 | _MODULECONFIG_AUDIOCONFIG._serialized_start=1742 39 | _MODULECONFIG_AUDIOCONFIG._serialized_end=2098 40 | _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=1931 41 | _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=2098 42 | _MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=2100 43 | _MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=2218 44 | _MODULECONFIG_SERIALCONFIG._serialized_start=2221 45 | _MODULECONFIG_SERIALCONFIG._serialized_end=2843 46 | _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=2480 47 | _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=2746 48 | _MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=2748 49 | _MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=2843 50 | _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=2846 51 | _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=3207 52 | _MODULECONFIG_STOREFORWARDCONFIG._serialized_start=3210 53 | _MODULECONFIG_STOREFORWARDCONFIG._serialized_end=3361 54 | _MODULECONFIG_RANGETESTCONFIG._serialized_start=3363 55 | _MODULECONFIG_RANGETESTCONFIG._serialized_end=3427 56 | _MODULECONFIG_TELEMETRYCONFIG._serialized_start=3430 57 | _MODULECONFIG_TELEMETRYCONFIG._serialized_end=3788 58 | _MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=3791 59 | _MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=4389 60 | _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=4290 61 | _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=4389 62 | _MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=4391 63 | _MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=4492 64 | _REMOTEHARDWAREPIN._serialized_start=4513 65 | _REMOTEHARDWAREPIN._serialized_end=4613 66 | # @@protoc_insertion_point(module_scope) 67 | -------------------------------------------------------------------------------- /meshtastic/mqtt_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/mqtt.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | from meshtastic import config_pb2 as meshtastic_dot_config__pb2 15 | from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2 16 | 17 | 18 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mqtt.proto\x12\nmeshtastic\x1a\x17meshtastic/config.proto\x1a\x15meshtastic/mesh.proto\"a\n\x0fServiceEnvelope\x12&\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\xbc\x03\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12\x32\n\x04role\x18\x03 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12+\n\x08hw_model\x18\x04 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x38\n\x06region\x18\x06 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12?\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x1b\n\x13has_default_channel\x18\x08 \x01(\x08\x12\x12\n\nlatitude_i\x18\t \x01(\x0f\x12\x13\n\x0blongitude_i\x18\n \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x0b \x01(\x05\x12\x1a\n\x12position_precision\x18\x0c \x01(\r\x12\x1e\n\x16num_online_local_nodes\x18\r \x01(\rB_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 19 | 20 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 21 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mqtt_pb2', globals()) 22 | if _descriptor._USE_C_DESCRIPTORS == False: 23 | 24 | DESCRIPTOR._options = None 25 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 26 | _SERVICEENVELOPE._serialized_start=85 27 | _SERVICEENVELOPE._serialized_end=182 28 | _MAPREPORT._serialized_start=185 29 | _MAPREPORT._serialized_end=629 30 | # @@protoc_insertion_point(module_scope) 31 | -------------------------------------------------------------------------------- /meshtastic/paxcount_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/paxcount.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/paxcount.proto\x12\nmeshtastic\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\rBc\n\x13\x63om.geeksville.meshB\x0ePaxcountProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.paxcount_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _PAXCOUNT._serialized_start=41 25 | _PAXCOUNT._serialized_end=94 26 | # @@protoc_insertion_point(module_scope) 27 | -------------------------------------------------------------------------------- /meshtastic/portnums_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/portnums.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/portnums.proto\x12\nmeshtastic*\xa2\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42]\n\x13\x63om.geeksville.meshB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.portnums_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _PORTNUM._serialized_start=42 25 | _PORTNUM._serialized_end=588 26 | # @@protoc_insertion_point(module_scope) 27 | -------------------------------------------------------------------------------- /meshtastic/remote_hardware_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/remote_hardware.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/remote_hardware.proto\x12\nmeshtastic\"\xd6\x01\n\x0fHardwareMessage\x12.\n\x04type\x18\x01 \x01(\x0e\x32 .meshtastic.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42\x63\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.remote_hardware_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _HARDWAREMESSAGE._serialized_start=49 25 | _HARDWAREMESSAGE._serialized_end=263 26 | _HARDWAREMESSAGE_TYPE._serialized_start=155 27 | _HARDWAREMESSAGE_TYPE._serialized_end=263 28 | # @@protoc_insertion_point(module_scope) 29 | -------------------------------------------------------------------------------- /meshtastic/rtttl_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/rtttl.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/rtttl.proto\x12\nmeshtastic\"\x1f\n\x0bRTTTLConfig\x12\x10\n\x08ringtone\x18\x01 \x01(\tBf\n\x13\x63om.geeksville.meshB\x11RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.rtttl_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\021RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _RTTTLCONFIG._serialized_start=38 25 | _RTTTLCONFIG._serialized_end=69 26 | # @@protoc_insertion_point(module_scope) 27 | -------------------------------------------------------------------------------- /meshtastic/storeforward_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/storeforward.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/storeforward.proto\x12\nmeshtastic\"\x9c\x07\n\x0fStoreAndForward\x12\x37\n\x02rr\x18\x01 \x01(\x0e\x32+.meshtastic.StoreAndForward.RequestResponse\x12\x37\n\x05stats\x18\x02 \x01(\x0b\x32&.meshtastic.StoreAndForward.StatisticsH\x00\x12\x36\n\x07history\x18\x03 \x01(\x0b\x32#.meshtastic.StoreAndForward.HistoryH\x00\x12:\n\theartbeat\x18\x04 \x01(\x0b\x32%.meshtastic.StoreAndForward.HeartbeatH\x00\x12\x0e\n\x04text\x18\x05 \x01(\x0cH\x00\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBj\n\x13\x63om.geeksville.meshB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.storeforward_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _STOREANDFORWARD._serialized_start=46 25 | _STOREANDFORWARD._serialized_end=970 26 | _STOREANDFORWARD_STATISTICS._serialized_start=312 27 | _STOREANDFORWARD_STATISTICS._serialized_end=517 28 | _STOREANDFORWARD_HISTORY._serialized_start=519 29 | _STOREANDFORWARD_HISTORY._serialized_end=592 30 | _STOREANDFORWARD_HEARTBEAT._serialized_start=594 31 | _STOREANDFORWARD_HEARTBEAT._serialized_end=640 32 | _STOREANDFORWARD_REQUESTRESPONSE._serialized_start=643 33 | _STOREANDFORWARD_REQUESTRESPONSE._serialized_end=959 34 | # @@protoc_insertion_point(module_scope) 35 | -------------------------------------------------------------------------------- /meshtastic/telemetry_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/telemetry.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/telemetry.proto\x12\nmeshtastic\"\xf3\x01\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07voltage\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x63hannel_utilization\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x1b\n\x0euptime_seconds\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x10\n\x0e_battery_levelB\n\n\x08_voltageB\x16\n\x14_channel_utilizationB\x0e\n\x0c_air_util_txB\x11\n\x0f_uptime_seconds\"\xa4\x05\n\x12\x45nvironmentMetrics\x12\x18\n\x0btemperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11relative_humidity\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1b\n\x0egas_resistance\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x14\n\x07voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x14\n\x07\x63urrent\x18\x06 \x01(\x02H\x05\x88\x01\x01\x12\x10\n\x03iaq\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x10\n\x03lux\x18\t \x01(\x02H\x08\x88\x01\x01\x12\x16\n\twhite_lux\x18\n \x01(\x02H\t\x88\x01\x01\x12\x13\n\x06ir_lux\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x13\n\x06uv_lux\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x1b\n\x0ewind_direction\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x17\n\nwind_speed\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x13\n\x06weight\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x16\n\twind_gust\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x16\n\twind_lull\x18\x11 \x01(\x02H\x10\x88\x01\x01\x42\x0e\n\x0c_temperatureB\x14\n\x12_relative_humidityB\x16\n\x14_barometric_pressureB\x11\n\x0f_gas_resistanceB\n\n\x08_voltageB\n\n\x08_currentB\x06\n\x04_iaqB\x0b\n\t_distanceB\x06\n\x04_luxB\x0c\n\n_white_luxB\t\n\x07_ir_luxB\t\n\x07_uv_luxB\x11\n\x0f_wind_directionB\r\n\x0b_wind_speedB\t\n\x07_weightB\x0c\n\n_wind_gustB\x0c\n\n_wind_lull\"\x8a\x02\n\x0cPowerMetrics\x12\x18\n\x0b\x63h1_voltage\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x18\n\x0b\x63h1_current\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0b\x63h2_voltage\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x63h2_current\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x18\n\x0b\x63h3_voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x18\n\x0b\x63h3_current\x18\x06 \x01(\x02H\x05\x88\x01\x01\x42\x0e\n\x0c_ch1_voltageB\x0e\n\x0c_ch1_currentB\x0e\n\x0c_ch2_voltageB\x0e\n\x0c_ch2_currentB\x0e\n\x0c_ch3_voltageB\x0e\n\x0c_ch3_current\"\xeb\x04\n\x11\x41irQualityMetrics\x12\x1a\n\rpm10_standard\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rpm25_standard\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0epm100_standard\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12pm10_environmental\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x1f\n\x12pm25_environmental\x18\x05 \x01(\rH\x04\x88\x01\x01\x12 \n\x13pm100_environmental\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eparticles_03um\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x1b\n\x0eparticles_05um\x18\x08 \x01(\rH\x07\x88\x01\x01\x12\x1b\n\x0eparticles_10um\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1b\n\x0eparticles_25um\x18\n \x01(\rH\t\x88\x01\x01\x12\x1b\n\x0eparticles_50um\x18\x0b \x01(\rH\n\x88\x01\x01\x12\x1c\n\x0fparticles_100um\x18\x0c \x01(\rH\x0b\x88\x01\x01\x42\x10\n\x0e_pm10_standardB\x10\n\x0e_pm25_standardB\x11\n\x0f_pm100_standardB\x15\n\x13_pm10_environmentalB\x15\n\x13_pm25_environmentalB\x16\n\x14_pm100_environmentalB\x11\n\x0f_particles_03umB\x11\n\x0f_particles_05umB\x11\n\x0f_particles_10umB\x11\n\x0f_particles_25umB\x11\n\x0f_particles_50umB\x12\n\x10_particles_100um\"\xd5\x01\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\x02\x12\x16\n\x0enum_packets_tx\x18\x04 \x01(\r\x12\x16\n\x0enum_packets_rx\x18\x05 \x01(\r\x12\x1a\n\x12num_packets_rx_bad\x18\x06 \x01(\r\x12\x18\n\x10num_online_nodes\x18\x07 \x01(\r\x12\x17\n\x0fnum_total_nodes\x18\x08 \x01(\r\"\xb8\x02\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12\x33\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\x19.meshtastic.DeviceMetricsH\x00\x12=\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\x1e.meshtastic.EnvironmentMetricsH\x00\x12<\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32\x1d.meshtastic.AirQualityMetricsH\x00\x12\x31\n\rpower_metrics\x18\x05 \x01(\x0b\x32\x18.meshtastic.PowerMetricsH\x00\x12-\n\x0blocal_stats\x18\x06 \x01(\x0b\x32\x16.meshtastic.LocalStatsH\x00\x42\t\n\x07variant\">\n\rNau7802Config\x12\x12\n\nzeroOffset\x18\x01 \x01(\x05\x12\x19\n\x11\x63\x61librationFactor\x18\x02 \x01(\x02*\x92\x03\n\x13TelemetrySensorType\x12\x10\n\x0cSENSOR_UNSET\x10\x00\x12\n\n\x06\x42ME280\x10\x01\x12\n\n\x06\x42ME680\x10\x02\x12\x0b\n\x07MCP9808\x10\x03\x12\n\n\x06INA260\x10\x04\x12\n\n\x06INA219\x10\x05\x12\n\n\x06\x42MP280\x10\x06\x12\t\n\x05SHTC3\x10\x07\x12\t\n\x05LPS22\x10\x08\x12\x0b\n\x07QMC6310\x10\t\x12\x0b\n\x07QMI8658\x10\n\x12\x0c\n\x08QMC5883L\x10\x0b\x12\t\n\x05SHT31\x10\x0c\x12\x0c\n\x08PMSA003I\x10\r\x12\x0b\n\x07INA3221\x10\x0e\x12\n\n\x06\x42MP085\x10\x0f\x12\x0c\n\x08RCWL9620\x10\x10\x12\t\n\x05SHT4X\x10\x11\x12\x0c\n\x08VEML7700\x10\x12\x12\x0c\n\x08MLX90632\x10\x13\x12\x0b\n\x07OPT3001\x10\x14\x12\x0c\n\x08LTR390UV\x10\x15\x12\x0e\n\nTSL25911FN\x10\x16\x12\t\n\x05\x41HT10\x10\x17\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x18\x12\x0b\n\x07NAU7802\x10\x19\x12\n\n\x06\x42MP3XX\x10\x1a\x12\x0c\n\x08ICM20948\x10\x1b\x12\x0c\n\x08MAX17048\x10\x1c\x42\x64\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.telemetry_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _TELEMETRYSENSORTYPE._serialized_start=2454 25 | _TELEMETRYSENSORTYPE._serialized_end=2856 26 | _DEVICEMETRICS._serialized_start=43 27 | _DEVICEMETRICS._serialized_end=286 28 | _ENVIRONMENTMETRICS._serialized_start=289 29 | _ENVIRONMENTMETRICS._serialized_end=965 30 | _POWERMETRICS._serialized_start=968 31 | _POWERMETRICS._serialized_end=1234 32 | _AIRQUALITYMETRICS._serialized_start=1237 33 | _AIRQUALITYMETRICS._serialized_end=1856 34 | _LOCALSTATS._serialized_start=1859 35 | _LOCALSTATS._serialized_end=2072 36 | _TELEMETRY._serialized_start=2075 37 | _TELEMETRY._serialized_end=2387 38 | _NAU7802CONFIG._serialized_start=2389 39 | _NAU7802CONFIG._serialized_end=2451 40 | # @@protoc_insertion_point(module_scope) 41 | -------------------------------------------------------------------------------- /meshtastic/xmodem_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: meshtastic/xmodem.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf.internal import builder as _builder 6 | from google.protobuf import descriptor as _descriptor 7 | from google.protobuf import descriptor_pool as _descriptor_pool 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/xmodem.proto\x12\nmeshtastic\"\xb6\x01\n\x06XModem\x12+\n\x07\x63ontrol\x18\x01 \x01(\x0e\x32\x1a.meshtastic.XModem.Control\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\r\n\x05\x63rc16\x18\x03 \x01(\r\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\"S\n\x07\x43ontrol\x12\x07\n\x03NUL\x10\x00\x12\x07\n\x03SOH\x10\x01\x12\x07\n\x03STX\x10\x02\x12\x07\n\x03\x45OT\x10\x04\x12\x07\n\x03\x41\x43K\x10\x06\x12\x07\n\x03NAK\x10\x15\x12\x07\n\x03\x43\x41N\x10\x18\x12\t\n\x05\x43TRLZ\x10\x1a\x42\x61\n\x13\x63om.geeksville.meshB\x0cXmodemProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') 17 | 18 | _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) 19 | _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.xmodem_pb2', globals()) 20 | if _descriptor._USE_C_DESCRIPTORS == False: 21 | 22 | DESCRIPTOR._options = None 23 | DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014XmodemProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' 24 | _XMODEM._serialized_start=40 25 | _XMODEM._serialized_end=222 26 | _XMODEM_CONTROL._serialized_start=139 27 | _XMODEM_CONTROL._serialized_end=222 28 | # @@protoc_insertion_point(module_scope) 29 | -------------------------------------------------------------------------------- /meshview/1x1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armooo/meshview/c0641147cbd380de95fa9e2a720bcc556fe74150/meshview/1x1.png -------------------------------------------------------------------------------- /meshview/database.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy.ext.asyncio import async_sessionmaker 2 | from sqlalchemy.ext.asyncio import AsyncSession 3 | from sqlalchemy.ext.asyncio import create_async_engine 4 | 5 | from meshview import models 6 | 7 | 8 | def init_database(database_connetion_string): 9 | global engine, async_session 10 | kwargs = {} 11 | if not database_connetion_string.startswith('sqlite'): 12 | kwargs['pool_size'] = 20 13 | kwargs['max_overflow'] = 50 14 | engine = create_async_engine(database_connetion_string, echo=False, **kwargs) 15 | async_session = async_sessionmaker(engine, expire_on_commit=False) 16 | 17 | 18 | async def create_tables(): 19 | async with engine.begin() as conn: 20 | await conn.run_sync(models.Base.metadata.create_all) 21 | -------------------------------------------------------------------------------- /meshview/decode_payload.py: -------------------------------------------------------------------------------- 1 | from meshtastic.portnums_pb2 import PortNum 2 | from meshtastic.mesh_pb2 import ( 3 | Position, 4 | NeighborInfo, 5 | NodeInfo, 6 | User, 7 | RouteDiscovery, 8 | Routing, 9 | MeshPacket, 10 | ) 11 | from meshtastic.telemetry_pb2 import Telemetry 12 | from google.protobuf.message import DecodeError 13 | 14 | 15 | def text_message(payload): 16 | return payload.decode("utf-8") 17 | 18 | 19 | DECODE_MAP = { 20 | PortNum.POSITION_APP: Position.FromString, 21 | PortNum.NEIGHBORINFO_APP: NeighborInfo.FromString, 22 | PortNum.NODEINFO_APP: User.FromString, 23 | PortNum.TELEMETRY_APP: Telemetry.FromString, 24 | PortNum.TRACEROUTE_APP: RouteDiscovery.FromString, 25 | PortNum.ROUTING_APP: Routing.FromString, 26 | PortNum.TEXT_MESSAGE_APP: text_message, 27 | } 28 | 29 | 30 | def decode_payload(portnum, payload): 31 | if portnum not in DECODE_MAP: 32 | return None 33 | try: 34 | payload = DECODE_MAP[portnum](payload) 35 | except (DecodeError, UnicodeDecodeError): 36 | print(payload, flush=True) 37 | return None 38 | return payload 39 | 40 | 41 | def decode(packet): 42 | try: 43 | mesh_packet = MeshPacket.FromString(packet.payload) 44 | except DecodeError: 45 | return None, None 46 | 47 | payload = decode_payload(mesh_packet.decoded.portnum, mesh_packet.decoded.payload) 48 | if payload is None: 49 | return mesh_packet, None 50 | 51 | return mesh_packet, payload 52 | -------------------------------------------------------------------------------- /meshview/http.py: -------------------------------------------------------------------------------- 1 | from aiohttp import web 2 | 3 | 4 | async def redirect(request): 5 | return web.Response( 6 | status=307, 7 | headers={"location": "https://meshview.armooo.net" + str(request.rel_url)}, 8 | ) 9 | 10 | 11 | async def run_server(bind, path): 12 | app = web.Application() 13 | app.add_routes( 14 | [ 15 | web.static("/.well-known/acme-challenge", path), 16 | web.get("/{tail:.*}", redirect), 17 | ] 18 | ) 19 | runner = web.AppRunner(app) 20 | await runner.setup() 21 | for host in bind: 22 | site = web.TCPSite(runner, host, 80) 23 | await site.start() 24 | -------------------------------------------------------------------------------- /meshview/models.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | from sqlalchemy.orm import DeclarativeBase, foreign 4 | from sqlalchemy.ext.asyncio import AsyncAttrs 5 | from sqlalchemy.orm import mapped_column, relationship, Mapped 6 | from sqlalchemy import ForeignKey, BigInteger 7 | 8 | 9 | class Base(AsyncAttrs, DeclarativeBase): 10 | pass 11 | 12 | 13 | class Node(Base): 14 | __tablename__ = "node" 15 | id: Mapped[str] = mapped_column(primary_key=True) 16 | node_id: Mapped[int] = mapped_column(BigInteger, nullable=True, unique=True) 17 | long_name: Mapped[str] 18 | short_name: Mapped[str] 19 | hw_model: Mapped[str] 20 | role: Mapped[str] = mapped_column(nullable=True) 21 | last_lat: Mapped[int] = mapped_column(BigInteger, nullable=True) 22 | last_long: Mapped[int] = mapped_column(BigInteger, nullable=True) 23 | 24 | 25 | class Packet(Base): 26 | __tablename__ = "packet" 27 | id: Mapped[int] = mapped_column(BigInteger, primary_key=True) 28 | portnum: Mapped[int] 29 | from_node_id: Mapped[int] = mapped_column(BigInteger) 30 | from_node: Mapped["Node"] = relationship( 31 | primaryjoin="Packet.from_node_id == foreign(Node.node_id)", lazy="joined" 32 | ) 33 | to_node_id: Mapped[int] = mapped_column(BigInteger) 34 | to_node: Mapped["Node"] = relationship( 35 | primaryjoin="Packet.to_node_id == foreign(Node.node_id)", lazy="joined" 36 | ) 37 | payload: Mapped[bytes] 38 | import_time: Mapped[datetime] 39 | 40 | 41 | class PacketSeen(Base): 42 | __tablename__ = "packet_seen" 43 | packet_id = mapped_column(ForeignKey("packet.id"), primary_key=True) 44 | node_id: Mapped[int] = mapped_column(BigInteger, primary_key=True) 45 | node: Mapped["Node"] = relationship( 46 | lazy="joined", primaryjoin="PacketSeen.node_id == foreign(Node.node_id)" 47 | ) 48 | rx_time: Mapped[int] = mapped_column(BigInteger, primary_key=True) 49 | hop_limit: Mapped[int] 50 | hop_start: Mapped[int] = mapped_column(nullable=True) 51 | channel: Mapped[str] 52 | rx_snr: Mapped[float] = mapped_column(nullable=True) 53 | rx_rssi: Mapped[int] = mapped_column(nullable=True) 54 | topic: Mapped[str] 55 | import_time: Mapped[datetime] 56 | 57 | 58 | class Traceroute(Base): 59 | __tablename__ = "traceroute" 60 | id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) 61 | packet_id = mapped_column(ForeignKey("packet.id")) 62 | packet: Mapped["Packet"] = relationship( 63 | primaryjoin="Traceroute.packet_id == foreign(Packet.id)", lazy="joined" 64 | ) 65 | gateway_node_id: Mapped[int] = mapped_column(BigInteger) 66 | done: Mapped[bool] 67 | route: Mapped[bytes] 68 | import_time: Mapped[datetime] 69 | 70 | -------------------------------------------------------------------------------- /meshview/mqtt_reader.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import asyncio 3 | import random 4 | 5 | import aiomqtt 6 | from google.protobuf.message import DecodeError 7 | from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes 8 | 9 | from meshtastic.mqtt_pb2 import ServiceEnvelope 10 | 11 | KEY = base64.b64decode("1PG7OiApB1nwvP+rz05pAQ==") 12 | 13 | 14 | def decrypt(packet): 15 | if packet.HasField("decoded"): 16 | return 17 | packet_id = packet.id.to_bytes(8, "little") 18 | from_node_id = getattr(packet, "from").to_bytes(8, "little") 19 | nonce = packet_id + from_node_id 20 | 21 | cipher = Cipher(algorithms.AES(KEY), modes.CTR(nonce)) 22 | decryptor = cipher.decryptor() 23 | raw_proto = decryptor.update(packet.encrypted) + decryptor.finalize() 24 | try: 25 | packet.decoded.ParseFromString(raw_proto) 26 | except DecodeError: 27 | pass 28 | 29 | 30 | async def get_topic_envelopes(mqtt_server, topics): 31 | identifier = str(random.getrandbits(16)) 32 | while True: 33 | try: 34 | async with aiomqtt.Client( 35 | mqtt_server, username="meshdev", password="large4cats" , identifier=identifier, 36 | ) as client: 37 | for topic in topics: 38 | await client.subscribe(topic) 39 | async for msg in client.messages: 40 | try: 41 | envelope = ServiceEnvelope.FromString(msg.payload) 42 | except DecodeError: 43 | continue 44 | decrypt(envelope.packet) 45 | if not envelope.packet.decoded: 46 | continue 47 | yield msg.topic.value, envelope 48 | except aiomqtt.MqttError as e: 49 | await asyncio.sleep(1) 50 | -------------------------------------------------------------------------------- /meshview/notify.py: -------------------------------------------------------------------------------- 1 | import contextlib 2 | from collections import defaultdict 3 | import asyncio 4 | 5 | waiting_node_ids_events = defaultdict(set) 6 | 7 | 8 | class NodeEvent: 9 | def __init__(self, node_id): 10 | self.node_id = node_id 11 | self.event = asyncio.Event() 12 | self.packets = [] 13 | self.uplinked = [] 14 | 15 | async def wait(self): 16 | await self.event.wait() 17 | 18 | def set(self): 19 | return self.event.set() 20 | 21 | def is_set(self): 22 | return self.event.is_set() 23 | 24 | def clear(self): 25 | del self.packets[:] 26 | del self.uplinked[:] 27 | return self.event.clear() 28 | 29 | 30 | def create_event(node_id): 31 | event = NodeEvent(node_id) 32 | waiting_node_ids_events[node_id].add(event) 33 | return event 34 | 35 | 36 | def remove_event(node_event): 37 | print("removing event") 38 | waiting_node_ids_events[node_event.node_id].remove(node_event) 39 | 40 | 41 | def notify_packet(node_id, packet): 42 | for event in waiting_node_ids_events[node_id]: 43 | event.packets.append(packet) 44 | event.set() 45 | 46 | 47 | def notify_uplinked(node_id, packet): 48 | for event in waiting_node_ids_events[node_id]: 49 | event.uplinked.append(packet) 50 | event.set() 51 | 52 | 53 | @contextlib.contextmanager 54 | def subscribe(node_id): 55 | event = create_event(node_id) 56 | try: 57 | yield event 58 | finally: 59 | remove_event(event) 60 | -------------------------------------------------------------------------------- /meshview/store.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | from sqlalchemy import select, func 4 | from sqlalchemy.orm import lazyload 5 | 6 | from meshtastic.config_pb2 import Config 7 | from meshtastic.portnums_pb2 import PortNum 8 | from meshtastic.mesh_pb2 import User, HardwareModel 9 | from meshview import database 10 | from meshview import decode_payload 11 | from meshview.models import Packet, PacketSeen, Node, Traceroute 12 | from meshview import notify 13 | 14 | 15 | async def process_envelope(topic, env): 16 | if not env.packet.id: 17 | return 18 | 19 | async with database.async_session() as session: 20 | result = await session.execute(select(Packet).where(Packet.id == env.packet.id)) 21 | new_packet = False 22 | packet = result.scalar_one_or_none() 23 | if not packet: 24 | new_packet = True 25 | packet = Packet( 26 | id=env.packet.id, 27 | portnum=env.packet.decoded.portnum, 28 | from_node_id=getattr(env.packet, "from"), 29 | to_node_id=env.packet.to, 30 | payload=env.packet.SerializeToString(), 31 | import_time=datetime.datetime.utcnow(), 32 | ) 33 | session.add(packet) 34 | 35 | result = await session.execute( 36 | select(PacketSeen).where( 37 | PacketSeen.packet_id == env.packet.id, 38 | PacketSeen.node_id == int(env.gateway_id[1:], 16), 39 | PacketSeen.rx_time == env.packet.rx_time, 40 | ) 41 | ) 42 | seen = None 43 | if not result.scalar_one_or_none(): 44 | seen = PacketSeen( 45 | packet_id=env.packet.id, 46 | node_id=int(env.gateway_id[1:], 16), 47 | channel=env.channel_id, 48 | rx_time=env.packet.rx_time, 49 | rx_snr=env.packet.rx_snr, 50 | rx_rssi=env.packet.rx_rssi, 51 | hop_limit=env.packet.hop_limit, 52 | hop_start=env.packet.hop_start, 53 | topic=topic, 54 | import_time=datetime.datetime.utcnow(), 55 | ) 56 | session.add(seen) 57 | 58 | if env.packet.decoded.portnum == PortNum.NODEINFO_APP: 59 | user = decode_payload.decode_payload( 60 | PortNum.NODEINFO_APP, env.packet.decoded.payload 61 | ) 62 | if user: 63 | result = await session.execute(select(Node).where(Node.id == user.id)) 64 | if user.id and user.id[0] == "!": 65 | try: 66 | node_id = int(user.id[1:], 16) 67 | except ValueError: 68 | node_id = None 69 | pass 70 | else: 71 | node_id = None 72 | 73 | try: 74 | hw_model = HardwareModel.Name(user.hw_model) 75 | except ValueError: 76 | hw_model = "unknown" 77 | try: 78 | role = Config.DeviceConfig.Role.Name(user.role) 79 | except ValueError: 80 | role = "unknown" 81 | 82 | if node := result.scalar_one_or_none(): 83 | node.node_id = node_id 84 | node.long_name = user.long_name 85 | node.short_name = user.short_name 86 | node.hw_model = hw_model 87 | node.role = role 88 | else: 89 | node = Node( 90 | id=user.id, 91 | node_id=node_id, 92 | long_name=user.long_name, 93 | short_name=user.short_name, 94 | hw_model=hw_model, 95 | role=role, 96 | ) 97 | session.add(node) 98 | 99 | if env.packet.decoded.portnum == PortNum.POSITION_APP: 100 | position = decode_payload.decode_payload( 101 | PortNum.POSITION_APP, env.packet.decoded.payload 102 | ) 103 | if position and position.latitude_i and position.longitude_i: 104 | from_node_id = getattr(env.packet, 'from') 105 | node = (await session.execute(select(Node).where(Node.node_id == from_node_id))).scalar_one_or_none() 106 | if node: 107 | node.last_lat = position.latitude_i 108 | node.last_long = position.longitude_i 109 | session.add(node) 110 | 111 | if env.packet.decoded.portnum == PortNum.TRACEROUTE_APP: 112 | packet_id = None 113 | if env.packet.decoded.want_response: 114 | packet_id = env.packet.id 115 | else: 116 | result = await session.execute(select(Packet).where(Packet.id == env.packet.decoded.request_id)) 117 | if result.scalar_one_or_none(): 118 | packet_id = env.packet.decoded.request_id 119 | if packet_id is not None: 120 | session.add(Traceroute( 121 | packet_id=packet_id, 122 | route=env.packet.decoded.payload, 123 | done=not env.packet.decoded.want_response, 124 | gateway_node_id=int(env.gateway_id[1:], 16), 125 | import_time=datetime.datetime.utcnow(), 126 | )) 127 | 128 | await session.commit() 129 | if new_packet: 130 | await packet.awaitable_attrs.to_node 131 | await packet.awaitable_attrs.from_node 132 | notify.notify_packet(packet.to_node_id, packet) 133 | notify.notify_packet(packet.from_node_id, packet) 134 | notify.notify_packet(None, packet) 135 | if seen: 136 | notify.notify_uplinked(seen.node_id, packet) 137 | 138 | 139 | async def get_node(node_id): 140 | async with database.async_session() as session: 141 | result = await session.execute(select(Node).where(Node.node_id == node_id)) 142 | return result.scalar_one_or_none() 143 | 144 | 145 | async def get_fuzzy_nodes(query): 146 | async with database.async_session() as session: 147 | q = select(Node).where( 148 | Node.id.ilike(query + "%") 149 | | Node.long_name.ilike(query + "%") 150 | | Node.short_name.ilike(query + "%") 151 | ) 152 | result = await session.execute(q) 153 | return result.scalars() 154 | 155 | 156 | async def get_packets(node_id=None, portnum=None, since=None, limit=500, before=None, after=None): 157 | async with database.async_session() as session: 158 | q = select(Packet) 159 | 160 | if node_id: 161 | q = q.where( 162 | (Packet.from_node_id == node_id) | (Packet.to_node_id == node_id) 163 | ) 164 | if portnum: 165 | q = q.where(Packet.portnum == portnum) 166 | if since: 167 | q = q.where(Packet.import_time > (datetime.datetime.utcnow() - since)) 168 | if before: 169 | q = q.where(Packet.import_time < before) 170 | if after: 171 | q = q.where(Packet.import_time > after) 172 | if limit is not None: 173 | q = q.limit(limit) 174 | 175 | result = await session.execute(q.order_by(Packet.import_time.desc())) 176 | return result.scalars() 177 | 178 | 179 | async def get_packets_from(node_id=None, portnum=None, since=None, limit=500): 180 | async with database.async_session() as session: 181 | q = select(Packet) 182 | 183 | if node_id: 184 | q = q.where( 185 | Packet.from_node_id == node_id 186 | ) 187 | if portnum: 188 | q = q.where(Packet.portnum == portnum) 189 | if since: 190 | q = q.where(Packet.import_time > (datetime.datetime.utcnow() - since)) 191 | result = await session.execute(q.limit(limit).order_by(Packet.import_time.desc())) 192 | return result.scalars() 193 | 194 | 195 | async def get_packet(packet_id): 196 | async with database.async_session() as session: 197 | q = select(Packet).where(Packet.id == packet_id) 198 | result = await session.execute(q) 199 | return result.scalar_one_or_none() 200 | 201 | 202 | async def get_uplinked_packets(node_id, portnum=None): 203 | async with database.async_session() as session: 204 | q = select(Packet).join(PacketSeen).where(PacketSeen.node_id == node_id).order_by(Packet.import_time.desc()).limit(500) 205 | if portnum: 206 | q = q.where(Packet.portnum == portnum) 207 | result = await session.execute(q) 208 | return result.scalars() 209 | 210 | 211 | async def get_packets_seen(packet_id): 212 | async with database.async_session() as session: 213 | result = await session.execute( 214 | select(PacketSeen) 215 | .where(PacketSeen.packet_id == packet_id) 216 | .order_by(PacketSeen.import_time.desc()) 217 | ) 218 | return result.scalars() 219 | 220 | 221 | async def has_packets(node_id, portnum): 222 | async with database.async_session() as session: 223 | return bool( 224 | (await session.execute( 225 | select(Packet.id).where(Packet.from_node_id == node_id).limit(1) 226 | )).scalar() 227 | ) 228 | 229 | 230 | async def get_traceroute(packet_id): 231 | async with database.async_session() as session: 232 | result = await session.execute( 233 | select(Traceroute) 234 | .where(Traceroute.packet_id == packet_id) 235 | .order_by(Traceroute.import_time) 236 | ) 237 | return result.scalars() 238 | 239 | 240 | async def get_traceroutes(since): 241 | async with database.async_session() as session: 242 | result = await session.execute( 243 | select(Traceroute) 244 | .join(Packet) 245 | .where(Traceroute.import_time > (datetime.datetime.utcnow() - since)) 246 | .order_by(Traceroute.import_time) 247 | ) 248 | return result.scalars() 249 | 250 | 251 | async def get_mqtt_neighbors(since): 252 | async with database.async_session() as session: 253 | result = await session.execute(select(PacketSeen, Packet) 254 | .join(Packet) 255 | .where( 256 | (PacketSeen.hop_limit == PacketSeen.hop_start) 257 | & (PacketSeen.hop_start != 0) 258 | & (PacketSeen.import_time > (datetime.datetime.utcnow() - since)) 259 | ) 260 | .options( 261 | lazyload(Packet.from_node), 262 | lazyload(Packet.to_node), 263 | ) 264 | ) 265 | return result 266 | 267 | -------------------------------------------------------------------------------- /meshview/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MeshView {% if node and node.short_name %}-- {{node.short_name}}{% endif %} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {% block head %} 14 | {% endblock %} 15 | 16 | 34 | 35 | 36 |
37 | Loading... 38 |
39 | {% block body %} 40 | {% endblock %} 41 | 42 | 43 | -------------------------------------------------------------------------------- /meshview/templates/buttons.html: -------------------------------------------------------------------------------- 1 |
2 | 7 | TX/RX 8 | 9 | 14 | Uplinked 15 | 16 |
17 | -------------------------------------------------------------------------------- /meshview/templates/chat.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block css %} 4 | .timestamp { 5 | min-width:10em; 6 | } 7 | .chat-packet:nth-of-type(odd){ 8 | background-color:#CCC; 9 | } 10 | .chat-packet:nth-of-type(even){ 11 | background-color:#EEE; 12 | } 13 | {% endblock %} 14 | 15 | 16 | {% block body %} 17 |
18 | {% for packet in packets %} 19 | {% include 'chat_packet.html' %} 20 | {% else %} 21 | No packets found. 22 | {% endfor %} 23 |
24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /meshview/templates/chat_packet.html: -------------------------------------------------------------------------------- 1 |
2 | {{packet.import_time | format_timestamp}} ✉️ 3 | {{packet.from_node.long_name or (packet.from_node_id | node_id_to_hex) }} 4 | {{packet.payload}} 5 |
6 | -------------------------------------------------------------------------------- /meshview/templates/datalist.html: -------------------------------------------------------------------------------- 1 | 4 | {% for option in node_options %} 5 | 6 | {% endfor %} 7 | 8 | -------------------------------------------------------------------------------- /meshview/templates/firehose.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body %} 4 |
5 |
6 | {% set options = { 7 | 1: "Text Message", 8 | 3: "Position", 9 | 4: "Node Info", 10 | 67: "Telemetry", 11 | 71: "Neighbor Info", 12 | } 13 | %} 14 | 26 | 27 |
28 |
29 |
30 | {% for packet in packets %} 31 | {% include 'packet.html' %} 32 | {% else %} 33 | No packets found. 34 | {% endfor %} 35 |
36 |
37 |
38 |
39 | {% endblock %} 40 | -------------------------------------------------------------------------------- /meshview/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body %} 4 | {% include "search_form.html" %} 5 |

See a realtime graph of the network

6 |

See what people are saying

7 |

See everything

8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /meshview/templates/net.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block css %} 4 | #packet_details{ 5 | height: 95vh; 6 | overflow: scroll; 7 | } 8 | {% endblock %} 9 | 10 | {% block body %} 11 |
17 |
18 |
19 | {% for packet in net_packets %} 20 | {% include 'net_packet.html' %} 21 | {% endfor %} 22 |
23 |
24 |
25 |
26 |
27 | {% endblock body %} 28 | -------------------------------------------------------------------------------- /meshview/templates/net_packet.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{packet.from_node.long_name}} 4 | 🔎 5 |
6 |
7 |
8 |
{{packet.import_time | format_timestamp}}
9 |
{{packet.payload}}
10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /meshview/templates/node.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block css %} 4 | #node_info { 5 | height:100%; 6 | } 7 | #map{ 8 | height:100%; 9 | min-height: 400px; 10 | } 11 | #packet_details{ 12 | height: 95vh; 13 | overflow: scroll; 14 | top: 3em; 15 | } 16 | {% endblock %} 17 | 18 | {% block body %} 19 | 20 | {% include "search_form.html" %} 21 | 22 |
23 |
29 |
30 |
31 |
32 | {% if node %} 33 |
34 | {{node.long_name}} ({{node.node_id|node_id_to_hex}}) 35 |
36 |
37 |
38 |
short name
39 |
{{node.short_name}}
40 |
hw model
41 |
{{node.hw_model}}
42 |
role
43 |
{{node.role}}
44 |
45 | {% include "node_graphs.html" %} 46 |
47 | {% else %} 48 |
49 | A NodeInfo has not been seen. 50 |
51 | {% endif %} 52 |
53 |
54 |
55 |
56 |
57 |
58 | 59 |
60 |
61 | {% include "buttons.html" %} 62 |
63 |
64 | 65 |
66 | {% include 'packet_list.html' %} 67 |
68 |
69 |
70 |
71 |
72 | 73 | {% if trace %} 74 | 93 | {% endif %} 94 | 95 | {% endblock %} 96 | -------------------------------------------------------------------------------- /meshview/templates/node_graphs.html: -------------------------------------------------------------------------------- 1 | {% macro graph(name) %} 2 | 3 | {% endmacro %} 4 | 5 | 6 | 20 | 21 |
22 |
23 | {{ graph("power") }} 24 | {{ graph("chutil") }} 25 |
26 |
27 | 28 |
29 |
30 | {{ graph("temperature") }} 31 | {{ graph("humidity") }} 32 | {{ graph("wind_speed") }} 33 | {{ graph("wind_direction") }} 34 |
35 |
36 | {{ graph("power_metrics") }} 37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /meshview/templates/packet.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {% set from_me = packet.from_node_id == node_id %} 4 | {% set to_me = packet.to_node_id == node_id %} 5 | 6 | {{packet.from_node.long_name}}( 7 | {%- if not from_me -%} 8 | 9 | {%- endif -%} 10 | {{packet.from_node_id|node_id_to_hex}} 11 | {%- if not from_me -%} 12 | 13 | {%- endif -%} 14 | ) 15 | 16 | -> 17 | 18 | {{packet.to_node.long_name}}( 19 | {%- if not to_me -%} 20 | 21 | {%- endif -%} 22 | {{packet.to_node_id|node_id_to_hex}} 23 | {%- if not to_me -%} 24 | 25 | {%- endif -%} 26 | ) 27 | 28 |
29 |
30 |
31 | {{packet.id}} 32 | 🔎 33 | 🔗 34 |
35 |
36 |
37 |
import_time
38 |
{{packet.import_time | format_timestamp}}
39 |
packet
40 |
{{packet.data}}
41 |
payload
42 |
43 | {% if packet.pretty_payload %} 44 |
{{packet.pretty_payload}}
45 | {% endif %} 46 | {% if packet.raw_mesh_packet.decoded and packet.raw_mesh_packet.decoded.portnum == 70 %} 47 | 57 | {% if packet.raw_mesh_packet.decoded.want_response %} 58 | graph 59 | {% else %} 60 | graph 61 | {% endif %} 62 | {% endif %} 63 |
{{packet.payload}}
64 |
65 |
66 |
67 |
68 |
69 | -------------------------------------------------------------------------------- /meshview/templates/packet_details.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | {% for seen in packets_seen %} 4 |
5 |
6 | {{seen.node.long_name}}( 7 | 8 | {{seen.node_id|node_id_to_hex}} 9 | 10 | ) 11 |
12 |
13 |
14 |
15 |
import_time
16 |
{{seen.import_time|format_timestamp}}
17 |
rx_time
18 |
{{seen.rx_time|format_timestamp}}
19 |
hop_limit
20 |
{{seen.hop_limit}}
21 |
hop_start
22 |
{{seen.hop_start}}
23 |
channel
24 |
{{seen.channel}}
25 |
rx_snr
26 |
{{seen.rx_snr}}
27 |
rx_rssi
28 |
{{seen.rx_rssi}}
29 |
topic
30 |
{{seen.topic}}
31 |
32 |
33 |
34 |
35 | {% endfor %} 36 | 37 | {% if map_center %} 38 | 60 | {% endif %} 61 | -------------------------------------------------------------------------------- /meshview/templates/packet_index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 | {% include 'packet.html' %} 8 |
9 |
15 |
16 |
17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /meshview/templates/packet_list.html: -------------------------------------------------------------------------------- 1 |
2 | {% for packet in packets %} 3 | {% include 'packet.html' %} 4 | {% else %} 5 | No packets found. 6 | {% endfor %} 7 |
8 | -------------------------------------------------------------------------------- /meshview/templates/search.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block body %} 5 | 6 | {% include "search_form.html" %} 7 | 8 | 20 | 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /meshview/templates/search_form.html: -------------------------------------------------------------------------------- 1 |
6 |
7 | 20 | {% include "datalist.html" %} 21 | {% set options = { 22 | 1: "Text Message", 23 | 3: "Position", 24 | 4: "Node Info", 25 | 67: "Telemetry", 26 | 70: "Traceroute", 27 | 71: "Neighbor Info", 28 | } 29 | %} 30 | 42 | 43 | 44 |
45 |
46 | -------------------------------------------------------------------------------- /proto_def/meshtastic/admin.options: -------------------------------------------------------------------------------- 1 | *AdminMessage.payload_variant anonymous_oneof:true 2 | 3 | *AdminMessage.session_passkey max_size:8 4 | 5 | *AdminMessage.set_canned_message_module_messages max_size:201 6 | *AdminMessage.get_canned_message_module_messages_response max_size:201 7 | *AdminMessage.delete_file_request max_size:201 8 | 9 | *AdminMessage.set_ringtone_message max_size:231 10 | *AdminMessage.get_ringtone_response max_size:231 11 | 12 | *HamParameters.call_sign max_size:8 13 | *HamParameters.short_name max_size:5 14 | *NodeRemoteHardwarePinsResponse.node_remote_hardware_pins max_count:16 15 | -------------------------------------------------------------------------------- /proto_def/meshtastic/admin.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | import "meshtastic/channel.proto"; 6 | import "meshtastic/config.proto"; 7 | import "meshtastic/connection_status.proto"; 8 | import "meshtastic/mesh.proto"; 9 | import "meshtastic/module_config.proto"; 10 | 11 | option csharp_namespace = "Meshtastic.Protobufs"; 12 | option go_package = "github.com/meshtastic/go/generated"; 13 | option java_outer_classname = "AdminProtos"; 14 | option java_package = "com.geeksville.mesh"; 15 | option swift_prefix = ""; 16 | 17 | /* 18 | * This message is handled by the Admin module and is responsible for all settings/channel read/write operations. 19 | * This message is used to do settings operations to both remote AND local nodes. 20 | * (Prior to 1.2 these operations were done via special ToRadio operations) 21 | */ 22 | message AdminMessage { 23 | 24 | /* 25 | * The node generates this key and sends it with any get_x_response packets. 26 | * The client MUST include the same key with any set_x commands. Key expires after 300 seconds. 27 | * Prevents replay attacks for admin messages. 28 | */ 29 | bytes session_passkey = 101; 30 | 31 | /* 32 | * TODO: REPLACE 33 | */ 34 | enum ConfigType { 35 | /* 36 | * TODO: REPLACE 37 | */ 38 | DEVICE_CONFIG = 0; 39 | 40 | /* 41 | * TODO: REPLACE 42 | */ 43 | POSITION_CONFIG = 1; 44 | 45 | /* 46 | * TODO: REPLACE 47 | */ 48 | POWER_CONFIG = 2; 49 | 50 | /* 51 | * TODO: REPLACE 52 | */ 53 | NETWORK_CONFIG = 3; 54 | 55 | /* 56 | * TODO: REPLACE 57 | */ 58 | DISPLAY_CONFIG = 4; 59 | 60 | /* 61 | * TODO: REPLACE 62 | */ 63 | LORA_CONFIG = 5; 64 | 65 | /* 66 | * TODO: REPLACE 67 | */ 68 | BLUETOOTH_CONFIG = 6; 69 | 70 | /* 71 | * TODO: REPLACE 72 | */ 73 | SECURITY_CONFIG = 7; 74 | 75 | /* 76 | * 77 | */ 78 | SESSIONKEY_CONFIG = 8; 79 | } 80 | 81 | /* 82 | * TODO: REPLACE 83 | */ 84 | enum ModuleConfigType { 85 | /* 86 | * TODO: REPLACE 87 | */ 88 | MQTT_CONFIG = 0; 89 | 90 | /* 91 | * TODO: REPLACE 92 | */ 93 | SERIAL_CONFIG = 1; 94 | 95 | /* 96 | * TODO: REPLACE 97 | */ 98 | EXTNOTIF_CONFIG = 2; 99 | 100 | /* 101 | * TODO: REPLACE 102 | */ 103 | STOREFORWARD_CONFIG = 3; 104 | 105 | /* 106 | * TODO: REPLACE 107 | */ 108 | RANGETEST_CONFIG = 4; 109 | 110 | /* 111 | * TODO: REPLACE 112 | */ 113 | TELEMETRY_CONFIG = 5; 114 | 115 | /* 116 | * TODO: REPLACE 117 | */ 118 | CANNEDMSG_CONFIG = 6; 119 | 120 | /* 121 | * TODO: REPLACE 122 | */ 123 | AUDIO_CONFIG = 7; 124 | 125 | /* 126 | * TODO: REPLACE 127 | */ 128 | REMOTEHARDWARE_CONFIG = 8; 129 | 130 | /* 131 | * TODO: REPLACE 132 | */ 133 | NEIGHBORINFO_CONFIG = 9; 134 | 135 | /* 136 | * TODO: REPLACE 137 | */ 138 | AMBIENTLIGHTING_CONFIG = 10; 139 | 140 | /* 141 | * TODO: REPLACE 142 | */ 143 | DETECTIONSENSOR_CONFIG = 11; 144 | 145 | /* 146 | * TODO: REPLACE 147 | */ 148 | PAXCOUNTER_CONFIG = 12; 149 | } 150 | 151 | /* 152 | * TODO: REPLACE 153 | */ 154 | oneof payload_variant { 155 | /* 156 | * Send the specified channel in the response to this message 157 | * NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present) 158 | */ 159 | uint32 get_channel_request = 1; 160 | 161 | /* 162 | * TODO: REPLACE 163 | */ 164 | Channel get_channel_response = 2; 165 | 166 | /* 167 | * Send the current owner data in the response to this message. 168 | */ 169 | bool get_owner_request = 3; 170 | 171 | /* 172 | * TODO: REPLACE 173 | */ 174 | User get_owner_response = 4; 175 | 176 | /* 177 | * Ask for the following config data to be sent 178 | */ 179 | ConfigType get_config_request = 5; 180 | 181 | /* 182 | * Send the current Config in the response to this message. 183 | */ 184 | Config get_config_response = 6; 185 | 186 | /* 187 | * Ask for the following config data to be sent 188 | */ 189 | ModuleConfigType get_module_config_request = 7; 190 | 191 | /* 192 | * Send the current Config in the response to this message. 193 | */ 194 | ModuleConfig get_module_config_response = 8; 195 | 196 | /* 197 | * Get the Canned Message Module messages in the response to this message. 198 | */ 199 | bool get_canned_message_module_messages_request = 10; 200 | 201 | /* 202 | * Get the Canned Message Module messages in the response to this message. 203 | */ 204 | string get_canned_message_module_messages_response = 11; 205 | 206 | /* 207 | * Request the node to send device metadata (firmware, protobuf version, etc) 208 | */ 209 | bool get_device_metadata_request = 12; 210 | 211 | /* 212 | * Device metadata response 213 | */ 214 | DeviceMetadata get_device_metadata_response = 13; 215 | 216 | /* 217 | * Get the Ringtone in the response to this message. 218 | */ 219 | bool get_ringtone_request = 14; 220 | 221 | /* 222 | * Get the Ringtone in the response to this message. 223 | */ 224 | string get_ringtone_response = 15; 225 | 226 | /* 227 | * Request the node to send it's connection status 228 | */ 229 | bool get_device_connection_status_request = 16; 230 | 231 | /* 232 | * Device connection status response 233 | */ 234 | DeviceConnectionStatus get_device_connection_status_response = 17; 235 | 236 | /* 237 | * Setup a node for licensed amateur (ham) radio operation 238 | */ 239 | HamParameters set_ham_mode = 18; 240 | 241 | /* 242 | * Get the mesh's nodes with their available gpio pins for RemoteHardware module use 243 | */ 244 | bool get_node_remote_hardware_pins_request = 19; 245 | 246 | /* 247 | * Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use 248 | */ 249 | NodeRemoteHardwarePinsResponse get_node_remote_hardware_pins_response = 20; 250 | 251 | /* 252 | * Enter (UF2) DFU mode 253 | * Only implemented on NRF52 currently 254 | */ 255 | bool enter_dfu_mode_request = 21; 256 | 257 | /* 258 | * Delete the file by the specified path from the device 259 | */ 260 | string delete_file_request = 22; 261 | 262 | /* 263 | * Set zero and offset for scale chips 264 | */ 265 | uint32 set_scale = 23; 266 | 267 | /* 268 | * Set the owner for this node 269 | */ 270 | User set_owner = 32; 271 | 272 | /* 273 | * Set channels (using the new API). 274 | * A special channel is the "primary channel". 275 | * The other records are secondary channels. 276 | * Note: only one channel can be marked as primary. 277 | * If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically. 278 | */ 279 | Channel set_channel = 33; 280 | 281 | /* 282 | * Set the current Config 283 | */ 284 | Config set_config = 34; 285 | 286 | /* 287 | * Set the current Config 288 | */ 289 | ModuleConfig set_module_config = 35; 290 | 291 | /* 292 | * Set the Canned Message Module messages text. 293 | */ 294 | string set_canned_message_module_messages = 36; 295 | 296 | /* 297 | * Set the ringtone for ExternalNotification. 298 | */ 299 | string set_ringtone_message = 37; 300 | 301 | /* 302 | * Remove the node by the specified node-num from the NodeDB on the device 303 | */ 304 | uint32 remove_by_nodenum = 38; 305 | 306 | /* 307 | * Set specified node-num to be favorited on the NodeDB on the device 308 | */ 309 | uint32 set_favorite_node = 39; 310 | 311 | /* 312 | * Set specified node-num to be un-favorited on the NodeDB on the device 313 | */ 314 | uint32 remove_favorite_node = 40; 315 | 316 | /* 317 | * Set fixed position data on the node and then set the position.fixed_position = true 318 | */ 319 | Position set_fixed_position = 41; 320 | 321 | /* 322 | * Clear fixed position coordinates and then set position.fixed_position = false 323 | */ 324 | bool remove_fixed_position = 42; 325 | 326 | /* 327 | * Set time only on the node 328 | * Convenience method to set the time on the node (as Net quality) without any other position data 329 | */ 330 | fixed32 set_time_only = 43; 331 | 332 | /* 333 | * Begins an edit transaction for config, module config, owner, and channel settings changes 334 | * This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings) 335 | */ 336 | bool begin_edit_settings = 64; 337 | 338 | /* 339 | * Commits an open transaction for any edits made to config, module config, owner, and channel settings 340 | */ 341 | bool commit_edit_settings = 65; 342 | 343 | /* 344 | * Tell the node to factory reset config everything; all device state and configuration will be returned to factory defaults and BLE bonds will be cleared. 345 | */ 346 | int32 factory_reset_device = 94; 347 | 348 | /* 349 | * Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot) 350 | * Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth. 351 | */ 352 | int32 reboot_ota_seconds = 95; 353 | 354 | /* 355 | * This message is only supported for the simulator Portduino build. 356 | * If received the simulator will exit successfully. 357 | */ 358 | bool exit_simulator = 96; 359 | 360 | /* 361 | * Tell the node to reboot in this many seconds (or <0 to cancel reboot) 362 | */ 363 | int32 reboot_seconds = 97; 364 | 365 | /* 366 | * Tell the node to shutdown in this many seconds (or <0 to cancel shutdown) 367 | */ 368 | int32 shutdown_seconds = 98; 369 | 370 | /* 371 | * Tell the node to factory reset config; all device state and configuration will be returned to factory defaults; BLE bonds will be preserved. 372 | */ 373 | int32 factory_reset_config = 99; 374 | 375 | /* 376 | * Tell the node to reset the nodedb. 377 | */ 378 | int32 nodedb_reset = 100; 379 | } 380 | } 381 | 382 | /* 383 | * Parameters for setting up Meshtastic for ameteur radio usage 384 | */ 385 | message HamParameters { 386 | /* 387 | * Amateur radio call sign, eg. KD2ABC 388 | */ 389 | string call_sign = 1; 390 | 391 | /* 392 | * Transmit power in dBm at the LoRA transceiver, not including any amplification 393 | */ 394 | int32 tx_power = 2; 395 | 396 | /* 397 | * The selected frequency of LoRA operation 398 | * Please respect your local laws, regulations, and band plans. 399 | * Ensure your radio is capable of operating of the selected frequency before setting this. 400 | */ 401 | float frequency = 3; 402 | 403 | /* 404 | * Optional short name of user 405 | */ 406 | string short_name = 4; 407 | } 408 | 409 | /* 410 | * Response envelope for node_remote_hardware_pins 411 | */ 412 | message NodeRemoteHardwarePinsResponse { 413 | /* 414 | * Nodes and their respective remote hardware GPIO pins 415 | */ 416 | repeated NodeRemoteHardwarePin node_remote_hardware_pins = 1; 417 | } 418 | -------------------------------------------------------------------------------- /proto_def/meshtastic/apponly.options: -------------------------------------------------------------------------------- 1 | *ChannelSet.settings max_count:8 2 | -------------------------------------------------------------------------------- /proto_def/meshtastic/apponly.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | import "meshtastic/channel.proto"; 6 | import "meshtastic/config.proto"; 7 | 8 | option csharp_namespace = "Meshtastic.Protobufs"; 9 | option go_package = "github.com/meshtastic/go/generated"; 10 | option java_outer_classname = "AppOnlyProtos"; 11 | option java_package = "com.geeksville.mesh"; 12 | option swift_prefix = ""; 13 | 14 | /* 15 | * This is the most compact possible representation for a set of channels. 16 | * It includes only one PRIMARY channel (which must be first) and 17 | * any SECONDARY channels. 18 | * No DISABLED channels are included. 19 | * This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL 20 | */ 21 | message ChannelSet { 22 | /* 23 | * Channel list with settings 24 | */ 25 | repeated ChannelSettings settings = 1; 26 | 27 | /* 28 | * LoRa config 29 | */ 30 | Config.LoRaConfig lora_config = 2; 31 | } 32 | -------------------------------------------------------------------------------- /proto_def/meshtastic/atak.options: -------------------------------------------------------------------------------- 1 | *Contact.callsign max_size:120 2 | *Contact.device_callsign max_size:120 3 | *Status.battery int_size:8 4 | *PLI.course int_size:16 5 | *GeoChat.message max_size:200 6 | *GeoChat.to max_size:120 7 | *GeoChat.to_callsign max_size:120 8 | -------------------------------------------------------------------------------- /proto_def/meshtastic/atak.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "ATAKProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * Packets for the official ATAK Plugin 13 | */ 14 | message TAKPacket { 15 | /* 16 | * Are the payloads strings compressed for LoRA transport? 17 | */ 18 | bool is_compressed = 1; 19 | /* 20 | * The contact / callsign for ATAK user 21 | */ 22 | Contact contact = 2; 23 | /* 24 | * The group for ATAK user 25 | */ 26 | Group group = 3; 27 | /* 28 | * The status of the ATAK EUD 29 | */ 30 | Status status = 4; 31 | /* 32 | * The payload of the packet 33 | */ 34 | oneof payload_variant { 35 | /* 36 | * TAK position report 37 | */ 38 | PLI pli = 5; 39 | /* 40 | * ATAK GeoChat message 41 | */ 42 | GeoChat chat = 6; 43 | } 44 | } 45 | 46 | /* 47 | * ATAK GeoChat message 48 | */ 49 | message GeoChat { 50 | /* 51 | * The text message 52 | */ 53 | string message = 1; 54 | 55 | /* 56 | * Uid recipient of the message 57 | */ 58 | optional string to = 2; 59 | 60 | /* 61 | * Callsign of the recipient for the message 62 | */ 63 | optional string to_callsign = 3; 64 | } 65 | 66 | /* 67 | * ATAK Group 68 | * <__group role='Team Member' name='Cyan'/> 69 | */ 70 | message Group { 71 | /* 72 | * Role of the group member 73 | */ 74 | MemberRole role = 1; 75 | /* 76 | * Team (color) 77 | * Default Cyan 78 | */ 79 | Team team = 2; 80 | } 81 | 82 | enum Team { 83 | /* 84 | * Unspecifed 85 | */ 86 | Unspecifed_Color = 0; 87 | /* 88 | * White 89 | */ 90 | White = 1; 91 | /* 92 | * Yellow 93 | */ 94 | Yellow = 2; 95 | /* 96 | * Orange 97 | */ 98 | Orange = 3; 99 | /* 100 | * Magenta 101 | */ 102 | Magenta = 4; 103 | /* 104 | * Red 105 | */ 106 | Red = 5; 107 | /* 108 | * Maroon 109 | */ 110 | Maroon = 6; 111 | /* 112 | * Purple 113 | */ 114 | Purple = 7; 115 | /* 116 | * Dark Blue 117 | */ 118 | Dark_Blue = 8; 119 | /* 120 | * Blue 121 | */ 122 | Blue = 9; 123 | /* 124 | * Cyan 125 | */ 126 | Cyan = 10; 127 | /* 128 | * Teal 129 | */ 130 | Teal = 11; 131 | /* 132 | * Green 133 | */ 134 | Green = 12; 135 | /* 136 | * Dark Green 137 | */ 138 | Dark_Green = 13; 139 | /* 140 | * Brown 141 | */ 142 | Brown = 14; 143 | } 144 | 145 | /* 146 | * Role of the group member 147 | */ 148 | enum MemberRole { 149 | /* 150 | * Unspecifed 151 | */ 152 | Unspecifed = 0; 153 | /* 154 | * Team Member 155 | */ 156 | TeamMember = 1; 157 | /* 158 | * Team Lead 159 | */ 160 | TeamLead = 2; 161 | /* 162 | * Headquarters 163 | */ 164 | HQ = 3; 165 | /* 166 | * Airsoft enthusiast 167 | */ 168 | Sniper = 4; 169 | /* 170 | * Medic 171 | */ 172 | Medic = 5; 173 | /* 174 | * ForwardObserver 175 | */ 176 | ForwardObserver = 6; 177 | /* 178 | * Radio Telephone Operator 179 | */ 180 | RTO = 7; 181 | /* 182 | * Doggo 183 | */ 184 | K9 = 8; 185 | } 186 | 187 | /* 188 | * ATAK EUD Status 189 | * 190 | */ 191 | message Status { 192 | /* 193 | * Battery level 194 | */ 195 | uint32 battery = 1; 196 | } 197 | 198 | /* 199 | * ATAK Contact 200 | * 201 | */ 202 | message Contact { 203 | /* 204 | * Callsign 205 | */ 206 | string callsign = 1; 207 | 208 | /* 209 | * Device callsign 210 | */ 211 | string device_callsign = 2; 212 | /* 213 | * IP address of endpoint in integer form (0.0.0.0 default) 214 | */ 215 | // fixed32 enpoint_address = 3; 216 | /* 217 | * Port of endpoint (4242 default) 218 | */ 219 | // uint32 endpoint_port = 4; 220 | /* 221 | * Phone represented as integer 222 | * Terrible practice, but we really need the wire savings 223 | */ 224 | // uint32 phone = 4; 225 | } 226 | 227 | /* 228 | * Position Location Information from ATAK 229 | */ 230 | message PLI { 231 | /* 232 | * The new preferred location encoding, multiply by 1e-7 to get degrees 233 | * in floating point 234 | */ 235 | sfixed32 latitude_i = 1; 236 | 237 | /* 238 | * The new preferred location encoding, multiply by 1e-7 to get degrees 239 | * in floating point 240 | */ 241 | sfixed32 longitude_i = 2; 242 | 243 | /* 244 | * Altitude (ATAK prefers HAE) 245 | */ 246 | int32 altitude = 3; 247 | 248 | /* 249 | * Speed 250 | */ 251 | uint32 speed = 4; 252 | 253 | /* 254 | * Course in degrees 255 | */ 256 | uint32 course = 5; 257 | } 258 | -------------------------------------------------------------------------------- /proto_def/meshtastic/cannedmessages.options: -------------------------------------------------------------------------------- 1 | *CannedMessageModuleConfig.messages max_size:201 2 | -------------------------------------------------------------------------------- /proto_def/meshtastic/cannedmessages.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "CannedMessageConfigProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * Canned message module configuration. 13 | */ 14 | message CannedMessageModuleConfig { 15 | /* 16 | * Predefined messages for canned message module separated by '|' characters. 17 | */ 18 | string messages = 1; 19 | } 20 | -------------------------------------------------------------------------------- /proto_def/meshtastic/channel.options: -------------------------------------------------------------------------------- 1 | *Channel.index int_size:8 2 | 3 | # 256 bit or 128 bit psk key 4 | *ChannelSettings.psk max_size:32 5 | *ChannelSettings.name max_size:12 6 | -------------------------------------------------------------------------------- /proto_def/meshtastic/channel.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "ChannelProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * This information can be encoded as a QRcode/url so that other users can configure 13 | * their radio to join the same channel. 14 | * A note about how channel names are shown to users: channelname-X 15 | * poundsymbol is a prefix used to indicate this is a channel name (idea from @professr). 16 | * Where X is a letter from A-Z (base 26) representing a hash of the PSK for this 17 | * channel - so that if the user changes anything about the channel (which does 18 | * force a new PSK) this letter will also change. Thus preventing user confusion if 19 | * two friends try to type in a channel name of "BobsChan" and then can't talk 20 | * because their PSKs will be different. 21 | * The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26" 22 | * This also allows the option of someday if people have the PSK off (zero), the 23 | * users COULD type in a channel name and be able to talk. 24 | * FIXME: Add description of multi-channel support and how primary vs secondary channels are used. 25 | * FIXME: explain how apps use channels for security. 26 | * explain how remote settings and remote gpio are managed as an example 27 | */ 28 | message ChannelSettings { 29 | /* 30 | * Deprecated in favor of LoraConfig.channel_num 31 | */ 32 | uint32 channel_num = 1 [deprecated = true]; 33 | 34 | /* 35 | * A simple pre-shared key for now for crypto. 36 | * Must be either 0 bytes (no crypto), 16 bytes (AES128), or 32 bytes (AES256). 37 | * A special shorthand is used for 1 byte long psks. 38 | * These psks should be treated as only minimally secure, 39 | * because they are listed in this source code. 40 | * Those bytes are mapped using the following scheme: 41 | * `0` = No crypto 42 | * `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0x01} 43 | * `2` through 10 = The default channel key, except with 1 through 9 added to the last byte. 44 | * Shown to user as simple1 through 10 45 | */ 46 | bytes psk = 2; 47 | 48 | /* 49 | * A SHORT name that will be packed into the URL. 50 | * Less than 12 bytes. 51 | * Something for end users to call the channel 52 | * If this is the empty string it is assumed that this channel 53 | * is the special (minimally secure) "Default"channel. 54 | * In user interfaces it should be rendered as a local language translation of "X". 55 | * For channel_num hashing empty string will be treated as "X". 56 | * Where "X" is selected based on the English words listed above for ModemPreset 57 | */ 58 | string name = 3; 59 | 60 | /* 61 | * Used to construct a globally unique channel ID. 62 | * The full globally unique ID will be: "name.id" where ID is shown as base36. 63 | * Assuming that the number of meshtastic users is below 20K (true for a long time) 64 | * the chance of this 64 bit random number colliding with anyone else is super low. 65 | * And the penalty for collision is low as well, it just means that anyone trying to decrypt channel messages might need to 66 | * try multiple candidate channels. 67 | * Any time a non wire compatible change is made to a channel, this field should be regenerated. 68 | * There are a small number of 'special' globally known (and fairly) insecure standard channels. 69 | * Those channels do not have a numeric id included in the settings, but instead it is pulled from 70 | * a table of well known IDs. 71 | * (see Well Known Channels FIXME) 72 | */ 73 | fixed32 id = 4; 74 | 75 | /* 76 | * If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe 77 | */ 78 | bool uplink_enabled = 5; 79 | 80 | /* 81 | * If true, messages seen on the internet will be forwarded to the local mesh. 82 | */ 83 | bool downlink_enabled = 6; 84 | 85 | /* 86 | * Per-channel module settings. 87 | */ 88 | ModuleSettings module_settings = 7; 89 | } 90 | 91 | /* 92 | * This message is specifically for modules to store per-channel configuration data. 93 | */ 94 | message ModuleSettings { 95 | /* 96 | * Bits of precision for the location sent in position packets. 97 | */ 98 | uint32 position_precision = 1; 99 | 100 | /* 101 | * Controls whether or not the phone / clients should mute the current channel 102 | * Useful for noisy public channels you don't necessarily want to disable 103 | */ 104 | bool is_client_muted = 2; 105 | } 106 | 107 | /* 108 | * A pair of a channel number, mode and the (sharable) settings for that channel 109 | */ 110 | message Channel { 111 | /* 112 | * How this channel is being used (or not). 113 | * Note: this field is an enum to give us options for the future. 114 | * In particular, someday we might make a 'SCANNING' option. 115 | * SCANNING channels could have different frequencies and the radio would 116 | * occasionally check that freq to see if anything is being transmitted. 117 | * For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow 118 | * cross band routing as needed. 119 | * If a device has only a single radio (the common case) only one channel can be PRIMARY at a time 120 | * (but any number of SECONDARY channels can't be sent received on that common frequency) 121 | */ 122 | enum Role { 123 | /* 124 | * This channel is not in use right now 125 | */ 126 | DISABLED = 0; 127 | 128 | /* 129 | * This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY 130 | */ 131 | PRIMARY = 1; 132 | 133 | /* 134 | * Secondary channels are only used for encryption/decryption/authentication purposes. 135 | * Their radio settings (freq etc) are ignored, only psk is used. 136 | */ 137 | SECONDARY = 2; 138 | } 139 | 140 | /* 141 | * The index of this channel in the channel table (from 0 to MAX_NUM_CHANNELS-1) 142 | * (Someday - not currently implemented) An index of -1 could be used to mean "set by name", 143 | * in which case the target node will find and set the channel by settings.name. 144 | */ 145 | int32 index = 1; 146 | 147 | /* 148 | * The new settings, or NULL to disable that channel 149 | */ 150 | ChannelSettings settings = 2; 151 | 152 | /* 153 | * TODO: REPLACE 154 | */ 155 | Role role = 3; 156 | } 157 | -------------------------------------------------------------------------------- /proto_def/meshtastic/clientonly.options: -------------------------------------------------------------------------------- 1 | *DeviceProfile.long_name max_size:40 2 | *DeviceProfile.short_name max_size:5 -------------------------------------------------------------------------------- /proto_def/meshtastic/clientonly.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | import "meshtastic/localonly.proto"; 6 | 7 | option csharp_namespace = "Meshtastic.Protobufs"; 8 | option go_package = "github.com/meshtastic/go/generated"; 9 | option java_outer_classname = "ClientOnlyProtos"; 10 | option java_package = "com.geeksville.mesh"; 11 | option swift_prefix = ""; 12 | 13 | /* 14 | * This abstraction is used to contain any configuration for provisioning a node on any client. 15 | * It is useful for importing and exporting configurations. 16 | */ 17 | message DeviceProfile { 18 | /* 19 | * Long name for the node 20 | */ 21 | optional string long_name = 1; 22 | 23 | /* 24 | * Short name of the node 25 | */ 26 | optional string short_name = 2; 27 | 28 | /* 29 | * The url of the channels from our node 30 | */ 31 | optional string channel_url = 3; 32 | 33 | /* 34 | * The Config of the node 35 | */ 36 | optional LocalConfig config = 4; 37 | 38 | /* 39 | * The ModuleConfig of the node 40 | */ 41 | optional LocalModuleConfig module_config = 5; 42 | } 43 | -------------------------------------------------------------------------------- /proto_def/meshtastic/config.options: -------------------------------------------------------------------------------- 1 | # longest current is 45 chars, plan with a bit of buffer 2 | *DeviceConfig.tzdef max_size:65 3 | 4 | *NetworkConfig.wifi_ssid max_size:33 5 | *NetworkConfig.wifi_psk max_size:65 6 | *NetworkConfig.ntp_server max_size:33 7 | *NetworkConfig.rsyslog_server max_size:33 8 | 9 | # Max of three ignored nodes for our testing 10 | *LoRaConfig.ignore_incoming max_count:3 11 | 12 | *LoRaConfig.tx_power int_size:8 13 | *LoRaConfig.bandwidth int_size:16 14 | *LoRaConfig.coding_rate int_size:8 15 | *LoRaConfig.channel_num int_size:16 16 | 17 | *PowerConfig.device_battery_ina_address int_size:8 18 | 19 | *SecurityConfig.public_key max_size:32 20 | *SecurityConfig.private_key max_size:32 21 | *SecurityConfig.admin_key max_size:32 22 | -------------------------------------------------------------------------------- /proto_def/meshtastic/connection_status.options: -------------------------------------------------------------------------------- 1 | *WifiConnectionStatus.ssid max_size:33 2 | -------------------------------------------------------------------------------- /proto_def/meshtastic/connection_status.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "ConnStatusProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | message DeviceConnectionStatus { 12 | /* 13 | * WiFi Status 14 | */ 15 | optional WifiConnectionStatus wifi = 1; 16 | /* 17 | * WiFi Status 18 | */ 19 | optional EthernetConnectionStatus ethernet = 2; 20 | 21 | /* 22 | * Bluetooth Status 23 | */ 24 | optional BluetoothConnectionStatus bluetooth = 3; 25 | 26 | /* 27 | * Serial Status 28 | */ 29 | optional SerialConnectionStatus serial = 4; 30 | } 31 | 32 | /* 33 | * WiFi connection status 34 | */ 35 | message WifiConnectionStatus { 36 | /* 37 | * Connection status 38 | */ 39 | NetworkConnectionStatus status = 1; 40 | 41 | /* 42 | * WiFi access point SSID 43 | */ 44 | string ssid = 2; 45 | 46 | /* 47 | * RSSI of wireless connection 48 | */ 49 | int32 rssi = 3; 50 | } 51 | 52 | /* 53 | * Ethernet connection status 54 | */ 55 | message EthernetConnectionStatus { 56 | /* 57 | * Connection status 58 | */ 59 | NetworkConnectionStatus status = 1; 60 | } 61 | 62 | /* 63 | * Ethernet or WiFi connection status 64 | */ 65 | message NetworkConnectionStatus { 66 | /* 67 | * IP address of device 68 | */ 69 | fixed32 ip_address = 1; 70 | 71 | /* 72 | * Whether the device has an active connection or not 73 | */ 74 | bool is_connected = 2; 75 | 76 | /* 77 | * Whether the device has an active connection to an MQTT broker or not 78 | */ 79 | bool is_mqtt_connected = 3; 80 | 81 | /* 82 | * Whether the device is actively remote syslogging or not 83 | */ 84 | bool is_syslog_connected = 4; 85 | } 86 | 87 | /* 88 | * Bluetooth connection status 89 | */ 90 | message BluetoothConnectionStatus { 91 | /* 92 | * The pairing PIN for bluetooth 93 | */ 94 | uint32 pin = 1; 95 | 96 | /* 97 | * RSSI of bluetooth connection 98 | */ 99 | int32 rssi = 2; 100 | 101 | /* 102 | * Whether the device has an active connection or not 103 | */ 104 | bool is_connected = 3; 105 | } 106 | 107 | /* 108 | * Serial connection status 109 | */ 110 | message SerialConnectionStatus { 111 | /* 112 | * Serial baud rate 113 | */ 114 | uint32 baud = 1; 115 | 116 | /* 117 | * Whether the device has an active connection or not 118 | */ 119 | bool is_connected = 2; 120 | } 121 | -------------------------------------------------------------------------------- /proto_def/meshtastic/deviceonly.options: -------------------------------------------------------------------------------- 1 | # options for nanopb 2 | # https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options 3 | 4 | # FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in RAM 5 | *DeviceState.receive_queue max_count:1 6 | 7 | *ChannelFile.channels max_count:8 8 | 9 | *OEMStore.oem_text max_size:40 10 | *OEMStore.oem_icon_bits max_size:2048 11 | *OEMStore.oem_aes_key max_size:32 12 | 13 | *DeviceState.node_remote_hardware_pins max_count:12 14 | 15 | *NodeInfoLite.channel int_size:8 16 | *NodeInfoLite.hops_away int_size:8 17 | 18 | *UserLite.long_name max_size:40 19 | *UserLite.short_name max_size:5 20 | *UserLite.public_key max_size:32 # public key 21 | *UserLite.macaddr max_size:6 fixed_length:true 22 | -------------------------------------------------------------------------------- /proto_def/meshtastic/deviceonly.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | import "meshtastic/channel.proto"; 6 | import "meshtastic/localonly.proto"; 7 | import "meshtastic/mesh.proto"; 8 | import "meshtastic/telemetry.proto"; 9 | import "meshtastic/config.proto"; 10 | import "nanopb.proto"; 11 | 12 | option csharp_namespace = "Meshtastic.Protobufs"; 13 | option go_package = "github.com/meshtastic/go/generated"; 14 | option java_outer_classname = "DeviceOnly"; 15 | option java_package = "com.geeksville.mesh"; 16 | option swift_prefix = ""; 17 | option (nanopb_fileopt).include = ""; 18 | 19 | 20 | /* 21 | * Position with static location information only for NodeDBLite 22 | */ 23 | message PositionLite { 24 | /* 25 | * The new preferred location encoding, multiply by 1e-7 to get degrees 26 | * in floating point 27 | */ 28 | sfixed32 latitude_i = 1; 29 | 30 | /* 31 | * TODO: REPLACE 32 | */ 33 | sfixed32 longitude_i = 2; 34 | 35 | /* 36 | * In meters above MSL (but see issue #359) 37 | */ 38 | int32 altitude = 3; 39 | 40 | /* 41 | * This is usually not sent over the mesh (to save space), but it is sent 42 | * from the phone so that the local device can set its RTC If it is sent over 43 | * the mesh (because there are devices on the mesh without GPS), it will only 44 | * be sent by devices which has a hardware GPS clock. 45 | * seconds since 1970 46 | */ 47 | fixed32 time = 4; 48 | 49 | /* 50 | * TODO: REPLACE 51 | */ 52 | Position.LocSource location_source = 5; 53 | } 54 | 55 | message UserLite { 56 | /* 57 | * This is the addr of the radio. 58 | */ 59 | bytes macaddr = 1 [deprecated = true]; 60 | 61 | /* 62 | * A full name for this user, i.e. "Kevin Hester" 63 | */ 64 | string long_name = 2; 65 | 66 | /* 67 | * A VERY short name, ideally two characters. 68 | * Suitable for a tiny OLED screen 69 | */ 70 | string short_name = 3; 71 | 72 | /* 73 | * TBEAM, HELTEC, etc... 74 | * Starting in 1.2.11 moved to hw_model enum in the NodeInfo object. 75 | * Apps will still need the string here for older builds 76 | * (so OTA update can find the right image), but if the enum is available it will be used instead. 77 | */ 78 | HardwareModel hw_model = 4; 79 | 80 | /* 81 | * In some regions Ham radio operators have different bandwidth limitations than others. 82 | * If this user is a licensed operator, set this flag. 83 | * Also, "long_name" should be their licence number. 84 | */ 85 | bool is_licensed = 5; 86 | 87 | /* 88 | * Indicates that the user's role in the mesh 89 | */ 90 | Config.DeviceConfig.Role role = 6; 91 | 92 | /* 93 | * The public key of the user's device. 94 | * This is sent out to other nodes on the mesh to allow them to compute a shared secret key. 95 | */ 96 | bytes public_key = 7; 97 | } 98 | 99 | message NodeInfoLite { 100 | /* 101 | * The node number 102 | */ 103 | uint32 num = 1; 104 | 105 | /* 106 | * The user info for this node 107 | */ 108 | UserLite user = 2; 109 | 110 | /* 111 | * This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true. 112 | * Position.time now indicates the last time we received a POSITION from that node. 113 | */ 114 | PositionLite position = 3; 115 | 116 | /* 117 | * Returns the Signal-to-noise ratio (SNR) of the last received message, 118 | * as measured by the receiver. Return SNR of the last received message in dB 119 | */ 120 | float snr = 4; 121 | 122 | /* 123 | * Set to indicate the last time we received a packet from this node 124 | */ 125 | fixed32 last_heard = 5; 126 | /* 127 | * The latest device metrics for the node. 128 | */ 129 | DeviceMetrics device_metrics = 6; 130 | 131 | /* 132 | * local channel index we heard that node on. Only populated if its not the default channel. 133 | */ 134 | uint32 channel = 7; 135 | 136 | /* 137 | * True if we witnessed the node over MQTT instead of LoRA transport 138 | */ 139 | bool via_mqtt = 8; 140 | 141 | /* 142 | * Number of hops away from us this node is (0 if adjacent) 143 | */ 144 | uint32 hops_away = 9; 145 | 146 | /* 147 | * True if node is in our favorites list 148 | * Persists between NodeDB internal clean ups 149 | */ 150 | bool is_favorite = 10; 151 | } 152 | 153 | /* 154 | * Font sizes for the device screen 155 | */ 156 | enum ScreenFonts { 157 | /* 158 | * TODO: REPLACE 159 | */ 160 | FONT_SMALL = 0; 161 | 162 | /* 163 | * TODO: REPLACE 164 | */ 165 | FONT_MEDIUM = 1; 166 | 167 | /* 168 | * TODO: REPLACE 169 | */ 170 | FONT_LARGE = 2; 171 | } 172 | 173 | 174 | /* 175 | * This message is never sent over the wire, but it is used for serializing DB 176 | * state to flash in the device code 177 | * FIXME, since we write this each time we enter deep sleep (and have infinite 178 | * flash) it would be better to use some sort of append only data structure for 179 | * the receive queue and use the preferences store for the other stuff 180 | */ 181 | message DeviceState { 182 | /* 183 | * Read only settings/info about this node 184 | */ 185 | MyNodeInfo my_node = 2; 186 | 187 | /* 188 | * My owner info 189 | */ 190 | User owner = 3; 191 | 192 | /* 193 | * Received packets saved for delivery to the phone 194 | */ 195 | repeated MeshPacket receive_queue = 5; 196 | 197 | /* 198 | * A version integer used to invalidate old save files when we make 199 | * incompatible changes This integer is set at build time and is private to 200 | * NodeDB.cpp in the device code. 201 | */ 202 | uint32 version = 8; 203 | 204 | /* 205 | * We keep the last received text message (only) stored in the device flash, 206 | * so we can show it on the screen. 207 | * Might be null 208 | */ 209 | MeshPacket rx_text_message = 7; 210 | 211 | /* 212 | * Used only during development. 213 | * Indicates developer is testing and changes should never be saved to flash. 214 | * Deprecated in 2.3.1 215 | */ 216 | bool no_save = 9 [deprecated = true]; 217 | 218 | /* 219 | * Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset. 220 | */ 221 | bool did_gps_reset = 11; 222 | 223 | /* 224 | * We keep the last received waypoint stored in the device flash, 225 | * so we can show it on the screen. 226 | * Might be null 227 | */ 228 | MeshPacket rx_waypoint = 12; 229 | 230 | /* 231 | * The mesh's nodes with their available gpio pins for RemoteHardware module 232 | */ 233 | repeated NodeRemoteHardwarePin node_remote_hardware_pins = 13; 234 | 235 | /* 236 | * New lite version of NodeDB to decrease memory footprint 237 | */ 238 | repeated NodeInfoLite node_db_lite = 14 [(nanopb).callback_datatype = "std::vector"]; 239 | } 240 | 241 | /* 242 | * The on-disk saved channels 243 | */ 244 | message ChannelFile { 245 | /* 246 | * The channels our node knows about 247 | */ 248 | repeated Channel channels = 1; 249 | 250 | /* 251 | * A version integer used to invalidate old save files when we make 252 | * incompatible changes This integer is set at build time and is private to 253 | * NodeDB.cpp in the device code. 254 | */ 255 | uint32 version = 2; 256 | } 257 | 258 | /* 259 | * This can be used for customizing the firmware distribution. If populated, 260 | * show a secondary bootup screen with custom logo and text for 2.5 seconds. 261 | */ 262 | message OEMStore { 263 | /* 264 | * The Logo width in Px 265 | */ 266 | uint32 oem_icon_width = 1; 267 | 268 | /* 269 | * The Logo height in Px 270 | */ 271 | uint32 oem_icon_height = 2; 272 | 273 | /* 274 | * The Logo in XBM bytechar format 275 | */ 276 | bytes oem_icon_bits = 3; 277 | 278 | /* 279 | * Use this font for the OEM text. 280 | */ 281 | ScreenFonts oem_font = 4; 282 | 283 | /* 284 | * Use this font for the OEM text. 285 | */ 286 | string oem_text = 5; 287 | 288 | /* 289 | * The default device encryption key, 16 or 32 byte 290 | */ 291 | bytes oem_aes_key = 6; 292 | 293 | /* 294 | * A Preset LocalConfig to apply during factory reset 295 | */ 296 | LocalConfig oem_local_config = 7; 297 | 298 | /* 299 | * A Preset LocalModuleConfig to apply during factory reset 300 | */ 301 | LocalModuleConfig oem_local_module_config = 8; 302 | } 303 | -------------------------------------------------------------------------------- /proto_def/meshtastic/localonly.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | import "meshtastic/config.proto"; 6 | import "meshtastic/module_config.proto"; 7 | 8 | option csharp_namespace = "Meshtastic.Protobufs"; 9 | option go_package = "github.com/meshtastic/go/generated"; 10 | option java_outer_classname = "LocalOnlyProtos"; 11 | option java_package = "com.geeksville.mesh"; 12 | option swift_prefix = ""; 13 | 14 | /* 15 | * Protobuf structures common to apponly.proto and deviceonly.proto 16 | * This is never sent over the wire, only for local use 17 | */ 18 | 19 | message LocalConfig { 20 | /* 21 | * The part of the config that is specific to the Device 22 | */ 23 | Config.DeviceConfig device = 1; 24 | 25 | /* 26 | * The part of the config that is specific to the GPS Position 27 | */ 28 | Config.PositionConfig position = 2; 29 | 30 | /* 31 | * The part of the config that is specific to the Power settings 32 | */ 33 | Config.PowerConfig power = 3; 34 | 35 | /* 36 | * The part of the config that is specific to the Wifi Settings 37 | */ 38 | Config.NetworkConfig network = 4; 39 | 40 | /* 41 | * The part of the config that is specific to the Display 42 | */ 43 | Config.DisplayConfig display = 5; 44 | 45 | /* 46 | * The part of the config that is specific to the Lora Radio 47 | */ 48 | Config.LoRaConfig lora = 6; 49 | 50 | /* 51 | * The part of the config that is specific to the Bluetooth settings 52 | */ 53 | Config.BluetoothConfig bluetooth = 7; 54 | 55 | /* 56 | * A version integer used to invalidate old save files when we make 57 | * incompatible changes This integer is set at build time and is private to 58 | * NodeDB.cpp in the device code. 59 | */ 60 | uint32 version = 8; 61 | 62 | /* 63 | * The part of the config that is specific to Security settings 64 | */ 65 | Config.SecurityConfig security = 9; 66 | } 67 | 68 | message LocalModuleConfig { 69 | /* 70 | * The part of the config that is specific to the MQTT module 71 | */ 72 | ModuleConfig.MQTTConfig mqtt = 1; 73 | 74 | /* 75 | * The part of the config that is specific to the Serial module 76 | */ 77 | ModuleConfig.SerialConfig serial = 2; 78 | 79 | /* 80 | * The part of the config that is specific to the ExternalNotification module 81 | */ 82 | ModuleConfig.ExternalNotificationConfig external_notification = 3; 83 | 84 | /* 85 | * The part of the config that is specific to the Store & Forward module 86 | */ 87 | ModuleConfig.StoreForwardConfig store_forward = 4; 88 | 89 | /* 90 | * The part of the config that is specific to the RangeTest module 91 | */ 92 | ModuleConfig.RangeTestConfig range_test = 5; 93 | 94 | /* 95 | * The part of the config that is specific to the Telemetry module 96 | */ 97 | ModuleConfig.TelemetryConfig telemetry = 6; 98 | 99 | /* 100 | * The part of the config that is specific to the Canned Message module 101 | */ 102 | ModuleConfig.CannedMessageConfig canned_message = 7; 103 | 104 | /* 105 | * The part of the config that is specific to the Audio module 106 | */ 107 | ModuleConfig.AudioConfig audio = 9; 108 | 109 | /* 110 | * The part of the config that is specific to the Remote Hardware module 111 | */ 112 | ModuleConfig.RemoteHardwareConfig remote_hardware = 10; 113 | 114 | /* 115 | * The part of the config that is specific to the Neighbor Info module 116 | */ 117 | ModuleConfig.NeighborInfoConfig neighbor_info = 11; 118 | 119 | /* 120 | * The part of the config that is specific to the Ambient Lighting module 121 | */ 122 | ModuleConfig.AmbientLightingConfig ambient_lighting = 12; 123 | 124 | /* 125 | * The part of the config that is specific to the Detection Sensor module 126 | */ 127 | ModuleConfig.DetectionSensorConfig detection_sensor = 13; 128 | 129 | /* 130 | * Paxcounter Config 131 | */ 132 | ModuleConfig.PaxcounterConfig paxcounter = 14; 133 | 134 | /* 135 | * A version integer used to invalidate old save files when we make 136 | * incompatible changes This integer is set at build time and is private to 137 | * NodeDB.cpp in the device code. 138 | */ 139 | uint32 version = 8; 140 | } 141 | -------------------------------------------------------------------------------- /proto_def/meshtastic/mesh.options: -------------------------------------------------------------------------------- 1 | # options for nanopb 2 | # https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options 3 | 4 | *macaddr max_size:6 fixed_length:true # macaddrs 5 | *id max_size:16 # node id strings 6 | *public_key max_size:32 # public key 7 | 8 | *User.long_name max_size:40 9 | *User.short_name max_size:5 10 | 11 | *RouteDiscovery.route max_count:8 12 | *RouteDiscovery.snr_towards max_count:8 13 | *RouteDiscovery.snr_towards int_size:8 14 | *RouteDiscovery.route_back max_count:8 15 | *RouteDiscovery.snr_back max_count:8 16 | *RouteDiscovery.snr_back int_size:8 17 | 18 | # note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is 19 | # outside of this envelope 20 | *Data.payload max_size:237 21 | 22 | *NodeInfo.channel int_size:8 23 | *NodeInfo.hops_away int_size:8 24 | 25 | # Big enough for 1.2.28.568032c-d 26 | *MyNodeInfo.firmware_version max_size:18 27 | 28 | *MyNodeInfo.air_period_tx max_count:8 29 | *MyNodeInfo.air_period_rx max_count:8 30 | 31 | # Note: the actual limit (because of header bytes) on the size of encrypted payloads is 251 bytes, but I use 256 32 | # here because we might need to fill with zeros for padding to encryption block size (16 bytes per block) 33 | *MeshPacket.encrypted max_size:256 34 | *MeshPacket.payload_variant anonymous_oneof:true 35 | *MeshPacket.hop_limit int_size:8 36 | *MeshPacket.hop_start int_size:8 37 | *MeshPacket.channel int_size:8 38 | 39 | *QueueStatus.res int_size:8 40 | *QueueStatus.free int_size:8 41 | *QueueStatus.maxlen int_size:8 42 | 43 | *ToRadio.payload_variant anonymous_oneof:true 44 | 45 | *FromRadio.payload_variant anonymous_oneof:true 46 | 47 | *Routing.variant anonymous_oneof:true 48 | 49 | *LogRecord.message max_size:384 50 | *LogRecord.source max_size:32 51 | 52 | *FileInfo.file_name max_size:228 53 | 54 | *ClientNotification.message max_size:400 55 | 56 | # MyMessage.name max_size:40 57 | # or fixed_length or fixed_count, or max_count 58 | 59 | #This value may want to be a few bytes smaller to compensate for the parent fields. 60 | *Compressed.data max_size:237 61 | 62 | *Waypoint.name max_size:30 63 | *Waypoint.description max_size:100 64 | 65 | *NeighborInfo.neighbors max_count:10 66 | 67 | *DeviceMetadata.firmware_version max_size:18 68 | 69 | *MqttClientProxyMessage.topic max_size:60 70 | *MqttClientProxyMessage.data max_size:435 71 | *MqttClientProxyMessage.text max_size:435 72 | 73 | *ChunkedPayload.chunk_count int_size:16 74 | *ChunkedPayload.chunk_index int_size:16 75 | *ChunkedPayload.payload_chunk max_size:228 -------------------------------------------------------------------------------- /proto_def/meshtastic/module_config.options: -------------------------------------------------------------------------------- 1 | *CannedMessageConfig.allow_input_source max_size:16 2 | 3 | *MQTTConfig.address max_size:64 4 | *MQTTConfig.username max_size:64 5 | *MQTTConfig.password max_size:64 6 | *MQTTConfig.root max_size:32 7 | 8 | *AudioConfig.ptt_pin int_size:8 9 | *AudioConfig.i2s_ws int_size:8 10 | *AudioConfig.i2s_sd int_size:8 11 | *AudioConfig.i2s_din int_size:8 12 | *AudioConfig.i2s_sck int_size:8 13 | 14 | *ExternalNotificationConfig.output_vibra int_size:8 15 | *ExternalNotificationConfig.output_buzzer int_size:8 16 | *ExternalNotificationConfig.nag_timeout int_size:16 17 | 18 | *RemoteHardwareConfig.available_pins max_count:4 19 | *RemoteHardwarePin.name max_size:15 20 | *RemoteHardwarePin.gpio_pin int_size:8 21 | 22 | *AmbientLightingConfig.current int_size:8 23 | *AmbientLightingConfig.red int_size:8 24 | *AmbientLightingConfig.green int_size:8 25 | *AmbientLightingConfig.blue int_size:8 26 | 27 | *DetectionSensorConfig.monitor_pin int_size:8 28 | *DetectionSensorConfig.name max_size:20 29 | -------------------------------------------------------------------------------- /proto_def/meshtastic/mqtt.options: -------------------------------------------------------------------------------- 1 | *ServiceEnvelope.packet type:FT_POINTER 2 | *ServiceEnvelope.channel_id type:FT_POINTER 3 | *ServiceEnvelope.gateway_id type:FT_POINTER 4 | 5 | *MapReport.long_name max_size:40 6 | *MapReport.short_name max_size:5 7 | *MapReport.firmware_version max_size:18 8 | *MapReport.num_online_local_nodes int_size:16 -------------------------------------------------------------------------------- /proto_def/meshtastic/mqtt.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | import "meshtastic/config.proto"; 6 | import "meshtastic/mesh.proto"; 7 | 8 | option csharp_namespace = "Meshtastic.Protobufs"; 9 | option go_package = "github.com/meshtastic/go/generated"; 10 | option java_outer_classname = "MQTTProtos"; 11 | option java_package = "com.geeksville.mesh"; 12 | option swift_prefix = ""; 13 | 14 | /* 15 | * This message wraps a MeshPacket with extra metadata about the sender and how it arrived. 16 | */ 17 | message ServiceEnvelope { 18 | /* 19 | * The (probably encrypted) packet 20 | */ 21 | MeshPacket packet = 1; 22 | 23 | /* 24 | * The global channel ID it was sent on 25 | */ 26 | string channel_id = 2; 27 | 28 | /* 29 | * The sending gateway node ID. Can we use this to authenticate/prevent fake 30 | * nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as 31 | * the globally trusted nodenum 32 | */ 33 | string gateway_id = 3; 34 | } 35 | 36 | /* 37 | * Information about a node intended to be reported unencrypted to a map using MQTT. 38 | */ 39 | message MapReport { 40 | /* 41 | * A full name for this user, i.e. "Kevin Hester" 42 | */ 43 | string long_name = 1; 44 | 45 | /* 46 | * A VERY short name, ideally two characters. 47 | * Suitable for a tiny OLED screen 48 | */ 49 | string short_name = 2; 50 | 51 | /* 52 | * Role of the node that applies specific settings for a particular use-case 53 | */ 54 | Config.DeviceConfig.Role role = 3; 55 | 56 | /* 57 | * Hardware model of the node, i.e. T-Beam, Heltec V3, etc... 58 | */ 59 | HardwareModel hw_model = 4; 60 | 61 | /* 62 | * Device firmware version string 63 | */ 64 | string firmware_version = 5; 65 | 66 | /* 67 | * The region code for the radio (US, CN, EU433, etc...) 68 | */ 69 | Config.LoRaConfig.RegionCode region = 6; 70 | 71 | /* 72 | * Modem preset used by the radio (LongFast, MediumSlow, etc...) 73 | */ 74 | Config.LoRaConfig.ModemPreset modem_preset = 7; 75 | 76 | /* 77 | * Whether the node has a channel with default PSK and name (LongFast, MediumSlow, etc...) 78 | * and it uses the default frequency slot given the region and modem preset. 79 | */ 80 | bool has_default_channel = 8; 81 | 82 | /* 83 | * Latitude: multiply by 1e-7 to get degrees in floating point 84 | */ 85 | sfixed32 latitude_i = 9; 86 | 87 | /* 88 | * Longitude: multiply by 1e-7 to get degrees in floating point 89 | */ 90 | sfixed32 longitude_i = 10; 91 | 92 | /* 93 | * Altitude in meters above MSL 94 | */ 95 | int32 altitude = 11; 96 | 97 | /* 98 | * Indicates the bits of precision for latitude and longitude set by the sending node 99 | */ 100 | uint32 position_precision = 12; 101 | 102 | /* 103 | * Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT) 104 | */ 105 | uint32 num_online_local_nodes = 13; 106 | } 107 | -------------------------------------------------------------------------------- /proto_def/meshtastic/paxcount.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "PaxcountProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * TODO: REPLACE 13 | */ 14 | message Paxcount { 15 | /* 16 | * seen Wifi devices 17 | */ 18 | uint32 wifi = 1; 19 | 20 | /* 21 | * Seen BLE devices 22 | */ 23 | uint32 ble = 2; 24 | 25 | /* 26 | * Uptime in seconds 27 | */ 28 | uint32 uptime = 3; 29 | } 30 | -------------------------------------------------------------------------------- /proto_def/meshtastic/portnums.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "Portnums"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * For any new 'apps' that run on the device or via sister apps on phones/PCs they should pick and use a 13 | * unique 'portnum' for their application. 14 | * If you are making a new app using meshtastic, please send in a pull request to add your 'portnum' to this 15 | * master table. 16 | * PortNums should be assigned in the following range: 17 | * 0-63 Core Meshtastic use, do not use for third party apps 18 | * 64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application 19 | * 256-511 Use one of these portnums for your private applications that you don't want to register publically 20 | * All other values are reserved. 21 | * Note: This was formerly a Type enum named 'typ' with the same id # 22 | * We have change to this 'portnum' based scheme for specifying app handlers for particular payloads. 23 | * This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically. 24 | */ 25 | enum PortNum { 26 | /* 27 | * Deprecated: do not use in new code (formerly called OPAQUE) 28 | * A message sent from a device outside of the mesh, in a form the mesh does not understand 29 | * NOTE: This must be 0, because it is documented in IMeshService.aidl to be so 30 | * ENCODING: binary undefined 31 | */ 32 | UNKNOWN_APP = 0; 33 | 34 | /* 35 | * A simple UTF-8 text message, which even the little micros in the mesh 36 | * can understand and show on their screen eventually in some circumstances 37 | * even signal might send messages in this form (see below) 38 | * ENCODING: UTF-8 Plaintext (?) 39 | */ 40 | TEXT_MESSAGE_APP = 1; 41 | 42 | /* 43 | * Reserved for built-in GPIO/example app. 44 | * See remote_hardware.proto/HardwareMessage for details on the message sent/received to this port number 45 | * ENCODING: Protobuf 46 | */ 47 | REMOTE_HARDWARE_APP = 2; 48 | 49 | /* 50 | * The built-in position messaging app. 51 | * Payload is a Position message. 52 | * ENCODING: Protobuf 53 | */ 54 | POSITION_APP = 3; 55 | 56 | /* 57 | * The built-in user info app. 58 | * Payload is a User message. 59 | * ENCODING: Protobuf 60 | */ 61 | NODEINFO_APP = 4; 62 | 63 | /* 64 | * Protocol control packets for mesh protocol use. 65 | * Payload is a Routing message. 66 | * ENCODING: Protobuf 67 | */ 68 | ROUTING_APP = 5; 69 | 70 | /* 71 | * Admin control packets. 72 | * Payload is a AdminMessage message. 73 | * ENCODING: Protobuf 74 | */ 75 | ADMIN_APP = 6; 76 | 77 | /* 78 | * Compressed TEXT_MESSAGE payloads. 79 | * ENCODING: UTF-8 Plaintext (?) with Unishox2 Compression 80 | * NOTE: The Device Firmware converts a TEXT_MESSAGE_APP to TEXT_MESSAGE_COMPRESSED_APP if the compressed 81 | * payload is shorter. There's no need for app developers to do this themselves. Also the firmware will decompress 82 | * any incoming TEXT_MESSAGE_COMPRESSED_APP payload and convert to TEXT_MESSAGE_APP. 83 | */ 84 | TEXT_MESSAGE_COMPRESSED_APP = 7; 85 | 86 | /* 87 | * Waypoint payloads. 88 | * Payload is a Waypoint message. 89 | * ENCODING: Protobuf 90 | */ 91 | WAYPOINT_APP = 8; 92 | 93 | /* 94 | * Audio Payloads. 95 | * Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now 96 | * ENCODING: codec2 audio frames 97 | * NOTE: audio frames contain a 3 byte header (0xc0 0xde 0xc2) and a one byte marker for the decompressed bitrate. 98 | * This marker comes from the 'moduleConfig.audio.bitrate' enum minus one. 99 | */ 100 | AUDIO_APP = 9; 101 | 102 | /* 103 | * Same as Text Message but originating from Detection Sensor Module. 104 | * NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 105 | */ 106 | DETECTION_SENSOR_APP = 10; 107 | 108 | /* 109 | * Provides a 'ping' service that replies to any packet it receives. 110 | * Also serves as a small example module. 111 | * ENCODING: ASCII Plaintext 112 | */ 113 | REPLY_APP = 32; 114 | 115 | /* 116 | * Used for the python IP tunnel feature 117 | * ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on. 118 | */ 119 | IP_TUNNEL_APP = 33; 120 | 121 | /* 122 | * Paxcounter lib included in the firmware 123 | * ENCODING: protobuf 124 | */ 125 | PAXCOUNTER_APP = 34; 126 | 127 | /* 128 | * Provides a hardware serial interface to send and receive from the Meshtastic network. 129 | * Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic 130 | * network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network. 131 | * Maximum packet size of 240 bytes. 132 | * Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp. 133 | * ENCODING: binary undefined 134 | */ 135 | SERIAL_APP = 64; 136 | 137 | /* 138 | * STORE_FORWARD_APP (Work in Progress) 139 | * Maintained by Jm Casler (MC Hamster) : jm@casler.org 140 | * ENCODING: Protobuf 141 | */ 142 | STORE_FORWARD_APP = 65; 143 | 144 | /* 145 | * Optional port for messages for the range test module. 146 | * ENCODING: ASCII Plaintext 147 | * NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9 148 | */ 149 | RANGE_TEST_APP = 66; 150 | 151 | /* 152 | * Provides a format to send and receive telemetry data from the Meshtastic network. 153 | * Maintained by Charles Crossan (crossan007) : crossan007@gmail.com 154 | * ENCODING: Protobuf 155 | */ 156 | TELEMETRY_APP = 67; 157 | 158 | /* 159 | * Experimental tools for estimating node position without a GPS 160 | * Maintained by Github user a-f-G-U-C (a Meshtastic contributor) 161 | * Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS 162 | * ENCODING: arrays of int64 fields 163 | */ 164 | ZPS_APP = 68; 165 | 166 | /* 167 | * Used to let multiple instances of Linux native applications communicate 168 | * as if they did using their LoRa chip. 169 | * Maintained by GitHub user GUVWAF. 170 | * Project files at https://github.com/GUVWAF/Meshtasticator 171 | * ENCODING: Protobuf (?) 172 | */ 173 | SIMULATOR_APP = 69; 174 | 175 | /* 176 | * Provides a traceroute functionality to show the route a packet towards 177 | * a certain destination would take on the mesh. Contains a RouteDiscovery message as payload. 178 | * ENCODING: Protobuf 179 | */ 180 | TRACEROUTE_APP = 70; 181 | 182 | /* 183 | * Aggregates edge info for the network by sending out a list of each node's neighbors 184 | * ENCODING: Protobuf 185 | */ 186 | NEIGHBORINFO_APP = 71; 187 | 188 | /* 189 | * ATAK Plugin 190 | * Portnum for payloads from the official Meshtastic ATAK plugin 191 | */ 192 | ATAK_PLUGIN = 72; 193 | 194 | /* 195 | * Provides unencrypted information about a node for consumption by a map via MQTT 196 | */ 197 | MAP_REPORT_APP = 73; 198 | 199 | /* 200 | * PowerStress based monitoring support (for automated power consumption testing) 201 | */ 202 | POWERSTRESS_APP = 74; 203 | 204 | /* 205 | * Private applications should use portnums >= 256. 206 | * To simplify initial development and testing you can use "PRIVATE_APP" 207 | * in your code without needing to rebuild protobuf files (via [regen-protos.sh](https://github.com/meshtastic/firmware/blob/master/bin/regen-protos.sh)) 208 | */ 209 | PRIVATE_APP = 256; 210 | 211 | /* 212 | * ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder 213 | * ENCODING: libcotshrink 214 | */ 215 | ATAK_FORWARDER = 257; 216 | 217 | /* 218 | * Currently we limit port nums to no higher than this value 219 | */ 220 | MAX = 511; 221 | } -------------------------------------------------------------------------------- /proto_def/meshtastic/powermon.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option csharp_namespace = "Meshtastic.Protobufs"; 4 | option go_package = "github.com/meshtastic/go/generated"; 5 | option java_outer_classname = "PowerMonProtos"; 6 | option java_package = "com.geeksville.mesh"; 7 | option swift_prefix = ""; 8 | 9 | package meshtastic; 10 | 11 | /* Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs). 12 | But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) 13 | */ 14 | message PowerMon { 15 | /* Any significant power changing event in meshtastic should be tagged with a powermon state transition. 16 | If you are making new meshtastic features feel free to add new entries at the end of this definition. 17 | */ 18 | enum State { 19 | None = 0; 20 | 21 | CPU_DeepSleep = 0x01; 22 | CPU_LightSleep = 0x02; 23 | 24 | /* 25 | The external Vext1 power is on. Many boards have auxillary power rails that the CPU turns on only 26 | occasionally. In cases where that rail has multiple devices on it we usually want to have logging on 27 | the state of that rail as an independent record. 28 | For instance on the Heltec Tracker 1.1 board, this rail is the power source for the GPS and screen. 29 | 30 | The log messages will be short and complete (see PowerMon.Event in the protobufs for details). 31 | something like "S:PM:C,0x00001234,REASON" where the hex number is the bitmask of all current states. 32 | (We use a bitmask for states so that if a log message gets lost it won't be fatal) 33 | */ 34 | Vext1_On = 0x04; 35 | 36 | Lora_RXOn = 0x08; 37 | Lora_TXOn = 0x10; 38 | Lora_RXActive = 0x20; 39 | BT_On = 0x40; 40 | LED_On = 0x80; 41 | 42 | Screen_On = 0x100; 43 | Screen_Drawing = 0x200; 44 | Wifi_On = 0x400; 45 | 46 | /* 47 | GPS is actively trying to find our location 48 | See GPSPowerState for more details 49 | */ 50 | GPS_Active = 0x800; 51 | } 52 | } 53 | 54 | 55 | /* 56 | * PowerStress testing support via the C++ PowerStress module 57 | */ 58 | message PowerStressMessage { 59 | /* 60 | * What operation would we like the UUT to perform. 61 | note: senders should probably set want_response in their request packets, so that they can know when the state 62 | machine has started processing their request 63 | */ 64 | enum Opcode { 65 | /* 66 | * Unset/unused 67 | */ 68 | UNSET = 0; 69 | 70 | PRINT_INFO = 1; // Print board version slog and send an ack that we are alive and ready to process commands 71 | FORCE_QUIET = 2; // Try to turn off all automatic processing of packets, screen, sleeping, etc (to make it easier to measure in isolation) 72 | END_QUIET = 3; // Stop powerstress processing - probably by just rebooting the board 73 | 74 | SCREEN_ON = 16; // Turn the screen on 75 | SCREEN_OFF = 17; // Turn the screen off 76 | 77 | CPU_IDLE = 32; // Let the CPU run but we assume mostly idling for num_seconds 78 | CPU_DEEPSLEEP = 33; // Force deep sleep for FIXME seconds 79 | CPU_FULLON = 34; // Spin the CPU as fast as possible for num_seconds 80 | 81 | LED_ON = 48; // Turn the LED on for num_seconds (and leave it on - for baseline power measurement purposes) 82 | LED_OFF = 49; // Force the LED off for num_seconds 83 | 84 | LORA_OFF = 64; // Completely turn off the LORA radio for num_seconds 85 | LORA_TX = 65; // Send Lora packets for num_seconds 86 | LORA_RX = 66; // Receive Lora packets for num_seconds (node will be mostly just listening, unless an external agent is helping stress this by sending packets on the current channel) 87 | 88 | BT_OFF = 80; // Turn off the BT radio for num_seconds 89 | BT_ON = 81; // Turn on the BT radio for num_seconds 90 | 91 | WIFI_OFF = 96; // Turn off the WIFI radio for num_seconds 92 | WIFI_ON = 97; // Turn on the WIFI radio for num_seconds 93 | 94 | GPS_OFF = 112; // Turn off the GPS radio for num_seconds 95 | GPS_ON = 113; // Turn on the GPS radio for num_seconds 96 | } 97 | 98 | /* 99 | * What type of HardwareMessage is this? 100 | */ 101 | Opcode cmd = 1; 102 | 103 | float num_seconds = 2; 104 | } -------------------------------------------------------------------------------- /proto_def/meshtastic/remote_hardware.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "RemoteHardware"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * An example app to show off the module system. This message is used for 13 | * REMOTE_HARDWARE_APP PortNums. 14 | * Also provides easy remote access to any GPIO. 15 | * In the future other remote hardware operations can be added based on user interest 16 | * (i.e. serial output, spi/i2c input/output). 17 | * FIXME - currently this feature is turned on by default which is dangerous 18 | * because no security yet (beyond the channel mechanism). 19 | * It should be off by default and then protected based on some TBD mechanism 20 | * (a special channel once multichannel support is included?) 21 | */ 22 | message HardwareMessage { 23 | /* 24 | * TODO: REPLACE 25 | */ 26 | enum Type { 27 | /* 28 | * Unset/unused 29 | */ 30 | UNSET = 0; 31 | 32 | /* 33 | * Set gpio gpios based on gpio_mask/gpio_value 34 | */ 35 | WRITE_GPIOS = 1; 36 | 37 | /* 38 | * We are now interested in watching the gpio_mask gpios. 39 | * If the selected gpios change, please broadcast GPIOS_CHANGED. 40 | * Will implicitly change the gpios requested to be INPUT gpios. 41 | */ 42 | WATCH_GPIOS = 2; 43 | 44 | /* 45 | * The gpios listed in gpio_mask have changed, the new values are listed in gpio_value 46 | */ 47 | GPIOS_CHANGED = 3; 48 | 49 | /* 50 | * Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated 51 | */ 52 | READ_GPIOS = 4; 53 | 54 | /* 55 | * A reply to READ_GPIOS. gpio_mask and gpio_value will be populated 56 | */ 57 | READ_GPIOS_REPLY = 5; 58 | } 59 | 60 | /* 61 | * What type of HardwareMessage is this? 62 | */ 63 | Type type = 1; 64 | 65 | /* 66 | * What gpios are we changing. Not used for all MessageTypes, see MessageType for details 67 | */ 68 | uint64 gpio_mask = 2; 69 | 70 | /* 71 | * For gpios that were listed in gpio_mask as valid, what are the signal levels for those gpios. 72 | * Not used for all MessageTypes, see MessageType for details 73 | */ 74 | uint64 gpio_value = 3; 75 | } 76 | -------------------------------------------------------------------------------- /proto_def/meshtastic/rtttl.options: -------------------------------------------------------------------------------- 1 | *RTTTLConfig.ringtone max_size:230 2 | -------------------------------------------------------------------------------- /proto_def/meshtastic/rtttl.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "RTTTLConfigProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * Canned message module configuration. 13 | */ 14 | message RTTTLConfig { 15 | /* 16 | * Ringtone for PWM Buzzer in RTTTL Format. 17 | */ 18 | string ringtone = 1; 19 | } 20 | -------------------------------------------------------------------------------- /proto_def/meshtastic/storeforward.options: -------------------------------------------------------------------------------- 1 | *StoreAndForward.text max_size:237 -------------------------------------------------------------------------------- /proto_def/meshtastic/storeforward.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "StoreAndForwardProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * TODO: REPLACE 13 | */ 14 | message StoreAndForward { 15 | /* 16 | * 001 - 063 = From Router 17 | * 064 - 127 = From Client 18 | */ 19 | enum RequestResponse { 20 | /* 21 | * Unset/unused 22 | */ 23 | UNSET = 0; 24 | 25 | /* 26 | * Router is an in error state. 27 | */ 28 | ROUTER_ERROR = 1; 29 | 30 | /* 31 | * Router heartbeat 32 | */ 33 | ROUTER_HEARTBEAT = 2; 34 | 35 | /* 36 | * Router has requested the client respond. This can work as a 37 | * "are you there" message. 38 | */ 39 | ROUTER_PING = 3; 40 | 41 | /* 42 | * The response to a "Ping" 43 | */ 44 | ROUTER_PONG = 4; 45 | 46 | /* 47 | * Router is currently busy. Please try again later. 48 | */ 49 | ROUTER_BUSY = 5; 50 | 51 | /* 52 | * Router is responding to a request for history. 53 | */ 54 | ROUTER_HISTORY = 6; 55 | 56 | /* 57 | * Router is responding to a request for stats. 58 | */ 59 | ROUTER_STATS = 7; 60 | 61 | /* 62 | * Router sends a text message from its history that was a direct message. 63 | */ 64 | ROUTER_TEXT_DIRECT = 8; 65 | 66 | /* 67 | * Router sends a text message from its history that was a broadcast. 68 | */ 69 | ROUTER_TEXT_BROADCAST = 9; 70 | 71 | /* 72 | * Client is an in error state. 73 | */ 74 | CLIENT_ERROR = 64; 75 | 76 | /* 77 | * Client has requested a replay from the router. 78 | */ 79 | CLIENT_HISTORY = 65; 80 | 81 | /* 82 | * Client has requested stats from the router. 83 | */ 84 | CLIENT_STATS = 66; 85 | 86 | /* 87 | * Client has requested the router respond. This can work as a 88 | * "are you there" message. 89 | */ 90 | CLIENT_PING = 67; 91 | 92 | /* 93 | * The response to a "Ping" 94 | */ 95 | CLIENT_PONG = 68; 96 | 97 | /* 98 | * Client has requested that the router abort processing the client's request 99 | */ 100 | CLIENT_ABORT = 106; 101 | } 102 | 103 | /* 104 | * TODO: REPLACE 105 | */ 106 | message Statistics { 107 | /* 108 | * Number of messages we have ever seen 109 | */ 110 | uint32 messages_total = 1; 111 | 112 | /* 113 | * Number of messages we have currently saved our history. 114 | */ 115 | uint32 messages_saved = 2; 116 | 117 | /* 118 | * Maximum number of messages we will save 119 | */ 120 | uint32 messages_max = 3; 121 | 122 | /* 123 | * Router uptime in seconds 124 | */ 125 | uint32 up_time = 4; 126 | 127 | /* 128 | * Number of times any client sent a request to the S&F. 129 | */ 130 | uint32 requests = 5; 131 | 132 | /* 133 | * Number of times the history was requested. 134 | */ 135 | uint32 requests_history = 6; 136 | 137 | /* 138 | * Is the heartbeat enabled on the server? 139 | */ 140 | bool heartbeat = 7; 141 | 142 | /* 143 | * Maximum number of messages the server will return. 144 | */ 145 | uint32 return_max = 8; 146 | 147 | /* 148 | * Maximum history window in minutes the server will return messages from. 149 | */ 150 | uint32 return_window = 9; 151 | } 152 | 153 | /* 154 | * TODO: REPLACE 155 | */ 156 | message History { 157 | /* 158 | * Number of that will be sent to the client 159 | */ 160 | uint32 history_messages = 1; 161 | 162 | /* 163 | * The window of messages that was used to filter the history client requested 164 | */ 165 | uint32 window = 2; 166 | 167 | /* 168 | * Index in the packet history of the last message sent in a previous request to the server. 169 | * Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server already sent to the client. 170 | */ 171 | uint32 last_request = 3; 172 | } 173 | 174 | /* 175 | * TODO: REPLACE 176 | */ 177 | message Heartbeat { 178 | /* 179 | * Period in seconds that the heartbeat is sent out that will be sent to the client 180 | */ 181 | uint32 period = 1; 182 | 183 | /* 184 | * If set, this is not the primary Store & Forward router on the mesh 185 | */ 186 | uint32 secondary = 2; 187 | } 188 | 189 | /* 190 | * TODO: REPLACE 191 | */ 192 | RequestResponse rr = 1; 193 | 194 | /* 195 | * TODO: REPLACE 196 | */ 197 | oneof variant { 198 | /* 199 | * TODO: REPLACE 200 | */ 201 | Statistics stats = 2; 202 | 203 | /* 204 | * TODO: REPLACE 205 | */ 206 | History history = 3; 207 | 208 | /* 209 | * TODO: REPLACE 210 | */ 211 | Heartbeat heartbeat = 4; 212 | 213 | /* 214 | * Text from history message. 215 | */ 216 | bytes text = 5; 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /proto_def/meshtastic/telemetry.options: -------------------------------------------------------------------------------- 1 | # options for nanopb 2 | # https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options 3 | 4 | *EnvironmentMetrics.iaq int_size:16 5 | *EnvironmentMetrics.wind_direction int_size:16 6 | 7 | *LocalStats.num_online_nodes int_size:16 8 | *LocalStats.num_total_nodes int_size:16 9 | -------------------------------------------------------------------------------- /proto_def/meshtastic/telemetry.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "TelemetryProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | /* 12 | * Key native device metrics such as battery level 13 | */ 14 | message DeviceMetrics { 15 | /* 16 | * 0-100 (>100 means powered) 17 | */ 18 | optional uint32 battery_level = 1; 19 | 20 | /* 21 | * Voltage measured 22 | */ 23 | optional float voltage = 2; 24 | 25 | /* 26 | * Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). 27 | */ 28 | optional float channel_utilization = 3; 29 | 30 | /* 31 | * Percent of airtime for transmission used within the last hour. 32 | */ 33 | optional float air_util_tx = 4; 34 | 35 | /* 36 | * How long the device has been running since the last reboot (in seconds) 37 | */ 38 | optional uint32 uptime_seconds = 5; 39 | } 40 | 41 | /* 42 | * Weather station or other environmental metrics 43 | */ 44 | message EnvironmentMetrics { 45 | /* 46 | * Temperature measured 47 | */ 48 | optional float temperature = 1; 49 | 50 | /* 51 | * Relative humidity percent measured 52 | */ 53 | optional float relative_humidity = 2; 54 | 55 | /* 56 | * Barometric pressure in hPA measured 57 | */ 58 | optional float barometric_pressure = 3; 59 | 60 | /* 61 | * Gas resistance in MOhm measured 62 | */ 63 | optional float gas_resistance = 4; 64 | 65 | /* 66 | * Voltage measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x) 67 | */ 68 | optional float voltage = 5; 69 | 70 | /* 71 | * Current measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x) 72 | */ 73 | optional float current = 6; 74 | 75 | /* 76 | * relative scale IAQ value as measured by Bosch BME680 . value 0-500. 77 | * Belongs to Air Quality but is not particle but VOC measurement. Other VOC values can also be put in here. 78 | */ 79 | optional uint32 iaq = 7; 80 | 81 | /* 82 | * RCWL9620 Doppler Radar Distance Sensor, used for water level detection. Float value in mm. 83 | */ 84 | optional float distance = 8; 85 | 86 | /* 87 | * VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. 88 | */ 89 | optional float lux = 9; 90 | 91 | /* 92 | * VEML7700 high accuracy white light(irradiance) not calibrated digital 16-bit resolution sensor. 93 | */ 94 | optional float white_lux = 10; 95 | 96 | /* 97 | * Infrared lux 98 | */ 99 | optional float ir_lux = 11; 100 | 101 | /* 102 | * Ultraviolet lux 103 | */ 104 | optional float uv_lux = 12; 105 | 106 | /* 107 | * Wind direction in degrees 108 | * 0 degrees = North, 90 = East, etc... 109 | */ 110 | optional uint32 wind_direction = 13; 111 | 112 | /* 113 | * Wind speed in m/s 114 | */ 115 | optional float wind_speed = 14; 116 | 117 | /* 118 | * Weight in KG 119 | */ 120 | optional float weight = 15; 121 | 122 | /* 123 | * Wind gust in m/s 124 | */ 125 | optional float wind_gust = 16; 126 | 127 | /* 128 | * Wind lull in m/s 129 | */ 130 | optional float wind_lull = 17; 131 | } 132 | 133 | /* 134 | * Power Metrics (voltage / current / etc) 135 | */ 136 | message PowerMetrics { 137 | /* 138 | * Voltage (Ch1) 139 | */ 140 | optional float ch1_voltage = 1; 141 | 142 | /* 143 | * Current (Ch1) 144 | */ 145 | optional float ch1_current = 2; 146 | 147 | /* 148 | * Voltage (Ch2) 149 | */ 150 | optional float ch2_voltage = 3; 151 | 152 | /* 153 | * Current (Ch2) 154 | */ 155 | optional float ch2_current = 4; 156 | 157 | /* 158 | * Voltage (Ch3) 159 | */ 160 | optional float ch3_voltage = 5; 161 | 162 | /* 163 | * Current (Ch3) 164 | */ 165 | optional float ch3_current = 6; 166 | } 167 | 168 | /* 169 | * Air quality metrics 170 | */ 171 | message AirQualityMetrics { 172 | /* 173 | * Concentration Units Standard PM1.0 174 | */ 175 | optional uint32 pm10_standard = 1; 176 | 177 | /* 178 | * Concentration Units Standard PM2.5 179 | */ 180 | optional uint32 pm25_standard = 2; 181 | 182 | /* 183 | * Concentration Units Standard PM10.0 184 | */ 185 | optional uint32 pm100_standard = 3; 186 | 187 | /* 188 | * Concentration Units Environmental PM1.0 189 | */ 190 | optional uint32 pm10_environmental = 4; 191 | 192 | /* 193 | * Concentration Units Environmental PM2.5 194 | */ 195 | optional uint32 pm25_environmental = 5; 196 | 197 | /* 198 | * Concentration Units Environmental PM10.0 199 | */ 200 | optional uint32 pm100_environmental = 6; 201 | 202 | /* 203 | * 0.3um Particle Count 204 | */ 205 | optional uint32 particles_03um = 7; 206 | 207 | /* 208 | * 0.5um Particle Count 209 | */ 210 | optional uint32 particles_05um = 8; 211 | 212 | /* 213 | * 1.0um Particle Count 214 | */ 215 | optional uint32 particles_10um = 9; 216 | 217 | /* 218 | * 2.5um Particle Count 219 | */ 220 | optional uint32 particles_25um = 10; 221 | 222 | /* 223 | * 5.0um Particle Count 224 | */ 225 | optional uint32 particles_50um = 11; 226 | 227 | /* 228 | * 10.0um Particle Count 229 | */ 230 | optional uint32 particles_100um = 12; 231 | } 232 | 233 | /* 234 | * Local device mesh statistics 235 | */ 236 | message LocalStats { 237 | /* 238 | * How long the device has been running since the last reboot (in seconds) 239 | */ 240 | uint32 uptime_seconds = 1; 241 | /* 242 | * Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise). 243 | */ 244 | float channel_utilization = 2; 245 | /* 246 | * Percent of airtime for transmission used within the last hour. 247 | */ 248 | float air_util_tx = 3; 249 | 250 | /* 251 | * Number of packets sent 252 | */ 253 | uint32 num_packets_tx = 4; 254 | 255 | /* 256 | * Number of packets received good 257 | */ 258 | uint32 num_packets_rx = 5; 259 | 260 | /* 261 | * Number of packets received that are malformed or violate the protocol 262 | */ 263 | uint32 num_packets_rx_bad = 6; 264 | 265 | /* 266 | * Number of nodes online (in the past 2 hours) 267 | */ 268 | uint32 num_online_nodes = 7; 269 | 270 | /* 271 | * Number of nodes total 272 | */ 273 | uint32 num_total_nodes = 8; 274 | } 275 | 276 | /* 277 | * Types of Measurements the telemetry module is equipped to handle 278 | */ 279 | message Telemetry { 280 | /* 281 | * Seconds since 1970 - or 0 for unknown/unset 282 | */ 283 | fixed32 time = 1; 284 | 285 | oneof variant { 286 | /* 287 | * Key native device metrics such as battery level 288 | */ 289 | DeviceMetrics device_metrics = 2; 290 | 291 | /* 292 | * Weather station or other environmental metrics 293 | */ 294 | EnvironmentMetrics environment_metrics = 3; 295 | 296 | /* 297 | * Air quality metrics 298 | */ 299 | AirQualityMetrics air_quality_metrics = 4; 300 | 301 | /* 302 | * Power Metrics 303 | */ 304 | PowerMetrics power_metrics = 5; 305 | 306 | /* 307 | * Local device mesh statistics 308 | */ 309 | LocalStats local_stats = 6; 310 | } 311 | } 312 | 313 | /* 314 | * Supported I2C Sensors for telemetry in Meshtastic 315 | */ 316 | enum TelemetrySensorType { 317 | /* 318 | * No external telemetry sensor explicitly set 319 | */ 320 | SENSOR_UNSET = 0; 321 | 322 | /* 323 | * High accuracy temperature, pressure, humidity 324 | */ 325 | BME280 = 1; 326 | 327 | /* 328 | * High accuracy temperature, pressure, humidity, and air resistance 329 | */ 330 | BME680 = 2; 331 | 332 | /* 333 | * Very high accuracy temperature 334 | */ 335 | MCP9808 = 3; 336 | 337 | /* 338 | * Moderate accuracy current and voltage 339 | */ 340 | INA260 = 4; 341 | 342 | /* 343 | * Moderate accuracy current and voltage 344 | */ 345 | INA219 = 5; 346 | 347 | /* 348 | * High accuracy temperature and pressure 349 | */ 350 | BMP280 = 6; 351 | 352 | /* 353 | * High accuracy temperature and humidity 354 | */ 355 | SHTC3 = 7; 356 | 357 | /* 358 | * High accuracy pressure 359 | */ 360 | LPS22 = 8; 361 | 362 | /* 363 | * 3-Axis magnetic sensor 364 | */ 365 | QMC6310 = 9; 366 | 367 | /* 368 | * 6-Axis inertial measurement sensor 369 | */ 370 | QMI8658 = 10; 371 | 372 | /* 373 | * 3-Axis magnetic sensor 374 | */ 375 | QMC5883L = 11; 376 | 377 | /* 378 | * High accuracy temperature and humidity 379 | */ 380 | SHT31 = 12; 381 | 382 | /* 383 | * PM2.5 air quality sensor 384 | */ 385 | PMSA003I = 13; 386 | 387 | /* 388 | * INA3221 3 Channel Voltage / Current Sensor 389 | */ 390 | INA3221 = 14; 391 | 392 | /* 393 | * BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280) 394 | */ 395 | BMP085 = 15; 396 | 397 | /* 398 | * RCWL-9620 Doppler Radar Distance Sensor, used for water level detection 399 | */ 400 | RCWL9620 = 16; 401 | 402 | /* 403 | * Sensirion High accuracy temperature and humidity 404 | */ 405 | SHT4X = 17; 406 | 407 | /* 408 | * VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor. 409 | */ 410 | VEML7700 = 18; 411 | 412 | /* 413 | * MLX90632 non-contact IR temperature sensor. 414 | */ 415 | MLX90632 = 19; 416 | 417 | /* 418 | * TI OPT3001 Ambient Light Sensor 419 | */ 420 | OPT3001 = 20; 421 | 422 | /* 423 | * Lite On LTR-390UV-01 UV Light Sensor 424 | */ 425 | LTR390UV = 21; 426 | 427 | /* 428 | * AMS TSL25911FN RGB Light Sensor 429 | */ 430 | TSL25911FN = 22; 431 | 432 | /* 433 | * AHT10 Integrated temperature and humidity sensor 434 | */ 435 | AHT10 = 23; 436 | 437 | /* 438 | * DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction) 439 | */ 440 | DFROBOT_LARK = 24; 441 | 442 | /* 443 | * NAU7802 Scale Chip or compatible 444 | */ 445 | NAU7802 = 25; 446 | 447 | /* 448 | * BMP3XX High accuracy temperature and pressure 449 | */ 450 | BMP3XX = 26; 451 | 452 | /* 453 | * ICM-20948 9-Axis digital motion processor 454 | */ 455 | ICM20948 = 27; 456 | 457 | /* 458 | * MAX17048 1S lipo battery sensor (voltage, state of charge, time to go) 459 | */ 460 | MAX17048 = 28; 461 | } 462 | 463 | /* 464 | * NAU7802 Telemetry configuration, for saving to flash 465 | */ 466 | message Nau7802Config { 467 | /* 468 | * The offset setting for the NAU7802 469 | */ 470 | int32 zeroOffset = 1; 471 | 472 | /* 473 | * The calibration factor for the NAU7802 474 | */ 475 | float calibrationFactor = 2; 476 | } 477 | -------------------------------------------------------------------------------- /proto_def/meshtastic/xmodem.options: -------------------------------------------------------------------------------- 1 | # options for nanopb 2 | # https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options 3 | 4 | *XModem.buffer max_size:128 5 | *XModem.seq int_size:16 6 | *XModem.crc16 int_size:16 7 | -------------------------------------------------------------------------------- /proto_def/meshtastic/xmodem.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package meshtastic; 4 | 5 | option csharp_namespace = "Meshtastic.Protobufs"; 6 | option go_package = "github.com/meshtastic/go/generated"; 7 | option java_outer_classname = "XmodemProtos"; 8 | option java_package = "com.geeksville.mesh"; 9 | option swift_prefix = ""; 10 | 11 | message XModem { 12 | enum Control { 13 | NUL = 0; 14 | SOH = 1; 15 | STX = 2; 16 | EOT = 4; 17 | ACK = 6; 18 | NAK = 21; 19 | CAN = 24; 20 | CTRLZ = 26; 21 | } 22 | 23 | Control control = 1; 24 | uint32 seq = 2; 25 | uint32 crc16 = 3; 26 | bytes buffer = 4; 27 | } 28 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | protobuf 2 | aiomqtt 3 | sqlalchemy[asyncio] 4 | cryptography 5 | aiosqlite 6 | aiohttp 7 | aiodns 8 | Jinja2 9 | aiohttp-sse 10 | asyncpg 11 | seaborn 12 | pydot 13 | plotly 14 | --------------------------------------------------------------------------------