Compare commits

..

103 Commits
2.2.6 ... 2.3.2

Author SHA1 Message Date
Ian McEwen
05e181dece protobufs: v2.3.2 2024-03-25 13:17:23 -07:00
Ben Meadors
ad02ce172d Merge pull request #524 from ianmcorvidae/make-tests-happy
Fix up or comment out broken tests, to get CI (hopefully) happy
2024-03-24 20:25:15 -05:00
Ian McEwen
daa5587443 re-fix pylint 2024-03-23 22:17:49 -07:00
Ian McEwen
a139d180b8 Fix up or comment out broken tests, to get CI (hopefully) happy 2024-03-23 22:07:17 -07:00
Ian McEwen
09f8405422 Remove --sendping as REPLY_APP portnum is disabled in firmware now 2024-03-23 21:25:38 -07:00
Ben Meadors
107629e581 Merge pull request #523 from ianmcorvidae/readme-roadmap
Add a rudimentary call for contributors & roadmap to README.md
2024-03-22 14:28:38 -05:00
Ian McEwen
39a2ecb439 improve README wording 2024-03-22 12:27:05 -07:00
Ian McEwen
1318225e27 Add a rudimentary call for contributors & roadmap to README.md 2024-03-22 12:05:40 -07:00
Ian McEwen
85a6d4c21b Remove stale device_metadata_pb2 whose .proto file no longer exists 2024-03-22 11:46:29 -07:00
github-actions
1088880f04 bump version 2024-03-21 12:47:22 +00:00
Ben Meadors
0738e5ec6d Remove publish mac (for now) 2024-03-21 07:35:55 -05:00
Ben Meadors
5537778b64 2.3.1 protobufs 2024-03-20 10:27:19 -05:00
Ben Meadors
341d8e0cec Merge pull request #517 from ianmcorvidae/pylint-wrangling
Pylint wrangling
2024-03-19 17:51:14 -05:00
Ian McEwen
9b5943192d Make pylint happy with ble_interface.py 2024-03-19 13:18:15 -07:00
Ian McEwen
bf56521a53 Create Tunnel.TunnelError for specialized errors in that file 2024-03-19 13:00:06 -07:00
Ian McEwen
16a1af6a13 Create MeshInterface.MeshInterfaceError to specialize errors in that file 2024-03-19 12:58:44 -07:00
Ian McEwen
b8640666d7 Fix some outstanding pylint issues (or disable the checks) 2024-03-19 12:47:08 -07:00
Ben Meadors
0528a6fb3b Merge pull request #516 from ianmcorvidae/pkgversions-ci
use importlib.metadata and packaging.version instead of pkg_resources
2024-03-19 14:24:23 -05:00
Ian McEwen
5511871442 Add packaging to setup.py. hopefully. 2024-03-19 12:20:35 -07:00
Ian McEwen
486e13a93b Add 'packaging' to requirements.txt 2024-03-19 12:17:24 -07:00
Ian McEwen
759cafb817 use importlib.metadata and packaging.version instead of pkg_resources 2024-03-19 12:02:40 -07:00
Ben Meadors
bd788ae303 Merge pull request #508 from ianmcorvidae/set-ch-index-on-add
Set --ch-index to a newly added channel when --ch-add is set, to allow further modification
2024-03-17 07:45:29 -05:00
Ben Meadors
bb8a0d987f Merge pull request #509 from ianmcorvidae/fix-chset-options-list
Make --ch-set with invalid options print out the available options
2024-03-17 07:44:30 -05:00
Ian McEwen
92cc84e692 Make --ch-set with invalid options print out the available options as the documentation says it does 2024-03-16 11:58:38 -07:00
Ian McEwen
03abaf6059 Set --ch-index to a newly added channel when --ch-add is set, to allow further modification 2024-03-16 11:06:32 -07:00
Ben Meadors
6bed30e175 Merge pull request #505 from ianmcorvidae/unknown-nodes
Show unknown nodes in a fashion similar to the web UI. Fixes #504
2024-03-14 07:38:23 -05:00
Ian McEwen
9f2cc28fef Show unknown nodes in a fashion similar to the web UI. Fixes #504 2024-03-13 21:15:00 -07:00
Ben Meadors
fdd5b866b5 Merge pull request #503 from wnagele/ble_improvements
Make BLE connections a bit more resilient
2024-03-13 08:20:55 -05:00
Wolfgang Nagele
4ebb928400 Make BLE connections a bit more resilient 2024-03-13 14:08:32 +01:00
Jonathan Bennett
4522a8a7b0 Document automatic device search 2024-03-11 18:41:20 -05:00
Jonathan Bennett
14813e5c76 Attempt TCP connection to localhost if serial detect fails 2024-03-11 18:41:20 -05:00
Ben Meadors
c67d299984 Put bump version back 2024-03-11 12:45:32 -05:00
Ben Meadors
d1efe39c59 Temporarily remove bump_version 2024-03-11 12:38:21 -05:00
Ben Meadors
079c8c6a24 Version 2024-03-11 12:21:00 -05:00
Ben Meadors
fbcdab37ed Protobufs 2024-03-11 12:20:08 -05:00
Ben Meadors
83359a9cae Merge pull request #497 from meshtastic/revert-490-master
Revert "Move pb2 Files to Own Folder"
2024-03-11 12:18:53 -05:00
Ben Meadors
67636c4ce2 Revert "Move pb2 Files to Own Folder" 2024-03-11 12:18:25 -05:00
Ben Meadors
fdf594492c Merge pull request #496 from meshtastic/listen-command
Added command to listen to protobuf stream
2024-03-09 15:51:33 -06:00
Ben Meadors
8d6827dd23 Merge pull request #490 from rc14193/master
Move pb2 Files to Own Folder
2024-03-08 14:19:22 -06:00
Ben Meadors
a1ffb459f8 Added command to listen to protobuf stream 2024-03-08 14:16:02 -06:00
foglet15
df8ea85873 change to PbDefinitions for clearer naming 2024-02-25 14:22:15 -05:00
foglet15
10c2e753f5 fix tests imports, add sed for fixing pb2 imports 2024-02-25 14:16:31 -05:00
foglet15
769c99ec7d reset regen bash again 2024-02-25 14:02:45 -05:00
foglet15
1a8778022f use the move command instead 2024-02-25 13:53:10 -05:00
foglet15
b7e23ab762 use mv command instead, run regen test 2024-02-25 13:48:10 -05:00
foglet15
9fbde7b85a change regen to unmodified 2024-02-25 13:40:28 -05:00
foglet15
17ab557f81 change back to previous path 2024-02-25 13:32:25 -05:00
foglet15
8271997279 fix sed commands and dir path 2024-02-25 13:28:28 -05:00
foglet15
1c9af1f002 modify dir path 2024-02-25 13:26:01 -05:00
foglet15
9a4feecea8 move pb2 to own folder, regen script writes to new folder, update imports 2024-02-25 13:11:36 -05:00
Ben Meadors
90c218daa7 Merge pull request #489 from meshtastic/precision-try-2
Fixup handling for radio configs with disabled channel
2024-02-22 07:14:41 -06:00
Jonathan Bennett
a067c9295e Fixup handling for radio configs with disabled channel 2024-02-22 00:44:25 -06:00
github-actions
48fe844e12 bump version 2024-02-17 02:02:53 +00:00
Ben Meadors
1a9e728dee v2.2.23 protobufs 2024-02-16 20:02:10 -06:00
github-actions
34736bd246 bump version 2024-02-12 17:02:47 +00:00
Ben Meadors
193b8bcfb5 Merge pull request #486 from thoherr/add-paxcounter-config
add paxcounter moduleConfig (fixes Bug #485)
2024-02-12 11:01:58 -06:00
Ben Meadors
3321d8454a v.2.2.22 protos 2024-02-12 11:00:28 -06:00
Thomas Herrmann
22f2168bfd add paxcounter moduleConfig
(fixes Bug #485 "No valid config with name paxcounter" for me)
2024-02-10 14:06:02 +01:00
github-actions
2bf72523e9 bump version 2024-02-01 14:23:53 +00:00
Ben Meadors
658ecb60dc v2.2.21 protos 2024-02-01 08:23:02 -06:00
Ben Meadors
129f68ec14 Merge pull request #483 from bmidgley/brad/longer-timeout
Extend timeout for slow devices like pi zero
2024-01-28 07:51:46 -06:00
Brad Midgley
281ff788f3 Extend timeout for slow devices like pi zero 2024-01-28 06:35:15 -07:00
github-actions
70069323fc bump version 2024-01-16 17:12:28 +00:00
Ben Meadors
4721bc5adf Merge pull request #473 from wnagele/BLE_support
BLE Support
2024-01-16 11:11:50 -06:00
Ben Meadors
bc67546019 V2.2.18 protos 2024-01-16 10:39:50 -06:00
github-actions
dc35ffa12e bump version 2024-01-16 16:38:56 +00:00
Ben Meadors
b41baeac98 Merge pull request #477 from TimothyHarder/hardertimothy/issue-366
Issue #366 TCP connection error handling
2024-01-16 10:37:43 -06:00
Ben Meadors
bbc458954d Merge pull request #478 from TimothyHarder/hardertimothy/issue-424
Issue #424 Admin channel case sensitivity
2024-01-16 10:37:22 -06:00
Ben Meadors
2f59028df3 v2.2.17 2024-01-16 10:36:43 -06:00
Wolfgang Nagele
0a8a193081 BLE Support 2024-01-15 21:33:53 +01:00
github-actions
2eda2e56d5 Update protobuf submodule 2024-01-14 14:47:08 +00:00
Timothy Harder
52f8e82ea1 _getAdminChannelIndex can get the index of the admin channel regardless of case. 2024-01-07 14:02:44 -06:00
Timothy Harder
b11edacee0 Added except block to args.host to handle connection errors for the CLI. 2024-01-07 12:37:13 -06:00
github-actions
6dcdf7fc19 bump version 2024-01-06 12:24:57 +00:00
Ben Meadors
fe8ae6237e Merge pull request #469 from marek22k/improve-argument-handling
Improve argument handling
2024-01-04 20:30:36 -06:00
github-actions
7908fda1cf bump version 2023-12-17 17:43:05 +00:00
github-actions
fe9a367553 Update protobuf submodule 2023-12-17 17:41:45 +00:00
github-actions
79d7dcc199 bump version 2023-12-13 01:04:29 +00:00
Ben Meadors
ddf2221797 2.2.16 Protos 2023-12-12 19:03:23 -06:00
github-actions
a6f9100520 bump version 2023-12-13 01:01:38 +00:00
Ben Meadors
36011da918 2.2.15 protos 2023-12-12 19:00:48 -06:00
Ben Meadors
882e160a32 Merge pull request #471 from marek22k/cjdns-beacon
Tunnel: Add overlay peer discovery to blocklist
2023-12-12 18:58:37 -06:00
github-actions
958edbfdb2 bump version 2023-12-13 00:58:02 +00:00
Ben Meadors
484dc8007c 2.2.14 protos 2023-12-12 18:56:33 -06:00
Marek Küthe
2464bcf414 Tunnel: Add overlay peer discovery to blocklist 2023-12-09 11:50:47 +00:00
Marek Küthe
b468a0c908 Tunnel: Check other arguments 2023-12-04 12:55:36 +00:00
Marek Küthe
de154e50ca Tunnel: Pass variable only if it has content.
Closes https://github.com/meshtastic/python/issues/468
2023-12-04 12:55:06 +00:00
github-actions
70bb58b8ce bump version 2023-11-05 00:25:17 +00:00
Ben Meadors
dae63d4176 Protos 2023-11-04 19:24:27 -05:00
github-actions
9aef3b11f1 bump version 2023-11-03 21:41:23 +00:00
Ben Meadors
eebaa10d13 Regen protos 2023-11-03 07:50:30 -05:00
Ben Meadors
5076119b4f Merge pull request #463 from GUVWAF/AmbientLighting 2023-11-02 14:46:49 -05:00
GUVWAF
e25b183c23 Add getter/setter for AmbientLighting Module 2023-11-02 20:35:57 +01:00
github-actions
236d30f7c1 bump version 2023-10-11 14:59:14 +00:00
Ben Meadors
1f054abe47 Update protobufs 2023-10-11 09:58:07 -05:00
github-actions
d793ae431c bump version 2023-10-08 11:55:02 +00:00
Garth Vander Houwen
d02c4af995 Merge pull request #461 from sbias/add-channel-info
add channel info
2023-10-07 10:25:14 -07:00
Sascha Bias
7123a095dc add channel info 2023-10-07 19:01:01 +02:00
github-actions
abbe9ba10e bump version 2023-09-30 11:00:34 +00:00
Ben Meadors
6fe40e22b6 Update protos 2023-09-30 05:59:39 -05:00
Ben Meadors
ae648e7a82 Update protos 2023-09-26 06:09:43 -05:00
github-actions
550a5fe49a bump version 2023-09-26 11:06:05 +00:00
github-actions
20bb1ebdfa bump version 2023-09-20 12:01:35 +00:00
50 changed files with 1434 additions and 1887 deletions

View File

@@ -74,51 +74,51 @@ jobs:
user: __token__ user: __token__
password: ${{ secrets.PYPI_API_TOKEN }} password: ${{ secrets.PYPI_API_TOKEN }}
build-and-publish-mac: # build-and-publish-mac:
runs-on: macos-latest # runs-on: macos-latest
needs: release_create # needs: release_create
steps: # steps:
- name: Checkout # - name: Checkout
uses: actions/checkout@v3 # uses: actions/checkout@v3
with: # with:
ref: ${{ needs.release_create.outputs.new_sha }} # ref: ${{ needs.release_create.outputs.new_sha }}
- name: Set up Python 3.9 # - name: Set up Python 3.9
uses: actions/setup-python@v2 # uses: actions/setup-python@v2
with: # with:
python-version: 3.9 # python-version: 3.9
- name: Setup code signing # - name: Setup code signing
env: # env:
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }} # MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }} # MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} # MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
run: | # run: |
echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12 # echo $MACOS_CERTIFICATE | base64 --decode > certificate.p12
security create-keychain -p "$MACOS_KEYCHAIN_PASSWORD" meshtastic.keychain # security create-keychain -p "$MACOS_KEYCHAIN_PASSWORD" meshtastic.keychain
security default-keychain -s meshtastic.keychain # security default-keychain -s meshtastic.keychain
security unlock-keychain -p "$MACOS_KEYCHAIN_PASSWORD" meshtastic.keychain # security unlock-keychain -p "$MACOS_KEYCHAIN_PASSWORD" meshtastic.keychain
security import certificate.p12 -k meshtastic.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign # security import certificate.p12 -k meshtastic.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_KEYCHAIN_PASSWORD" meshtastic.keychain # security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$MACOS_KEYCHAIN_PASSWORD" meshtastic.keychain
- name: Build # - name: Build
env: # env:
MACOS_SIGNING_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY }} # MACOS_SIGNING_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY }}
run: | # run: |
pip install pyinstaller # pip install pyinstaller
pip install -r requirements.txt # pip install -r requirements.txt
pip install . # pip install .
pyinstaller -F -n meshtastic --collect-all meshtastic --codesign-identity "$MACOS_SIGNING_IDENTITY" meshtastic/__main__.py # pyinstaller -F -n meshtastic --collect-all meshtastic --codesign-identity "$MACOS_SIGNING_IDENTITY" meshtastic/__main__.py
- name: Add mac to release # - name: Add mac to release
uses: actions/upload-release-asset@v1 # uses: actions/upload-release-asset@v1
env: # env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: # with:
upload_url: ${{ needs.release_create.outputs.upload_url }} # upload_url: ${{ needs.release_create.outputs.upload_url }}
asset_path: dist/meshtastic # asset_path: dist/meshtastic
asset_name: meshtastic_mac # asset_name: meshtastic_mac
asset_content_type: application/zip # asset_content_type: application/zip
build-and-publish-ubuntu: build-and-publish-ubuntu:
runs-on: ubuntu-latest runs-on: ubuntu-latest

10
.vscode/launch.json vendored
View File

@@ -10,7 +10,7 @@
"request": "launch", "request": "launch",
"module": "meshtastic", "module": "meshtastic",
"justMyCode": false, "justMyCode": false,
"args": ["--debug", "--ble", "--device", "24:62:AB:DD:DF:3A"] "args": ["--debug", "--ble", "24:62:AB:DD:DF:3A"]
}, },
{ {
"name": "meshtastic admin", "name": "meshtastic admin",
@@ -44,6 +44,14 @@
"justMyCode": true, "justMyCode": true,
"args": ["--debug"] "args": ["--debug"]
}, },
{
"name": "meshtastic listen",
"type": "python",
"request": "launch",
"module": "meshtastic",
"justMyCode": true,
"args": ["--listen", "--debug"]
},
{ {
"name": "meshtastic debug getPref", "name": "meshtastic debug getPref",
"type": "python", "type": "python",

View File

@@ -18,6 +18,35 @@ Events are delivered using a publish-subscribe model, and you can subscribe to o
**[Documentation/API Reference](https://python.meshtastic.org/)** **[Documentation/API Reference](https://python.meshtastic.org/)**
## Call for Contributors
This library and CLI has gone without a consistent maintainer for a while, and there's many improvements that could be made. We're all volunteers here and help is extremely appreciated, whether in implementing your own needs or helping maintain the library and CLI in general.
If you're interested in contributing but don't have specific things you'd like to work on, look at the roadmap below!
## Roadmap
This should always be considered a list in progress and flux -- inclusion doesn't guarantee implementation, and exclusion doesn't mean something's not wanted. GitHub issues are a great place to discuss ideas.
* Types
* type annotations throughout the codebase
* mypy running in CI to type-check new code
* async-friendliness
* CLI completeness & consistency
* the CLI should support all features of the firmware
* there should be a consistent output format available for shell scripting
* CLI input validation & documentation
* what arguments and options are compatible & incompatible with one another?
* can the options be restructured in a way that is more self-documenting?
* pubsub events should be documented clearly
* helpers for third-party code
* it should be easy to write a script that supports similar options to the CLI so many tools support the same ways of connecting to nodes
* interactive client
* data storage & processing
* there should be a standardized way of recording packets for later use, debugging, etc.
* a sqlite database schema and tools for writing to it may be a good starting point
* enable maps, charts, visualizations
## Stats ## Stats
![Alt](https://repobeats.axiom.co/api/embed/c71ee8fc4a79690402e5d2807a41eec5e96d9039.svg "Repobeats analytics image") ![Alt](https://repobeats.axiom.co/api/embed/c71ee8fc4a79690402e5d2807a41eec5e96d9039.svg "Repobeats analytics image")

View File

@@ -5,7 +5,6 @@ Basic functionality is complete now.
## Eventual tasks ## Eventual tasks
- Improve documentation on properties/fields - Improve documentation on properties/fields
- change back to Bleak for BLE support - now that they fixed https://github.com/hbldh/bleak/issues/139#event-3499535304
- include more examples: textchat.py, replymessage.py all as one little demo - include more examples: textchat.py, replymessage.py all as one little demo
- possibly use tk to make a multiwindow test console: https://stackoverflow.com/questions/12351786/how-to-redirect-print-statements-to-tkinter-text-widget - possibly use tk to make a multiwindow test console: https://stackoverflow.com/questions/12351786/how-to-redirect-print-statements-to-tkinter-text-widget
@@ -17,11 +16,8 @@ Basic functionality is complete now.
## Bluetooth support ## Bluetooth support
(Pre-alpha level feature - you probably don't want this one yet) - ./bin/run.sh --ble-scan # To look for Meshtastic devices
- ./bin/run.sh --ble 24:62:AB:DD:DF:3A --info
- This library supports connecting to Meshtastic devices over either USB (serial) or Bluetooth. Before connecting to the device you must [pair](https://docs.ubuntu.com/core/en/stacks/bluetooth/bluez/docs/reference/pairing/outbound.html) your PC with it.
- We use the pip3 install "pygatt[GATTTOOL]"
- ./bin/run.sh --debug --ble --device 24:62:AB:DD:DF:3A
## Done ## Done

View File

@@ -4,7 +4,7 @@
#gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/* #gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/*
#gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/* #gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/*
./nanopb-0.4.6/generator-bin/protoc -I=protobufs --python_out ./ ./protobufs/meshtastic/*.proto ./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./ ./protobufs/meshtastic/*.proto
# workaround for import bug in protoc https://github.com/protocolbuffers/protobuf/issues/1491#issuecomment-690618628 # workaround for import bug in protoc https://github.com/protocolbuffers/protobuf/issues/1491#issuecomment-690618628

View File

@@ -71,11 +71,11 @@ from datetime import datetime
from typing import * from typing import *
import google.protobuf.json_format import google.protobuf.json_format
import serial import serial # type: ignore[import-untyped]
import timeago import timeago # type: ignore[import-untyped]
from dotmap import DotMap from dotmap import DotMap # type: ignore[import-untyped]
from google.protobuf.json_format import MessageToJson from google.protobuf.json_format import MessageToJson
from pubsub import pub from pubsub import pub # type: ignore[import-untyped]
from tabulate import tabulate from tabulate import tabulate
from meshtastic import ( from meshtastic import (
@@ -127,9 +127,9 @@ class KnownProtocol(NamedTuple):
name: str name: str
# portnum: int, now a key # portnum: int, now a key
# If set, will be called to prase as a protocol buffer # If set, will be called to prase as a protocol buffer
protobufFactory: Callable = None protobufFactory: Optional[Callable] = None
# If set, invoked as onReceive(interface, packet) # If set, invoked as onReceive(interface, packet)
onReceive: Callable = None onReceive: Optional[Callable] = None
def _onTextReceive(iface, asDict): def _onTextReceive(iface, asDict):

View File

@@ -9,7 +9,6 @@ import platform
import sys import sys
import time import time
import pkg_resources
import pyqrcode import pyqrcode
import yaml import yaml
from google.protobuf.json_format import MessageToDict from google.protobuf.json_format import MessageToDict
@@ -18,6 +17,7 @@ from pubsub import pub
import meshtastic.test import meshtastic.test
import meshtastic.util import meshtastic.util
from meshtastic import channel_pb2, config_pb2, portnums_pb2, remote_hardware from meshtastic import channel_pb2, config_pb2, portnums_pb2, remote_hardware
from meshtastic.version import get_active_version
from meshtastic.__init__ import BROADCAST_ADDR from meshtastic.__init__ import BROADCAST_ADDR
from meshtastic.ble_interface import BLEInterface from meshtastic.ble_interface import BLEInterface
from meshtastic.globals import Globals from meshtastic.globals import Globals
@@ -135,7 +135,7 @@ def splitCompoundName(comp_name):
return name return name
def setPref(config, comp_name, valStr): def setPref(config, comp_name, valStr) -> bool:
"""Set a channel or preferences value""" """Set a channel or preferences value"""
name = splitCompoundName(comp_name) name = splitCompoundName(comp_name)
@@ -160,8 +160,8 @@ def setPref(config, comp_name, valStr):
val = meshtastic.util.fromStr(valStr) val = meshtastic.util.fromStr(valStr)
logging.debug(f"valStr:{valStr} val:{val}") logging.debug(f"valStr:{valStr} val:{val}")
if snake_name == "psk" and len(valStr) < 8: if snake_name == "wifi_psk" and len(valStr) < 8:
print(f"Warning: wifi.psk must be 8 or more characters.") print(f"Warning: network.wifi_psk must be 8 or more characters.")
return False return False
enumType = pref.enum_type enumType = pref.enum_type
@@ -394,17 +394,6 @@ def onConnected(interface):
f"Warning: {channelIndex} is not a valid channel. Channel must not be DISABLED." f"Warning: {channelIndex} is not a valid channel. Channel must not be DISABLED."
) )
if args.sendping:
payload = str.encode("test string")
print(f"Sending ping message to {args.dest}")
interface.sendData(
payload,
args.dest,
portNum=portnums_pb2.PortNum.REPLY_APP,
wantAck=True,
wantResponse=True,
)
if args.traceroute: if args.traceroute:
loraConfig = getattr(interface.localNode.localConfig, "lora") loraConfig = getattr(interface.localNode.localConfig, "lora")
hopLimit = getattr(loraConfig, "hop_limit") hopLimit = getattr(loraConfig, "hop_limit")
@@ -597,6 +586,12 @@ def onConnected(interface):
# handle changing channels # handle changing channels
if args.ch_add: if args.ch_add:
channelIndex = our_globals.get_channel_index()
if channelIndex is not None:
# Since we set the channel index after adding a channel, don't allow --ch-index
meshtastic.util.our_exit(
"Warning: '--ch-add' and '--ch-index' are incompatible. Channel not added."
)
closeNow = True closeNow = True
if len(args.ch_add) > 10: if len(args.ch_add) > 10:
meshtastic.util.our_exit( meshtastic.util.our_exit(
@@ -620,6 +615,9 @@ def onConnected(interface):
ch.role = channel_pb2.Channel.Role.SECONDARY ch.role = channel_pb2.Channel.Role.SECONDARY
print(f"Writing modified channels to device") print(f"Writing modified channels to device")
n.writeChannel(ch.index) n.writeChannel(ch.index)
if channelIndex is None:
print(f"Setting newly-added channel's {ch.index} as '--ch-index' for further modifications")
our_globals.set_channel_index(ch.index)
if args.ch_del: if args.ch_del:
closeNow = True closeNow = True
@@ -640,6 +638,11 @@ def onConnected(interface):
def setSimpleConfig(modem_preset): def setSimpleConfig(modem_preset):
"""Set one of the simple modem_config""" """Set one of the simple modem_config"""
channelIndex = our_globals.get_channel_index()
if channelIndex is not None and channelIndex > 0:
meshtastic.util.our_exit(
"Warning: Cannot set modem preset for non-primary channel", 1
)
# Overwrite modem_preset # Overwrite modem_preset
prefs = interface.getNode(args.dest).localConfig prefs = interface.getNode(args.dest).localConfig
prefs.lora.modem_preset = modem_preset prefs.lora.modem_preset = modem_preset
@@ -690,9 +693,29 @@ def onConnected(interface):
# Handle the channel settings # Handle the channel settings
for pref in args.ch_set or []: for pref in args.ch_set or []:
if pref[0] == "psk": if pref[0] == "psk":
found = True
ch.settings.psk = meshtastic.util.fromPSK(pref[1]) ch.settings.psk = meshtastic.util.fromPSK(pref[1])
else: else:
setPref(ch.settings, pref[0], pref[1]) found = setPref(ch.settings, pref[0], pref[1])
if not found:
category_settings = ['module_settings']
print(
f"{ch.settings.__class__.__name__} does not have an attribute {pref[0]}."
)
print("Choices are...")
for field in ch.settings.DESCRIPTOR.fields:
if field.name not in category_settings:
print(f"{field.name}")
else:
print(f"{field.name}:")
config = ch.settings.DESCRIPTOR.fields_by_name.get(field.name)
names = []
for sub_field in config.message_type.fields:
tmp_name = f"{field.name}.{sub_field.name}"
names.append(tmp_name)
for temp_name in sorted(names):
print(f" {temp_name}")
enable = True # If we set any pref, assume the user wants to enable the channel enable = True # If we set any pref, assume the user wants to enable the channel
if enable: if enable:
@@ -761,6 +784,9 @@ def onConnected(interface):
qr = pyqrcode.create(url) qr = pyqrcode.create(url)
print(qr.terminal()) print(qr.terminal())
if args.listen:
closeNow = False
have_tunnel = platform.system() == "Linux" have_tunnel = platform.system() == "Linux"
if have_tunnel and args.tunnel: if have_tunnel and args.tunnel:
# pylint: disable=C0415 # pylint: disable=C0415
@@ -771,7 +797,10 @@ def onConnected(interface):
if interface.noProto: if interface.noProto:
logging.warning(f"Not starting Tunnel - disabled by noProto") logging.warning(f"Not starting Tunnel - disabled by noProto")
else: else:
tunnel.Tunnel(interface, subnet=args.tunnel_net) if args.tunnel_net:
tunnel.Tunnel(interface, subnet=args.tunnel_net)
else:
tunnel.Tunnel(interface)
if args.ack or (args.dest != BROADCAST_ADDR and waitForAckNak): if args.ack or (args.dest != BROADCAST_ADDR and waitForAckNak):
print( print(
@@ -942,12 +971,27 @@ def common():
our_globals.set_logfile(logfile) our_globals.set_logfile(logfile)
subscribe() subscribe()
if args.ble: if args.ble_scan:
logging.debug("BLE scan starting")
client = BLEInterface(None, debugOut=logfile, noProto=args.noproto)
try:
for x in client.scan():
print(f"Found: name='{x[1].local_name}' address='{x[0].address}'")
finally:
client.close()
meshtastic.util.our_exit("BLE scan finished", 0)
return
elif args.ble:
client = BLEInterface(args.ble, debugOut=logfile, noProto=args.noproto) client = BLEInterface(args.ble, debugOut=logfile, noProto=args.noproto)
elif args.host: elif args.host:
client = meshtastic.tcp_interface.TCPInterface( try:
args.host, debugOut=logfile, noProto=args.noproto client = meshtastic.tcp_interface.TCPInterface(
) args.host, debugOut=logfile, noProto=args.noproto
)
except Exception as ex:
meshtastic.util.our_exit(
f"Error connecting to {args.host}:{ex}", 1
)
else: else:
try: try:
client = meshtastic.serial_interface.SerialInterface( client = meshtastic.serial_interface.SerialInterface(
@@ -963,13 +1007,23 @@ def common():
message += " After running that command, log out and re-login for it to take effect.\n" message += " After running that command, log out and re-login for it to take effect.\n"
message += f"Error was:{ex}" message += f"Error was:{ex}"
meshtastic.util.our_exit(message) meshtastic.util.our_exit(message)
if client.devPath is None:
try:
client = meshtastic.tcp_interface.TCPInterface(
"localhost", debugOut=logfile, noProto=args.noproto
)
except Exception as ex:
meshtastic.util.our_exit(
f"Error connecting to localhost:{ex}", 1
)
# We assume client is fully connected now # We assume client is fully connected now
onConnected(client) onConnected(client)
have_tunnel = platform.system() == "Linux" have_tunnel = platform.system() == "Linux"
if ( if (
args.noproto or args.reply or (have_tunnel and args.tunnel) args.noproto or args.reply or (have_tunnel and args.tunnel) or args.listen
): # loop until someone presses ctrlc ): # loop until someone presses ctrlc
while True: while True:
time.sleep(1000) time.sleep(1000)
@@ -998,7 +1052,7 @@ def initParser():
parser.add_argument( parser.add_argument(
"--port", "--port",
help="The port the Meshtastic device is connected to, i.e. /dev/ttyUSB0. If unspecified, we'll try to find it.", help="The port the Meshtastic device is connected to, i.e. /dev/ttyUSB0.",
default=None, default=None,
) )
@@ -1181,12 +1235,6 @@ def initParser():
help="Send a text message. Can specify a destination '--dest' and/or channel index '--ch-index'.", help="Send a text message. Can specify a destination '--dest' and/or channel index '--ch-index'.",
) )
parser.add_argument(
"--sendping",
help="Send a ping message (which requests a reply)",
action="store_true",
)
parser.add_argument( parser.add_argument(
"--traceroute", "--traceroute",
help="Traceroute from connected node to a destination. " help="Traceroute from connected node to a destination. "
@@ -1200,7 +1248,7 @@ def initParser():
help="Request telemetry from a node. " help="Request telemetry from a node. "
"You need pass the destination ID as argument with '--dest'. " "You need pass the destination ID as argument with '--dest'. "
"For repeaters, the nodeNum is required.", "For repeaters, the nodeNum is required.",
action="store_true", action="store_true",
) )
parser.add_argument( parser.add_argument(
@@ -1302,9 +1350,14 @@ def initParser():
parser.add_argument( parser.add_argument(
"--ble", "--ble",
help="BLE mac address to connect to (BLE is not yet supported for this tool)", help="BLE device address or name to connect to",
default=None, default=None,
) )
parser.add_argument(
"--ble-scan",
help="Scan for Meshtastic BLE devices",
action="store_true",
)
parser.add_argument( parser.add_argument(
"--noproto", "--noproto",
@@ -1312,6 +1365,12 @@ def initParser():
action="store_true", action="store_true",
) )
parser.add_argument(
"--listen",
help="Just stay open and listen to the protobuf stream.",
action="store_true",
)
have_tunnel = platform.system() == "Linux" have_tunnel = platform.system() == "Linux"
if have_tunnel: if have_tunnel:
parser.add_argument( parser.add_argument(
@@ -1328,7 +1387,7 @@ def initParser():
parser.set_defaults(deprecated=None) parser.set_defaults(deprecated=None)
the_version = pkg_resources.get_distribution("meshtastic").version the_version = get_active_version()
parser.add_argument("--version", action="version", version=f"{the_version}") parser.add_argument("--version", action="version", version=f"{the_version}")
parser.add_argument( parser.add_argument(
@@ -1345,7 +1404,9 @@ def initParser():
def main(): def main():
"""Perform command line meshtastic operations""" """Perform command line meshtastic operations"""
our_globals = Globals.getInstance() our_globals = Globals.getInstance()
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser(
epilog="If neither --port nor --host are specified, we search for a compatible serial device, "
"and if none is found, then attempt a TCP connection to localhost.")
our_globals.set_parser(parser) our_globals.set_parser(parser)
initParser() initParser()
common() common()

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/admin.proto # source: meshtastic/admin.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -20,48 +19,22 @@ from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2 from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/admin.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\"meshtastic/connection_status.proto\x1a\x1bmeshtastic/deviceonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\"\xad\x0e\n\x0c\x41\x64minMessage\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12(\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12#\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x05.UserH\x00\x12\x36\n\x12get_config_request\x18\x05 \x01(\x0e\x32\x18.AdminMessage.ConfigTypeH\x00\x12&\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x07.ConfigH\x00\x12\x43\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x1e.AdminMessage.ModuleConfigTypeH\x00\x12\x33\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32\r.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\x37\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32\x0f.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\x12H\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32\x17.DeviceConnectionStatusH\x00\x12&\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\x0e.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12Q\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x1f.NodeRemoteHardwarePinsResponseH\x00\x12\x1a\n\tset_owner\x18 \x01(\x0b\x32\x05.UserH\x00\x12\x1f\n\x0bset_channel\x18! \x01(\x0b\x32\x08.ChannelH\x00\x12\x1d\n\nset_config\x18\" \x01(\x0b\x32\x07.ConfigH\x00\x12*\n\x11set_module_config\x18# \x01(\x0b\x32\r.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messages\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% \x01(\tH\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\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\x17\n\rfactory_reset\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\x95\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\"\xa4\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\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\"[\n\x1eNodeRemoteHardwarePinsResponse\x12\x39\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32\x16.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/admin.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\"meshtastic/connection_status.proto\x1a\x1bmeshtastic/deviceonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\"\xdf\x0f\n\x0c\x41\x64minMessage\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12(\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12#\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x05.UserH\x00\x12\x36\n\x12get_config_request\x18\x05 \x01(\x0e\x32\x18.AdminMessage.ConfigTypeH\x00\x12&\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x07.ConfigH\x00\x12\x43\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x1e.AdminMessage.ModuleConfigTypeH\x00\x12\x33\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32\r.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\x37\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32\x0f.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\x12H\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32\x17.DeviceConnectionStatusH\x00\x12&\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\x0e.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12Q\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x1f.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\x1a\n\tset_owner\x18 \x01(\x0b\x32\x05.UserH\x00\x12\x1f\n\x0bset_channel\x18! \x01(\x0b\x32\x08.ChannelH\x00\x12\x1d\n\nset_config\x18\" \x01(\x0b\x32\x07.ConfigH\x00\x12*\n\x11set_module_config\x18# \x01(\x0b\x32\r.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\x1d\n\x13\x62\x65gin_edit_settings\x18@ \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 \x01(\x08H\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\x17\n\rfactory_reset\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\x95\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\"\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\"[\n\x1eNodeRemoteHardwarePinsResponse\x12\x39\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32\x16.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_ADMINMESSAGE = DESCRIPTOR.message_types_by_name['AdminMessage']
_HAMPARAMETERS = DESCRIPTOR.message_types_by_name['HamParameters']
_NODEREMOTEHARDWAREPINSRESPONSE = DESCRIPTOR.message_types_by_name['NodeRemoteHardwarePinsResponse']
_ADMINMESSAGE_CONFIGTYPE = _ADMINMESSAGE.enum_types_by_name['ConfigType']
_ADMINMESSAGE_MODULECONFIGTYPE = _ADMINMESSAGE.enum_types_by_name['ModuleConfigType']
AdminMessage = _reflection.GeneratedProtocolMessageType('AdminMessage', (_message.Message,), {
'DESCRIPTOR' : _ADMINMESSAGE,
'__module__' : 'meshtastic.admin_pb2'
# @@protoc_insertion_point(class_scope:AdminMessage)
})
_sym_db.RegisterMessage(AdminMessage)
HamParameters = _reflection.GeneratedProtocolMessageType('HamParameters', (_message.Message,), {
'DESCRIPTOR' : _HAMPARAMETERS,
'__module__' : 'meshtastic.admin_pb2'
# @@protoc_insertion_point(class_scope:HamParameters)
})
_sym_db.RegisterMessage(HamParameters)
NodeRemoteHardwarePinsResponse = _reflection.GeneratedProtocolMessageType('NodeRemoteHardwarePinsResponse', (_message.Message,), {
'DESCRIPTOR' : _NODEREMOTEHARDWAREPINSRESPONSE,
'__module__' : 'meshtastic.admin_pb2'
# @@protoc_insertion_point(class_scope:NodeRemoteHardwarePinsResponse)
})
_sym_db.RegisterMessage(NodeRemoteHardwarePinsResponse)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.admin_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_ADMINMESSAGE._serialized_start=198 _ADMINMESSAGE._serialized_start=198
_ADMINMESSAGE._serialized_end=2035 _ADMINMESSAGE._serialized_end=2213
_ADMINMESSAGE_CONFIGTYPE._serialized_start=1572 _ADMINMESSAGE_CONFIGTYPE._serialized_start=1727
_ADMINMESSAGE_CONFIGTYPE._serialized_end=1721 _ADMINMESSAGE_CONFIGTYPE._serialized_end=1876
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=1724 _ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=1879
_ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=2016 _ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=2194
_HAMPARAMETERS._serialized_start=2037 _HAMPARAMETERS._serialized_start=2215
_HAMPARAMETERS._serialized_end=2128 _HAMPARAMETERS._serialized_end=2306
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=2130 _NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=2308
_NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=2221 _NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=2399
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/apponly.proto # source: meshtastic/apponly.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -18,16 +17,8 @@ from meshtastic import config_pb2 as meshtastic_dot_config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/apponly.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"Y\n\nChannelSet\x12\"\n\x08settings\x18\x01 \x03(\x0b\x32\x10.ChannelSettings\x12\'\n\x0blora_config\x18\x02 \x01(\x0b\x32\x12.Config.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/apponly.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"Y\n\nChannelSet\x12\"\n\x08settings\x18\x01 \x03(\x0b\x32\x10.ChannelSettings\x12\'\n\x0blora_config\x18\x02 \x01(\x0b\x32\x12.Config.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.apponly_pb2', globals())
_CHANNELSET = DESCRIPTOR.message_types_by_name['ChannelSet']
ChannelSet = _reflection.GeneratedProtocolMessageType('ChannelSet', (_message.Message,), {
'DESCRIPTOR' : _CHANNELSET,
'__module__' : 'meshtastic.apponly_pb2'
# @@protoc_insertion_point(class_scope:ChannelSet)
})
_sym_db.RegisterMessage(ChannelSet)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

40
meshtastic/atak_pb2.py Normal file
View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/atak.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/atak.proto\"\xaf\x01\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12\x19\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x08.Contact\x12\x15\n\x05group\x18\x03 \x01(\x0b\x32\x06.Group\x12\x17\n\x06status\x18\x04 \x01(\x0b\x32\x07.Status\x12\x13\n\x03pli\x18\x05 \x01(\x0b\x32\x04.PLIH\x00\x12\x18\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x08.GeoChatH\x00\x42\x11\n\x0fpayload_variant\"2\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x05\n\x03_to\"7\n\x05Group\x12\x19\n\x04role\x18\x01 \x01(\x0e\x32\x0b.MemberRole\x12\x13\n\x04team\x18\x02 \x01(\x0e\x32\x05.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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.atak_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_TEAM._serialized_start=491
_TEAM._serialized_end=683
_MEMBERROLE._serialized_start=685
_MEMBERROLE._serialized_end=812
_TAKPACKET._serialized_start=26
_TAKPACKET._serialized_end=201
_GEOCHAT._serialized_start=203
_GEOCHAT._serialized_end=253
_GROUP._serialized_start=255
_GROUP._serialized_end=310
_STATUS._serialized_start=312
_STATUS._serialized_end=337
_CONTACT._serialized_start=339
_CONTACT._serialized_end=391
_PLI._serialized_start=393
_PLI._serialized_end=488
# @@protoc_insertion_point(module_scope)

View File

View File

@@ -1,66 +1,236 @@
"""Bluetooth interface """Bluetooth interface
""" """
import logging import logging
import platform import time
import struct
import asyncio
from threading import Thread, Event
from bleak import BleakScanner, BleakClient
from meshtastic.mesh_interface import MeshInterface from meshtastic.mesh_interface import MeshInterface
from meshtastic.util import our_exit from meshtastic.util import our_exit
if platform.system() == "Linux": SERVICE_UUID = "6ba1b218-15a8-461f-9fa8-5dcae273eafd"
# pylint: disable=E0401
import pygatt
# Our standard BLE characteristics
TORADIO_UUID = "f75c76d2-129e-4dad-a1dd-7866124401e7" TORADIO_UUID = "f75c76d2-129e-4dad-a1dd-7866124401e7"
FROMRADIO_UUID = "8ba2bcc2-ee02-4a55-a531-c525c5e454d5" FROMRADIO_UUID = "2c55e69e-4993-11ed-b878-0242ac120002"
FROMNUM_UUID = "ed9da18c-a800-4f66-a670-aa7547e34453" FROMNUM_UUID = "ed9da18c-a800-4f66-a670-aa7547e34453"
class BLEInterface(MeshInterface): class BLEInterface(MeshInterface):
"""A not quite ready - FIXME - BLE interface to devices""" """MeshInterface using BLE to connect to devices"""
class BLEError(Exception):
"""An exception class for BLE errors"""
def __init__(self, message):
self.message = message
super().__init__(self.message)
def __init__(self, address, noProto=False, debugOut=None): class BLEState(): # pylint: disable=C0115
if platform.system() != "Linux": THREADS = False
our_exit("Linux is the only platform with experimental BLE support.", 1) BLE = False
self.address = address MESH = False
if not noProto:
self.adapter = pygatt.GATTToolBackend() # BGAPIBackend()
self.adapter.start()
logging.debug(f"Connecting to {self.address}")
self.device = self.adapter.connect(address)
else:
self.adapter = None
self.device = None
logging.debug("Connected to device")
# fromradio = self.device.char_read(FROMRADIO_UUID)
MeshInterface.__init__(self, debugOut=debugOut, noProto=noProto)
self._readFromRadio() # read the initial responses
def handle_data(handle, data): # pylint: disable=W0613 def __init__(self, address, noProto = False, debugOut = None):
self._handleFromRadio(data) self.state = BLEInterface.BLEState()
if self.device: if not address:
self.device.subscribe(FROMNUM_UUID, callback=handle_data) return
self.should_read = False
logging.debug("Threads starting")
self._receiveThread = Thread(target = self._receiveFromRadioImpl)
self._receiveThread_started = Event()
self._receiveThread_stopped = Event()
self._receiveThread.start()
self._receiveThread_started.wait(1)
self.state.THREADS = True
logging.debug("Threads running")
try:
logging.debug(f"BLE connecting to: {address}")
self.client = self.connect(address)
self.state.BLE = True
logging.debug("BLE connected")
except BLEInterface.BLEError as e:
self.close()
our_exit(e.message, 1)
return
logging.debug("Mesh init starting")
MeshInterface.__init__(self, debugOut = debugOut, noProto = noProto)
self._startConfig()
if not self.noProto:
self._waitConnected(timeout = 60.0)
self.waitForConfig()
self.state.MESH = True
logging.debug("Mesh init finished")
logging.debug("Register FROMNUM notify callback")
self.client.start_notify(FROMNUM_UUID, self.from_num_handler)
async def from_num_handler(self, _, b): # pylint: disable=C0116
from_num = struct.unpack('<I', bytes(b))[0]
logging.debug(f"FROMNUM notify: {from_num}")
self.should_read = True
def scan(self):
"Scan for available BLE devices"
with BLEClient() as client:
return [
(x[0], x[1]) for x in (client.discover(
return_adv = True,
service_uuids = [ SERVICE_UUID ]
)).values()
]
def find_device(self, address):
"Find a device by address"
meshtastic_devices = self.scan()
addressed_devices = list(filter(lambda x: address in (x[1].local_name, x[0].name), meshtastic_devices))
# If nothing is found try on the address
if len(addressed_devices) == 0:
addressed_devices = list(filter(
lambda x: BLEInterface._sanitize_address(address) == BLEInterface._sanitize_address(x[0].address),
meshtastic_devices))
if len(addressed_devices) == 0:
raise BLEInterface.BLEError(f"No Meshtastic BLE peripheral with identifier or address '{address}' found. Try --ble-scan to find it.")
if len(addressed_devices) > 1:
raise BLEInterface.BLEError(f"More than one Meshtastic BLE peripheral with identifier or address '{address}' found.")
return addressed_devices[0][0]
def _sanitize_address(address): # pylint: disable=E0213
"Standardize BLE address by removing extraneous characters and lowercasing"
return address \
.replace("-", "") \
.replace("_", "") \
.replace(":", "") \
.lower()
def connect(self, address):
"Connect to a device by address"
device = self.find_device(address)
client = BLEClient(device.address)
client.connect()
try:
client.pair()
except NotImplementedError:
# Some bluetooth backends do not require explicit pairing.
# See Bleak docs for details on this.
pass
return client
def _receiveFromRadioImpl(self):
self._receiveThread_started.set()
while self._receiveThread_started.is_set():
if self.should_read:
self.should_read = False
retries = 0
while True:
b = bytes(self.client.read_gatt_char(FROMRADIO_UUID))
if not b:
if retries < 5:
time.sleep(0.1)
retries += 1
continue
break
logging.debug(f"FROMRADIO read: {b.hex()}")
self._handleFromRadio(b)
else:
time.sleep(0.1)
self._receiveThread_stopped.set()
def _sendToRadioImpl(self, toRadio): def _sendToRadioImpl(self, toRadio):
"""Send a ToRadio protobuf to the device"""
# logging.debug(f"Sending: {stripnl(toRadio)}")
b = toRadio.SerializeToString() b = toRadio.SerializeToString()
self.device.char_write(TORADIO_UUID, b) if b:
logging.debug(f"TORADIO write: {b.hex()}")
self.client.write_gatt_char(TORADIO_UUID, b, response = True)
# Allow to propagate and then make sure we read
time.sleep(0.1)
self.should_read = True
def close(self): def close(self):
MeshInterface.close(self) if self.state.MESH:
if self.adapter: MeshInterface.close(self)
self.adapter.stop()
def _readFromRadio(self): if self.state.THREADS:
if not self.noProto: self._receiveThread_started.clear()
wasEmpty = False self._receiveThread_stopped.wait(5)
while not wasEmpty:
if self.device: if self.state.BLE:
b = self.device.char_read(FROMRADIO_UUID) self.client.disconnect()
wasEmpty = len(b) == 0 self.client.close()
if not wasEmpty:
self._handleFromRadio(b)
class BLEClient():
"""Client for managing connection to a BLE device"""
def __init__(self, address = None, **kwargs):
self._eventThread = Thread(target = self._run_event_loop)
self._eventThread_started = Event()
self._eventThread_stopped = Event()
self._eventThread.start()
self._eventThread_started.wait(1)
if not address:
logging.debug("No address provided - only discover method will work.")
return
self.bleak_client = BleakClient(address, **kwargs)
def discover(self, **kwargs): # pylint: disable=C0116
return self.async_await(BleakScanner.discover(**kwargs))
def pair(self, **kwargs): # pylint: disable=C0116
return self.async_await(self.bleak_client.pair(**kwargs))
def connect(self, **kwargs): # pylint: disable=C0116
return self.async_await(self.bleak_client.connect(**kwargs))
def disconnect(self, **kwargs): # pylint: disable=C0116
self.async_await(self.bleak_client.disconnect(**kwargs))
def read_gatt_char(self, *args, **kwargs): # pylint: disable=C0116
return self.async_await(self.bleak_client.read_gatt_char(*args, **kwargs))
def write_gatt_char(self, *args, **kwargs): # pylint: disable=C0116
self.async_await(self.bleak_client.write_gatt_char(*args, **kwargs))
def start_notify(self, *args, **kwargs): # pylint: disable=C0116
self.async_await(self.bleak_client.start_notify(*args, **kwargs))
def close(self): # pylint: disable=C0116
self.async_run(self._stop_event_loop())
self._eventThread_stopped.wait(5)
def __enter__(self):
return self
def __exit__(self, _type, _value, _traceback):
self.close()
def async_await(self, coro, timeout = None): # pylint: disable=C0116
return self.async_run(coro).result(timeout)
def async_run(self, coro): # pylint: disable=C0116
return asyncio.run_coroutine_threadsafe(coro, self._eventLoop)
def _run_event_loop(self):
# I don't know if the event loop can be initialized in __init__ so silencing pylint
self._eventLoop = asyncio.new_event_loop() # pylint: disable=W0201
self._eventThread_started.set()
try:
self._eventLoop.run_forever()
finally:
self._eventLoop.close()
self._eventThread_stopped.set()
async def _stop_event_loop(self):
self._eventLoop.stop()

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/cannedmessages.proto # source: meshtastic/cannedmessages.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -16,16 +15,8 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\"-\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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\"-\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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.cannedmessages_pb2', globals())
_CANNEDMESSAGEMODULECONFIG = DESCRIPTOR.message_types_by_name['CannedMessageModuleConfig']
CannedMessageModuleConfig = _reflection.GeneratedProtocolMessageType('CannedMessageModuleConfig', (_message.Message,), {
'DESCRIPTOR' : _CANNEDMESSAGEMODULECONFIG,
'__module__' : 'meshtastic.cannedmessages_pb2'
# @@protoc_insertion_point(class_scope:CannedMessageModuleConfig)
})
_sym_db.RegisterMessage(CannedMessageModuleConfig)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/channel.proto # source: meshtastic/channel.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -14,27 +13,10 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/channel.proto\"\x83\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\"\x8b\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\"\n\x08settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x12\x1b\n\x04role\x18\x03 \x01(\x0e\x32\r.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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/channel.proto\"\xad\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(\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32\x0f.ModuleSettings\",\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\"\x8b\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\"\n\x08settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x12\x1b\n\x04role\x18\x03 \x01(\x0e\x32\r.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')
_CHANNELSETTINGS = DESCRIPTOR.message_types_by_name['ChannelSettings']
_CHANNEL = DESCRIPTOR.message_types_by_name['Channel']
_CHANNEL_ROLE = _CHANNEL.enum_types_by_name['Role']
ChannelSettings = _reflection.GeneratedProtocolMessageType('ChannelSettings', (_message.Message,), {
'DESCRIPTOR' : _CHANNELSETTINGS,
'__module__' : 'meshtastic.channel_pb2'
# @@protoc_insertion_point(class_scope:ChannelSettings)
})
_sym_db.RegisterMessage(ChannelSettings)
Channel = _reflection.GeneratedProtocolMessageType('Channel', (_message.Message,), {
'DESCRIPTOR' : _CHANNEL,
'__module__' : 'meshtastic.channel_pb2'
# @@protoc_insertion_point(class_scope:Channel)
})
_sym_db.RegisterMessage(Channel)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.channel_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
@@ -42,9 +24,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_CHANNELSETTINGS.fields_by_name['channel_num']._options = None _CHANNELSETTINGS.fields_by_name['channel_num']._options = None
_CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001' _CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001'
_CHANNELSETTINGS._serialized_start=29 _CHANNELSETTINGS._serialized_start=29
_CHANNELSETTINGS._serialized_end=160 _CHANNELSETTINGS._serialized_end=202
_CHANNEL._serialized_start=163 _MODULESETTINGS._serialized_start=204
_CHANNEL._serialized_end=302 _MODULESETTINGS._serialized_end=248
_CHANNEL_ROLE._serialized_start=254 _CHANNEL._serialized_start=251
_CHANNEL_ROLE._serialized_end=302 _CHANNEL._serialized_end=390
_CHANNEL_ROLE._serialized_start=342
_CHANNEL_ROLE._serialized_end=390
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/clientonly.proto # source: meshtastic/clientonly.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -17,16 +16,8 @@ from meshtastic import localonly_pb2 as meshtastic_dot_localonly__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/clientonly.proto\x1a\x1ameshtastic/localonly.proto\"\xf7\x01\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\x0c.LocalConfigH\x03\x88\x01\x01\x12.\n\rmodule_config\x18\x05 \x01(\x0b\x32\x12.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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/clientonly.proto\x1a\x1ameshtastic/localonly.proto\"\xf7\x01\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\x0c.LocalConfigH\x03\x88\x01\x01\x12.\n\rmodule_config\x18\x05 \x01(\x0b\x32\x12.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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.clientonly_pb2', globals())
_DEVICEPROFILE = DESCRIPTOR.message_types_by_name['DeviceProfile']
DeviceProfile = _reflection.GeneratedProtocolMessageType('DeviceProfile', (_message.Message,), {
'DESCRIPTOR' : _DEVICEPROFILE,
'__module__' : 'meshtastic.clientonly_pb2'
# @@protoc_insertion_point(class_scope:DeviceProfile)
})
_sym_db.RegisterMessage(DeviceProfile)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

View File

File diff suppressed because one or more lines are too long

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/connection_status.proto # source: meshtastic/connection_status.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -16,56 +15,8 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/connection_status.proto\"\x85\x02\n\x16\x44\x65viceConnectionStatus\x12(\n\x04wifi\x18\x01 \x01(\x0b\x32\x15.WifiConnectionStatusH\x00\x88\x01\x01\x12\x30\n\x08\x65thernet\x18\x02 \x01(\x0b\x32\x19.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x32\n\tbluetooth\x18\x03 \x01(\x0b\x32\x1a.BluetoothConnectionStatusH\x02\x88\x01\x01\x12,\n\x06serial\x18\x04 \x01(\x0b\x32\x17.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"\\\n\x14WifiConnectionStatus\x12(\n\x06status\x18\x01 \x01(\x0b\x32\x18.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"D\n\x18\x45thernetConnectionStatus\x12(\n\x06status\x18\x01 \x01(\x0b\x32\x18.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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/connection_status.proto\"\x85\x02\n\x16\x44\x65viceConnectionStatus\x12(\n\x04wifi\x18\x01 \x01(\x0b\x32\x15.WifiConnectionStatusH\x00\x88\x01\x01\x12\x30\n\x08\x65thernet\x18\x02 \x01(\x0b\x32\x19.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x32\n\tbluetooth\x18\x03 \x01(\x0b\x32\x1a.BluetoothConnectionStatusH\x02\x88\x01\x01\x12,\n\x06serial\x18\x04 \x01(\x0b\x32\x17.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"\\\n\x14WifiConnectionStatus\x12(\n\x06status\x18\x01 \x01(\x0b\x32\x18.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"D\n\x18\x45thernetConnectionStatus\x12(\n\x06status\x18\x01 \x01(\x0b\x32\x18.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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.connection_status_pb2', globals())
_DEVICECONNECTIONSTATUS = DESCRIPTOR.message_types_by_name['DeviceConnectionStatus']
_WIFICONNECTIONSTATUS = DESCRIPTOR.message_types_by_name['WifiConnectionStatus']
_ETHERNETCONNECTIONSTATUS = DESCRIPTOR.message_types_by_name['EthernetConnectionStatus']
_NETWORKCONNECTIONSTATUS = DESCRIPTOR.message_types_by_name['NetworkConnectionStatus']
_BLUETOOTHCONNECTIONSTATUS = DESCRIPTOR.message_types_by_name['BluetoothConnectionStatus']
_SERIALCONNECTIONSTATUS = DESCRIPTOR.message_types_by_name['SerialConnectionStatus']
DeviceConnectionStatus = _reflection.GeneratedProtocolMessageType('DeviceConnectionStatus', (_message.Message,), {
'DESCRIPTOR' : _DEVICECONNECTIONSTATUS,
'__module__' : 'meshtastic.connection_status_pb2'
# @@protoc_insertion_point(class_scope:DeviceConnectionStatus)
})
_sym_db.RegisterMessage(DeviceConnectionStatus)
WifiConnectionStatus = _reflection.GeneratedProtocolMessageType('WifiConnectionStatus', (_message.Message,), {
'DESCRIPTOR' : _WIFICONNECTIONSTATUS,
'__module__' : 'meshtastic.connection_status_pb2'
# @@protoc_insertion_point(class_scope:WifiConnectionStatus)
})
_sym_db.RegisterMessage(WifiConnectionStatus)
EthernetConnectionStatus = _reflection.GeneratedProtocolMessageType('EthernetConnectionStatus', (_message.Message,), {
'DESCRIPTOR' : _ETHERNETCONNECTIONSTATUS,
'__module__' : 'meshtastic.connection_status_pb2'
# @@protoc_insertion_point(class_scope:EthernetConnectionStatus)
})
_sym_db.RegisterMessage(EthernetConnectionStatus)
NetworkConnectionStatus = _reflection.GeneratedProtocolMessageType('NetworkConnectionStatus', (_message.Message,), {
'DESCRIPTOR' : _NETWORKCONNECTIONSTATUS,
'__module__' : 'meshtastic.connection_status_pb2'
# @@protoc_insertion_point(class_scope:NetworkConnectionStatus)
})
_sym_db.RegisterMessage(NetworkConnectionStatus)
BluetoothConnectionStatus = _reflection.GeneratedProtocolMessageType('BluetoothConnectionStatus', (_message.Message,), {
'DESCRIPTOR' : _BLUETOOTHCONNECTIONSTATUS,
'__module__' : 'meshtastic.connection_status_pb2'
# @@protoc_insertion_point(class_scope:BluetoothConnectionStatus)
})
_sym_db.RegisterMessage(BluetoothConnectionStatus)
SerialConnectionStatus = _reflection.GeneratedProtocolMessageType('SerialConnectionStatus', (_message.Message,), {
'DESCRIPTOR' : _SERIALCONNECTIONSTATUS,
'__module__' : 'meshtastic.connection_status_pb2'
# @@protoc_insertion_point(class_scope:SerialConnectionStatus)
})
_sym_db.RegisterMessage(SerialConnectionStatus)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

View File

@@ -1,37 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/device_metadata.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/device_metadata.proto\x1a\x17meshtastic/config.proto\x1a\x15meshtastic/mesh.proto\"\xfc\x01\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\'\n\x04role\x18\x07 \x01(\x0e\x32\x19.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12 \n\x08hw_model\x18\t \x01(\x0e\x32\x0e.HardwareModelBi\n\x13\x63om.geeksville.meshB\x14\x44\x65viceMetadataProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_DEVICEMETADATA = DESCRIPTOR.message_types_by_name['DeviceMetadata']
DeviceMetadata = _reflection.GeneratedProtocolMessageType('DeviceMetadata', (_message.Message,), {
'DESCRIPTOR' : _DEVICEMETADATA,
'__module__' : 'meshtastic.device_metadata_pb2'
# @@protoc_insertion_point(class_scope:DeviceMetadata)
})
_sym_db.RegisterMessage(DeviceMetadata)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\024DeviceMetadataProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_DEVICEMETADATA._serialized_start=85
_DEVICEMETADATA._serialized_end=337
# @@protoc_insertion_point(module_scope)

View File

@@ -2,11 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/deviceonly.proto # source: meshtastic/deviceonly.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import enum_type_wrapper from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -18,81 +16,33 @@ from meshtastic import localonly_pb2 as meshtastic_dot_localonly__pb2
from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2 from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
from meshtastic import telemetry_pb2 as meshtastic_dot_telemetry__pb2 from meshtastic import telemetry_pb2 as meshtastic_dot_telemetry__pb2
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2 from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
from . import nanopb_pb2 as nanopb__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/deviceonly.proto\x1a\x18meshtastic/channel.proto\x1a\x1ameshtastic/localonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x1emeshtastic/module_config.proto\"\xc6\x02\n\x0b\x44\x65viceState\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07no_save\x18\t \x01(\x08\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08\x12 \n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x0b.MeshPacket\x12\x39\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32\x16.NodeRemoteHardwarePin\x12#\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32\r.NodeInfoLite\"\xab\x01\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1f\n\x08position\x18\x03 \x01(\x0b\x32\r.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12&\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x0e.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\"\x85\x01\n\x0cPositionLite\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\x0c\n\x04time\x18\x04 \x01(\x07\x12,\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x13.Position.LocSource\":\n\x0b\x43hannelFile\x12\x1a\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x08.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\xf6\x01\n\x08OEMStore\x12\x16\n\x0eoem_icon_width\x18\x01 \x01(\r\x12\x17\n\x0foem_icon_height\x18\x02 \x01(\r\x12\x15\n\roem_icon_bits\x18\x03 \x01(\x0c\x12\x1e\n\x08oem_font\x18\x04 \x01(\x0e\x32\x0c.ScreenFonts\x12\x10\n\x08oem_text\x18\x05 \x01(\t\x12\x13\n\x0boem_aes_key\x18\x06 \x01(\x0c\x12&\n\x10oem_local_config\x18\x07 \x01(\x0b\x32\x0c.LocalConfig\x12\x33\n\x17oem_local_module_config\x18\x08 \x01(\x0b\x32\x12.LocalModuleConfig\"J\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x1f\n\x03pin\x18\x02 \x01(\x0b\x32\x12.RemoteHardwarePin*>\n\x0bScreenFonts\x12\x0e\n\nFONT_SMALL\x10\x00\x12\x0f\n\x0b\x46ONT_MEDIUM\x10\x01\x12\x0e\n\nFONT_LARGE\x10\x02\x42_\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/deviceonly.proto\x1a\x18meshtastic/channel.proto\x1a\x1ameshtastic/localonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x1emeshtastic/module_config.proto\x1a\x0cnanopb.proto\"\xf6\x02\n\x0b\x44\x65viceState\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08\x12 \n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x0b.MeshPacket\x12\x39\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32\x16.NodeRemoteHardwarePin\x12O\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32\r.NodeInfoLiteB*\x92?\'\x92\x01$std::vector<meshtastic_NodeInfoLite>\"\xe5\x01\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1f\n\x08position\x18\x03 \x01(\x0b\x32\r.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12&\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x0e.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\"\x85\x01\n\x0cPositionLite\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\x0c\n\x04time\x18\x04 \x01(\x07\x12,\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x13.Position.LocSource\":\n\x0b\x43hannelFile\x12\x1a\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x08.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\xf6\x01\n\x08OEMStore\x12\x16\n\x0eoem_icon_width\x18\x01 \x01(\r\x12\x17\n\x0foem_icon_height\x18\x02 \x01(\r\x12\x15\n\roem_icon_bits\x18\x03 \x01(\x0c\x12\x1e\n\x08oem_font\x18\x04 \x01(\x0e\x32\x0c.ScreenFonts\x12\x10\n\x08oem_text\x18\x05 \x01(\t\x12\x13\n\x0boem_aes_key\x18\x06 \x01(\x0c\x12&\n\x10oem_local_config\x18\x07 \x01(\x0b\x32\x0c.LocalConfig\x12\x33\n\x17oem_local_module_config\x18\x08 \x01(\x0b\x32\x12.LocalModuleConfig\"J\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x1f\n\x03pin\x18\x02 \x01(\x0b\x32\x12.RemoteHardwarePin*>\n\x0bScreenFonts\x12\x0e\n\nFONT_SMALL\x10\x00\x12\x0f\n\x0b\x46ONT_MEDIUM\x10\x01\x12\x0e\n\nFONT_LARGE\x10\x02\x42m\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08<vector>b\x06proto3')
_SCREENFONTS = DESCRIPTOR.enum_types_by_name['ScreenFonts']
ScreenFonts = enum_type_wrapper.EnumTypeWrapper(_SCREENFONTS)
FONT_SMALL = 0
FONT_MEDIUM = 1
FONT_LARGE = 2
_DEVICESTATE = DESCRIPTOR.message_types_by_name['DeviceState']
_NODEINFOLITE = DESCRIPTOR.message_types_by_name['NodeInfoLite']
_POSITIONLITE = DESCRIPTOR.message_types_by_name['PositionLite']
_CHANNELFILE = DESCRIPTOR.message_types_by_name['ChannelFile']
_OEMSTORE = DESCRIPTOR.message_types_by_name['OEMStore']
_NODEREMOTEHARDWAREPIN = DESCRIPTOR.message_types_by_name['NodeRemoteHardwarePin']
DeviceState = _reflection.GeneratedProtocolMessageType('DeviceState', (_message.Message,), {
'DESCRIPTOR' : _DEVICESTATE,
'__module__' : 'meshtastic.deviceonly_pb2'
# @@protoc_insertion_point(class_scope:DeviceState)
})
_sym_db.RegisterMessage(DeviceState)
NodeInfoLite = _reflection.GeneratedProtocolMessageType('NodeInfoLite', (_message.Message,), {
'DESCRIPTOR' : _NODEINFOLITE,
'__module__' : 'meshtastic.deviceonly_pb2'
# @@protoc_insertion_point(class_scope:NodeInfoLite)
})
_sym_db.RegisterMessage(NodeInfoLite)
PositionLite = _reflection.GeneratedProtocolMessageType('PositionLite', (_message.Message,), {
'DESCRIPTOR' : _POSITIONLITE,
'__module__' : 'meshtastic.deviceonly_pb2'
# @@protoc_insertion_point(class_scope:PositionLite)
})
_sym_db.RegisterMessage(PositionLite)
ChannelFile = _reflection.GeneratedProtocolMessageType('ChannelFile', (_message.Message,), {
'DESCRIPTOR' : _CHANNELFILE,
'__module__' : 'meshtastic.deviceonly_pb2'
# @@protoc_insertion_point(class_scope:ChannelFile)
})
_sym_db.RegisterMessage(ChannelFile)
OEMStore = _reflection.GeneratedProtocolMessageType('OEMStore', (_message.Message,), {
'DESCRIPTOR' : _OEMSTORE,
'__module__' : 'meshtastic.deviceonly_pb2'
# @@protoc_insertion_point(class_scope:OEMStore)
})
_sym_db.RegisterMessage(OEMStore)
NodeRemoteHardwarePin = _reflection.GeneratedProtocolMessageType('NodeRemoteHardwarePin', (_message.Message,), {
'DESCRIPTOR' : _NODEREMOTEHARDWAREPIN,
'__module__' : 'meshtastic.deviceonly_pb2'
# @@protoc_insertion_point(class_scope:NodeRemoteHardwarePin)
})
_sym_db.RegisterMessage(NodeRemoteHardwarePin)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.deviceonly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010<vector>'
_SCREENFONTS._serialized_start=1192 _DEVICESTATE.fields_by_name['no_save']._options = None
_SCREENFONTS._serialized_end=1254 _DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001'
_DEVICESTATE._serialized_start=169 _DEVICESTATE.fields_by_name['node_db_lite']._options = None
_DEVICESTATE._serialized_end=495 _DEVICESTATE.fields_by_name['node_db_lite']._serialized_options = b'\222?\'\222\001$std::vector<meshtastic_NodeInfoLite>'
_NODEINFOLITE._serialized_start=498 _SCREENFONTS._serialized_start=1312
_NODEINFOLITE._serialized_end=669 _SCREENFONTS._serialized_end=1374
_POSITIONLITE._serialized_start=672 _DEVICESTATE._serialized_start=183
_POSITIONLITE._serialized_end=805 _DEVICESTATE._serialized_end=557
_CHANNELFILE._serialized_start=807 _NODEINFOLITE._serialized_start=560
_CHANNELFILE._serialized_end=865 _NODEINFOLITE._serialized_end=789
_OEMSTORE._serialized_start=868 _POSITIONLITE._serialized_start=792
_OEMSTORE._serialized_end=1114 _POSITIONLITE._serialized_end=925
_NODEREMOTEHARDWAREPIN._serialized_start=1116 _CHANNELFILE._serialized_start=927
_NODEREMOTEHARDWAREPIN._serialized_end=1190 _CHANNELFILE._serialized_end=985
_OEMSTORE._serialized_start=988
_OEMSTORE._serialized_end=1234
_NODEREMOTEHARDWAREPIN._serialized_start=1236
_NODEREMOTEHARDWAREPIN._serialized_end=1310
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -24,7 +24,7 @@ class Globals:
def __init__(self): def __init__(self):
"""Constructor for the Globals CLass""" """Constructor for the Globals CLass"""
if Globals.__instance is not None: if Globals.__instance is not None:
raise Exception("This class is a singleton") raise Exception("This class is a singleton") # pylint: disable=W0719
else: else:
Globals.__instance = self Globals.__instance = self
self.args = None self.args = None

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/localonly.proto # source: meshtastic/localonly.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -16,26 +15,10 @@ from meshtastic import config_pb2 as meshtastic_dot_config__pb2
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2 from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/localonly.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\"\xb0\x02\n\x0bLocalConfig\x12$\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x14.Config.DeviceConfig\x12(\n\x08position\x18\x02 \x01(\x0b\x32\x16.Config.PositionConfig\x12\"\n\x05power\x18\x03 \x01(\x0b\x32\x13.Config.PowerConfig\x12&\n\x07network\x18\x04 \x01(\x0b\x32\x15.Config.NetworkConfig\x12&\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\x15.Config.DisplayConfig\x12 \n\x04lora\x18\x06 \x01(\x0b\x32\x12.Config.LoRaConfig\x12*\n\tbluetooth\x18\x07 \x01(\x0b\x32\x17.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\"\xb8\x05\n\x11LocalModuleConfig\x12&\n\x04mqtt\x18\x01 \x01(\x0b\x32\x18.ModuleConfig.MQTTConfig\x12*\n\x06serial\x18\x02 \x01(\x0b\x32\x1a.ModuleConfig.SerialConfig\x12G\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32(.ModuleConfig.ExternalNotificationConfig\x12\x37\n\rstore_forward\x18\x04 \x01(\x0b\x32 .ModuleConfig.StoreForwardConfig\x12\x31\n\nrange_test\x18\x05 \x01(\x0b\x32\x1d.ModuleConfig.RangeTestConfig\x12\x30\n\ttelemetry\x18\x06 \x01(\x0b\x32\x1d.ModuleConfig.TelemetryConfig\x12\x39\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32!.ModuleConfig.CannedMessageConfig\x12(\n\x05\x61udio\x18\t \x01(\x0b\x32\x19.ModuleConfig.AudioConfig\x12;\n\x0fremote_hardware\x18\n \x01(\x0b\x32\".ModuleConfig.RemoteHardwareConfig\x12\x37\n\rneighbor_info\x18\x0b \x01(\x0b\x32 .ModuleConfig.NeighborInfoConfig\x12=\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32#.ModuleConfig.AmbientLightingConfig\x12=\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32#.ModuleConfig.DetectionSensorConfig\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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/localonly.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\"\xb0\x02\n\x0bLocalConfig\x12$\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x14.Config.DeviceConfig\x12(\n\x08position\x18\x02 \x01(\x0b\x32\x16.Config.PositionConfig\x12\"\n\x05power\x18\x03 \x01(\x0b\x32\x13.Config.PowerConfig\x12&\n\x07network\x18\x04 \x01(\x0b\x32\x15.Config.NetworkConfig\x12&\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\x15.Config.DisplayConfig\x12 \n\x04lora\x18\x06 \x01(\x0b\x32\x12.Config.LoRaConfig\x12*\n\tbluetooth\x18\x07 \x01(\x0b\x32\x17.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\"\xec\x05\n\x11LocalModuleConfig\x12&\n\x04mqtt\x18\x01 \x01(\x0b\x32\x18.ModuleConfig.MQTTConfig\x12*\n\x06serial\x18\x02 \x01(\x0b\x32\x1a.ModuleConfig.SerialConfig\x12G\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32(.ModuleConfig.ExternalNotificationConfig\x12\x37\n\rstore_forward\x18\x04 \x01(\x0b\x32 .ModuleConfig.StoreForwardConfig\x12\x31\n\nrange_test\x18\x05 \x01(\x0b\x32\x1d.ModuleConfig.RangeTestConfig\x12\x30\n\ttelemetry\x18\x06 \x01(\x0b\x32\x1d.ModuleConfig.TelemetryConfig\x12\x39\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32!.ModuleConfig.CannedMessageConfig\x12(\n\x05\x61udio\x18\t \x01(\x0b\x32\x19.ModuleConfig.AudioConfig\x12;\n\x0fremote_hardware\x18\n \x01(\x0b\x32\".ModuleConfig.RemoteHardwareConfig\x12\x37\n\rneighbor_info\x18\x0b \x01(\x0b\x32 .ModuleConfig.NeighborInfoConfig\x12=\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32#.ModuleConfig.AmbientLightingConfig\x12=\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32#.ModuleConfig.DetectionSensorConfig\x12\x32\n\npaxcounter\x18\x0e \x01(\x0b\x32\x1e.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')
_LOCALCONFIG = DESCRIPTOR.message_types_by_name['LocalConfig']
_LOCALMODULECONFIG = DESCRIPTOR.message_types_by_name['LocalModuleConfig']
LocalConfig = _reflection.GeneratedProtocolMessageType('LocalConfig', (_message.Message,), {
'DESCRIPTOR' : _LOCALCONFIG,
'__module__' : 'meshtastic.localonly_pb2'
# @@protoc_insertion_point(class_scope:LocalConfig)
})
_sym_db.RegisterMessage(LocalConfig)
LocalModuleConfig = _reflection.GeneratedProtocolMessageType('LocalModuleConfig', (_message.Message,), {
'DESCRIPTOR' : _LOCALMODULECONFIG,
'__module__' : 'meshtastic.localonly_pb2'
# @@protoc_insertion_point(class_scope:LocalModuleConfig)
})
_sym_db.RegisterMessage(LocalModuleConfig)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.localonly_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
@@ -43,5 +26,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_LOCALCONFIG._serialized_start=88 _LOCALCONFIG._serialized_start=88
_LOCALCONFIG._serialized_end=392 _LOCALCONFIG._serialized_end=392
_LOCALMODULECONFIG._serialized_start=395 _LOCALMODULECONFIG._serialized_start=395
_LOCALMODULECONFIG._serialized_end=1091 _LOCALMODULECONFIG._serialized_end=1143
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -23,7 +23,6 @@ from meshtastic.__init__ import (
BROADCAST_ADDR, BROADCAST_ADDR,
BROADCAST_NUM, BROADCAST_NUM,
LOCAL_ADDR, LOCAL_ADDR,
OUR_APP_VERSION,
ResponseHandler, ResponseHandler,
protocols, protocols,
publishingThread, publishingThread,
@@ -48,6 +47,12 @@ class MeshInterface:
debugOut debugOut
""" """
class MeshInterfaceError(Exception):
"""An exception class for general mesh interface errors"""
def __init__(self, message):
self.message = message
super().__init__(self.message)
def __init__(self, debugOut=None, noProto=False): def __init__(self, debugOut=None, noProto=False):
"""Constructor """Constructor
@@ -124,7 +129,6 @@ class MeshInterface:
# use id as dictionary key for correct json format in list of nodes # use id as dictionary key for correct json format in list of nodes
nodeid = n2["user"]["id"] nodeid = n2["user"]["id"]
n2["user"].pop("id")
nodes[nodeid] = n2 nodes[nodeid] = n2
infos = owner + myinfo + metadata + mesh + json.dumps(nodes) infos = owner + myinfo + metadata + mesh + json.dumps(nodes)
print(infos) print(infos)
@@ -152,13 +156,13 @@ class MeshInterface:
) )
rows = [] rows = []
if self.nodes: if self.nodesByNum:
logging.debug(f"self.nodes:{self.nodes}") logging.debug(f"self.nodes:{self.nodes}")
for node in self.nodes.values(): for node in self.nodesByNum.values():
if not includeSelf and node["num"] == self.localNode.nodeNum: if not includeSelf and node["num"] == self.localNode.nodeNum:
continue continue
row = {"N": 0} row = {"N": 0, "User": f"UNK: {node['num']}", "ID": f"!{node['num']:x}"}
user = node.get("user") user = node.get("user")
if user: if user:
@@ -203,6 +207,7 @@ class MeshInterface:
row.update( row.update(
{ {
"SNR": formatFloat(node.get("snr"), 2, " dB"), "SNR": formatFloat(node.get("snr"), 2, " dB"),
"Channel": node.get("channel"),
"LastHeard": getLH(node.get("lastHeard")), "LastHeard": getLH(node.get("lastHeard")),
"Since": getTimeAgo(node.get("lastHeard")), "Since": getTimeAgo(node.get("lastHeard")),
} }
@@ -313,7 +318,7 @@ class MeshInterface:
f"mesh_pb2.Constants.DATA_PAYLOAD_LEN: {mesh_pb2.Constants.DATA_PAYLOAD_LEN}" f"mesh_pb2.Constants.DATA_PAYLOAD_LEN: {mesh_pb2.Constants.DATA_PAYLOAD_LEN}"
) )
if len(data) > mesh_pb2.Constants.DATA_PAYLOAD_LEN: if len(data) > mesh_pb2.Constants.DATA_PAYLOAD_LEN:
raise Exception("Data payload too big") raise MeshInterface.MeshInterfaceError("Data payload too big")
if ( if (
portNum == portnums_pb2.PortNum.UNKNOWN_APP portNum == portnums_pb2.PortNum.UNKNOWN_APP
@@ -439,7 +444,7 @@ class MeshInterface:
destinationId = int(destinationId[1:], 16) destinationId = int(destinationId[1:], 16)
else: else:
destinationId = int(destinationId) destinationId = int(destinationId)
self.sendData( self.sendData(
r, r,
destinationId=destinationId, destinationId=destinationId,
@@ -468,7 +473,7 @@ class MeshInterface:
) )
if telemetry.device_metrics.air_util_tx is not None: if telemetry.device_metrics.air_util_tx is not None:
print(f"Transmit air utilization: {telemetry.device_metrics.air_util_tx:.2f}%") print(f"Transmit air utilization: {telemetry.device_metrics.air_util_tx:.2f}%")
elif p["decoded"]["portnum"] == 'ROUTING_APP': elif p["decoded"]["portnum"] == 'ROUTING_APP':
if p["decoded"]["routing"]["errorReason"] == 'NO_RESPONSE': if p["decoded"]["routing"]["errorReason"] == 'NO_RESPONSE':
our_exit("No response from node. At least firmware 2.1.22 is required on the destination node.") our_exit("No response from node. At least firmware 2.1.22 is required on the destination node.")
@@ -542,25 +547,25 @@ class MeshInterface:
and self.localNode.waitForConfig() and self.localNode.waitForConfig()
) )
if not success: if not success:
raise Exception("Timed out waiting for interface config") raise MeshInterface.MeshInterfaceError("Timed out waiting for interface config")
def waitForAckNak(self): def waitForAckNak(self):
"""Wait for the ack/nak""" """Wait for the ack/nak"""
success = self._timeout.waitForAckNak(self._acknowledgment) success = self._timeout.waitForAckNak(self._acknowledgment)
if not success: if not success:
raise Exception("Timed out waiting for an acknowledgment") raise MeshInterface.MeshInterfaceError("Timed out waiting for an acknowledgment")
def waitForTraceRoute(self, waitFactor): def waitForTraceRoute(self, waitFactor):
"""Wait for trace route""" """Wait for trace route"""
success = self._timeout.waitForTraceRoute(waitFactor, self._acknowledgment) success = self._timeout.waitForTraceRoute(waitFactor, self._acknowledgment)
if not success: if not success:
raise Exception("Timed out waiting for traceroute") raise MeshInterface.MeshInterfaceError("Timed out waiting for traceroute")
def waitForTelemetry(self): def waitForTelemetry(self):
"""Wait for telemetry""" """Wait for telemetry"""
success = self._timeout.waitForTelemetry(self._acknowledgment) success = self._timeout.waitForTelemetry(self._acknowledgment)
if not success: if not success:
raise Exception("Timed out waiting for telemetry") raise MeshInterface.MeshInterfaceError("Timed out waiting for telemetry")
def getMyNodeInfo(self): def getMyNodeInfo(self):
"""Get info about my node.""" """Get info about my node."""
@@ -590,12 +595,12 @@ class MeshInterface:
return user.get("shortName", None) return user.get("shortName", None)
return None return None
def _waitConnected(self, timeout=15.0): def _waitConnected(self, timeout=30.0):
"""Block until the initial node db download is complete, or timeout """Block until the initial node db download is complete, or timeout
and raise an exception""" and raise an exception"""
if not self.noProto: if not self.noProto:
if not self.isConnected.wait(timeout): # timeout after x seconds if not self.isConnected.wait(timeout): # timeout after x seconds
raise Exception("Timed out waiting for connection completion") raise MeshInterface.MeshInterfaceError("Timed out waiting for connection completion")
# If we failed while connecting, raise the connection to the client # If we failed while connecting, raise the connection to the client
if self.failure: if self.failure:
@@ -604,7 +609,7 @@ class MeshInterface:
def _generatePacketId(self): def _generatePacketId(self):
"""Get a new unique packet ID""" """Get a new unique packet ID"""
if self.currentPacketId is None: if self.currentPacketId is None:
raise Exception("Not connected yet, can not generate packet") raise MeshInterface.MeshInterfaceError("Not connected yet, can not generate packet")
else: else:
self.currentPacketId = (self.currentPacketId + 1) & 0xFFFFFFFF self.currentPacketId = (self.currentPacketId + 1) & 0xFFFFFFFF
return self.currentPacketId return self.currentPacketId
@@ -773,7 +778,7 @@ class MeshInterface:
failmsg = None failmsg = None
if failmsg: if failmsg:
self.failure = Exception(failmsg) self.failure = MeshInterface.MeshInterfaceError(failmsg)
self.isConnected.set() # let waitConnected return this exception self.isConnected.set() # let waitConnected return this exception
self.close() self.close()
@@ -873,6 +878,14 @@ class MeshInterface:
self.localNode.moduleConfig.detection_sensor.CopyFrom( self.localNode.moduleConfig.detection_sensor.CopyFrom(
fromRadio.moduleConfig.detection_sensor fromRadio.moduleConfig.detection_sensor
) )
elif fromRadio.moduleConfig.HasField("ambient_lighting"):
self.localNode.moduleConfig.ambient_lighting.CopyFrom(
fromRadio.moduleConfig.ambient_lighting
)
elif fromRadio.moduleConfig.HasField("paxcounter"):
self.localNode.moduleConfig.paxcounter.CopyFrom(
fromRadio.moduleConfig.paxcounter
)
else: else:
logging.debug("Unexpected FromRadio payload") logging.debug("Unexpected FromRadio payload")
@@ -911,7 +924,7 @@ class MeshInterface:
def _getOrCreateByNum(self, nodeNum): def _getOrCreateByNum(self, nodeNum):
"""Given a nodenum find the NodeInfo in the DB (or create if necessary)""" """Given a nodenum find the NodeInfo in the DB (or create if necessary)"""
if nodeNum == BROADCAST_NUM: if nodeNum == BROADCAST_NUM:
raise Exception("Can not create/find nodenum by the broadcast num") raise MeshInterface.MeshInterfaceError("Can not create/find nodenum by the broadcast num")
if nodeNum in self.nodesByNum: if nodeNum in self.nodesByNum:
return self.nodesByNum[nodeNum] return self.nodesByNum[nodeNum]

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/mqtt.proto # source: meshtastic/mqtt.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -13,24 +12,19 @@ _sym_db = _symbol_database.Default()
from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2 from meshtastic import mesh_pb2 as meshtastic_dot_mesh__pb2
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mqtt.proto\x1a\x15meshtastic/mesh.proto\"V\n\x0fServiceEnvelope\x12\x1b\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\tB_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mqtt.proto\x1a\x15meshtastic/mesh.proto\x1a\x17meshtastic/config.proto\"V\n\x0fServiceEnvelope\x12\x1b\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\x90\x03\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12\'\n\x04role\x18\x03 \x01(\x0e\x32\x19.Config.DeviceConfig.Role\x12 \n\x08hw_model\x18\x04 \x01(\x0e\x32\x0e.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12-\n\x06region\x18\x06 \x01(\x0e\x32\x1d.Config.LoRaConfig.RegionCode\x12\x34\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32\x1e.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')
_SERVICEENVELOPE = DESCRIPTOR.message_types_by_name['ServiceEnvelope']
ServiceEnvelope = _reflection.GeneratedProtocolMessageType('ServiceEnvelope', (_message.Message,), {
'DESCRIPTOR' : _SERVICEENVELOPE,
'__module__' : 'meshtastic.mqtt_pb2'
# @@protoc_insertion_point(class_scope:ServiceEnvelope)
})
_sym_db.RegisterMessage(ServiceEnvelope)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mqtt_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_SERVICEENVELOPE._serialized_start=48 _SERVICEENVELOPE._serialized_start=73
_SERVICEENVELOPE._serialized_end=134 _SERVICEENVELOPE._serialized_end=159
_MAPREPORT._serialized_start=162
_MAPREPORT._serialized_end=562
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -52,7 +52,7 @@ class Node:
# don't show disabled channels # don't show disabled channels
if channel_pb2.Channel.Role.Name(c.role) != "DISABLED": if channel_pb2.Channel.Role.Name(c.role) != "DISABLED":
print( print(
f" {channel_pb2.Channel.Role.Name(c.role)} psk={pskToString(c.settings.psk)} {cStr}" f" Index {c.index}: {channel_pb2.Channel.Role.Name(c.role)} psk={pskToString(c.settings.psk)} {cStr}"
) )
publicURL = self.getURL(includeAll=False) publicURL = self.getURL(includeAll=False)
adminURL = self.getURL(includeAll=True) adminURL = self.getURL(includeAll=True)
@@ -115,6 +115,7 @@ class Node:
print(f"{str(camel_to_snake(field))}:\n{str(config_values)}") print(f"{str(camel_to_snake(field))}:\n{str(config_values)}")
def requestConfig(self, configType): def requestConfig(self, configType):
"""Request the config from the node via admin message"""
if self == self.iface.localNode: if self == self.iface.localNode:
onResponse = None onResponse = None
else: else:
@@ -192,6 +193,10 @@ class Node:
p.set_module_config.neighbor_info.CopyFrom(self.moduleConfig.neighbor_info) p.set_module_config.neighbor_info.CopyFrom(self.moduleConfig.neighbor_info)
elif config_name == "detection_sensor": elif config_name == "detection_sensor":
p.set_module_config.detection_sensor.CopyFrom(self.moduleConfig.detection_sensor) p.set_module_config.detection_sensor.CopyFrom(self.moduleConfig.detection_sensor)
elif config_name == "ambient_lighting":
p.set_module_config.ambient_lighting.CopyFrom(self.moduleConfig.ambient_lighting)
elif config_name == "paxcounter":
p.set_module_config.paxcounter.CopyFrom(self.moduleConfig.paxcounter)
else: else:
our_exit(f"Error: No valid config with name {config_name}") our_exit(f"Error: No valid config with name {config_name}")
@@ -264,11 +269,10 @@ class Node:
def _getAdminChannelIndex(self): def _getAdminChannelIndex(self):
"""Return the channel number of the admin channel, or 0 if no reserved channel""" """Return the channel number of the admin channel, or 0 if no reserved channel"""
c = self.getChannelByName("admin") for c in self.channels or []:
if c: if c.settings and c.settings.name.lower() == "admin":
return c.index return c.index
else: return 0
return 0
def setOwner(self, long_name=None, short_name=None, is_licensed=False): def setOwner(self, long_name=None, short_name=None, is_licensed=False):
"""Set device owner name""" """Set device owner name"""
@@ -685,16 +689,7 @@ class Node:
logging.debug(f"Received channel {stripnl(c)}") logging.debug(f"Received channel {stripnl(c)}")
index = c.index index = c.index
# for stress testing, we can always download all channels if index >= 8 - 1:
fastChannelDownload = True
# Once we see a response that has NO settings, assume
# we are at the end of channels and stop fetching
quitEarly = (
c.role == channel_pb2.Channel.Role.DISABLED
) and fastChannelDownload
if quitEarly or index >= 8 - 1:
logging.debug("Finished downloading channels") logging.debug("Finished downloading channels")
self.channels = self.partialChannels self.channels = self.partialChannels
@@ -706,6 +701,7 @@ class Node:
self._requestChannel(index + 1) self._requestChannel(index + 1)
def onAckNak(self, p): def onAckNak(self, p):
"""Informative handler for ACK/NAK responses"""
if p["decoded"]["routing"]["errorReason"] != "NONE": if p["decoded"]["routing"]["errorReason"] != "NONE":
print( print(
f'Received a NAK, error reason: {p["decoded"]["routing"]["errorReason"]}' f'Received a NAK, error reason: {p["decoded"]["routing"]["errorReason"]}'

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/paxcount.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/paxcount.proto\"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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.paxcount_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_PAXCOUNT._serialized_start=29
_PAXCOUNT._serialized_end=82
# @@protoc_insertion_point(module_scope)

View File

@@ -2,11 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/portnums.proto # source: meshtastic/portnums.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import enum_type_wrapper from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -15,40 +13,14 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/portnums.proto*\xd4\x03\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\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\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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/portnums.proto*\x8d\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\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')
_PORTNUM = DESCRIPTOR.enum_types_by_name['PortNum']
PortNum = enum_type_wrapper.EnumTypeWrapper(_PORTNUM)
UNKNOWN_APP = 0
TEXT_MESSAGE_APP = 1
REMOTE_HARDWARE_APP = 2
POSITION_APP = 3
NODEINFO_APP = 4
ROUTING_APP = 5
ADMIN_APP = 6
TEXT_MESSAGE_COMPRESSED_APP = 7
WAYPOINT_APP = 8
AUDIO_APP = 9
DETECTION_SENSOR_APP = 10
REPLY_APP = 32
IP_TUNNEL_APP = 33
SERIAL_APP = 64
STORE_FORWARD_APP = 65
RANGE_TEST_APP = 66
TELEMETRY_APP = 67
ZPS_APP = 68
SIMULATOR_APP = 69
TRACEROUTE_APP = 70
NEIGHBORINFO_APP = 71
PRIVATE_APP = 256
ATAK_FORWARDER = 257
MAX = 511
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.portnums_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_PORTNUM._serialized_start=30 _PORTNUM._serialized_start=30
_PORTNUM._serialized_end=498 _PORTNUM._serialized_end=555
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/remote_hardware.proto # source: meshtastic/remote_hardware.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -16,17 +15,8 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/remote_hardware.proto\"\xcb\x01\n\x0fHardwareMessage\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/remote_hardware.proto\"\xcb\x01\n\x0fHardwareMessage\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.remote_hardware_pb2', globals())
_HARDWAREMESSAGE = DESCRIPTOR.message_types_by_name['HardwareMessage']
_HARDWAREMESSAGE_TYPE = _HARDWAREMESSAGE.enum_types_by_name['Type']
HardwareMessage = _reflection.GeneratedProtocolMessageType('HardwareMessage', (_message.Message,), {
'DESCRIPTOR' : _HARDWAREMESSAGE,
'__module__' : 'meshtastic.remote_hardware_pb2'
# @@protoc_insertion_point(class_scope:HardwareMessage)
})
_sym_db.RegisterMessage(HardwareMessage)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/rtttl.proto # source: meshtastic/rtttl.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -16,16 +15,8 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/rtttl.proto\"\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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/rtttl.proto\"\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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.rtttl_pb2', globals())
_RTTTLCONFIG = DESCRIPTOR.message_types_by_name['RTTTLConfig']
RTTTLConfig = _reflection.GeneratedProtocolMessageType('RTTTLConfig', (_message.Message,), {
'DESCRIPTOR' : _RTTTLCONFIG,
'__module__' : 'meshtastic.rtttl_pb2'
# @@protoc_insertion_point(class_scope:RTTTLConfig)
})
_sym_db.RegisterMessage(RTTTLConfig)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

View File

@@ -32,7 +32,8 @@ class SerialInterface(StreamInterface):
ports = meshtastic.util.findPorts(True) ports = meshtastic.util.findPorts(True)
logging.debug(f"ports:{ports}") logging.debug(f"ports:{ports}")
if len(ports) == 0: if len(ports) == 0:
meshtastic.util.our_exit("Warning: No Meshtastic devices detected.") print("No Serial Meshtastic device detected, attempting TCP connection on localhost.")
return
elif len(ports) > 1: elif len(ports) > 1:
message = "Warning: Multiple serial ports were detected so one serial port must be specified with the '--port'.\n" message = "Warning: Multiple serial ports were detected so one serial port must be specified with the '--port'.\n"
message += f" Ports detected:{ports}" message += f" Ports detected:{ports}"

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/storeforward.proto # source: meshtastic/storeforward.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -14,58 +13,22 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/storeforward.proto\"\xbe\x06\n\x0fStoreAndForward\x12,\n\x02rr\x18\x01 \x01(\x0e\x32 .StoreAndForward.RequestResponse\x12,\n\x05stats\x18\x02 \x01(\x0b\x32\x1b.StoreAndForward.StatisticsH\x00\x12+\n\x07history\x18\x03 \x01(\x0b\x32\x18.StoreAndForward.HistoryH\x00\x12/\n\theartbeat\x18\x04 \x01(\x0b\x32\x1a.StoreAndForward.HeartbeatH\x00\x12\x0f\n\x05\x65mpty\x18\x05 \x01(\x08H\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\"\x89\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\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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/storeforward.proto\"\xf0\x06\n\x0fStoreAndForward\x12,\n\x02rr\x18\x01 \x01(\x0e\x32 .StoreAndForward.RequestResponse\x12,\n\x05stats\x18\x02 \x01(\x0b\x32\x1b.StoreAndForward.StatisticsH\x00\x12+\n\x07history\x18\x03 \x01(\x0b\x32\x18.StoreAndForward.HistoryH\x00\x12/\n\theartbeat\x18\x04 \x01(\x0b\x32\x1a.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')
_STOREANDFORWARD = DESCRIPTOR.message_types_by_name['StoreAndForward']
_STOREANDFORWARD_STATISTICS = _STOREANDFORWARD.nested_types_by_name['Statistics']
_STOREANDFORWARD_HISTORY = _STOREANDFORWARD.nested_types_by_name['History']
_STOREANDFORWARD_HEARTBEAT = _STOREANDFORWARD.nested_types_by_name['Heartbeat']
_STOREANDFORWARD_REQUESTRESPONSE = _STOREANDFORWARD.enum_types_by_name['RequestResponse']
StoreAndForward = _reflection.GeneratedProtocolMessageType('StoreAndForward', (_message.Message,), {
'Statistics' : _reflection.GeneratedProtocolMessageType('Statistics', (_message.Message,), {
'DESCRIPTOR' : _STOREANDFORWARD_STATISTICS,
'__module__' : 'meshtastic.storeforward_pb2'
# @@protoc_insertion_point(class_scope:StoreAndForward.Statistics)
})
,
'History' : _reflection.GeneratedProtocolMessageType('History', (_message.Message,), {
'DESCRIPTOR' : _STOREANDFORWARD_HISTORY,
'__module__' : 'meshtastic.storeforward_pb2'
# @@protoc_insertion_point(class_scope:StoreAndForward.History)
})
,
'Heartbeat' : _reflection.GeneratedProtocolMessageType('Heartbeat', (_message.Message,), {
'DESCRIPTOR' : _STOREANDFORWARD_HEARTBEAT,
'__module__' : 'meshtastic.storeforward_pb2'
# @@protoc_insertion_point(class_scope:StoreAndForward.Heartbeat)
})
,
'DESCRIPTOR' : _STOREANDFORWARD,
'__module__' : 'meshtastic.storeforward_pb2'
# @@protoc_insertion_point(class_scope:StoreAndForward)
})
_sym_db.RegisterMessage(StoreAndForward)
_sym_db.RegisterMessage(StoreAndForward.Statistics)
_sym_db.RegisterMessage(StoreAndForward.History)
_sym_db.RegisterMessage(StoreAndForward.Heartbeat)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.storeforward_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_STOREANDFORWARD._serialized_start=34 _STOREANDFORWARD._serialized_start=34
_STOREANDFORWARD._serialized_end=864 _STOREANDFORWARD._serialized_end=914
_STOREANDFORWARD_STATISTICS._serialized_start=257 _STOREANDFORWARD_STATISTICS._serialized_start=256
_STOREANDFORWARD_STATISTICS._serialized_end=462 _STOREANDFORWARD_STATISTICS._serialized_end=461
_STOREANDFORWARD_HISTORY._serialized_start=464 _STOREANDFORWARD_HISTORY._serialized_start=463
_STOREANDFORWARD_HISTORY._serialized_end=537 _STOREANDFORWARD_HISTORY._serialized_end=536
_STOREANDFORWARD_HEARTBEAT._serialized_start=539 _STOREANDFORWARD_HEARTBEAT._serialized_start=538
_STOREANDFORWARD_HEARTBEAT._serialized_end=585 _STOREANDFORWARD_HEARTBEAT._serialized_end=584
_STOREANDFORWARD_REQUESTRESPONSE._serialized_start=588 _STOREANDFORWARD_REQUESTRESPONSE._serialized_start=587
_STOREANDFORWARD_REQUESTRESPONSE._serialized_end=853 _STOREANDFORWARD_REQUESTRESPONSE._serialized_end=903
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -32,7 +32,7 @@ class StreamInterface(MeshInterface):
""" """
if not hasattr(self, "stream") and not noProto: if not hasattr(self, "stream") and not noProto:
raise Exception( raise Exception( # pylint: disable=W0719
"StreamInterface is now abstract (to update existing code create SerialInterface instead)" "StreamInterface is now abstract (to update existing code create SerialInterface instead)"
) )
self._rxBuf = bytes() # empty self._rxBuf = bytes() # empty

View File

@@ -2,11 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/telemetry.proto # source: meshtastic/telemetry.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import enum_type_wrapper from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -15,70 +13,24 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/telemetry.proto\"i\n\rDeviceMetrics\x12\x15\n\rbattery_level\x18\x01 \x01(\r\x12\x0f\n\x07voltage\x18\x02 \x01(\x02\x12\x1b\n\x13\x63hannel_utilization\x18\x03 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02\"\x9b\x01\n\x12\x45nvironmentMetrics\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x12\x16\n\x0egas_resistance\x18\x04 \x01(\x02\x12\x0f\n\x07voltage\x18\x05 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x06 \x01(\x02\"\xbf\x02\n\x11\x41irQualityMetrics\x12\x15\n\rpm10_standard\x18\x01 \x01(\r\x12\x15\n\rpm25_standard\x18\x02 \x01(\r\x12\x16\n\x0epm100_standard\x18\x03 \x01(\r\x12\x1a\n\x12pm10_environmental\x18\x04 \x01(\r\x12\x1a\n\x12pm25_environmental\x18\x05 \x01(\r\x12\x1b\n\x13pm100_environmental\x18\x06 \x01(\r\x12\x16\n\x0eparticles_03um\x18\x07 \x01(\r\x12\x16\n\x0eparticles_05um\x18\x08 \x01(\r\x12\x16\n\x0eparticles_10um\x18\t \x01(\r\x12\x16\n\x0eparticles_25um\x18\n \x01(\r\x12\x16\n\x0eparticles_50um\x18\x0b \x01(\r\x12\x17\n\x0fparticles_100um\x18\x0c \x01(\r\"\xb5\x01\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12(\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\x0e.DeviceMetricsH\x00\x12\x32\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\x13.EnvironmentMetricsH\x00\x12\x31\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32\x12.AirQualityMetricsH\x00\x42\t\n\x07variant*\xc7\x01\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\rBd\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/telemetry.proto\"i\n\rDeviceMetrics\x12\x15\n\rbattery_level\x18\x01 \x01(\r\x12\x0f\n\x07voltage\x18\x02 \x01(\x02\x12\x1b\n\x13\x63hannel_utilization\x18\x03 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02\"\x9b\x01\n\x12\x45nvironmentMetrics\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x12\x16\n\x0egas_resistance\x18\x04 \x01(\x02\x12\x0f\n\x07voltage\x18\x05 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x06 \x01(\x02\"\x8c\x01\n\x0cPowerMetrics\x12\x13\n\x0b\x63h1_voltage\x18\x01 \x01(\x02\x12\x13\n\x0b\x63h1_current\x18\x02 \x01(\x02\x12\x13\n\x0b\x63h2_voltage\x18\x03 \x01(\x02\x12\x13\n\x0b\x63h2_current\x18\x04 \x01(\x02\x12\x13\n\x0b\x63h3_voltage\x18\x05 \x01(\x02\x12\x13\n\x0b\x63h3_current\x18\x06 \x01(\x02\"\xbf\x02\n\x11\x41irQualityMetrics\x12\x15\n\rpm10_standard\x18\x01 \x01(\r\x12\x15\n\rpm25_standard\x18\x02 \x01(\r\x12\x16\n\x0epm100_standard\x18\x03 \x01(\r\x12\x1a\n\x12pm10_environmental\x18\x04 \x01(\r\x12\x1a\n\x12pm25_environmental\x18\x05 \x01(\r\x12\x1b\n\x13pm100_environmental\x18\x06 \x01(\r\x12\x16\n\x0eparticles_03um\x18\x07 \x01(\r\x12\x16\n\x0eparticles_05um\x18\x08 \x01(\r\x12\x16\n\x0eparticles_10um\x18\t \x01(\r\x12\x16\n\x0eparticles_25um\x18\n \x01(\r\x12\x16\n\x0eparticles_50um\x18\x0b \x01(\r\x12\x17\n\x0fparticles_100um\x18\x0c \x01(\r\"\xdd\x01\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12(\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\x0e.DeviceMetricsH\x00\x12\x32\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\x13.EnvironmentMetricsH\x00\x12\x31\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32\x12.AirQualityMetricsH\x00\x12&\n\rpower_metrics\x18\x05 \x01(\x0b\x32\r.PowerMetricsH\x00\x42\t\n\x07variant*\xe0\x01\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\x42\x64\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_TELEMETRYSENSORTYPE = DESCRIPTOR.enum_types_by_name['TelemetrySensorType']
TelemetrySensorType = enum_type_wrapper.EnumTypeWrapper(_TELEMETRYSENSORTYPE)
SENSOR_UNSET = 0
BME280 = 1
BME680 = 2
MCP9808 = 3
INA260 = 4
INA219 = 5
BMP280 = 6
SHTC3 = 7
LPS22 = 8
QMC6310 = 9
QMI8658 = 10
QMC5883L = 11
SHT31 = 12
PMSA003I = 13
_DEVICEMETRICS = DESCRIPTOR.message_types_by_name['DeviceMetrics']
_ENVIRONMENTMETRICS = DESCRIPTOR.message_types_by_name['EnvironmentMetrics']
_AIRQUALITYMETRICS = DESCRIPTOR.message_types_by_name['AirQualityMetrics']
_TELEMETRY = DESCRIPTOR.message_types_by_name['Telemetry']
DeviceMetrics = _reflection.GeneratedProtocolMessageType('DeviceMetrics', (_message.Message,), {
'DESCRIPTOR' : _DEVICEMETRICS,
'__module__' : 'meshtastic.telemetry_pb2'
# @@protoc_insertion_point(class_scope:DeviceMetrics)
})
_sym_db.RegisterMessage(DeviceMetrics)
EnvironmentMetrics = _reflection.GeneratedProtocolMessageType('EnvironmentMetrics', (_message.Message,), {
'DESCRIPTOR' : _ENVIRONMENTMETRICS,
'__module__' : 'meshtastic.telemetry_pb2'
# @@protoc_insertion_point(class_scope:EnvironmentMetrics)
})
_sym_db.RegisterMessage(EnvironmentMetrics)
AirQualityMetrics = _reflection.GeneratedProtocolMessageType('AirQualityMetrics', (_message.Message,), {
'DESCRIPTOR' : _AIRQUALITYMETRICS,
'__module__' : 'meshtastic.telemetry_pb2'
# @@protoc_insertion_point(class_scope:AirQualityMetrics)
})
_sym_db.RegisterMessage(AirQualityMetrics)
Telemetry = _reflection.GeneratedProtocolMessageType('Telemetry', (_message.Message,), {
'DESCRIPTOR' : _TELEMETRY,
'__module__' : 'meshtastic.telemetry_pb2'
# @@protoc_insertion_point(class_scope:Telemetry)
})
_sym_db.RegisterMessage(Telemetry)
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.telemetry_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_TELEMETRYSENSORTYPE._serialized_start=802 _TELEMETRYSENSORTYPE._serialized_start=985
_TELEMETRYSENSORTYPE._serialized_end=1001 _TELEMETRYSENSORTYPE._serialized_end=1209
_DEVICEMETRICS._serialized_start=30 _DEVICEMETRICS._serialized_start=30
_DEVICEMETRICS._serialized_end=135 _DEVICEMETRICS._serialized_end=135
_ENVIRONMENTMETRICS._serialized_start=138 _ENVIRONMENTMETRICS._serialized_start=138
_ENVIRONMENTMETRICS._serialized_end=293 _ENVIRONMENTMETRICS._serialized_end=293
_AIRQUALITYMETRICS._serialized_start=296 _POWERMETRICS._serialized_start=296
_AIRQUALITYMETRICS._serialized_end=615 _POWERMETRICS._serialized_end=436
_TELEMETRY._serialized_start=618 _AIRQUALITYMETRICS._serialized_start=439
_TELEMETRY._serialized_end=799 _AIRQUALITYMETRICS._serialized_end=758
_TELEMETRY._serialized_start=761
_TELEMETRY._serialized_end=982
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -1,17 +0,0 @@
"""Meshtastic unit tests for ble_interface.py"""
from unittest.mock import patch
import pytest
from ..ble_interface import BLEInterface
@pytest.mark.unit
@patch("platform.system", return_value="Linux")
def test_BLEInterface(mock_platform):
"""Test that we can instantiate a BLEInterface"""
iface = BLEInterface("foo", debugOut=True, noProto=True)
iface.close()
mock_platform.assert_called()

View File

File diff suppressed because it is too large Load Diff

View File

@@ -21,7 +21,6 @@ from ..util import Timeout
def test_MeshInterface(capsys): def test_MeshInterface(capsys):
"""Test that we can instantiate a MeshInterface""" """Test that we can instantiate a MeshInterface"""
iface = MeshInterface(noProto=True) iface = MeshInterface(noProto=True)
anode = Node("foo", "bar")
nodes = { nodes = {
"!9388f81c": { "!9388f81c": {
@@ -38,7 +37,7 @@ def test_MeshInterface(capsys):
} }
} }
iface.nodesByNum = {1: anode} iface.nodesByNum = {2475227164: nodes["!9388f81c"]}
iface.nodes = nodes iface.nodes = nodes
myInfo = MagicMock() myInfo = MagicMock()
@@ -148,7 +147,7 @@ def test_getNode_not_local(caplog):
with patch("meshtastic.node.Node", return_value=anode): with patch("meshtastic.node.Node", return_value=anode):
another_node = iface.getNode("bar2") another_node = iface.getNode("bar2")
assert another_node != iface.localNode assert another_node != iface.localNode
assert re.search(r"About to requestConfig", caplog.text, re.MULTILINE) assert re.search(r"About to requestChannels", caplog.text, re.MULTILINE)
@pytest.mark.unit @pytest.mark.unit
@@ -164,7 +163,7 @@ def test_getNode_not_local_timeout(capsys):
assert pytest_wrapped_e.type == SystemExit assert pytest_wrapped_e.type == SystemExit
assert pytest_wrapped_e.value.code == 1 assert pytest_wrapped_e.value.code == 1
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.match(r"Error: Timed out waiting for node config", out) assert re.match(r"Error: Timed out waiting for channels", out)
assert err == "" assert err == ""
@@ -230,8 +229,8 @@ def test_handleFromRadio_with_my_info(caplog):
with caplog.at_level(logging.DEBUG): with caplog.at_level(logging.DEBUG):
iface._handleFromRadio(from_radio_bytes) iface._handleFromRadio(from_radio_bytes)
iface.close() iface.close()
assert re.search(r"Received myinfo", caplog.text, re.MULTILINE) assert re.search(r"Received from radio: my_info {", caplog.text, re.MULTILINE)
assert re.search(r"max_channels: 8", caplog.text, re.MULTILINE) assert re.search(r"my_node_num: 682584012", caplog.text, re.MULTILINE)
@pytest.mark.unit @pytest.mark.unit
@@ -258,15 +257,14 @@ def test_handleFromRadio_with_node_info(caplog, capsys):
with caplog.at_level(logging.DEBUG): with caplog.at_level(logging.DEBUG):
iface._startConfig() iface._startConfig()
iface._handleFromRadio(from_radio_bytes) iface._handleFromRadio(from_radio_bytes)
assert re.search(r"Received nodeinfo", caplog.text, re.MULTILINE) assert re.search(r"Received from radio: node_info {", caplog.text, re.MULTILINE)
assert re.search(r"682584012", caplog.text, re.MULTILINE) assert re.search(r"682584012", caplog.text, re.MULTILINE)
assert re.search(r"HELTEC_V2_1", caplog.text, re.MULTILINE)
# validate some of showNodes() output # validate some of showNodes() output
iface.showNodes() iface.showNodes()
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r" 1 ", out, re.MULTILINE) assert re.search(r" 1 ", out, re.MULTILINE)
assert re.search(r"│ Unknown 67cc │ ", out, re.MULTILINE) assert re.search(r"│ Unknown 67cc │ ", out, re.MULTILINE)
assert re.search(r" !28af67cc │ N/A │ N/A │ N/A", out, re.MULTILINE) assert re.search(r"\s+!28af67cc\s+│\s+67cc\s+|", out, re.MULTILINE)
assert err == "" assert err == ""
iface.close() iface.close()
@@ -347,10 +345,10 @@ def test_sendData_too_long(caplog):
some_large_text += b"This is a long text that will be too long for send text." some_large_text += b"This is a long text that will be too long for send text."
some_large_text += b"This is a long text that will be too long for send text." some_large_text += b"This is a long text that will be too long for send text."
with caplog.at_level(logging.DEBUG): with caplog.at_level(logging.DEBUG):
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(MeshInterface.MeshInterfaceError) as pytest_wrapped_e:
iface.sendData(some_large_text) iface.sendData(some_large_text)
assert re.search("Data payload too big", caplog.text, re.MULTILINE) assert re.search("Data payload too big", caplog.text, re.MULTILINE)
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
iface.close() iface.close()
@@ -506,14 +504,14 @@ def test_generatePacketId(capsys):
# not sure when this condition would ever happen... but we can simulate it # not sure when this condition would ever happen... but we can simulate it
iface.currentPacketId = None iface.currentPacketId = None
assert iface.currentPacketId is None assert iface.currentPacketId is None
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(MeshInterface.MeshInterfaceError) as pytest_wrapped_e:
iface._generatePacketId() iface._generatePacketId()
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search( assert re.search(
r"Not connected yet, can not generate packet", out, re.MULTILINE r"Not connected yet, can not generate packet", out, re.MULTILINE
) )
assert err == "" assert err == ""
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
@pytest.mark.unit @pytest.mark.unit
@@ -597,9 +595,9 @@ def test_getOrCreateByNum_not_found(iface_with_nodes):
"""Test _getOrCreateByNum()""" """Test _getOrCreateByNum()"""
iface = iface_with_nodes iface = iface_with_nodes
iface.myInfo.my_node_num = 2475227164 iface.myInfo.my_node_num = 2475227164
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(MeshInterface.MeshInterfaceError) as pytest_wrapped_e:
iface._getOrCreateByNum(0xFFFFFFFF) iface._getOrCreateByNum(0xFFFFFFFF)
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
@pytest.mark.unit @pytest.mark.unit
@@ -651,9 +649,9 @@ def test_waitForConfig(capsys):
iface = MeshInterface(noProto=True) iface = MeshInterface(noProto=True)
# override how long to wait # override how long to wait
iface._timeout = Timeout(0.01) iface._timeout = Timeout(0.01)
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(MeshInterface.MeshInterfaceError) as pytest_wrapped_e:
iface.waitForConfig() iface.waitForConfig()
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search( assert re.search(
r"Exception: Timed out waiting for interface config", err, re.MULTILINE r"Exception: Timed out waiting for interface config", err, re.MULTILINE
@@ -665,10 +663,10 @@ def test_waitForConfig(capsys):
def test_waitConnected_raises_an_exception(capsys): def test_waitConnected_raises_an_exception(capsys):
"""Test waitConnected()""" """Test waitConnected()"""
iface = MeshInterface(noProto=True) iface = MeshInterface(noProto=True)
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(MeshInterface.MeshInterfaceError) as pytest_wrapped_e:
iface.failure = "warn about something" iface.failure = MeshInterface.MeshInterfaceError("warn about something")
iface._waitConnected(0.01) iface._waitConnected(0.01)
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r"warn about something", err, re.MULTILINE) assert re.search(r"warn about something", err, re.MULTILINE)
assert out == "" assert out == ""
@@ -677,10 +675,10 @@ def test_waitConnected_raises_an_exception(capsys):
@pytest.mark.unit @pytest.mark.unit
def test_waitConnected_isConnected_timeout(capsys): def test_waitConnected_isConnected_timeout(capsys):
"""Test waitConnected()""" """Test waitConnected()"""
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(MeshInterface.MeshInterfaceError) as pytest_wrapped_e:
iface = MeshInterface() iface = MeshInterface()
iface._waitConnected(0.01) iface._waitConnected(0.01)
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r"warn about something", err, re.MULTILINE) assert re.search(r"warn about something", err, re.MULTILINE)
assert out == "" assert out == ""

View File

@@ -7,9 +7,10 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
# from ..admin_pb2 import AdminMessage # from ..admin_pb2 import AdminMessage
from ..channel_pb2 import Channel from ..channel_pb2 import Channel # pylint: disable=E0611
from ..node import Node from ..node import Node
from ..serial_interface import SerialInterface from ..serial_interface import SerialInterface
from ..mesh_interface import MeshInterface
# from ..config_pb2 import Config # from ..config_pb2 import Config
# from ..cannedmessages_pb2 import (CannedMessagePluginMessagePart1, CannedMessagePluginMessagePart2, # from ..cannedmessages_pb2 import (CannedMessagePluginMessagePart1, CannedMessagePluginMessagePart2,
@@ -234,7 +235,7 @@ def test_exitSimulator(caplog):
@pytest.mark.unit @pytest.mark.unit
def test_reboot(caplog): def test_reboot(caplog):
"""Test reboot""" """Test reboot"""
anode = Node("foo", "bar", noProto=True) anode = Node(MeshInterface(), 1234567890, noProto=True)
with caplog.at_level(logging.DEBUG): with caplog.at_level(logging.DEBUG):
anode.reboot() anode.reboot()
assert re.search(r"Telling node to reboot", caplog.text, re.MULTILINE) assert re.search(r"Telling node to reboot", caplog.text, re.MULTILINE)
@@ -243,7 +244,7 @@ def test_reboot(caplog):
@pytest.mark.unit @pytest.mark.unit
def test_shutdown(caplog): def test_shutdown(caplog):
"""Test shutdown""" """Test shutdown"""
anode = Node("foo", "bar", noProto=True) anode = Node(MeshInterface(), 1234567890, noProto=True)
with caplog.at_level(logging.DEBUG): with caplog.at_level(logging.DEBUG):
anode.shutdown() anode.shutdown()
assert re.search(r"Telling node to shutdown", caplog.text, re.MULTILINE) assert re.search(r"Telling node to shutdown", caplog.text, re.MULTILINE)
@@ -258,7 +259,7 @@ def test_setURL_empty_url(capsys):
assert pytest_wrapped_e.type == SystemExit assert pytest_wrapped_e.type == SystemExit
assert pytest_wrapped_e.value.code == 1 assert pytest_wrapped_e.value.code == 1
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r"Warning: No RadioConfig has been read", out, re.MULTILINE) assert re.search(r"Warning: There were no settings.", out, re.MULTILINE)
assert err == "" assert err == ""
@@ -777,7 +778,8 @@ def test_writeConfig_with_no_radioConfig(capsys):
assert pytest_wrapped_e.type == SystemExit assert pytest_wrapped_e.type == SystemExit
assert pytest_wrapped_e.value.code == 1 assert pytest_wrapped_e.value.code == 1
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r"Error: No RadioConfig has been read", out) print(out)
assert re.search(r"Error: No valid config with name foo", out)
assert err == "" assert err == ""

View File

@@ -41,13 +41,11 @@ def test_SerialInterface_single_port(
@patch("meshtastic.util.findPorts", return_value=[]) @patch("meshtastic.util.findPorts", return_value=[])
def test_SerialInterface_no_ports(mocked_findPorts, capsys): def test_SerialInterface_no_ports(mocked_findPorts, capsys):
"""Test that we can instantiate a SerialInterface with no ports""" """Test that we can instantiate a SerialInterface with no ports"""
with pytest.raises(SystemExit) as pytest_wrapped_e: serialInterface = SerialInterface(noProto=True)
SerialInterface(noProto=True)
mocked_findPorts.assert_called() mocked_findPorts.assert_called()
assert pytest_wrapped_e.type == SystemExit assert serialInterface.devPath is None
assert pytest_wrapped_e.value.code == 1
out, err = capsys.readouterr() out, err = capsys.readouterr()
assert re.search(r"Warning: No Meshtastic devices detected", out, re.MULTILINE) assert re.search(r"No.*Meshtastic.*device.*detected", out, re.MULTILINE)
assert err == "" assert err == ""

View File

@@ -40,15 +40,6 @@ def test_smoke1_info():
assert return_value == 0 assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_sendping():
"""Test --sendping"""
return_value, out = subprocess.getstatusoutput("meshtastic --sendping")
assert re.match(r"Connected to radio", out)
assert re.search(r"^Sending ping message", out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1 @pytest.mark.smoke1
def test_get_with_invalid_setting(): def test_get_with_invalid_setting():
"""Test '--get a_bad_setting'.""" """Test '--get a_bad_setting'."""

View File

@@ -50,17 +50,6 @@ def test_smokevirt_info():
assert return_value == 0 assert return_value == 0
@pytest.mark.smokevirt
def test_smokevirt_sendping():
"""Test --sendping"""
return_value, out = subprocess.getstatusoutput(
"meshtastic --host localhost --sendping"
)
assert re.match(r"Connected to radio", out)
assert re.search(r"^Sending ping message", out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smokevirt @pytest.mark.smokevirt
def test_get_with_invalid_setting(): def test_get_with_invalid_setting():
"""Test '--get a_bad_setting'.""" """Test '--get a_bad_setting'."""

View File

@@ -20,10 +20,10 @@ def test_Tunnel_on_non_linux_system(mock_platform_system):
a_mock.return_value = "notLinux" a_mock.return_value = "notLinux"
mock_platform_system.side_effect = a_mock mock_platform_system.side_effect = a_mock
with patch("socket.socket") as mock_socket: with patch("socket.socket") as mock_socket:
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(Tunnel.TunnelError) as pytest_wrapped_e:
iface = TCPInterface(hostname="localhost", noProto=True) iface = TCPInterface(hostname="localhost", noProto=True)
Tunnel(iface) Tunnel(iface)
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == Tunnel.TunnelError
assert mock_socket.called assert mock_socket.called
@@ -34,9 +34,9 @@ def test_Tunnel_without_interface(mock_platform_system):
a_mock = MagicMock() a_mock = MagicMock()
a_mock.return_value = "Linux" a_mock.return_value = "Linux"
mock_platform_system.side_effect = a_mock mock_platform_system.side_effect = a_mock
with pytest.raises(Exception) as pytest_wrapped_e: with pytest.raises(Tunnel.TunnelError) as pytest_wrapped_e:
Tunnel(None) Tunnel(None)
assert pytest_wrapped_e.type == Exception assert pytest_wrapped_e.type == Tunnel.TunnelError
@pytest.mark.unitslow @pytest.mark.unitslow

View File

@@ -177,7 +177,7 @@ def test_catchAndIgnore(caplog):
"""Test catchAndIgnore() does not actually throw an exception, but just logs""" """Test catchAndIgnore() does not actually throw an exception, but just logs"""
def some_closure(): def some_closure():
raise Exception("foo") raise Exception("foo") # pylint: disable=W0719
with caplog.at_level(logging.DEBUG): with caplog.at_level(logging.DEBUG):
catchAndIgnore("something", some_closure) catchAndIgnore("something", some_closure)

View File

@@ -38,6 +38,12 @@ def onTunnelReceive(packet, interface): # pylint: disable=W0613
class Tunnel: class Tunnel:
"""A TUN based IP tunnel over meshtastic""" """A TUN based IP tunnel over meshtastic"""
class TunnelError(Exception):
"""An exception class for general tunnel errors"""
def __init__(self, message):
self.message = message
super().__init__(self.message)
def __init__(self, iface, subnet="10.115", netmask="255.255.0.0"): def __init__(self, iface, subnet="10.115", netmask="255.255.0.0"):
""" """
Constructor Constructor
@@ -47,13 +53,19 @@ class Tunnel:
""" """
if not iface: if not iface:
raise Exception("Tunnel() must have a interface") raise Tunnel.TunnelError("Tunnel() must have a interface")
if not subnet:
raise Tunnel.TunnelError("Tunnel() must have a subnet")
if not netmask:
raise Tunnel.TunnelError("Tunnel() must have a netmask")
self.iface = iface self.iface = iface
self.subnetPrefix = subnet self.subnetPrefix = subnet
if platform.system() != "Linux": if platform.system() != "Linux":
raise Exception("Tunnel() can only be run instantiated on a Linux system") raise Tunnel.TunnelError("Tunnel() can only be run instantiated on a Linux system")
our_globals = Globals.getInstance() our_globals = Globals.getInstance()
our_globals.set_tunnelInstance(self) our_globals.set_tunnelInstance(self)
@@ -63,6 +75,8 @@ class Tunnel:
self.udpBlacklist = { self.udpBlacklist = {
1900, # SSDP 1900, # SSDP
5353, # multicast DNS 5353, # multicast DNS
9001, # Yggdrasil multicast discovery
64512, # cjdns beacon
} }
"""A list of TCP services to block""" """A list of TCP services to block"""

View File

@@ -12,12 +12,13 @@ import time
import traceback import traceback
from queue import Queue from queue import Queue
import pkg_resources import packaging.version as pkg_version
import requests import requests
import serial import serial # type: ignore[import-untyped]
import serial.tools.list_ports import serial.tools.list_ports # type: ignore[import-untyped]
from meshtastic.supported_device import supported_devices from meshtastic.supported_device import supported_devices
from meshtastic.version import get_active_version
"""Some devices such as a seger jlink we never want to accidentally open""" """Some devices such as a seger jlink we never want to accidentally open"""
blacklistVids = dict.fromkeys([0x1366]) blacklistVids = dict.fromkeys([0x1366])
@@ -108,7 +109,7 @@ def stripnl(s):
def fixme(message): def fixme(message):
"""Raise an exception for things that needs to be fixed""" """Raise an exception for things that needs to be fixed"""
raise Exception(f"FIXME: {message}") raise Exception(f"FIXME: {message}") # pylint: disable=W0719
def catchAndIgnore(reason, closure): def catchAndIgnore(reason, closure):
@@ -145,8 +146,8 @@ class dotdict(dict):
"""dot.notation access to dictionary attributes""" """dot.notation access to dictionary attributes"""
__getattr__ = dict.get __getattr__ = dict.get
__setattr__ = dict.__setitem__ __setattr__ = dict.__setitem__ # type: ignore[assignment]
__delattr__ = dict.__delitem__ __delattr__ = dict.__delitem__ # type: ignore[assignment]
class Timeout: class Timeout:
@@ -192,7 +193,7 @@ class Timeout:
return True return True
time.sleep(self.sleepInterval) time.sleep(self.sleepInterval)
return False return False
def waitForTelemetry(self, acknowledgment): def waitForTelemetry(self, acknowledgment):
"""Block until telemetry response is received. Returns True if telemetry response has been received.""" """Block until telemetry response is received. Returns True if telemetry response has been received."""
self.reset() self.reset()
@@ -269,7 +270,7 @@ def support_info():
print(f" Machine: {platform.uname().machine}") print(f" Machine: {platform.uname().machine}")
print(f" Encoding (stdin): {sys.stdin.encoding}") print(f" Encoding (stdin): {sys.stdin.encoding}")
print(f" Encoding (stdout): {sys.stdout.encoding}") print(f" Encoding (stdout): {sys.stdout.encoding}")
the_version = pkg_resources.get_distribution("meshtastic").version the_version = get_active_version()
pypi_version = check_if_newer_version() pypi_version = check_if_newer_version()
if pypi_version: if pypi_version:
print( print(
@@ -599,9 +600,15 @@ def check_if_newer_version():
pypi_version = data["info"]["version"] pypi_version = data["info"]["version"]
except Exception: except Exception:
pass pass
act_version = pkg_resources.get_distribution("meshtastic").version act_version = get_active_version()
if pypi_version and pkg_resources.parse_version(
pypi_version try:
) <= pkg_resources.parse_version(act_version): parsed_act_version = pkg_version.parse(act_version)
parsed_pypi_version = pkg_version.parse(pypi_version)
except pkg_version.InvalidVersion:
return pypi_version
if parsed_pypi_version <= parsed_act_version:
return None return None
return pypi_version return pypi_version

13
meshtastic/version.py Normal file
View File

@@ -0,0 +1,13 @@
"""Version lookup utilities, isolated for cleanliness"""
import sys
try:
from importlib.metadata import version
except:
import pkg_resources
def get_active_version():
"""Get the currently active version using importlib, or pkg_resources if we must"""
if "importlib.metadata" in sys.modules:
return version("meshtastic")
else:
return pkg_resources.get_distribution("meshtastic").version # pylint: disable=E0601

View File

@@ -2,10 +2,9 @@
# Generated by the protocol buffer compiler. DO NOT EDIT! # Generated by the protocol buffer compiler. DO NOT EDIT!
# source: meshtastic/xmodem.proto # source: meshtastic/xmodem.proto
"""Generated protocol buffer code.""" """Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports) # @@protoc_insertion_point(imports)
@@ -16,17 +15,8 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/xmodem.proto\"\xab\x01\n\x06XModem\x12 \n\x07\x63ontrol\x18\x01 \x01(\x0e\x32\x0f.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') DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/xmodem.proto\"\xab\x01\n\x06XModem\x12 \n\x07\x63ontrol\x18\x01 \x01(\x0e\x32\x0f.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')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.xmodem_pb2', globals())
_XMODEM = DESCRIPTOR.message_types_by_name['XModem']
_XMODEM_CONTROL = _XMODEM.enum_types_by_name['Control']
XModem = _reflection.GeneratedProtocolMessageType('XModem', (_message.Message,), {
'DESCRIPTOR' : _XMODEM,
'__module__' : 'meshtastic.xmodem_pb2'
# @@protoc_insertion_point(class_scope:XModem)
})
_sym_db.RegisterMessage(XModem)
if _descriptor._USE_C_DESCRIPTORS == False: if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None DESCRIPTOR._options = None

View File

@@ -18,4 +18,5 @@ pyyaml
pytap2 pytap2
pdoc3 pdoc3
pypubsub pypubsub
pygatt; platform_system == "Linux" bleak
packaging

View File

@@ -13,7 +13,7 @@ with open("README.md", "r") as fh:
# This call to setup() does all the work # This call to setup() does all the work
setup( setup(
name="meshtastic", name="meshtastic",
version="2.2.5", version="2.3.1",
description="Python API & client shell for talking to Meshtastic devices", description="Python API & client shell for talking to Meshtastic devices",
long_description=long_description, long_description=long_description,
long_description_content_type="text/markdown", long_description_content_type="text/markdown",
@@ -43,7 +43,8 @@ setup(
"tabulate>=0.8.9", "tabulate>=0.8.9",
"timeago>=1.0.15", "timeago>=1.0.15",
"pyyaml", "pyyaml",
"pygatt>=4.0.5 ; platform_system=='Linux'", "bleak>=0.21.1",
"packaging",
], ],
extras_require={"tunnel": ["pytap2>=2.0.0"]}, extras_require={"tunnel": ["pytap2>=2.0.0"]},
python_requires=">=3.7", python_requires=">=3.7",