mirror of
https://github.com/eddieoz/LoRa-Mesh-Analyzer.git
synced 2026-03-28 17:42:59 +01:00
90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
|
|
import logging
|
|
|
|
# Configure logging
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def parse_packet(packet):
|
|
# Extract route information from traceroute packet
|
|
decoded = packet.get('decoded', {})
|
|
|
|
logger.debug(f"Decoded packet keys: {list(decoded.keys())}")
|
|
|
|
# The traceroute data is in decoded['traceroute'] (parsed by library)
|
|
# or in RouteDiscovery protobuf in payload (if raw)
|
|
route = []
|
|
route_back = []
|
|
|
|
# 1. Check for pre-parsed 'traceroute' dict (Meshtastic python lib does this)
|
|
if 'traceroute' in decoded:
|
|
tr = decoded['traceroute']
|
|
if isinstance(tr, dict):
|
|
route = tr.get('route', [])
|
|
route_back = tr.get('routeBack', [])
|
|
logger.debug(f"Found parsed traceroute: route={route}, route_back={route_back}")
|
|
|
|
# 2. Fallback: Try to parse RouteDiscovery protobuf from payload
|
|
elif 'payload' in decoded:
|
|
try:
|
|
from meshtastic import mesh_pb2
|
|
# If payload is bytes, parse it
|
|
if isinstance(decoded['payload'], bytes):
|
|
route_discovery = mesh_pb2.RouteDiscovery()
|
|
route_discovery.ParseFromString(decoded['payload'])
|
|
route = list(route_discovery.route)
|
|
route_back = list(route_discovery.route_back)
|
|
logger.debug(f"Parsed from bytes - route: {route}, route_back: {route_back}")
|
|
# If it's already a protobuf object
|
|
elif hasattr(decoded['payload'], 'route'):
|
|
route = list(decoded['payload'].route)
|
|
route_back = list(decoded['payload'].route_back)
|
|
logger.debug(f"Extracted from protobuf - route: {route}, route_back: {route_back}")
|
|
except Exception as e:
|
|
logger.debug(f"Could not parse RouteDiscovery protobuf: {e}")
|
|
|
|
# 3. Fallback: Old dict keys
|
|
if not route:
|
|
route = decoded.get('route', [])
|
|
route_back = decoded.get('routeBack', [])
|
|
|
|
return route, route_back
|
|
|
|
# Real packet data from debug log
|
|
packet = {
|
|
'from': 2905093827,
|
|
'to': 1119572084,
|
|
'channel': 1,
|
|
'decoded': {
|
|
'portnum': 'TRACEROUTE_APP',
|
|
'payload': b'\n\x08s\x81w{Z9\xedW\x12\x15\x16\xf2\xff\xff\xff\xff\xff\xff\xff\xff\x01\xb6\xff\xff\xff\xff\xff\xff\xff\xff\x01\x1a\x04s\x81w{"\x0b\xce\xff\xff\xff\xff\xff\xff\xff\xff\x01\x19',
|
|
'requestId': 1781248082,
|
|
'bitfield': 1,
|
|
'traceroute': {
|
|
'route': [2071429491, 1475164506],
|
|
'snrTowards': [22, -14, -74],
|
|
'routeBack': [2071429491],
|
|
'snrBack': [-50, 25],
|
|
'raw': "route: 2071429491..."
|
|
}
|
|
},
|
|
'id': 4198764725,
|
|
'rxSnr': 6.25,
|
|
'hopLimit': 3,
|
|
'rxRssi': -45,
|
|
'hopStart': 4,
|
|
'relayNode': 115,
|
|
'transportMechanism': 'TRANSPORT_LORA',
|
|
'fromId': '!ad2836c3',
|
|
'toId': '!42bb5074'
|
|
}
|
|
|
|
print("Testing parsing...")
|
|
r, rb = parse_packet(packet)
|
|
print(f"Result: route={r}, route_back={rb}")
|
|
|
|
if r == [2071429491, 1475164506] and rb == [2071429491]:
|
|
print("SUCCESS! Parsing logic works.")
|
|
else:
|
|
print("FAILURE! Parsing logic incorrect.")
|