Files
LoRa-Mesh-Analyzer/scripts/verify_parsing.py

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.")