From b19b51d6a6c6f898696494cff9fe8999d0048934 Mon Sep 17 00:00:00 2001 From: Jason Michalski Date: Fri, 28 Jun 2024 21:20:48 -0700 Subject: [PATCH] hack --- meshview/models.py | 15 ++++----- meshview/mqtt_reader.py | 3 +- meshview/store.py | 68 ++++++++++++++++++++--------------------- meshview/web.py | 11 ++++--- 4 files changed, 50 insertions(+), 47 deletions(-) diff --git a/meshview/models.py b/meshview/models.py index baa0391..3f88a59 100644 --- a/meshview/models.py +++ b/meshview/models.py @@ -3,7 +3,7 @@ from datetime import datetime from sqlalchemy.orm import DeclarativeBase, foreign from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.orm import mapped_column, relationship, Mapped -from sqlalchemy import ForeignKey, BigInteger +from sqlalchemy import ForeignKey, BigInteger, DateTime class Base(AsyncAttrs, DeclarativeBase): @@ -23,7 +23,8 @@ class Node(Base): class Packet(Base): __tablename__ = "packet" - id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + pk: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + id: Mapped[int] = mapped_column(BigInteger) portnum: Mapped[int] from_node_id: Mapped[int] = mapped_column(BigInteger) from_node: Mapped["Node"] = relationship( @@ -34,17 +35,18 @@ class Packet(Base): primaryjoin="Packet.to_node_id == foreign(Node.node_id)", lazy="joined" ) payload: Mapped[bytes] - import_time: Mapped[datetime] + import_time = mapped_column(DateTime) class PacketSeen(Base): __tablename__ = "packet_seen" - packet_id = mapped_column(ForeignKey("packet.id"), primary_key=True) - node_id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + pk: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + packet_id = mapped_column(ForeignKey("packet.id")) + node_id: Mapped[int] = mapped_column(BigInteger) node: Mapped["Node"] = relationship( lazy="joined", primaryjoin="PacketSeen.node_id == foreign(Node.node_id)" ) - rx_time: Mapped[int] = mapped_column(BigInteger, primary_key=True) + rx_time: Mapped[int] = mapped_column(BigInteger) hop_limit: Mapped[int] channel: Mapped[str] rx_snr: Mapped[float] = mapped_column(nullable=True) @@ -61,4 +63,3 @@ class Traceroute(Base): done: Mapped[bool] route: Mapped[bytes] import_time: Mapped[datetime] - diff --git a/meshview/mqtt_reader.py b/meshview/mqtt_reader.py index b047810..3a25cbf 100644 --- a/meshview/mqtt_reader.py +++ b/meshview/mqtt_reader.py @@ -30,13 +30,14 @@ async def get_topic_envelopes(topics): while True: try: async with aiomqtt.Client( - "mqtt.meshtastic.org", username="meshdev", password="large4cats" + "192.168.10.52" ) as client: for topic in topics: await client.subscribe(topic) async for msg in client.messages: try: envelope = ServiceEnvelope.FromString(msg.payload) + print(envelope) except DecodeError: continue decrypt(envelope.packet) diff --git a/meshview/store.py b/meshview/store.py index 9093153..f9b8ae8 100644 --- a/meshview/store.py +++ b/meshview/store.py @@ -17,40 +17,40 @@ async def process_envelope(topic, env): async with database.async_session() as session: result = await session.execute(select(Packet).where(Packet.id == env.packet.id)) new_packet = False - packet = result.scalar_one_or_none() - if not packet: - new_packet = True - packet = Packet( - id=env.packet.id, - portnum=env.packet.decoded.portnum, - from_node_id=getattr(env.packet, "from"), - to_node_id=env.packet.to, - payload=env.packet.SerializeToString(), - import_time=datetime.datetime.utcnow(), - ) - session.add(packet) - - result = await session.execute( - select(PacketSeen).where( - PacketSeen.packet_id == env.packet.id, - PacketSeen.node_id == int(env.gateway_id[1:], 16), - PacketSeen.rx_time == env.packet.rx_time, - ) + #packet = result.scalar_one_or_none() + #if not packet: + new_packet = True + packet = Packet( + id=env.packet.id, + portnum=env.packet.decoded.portnum, + from_node_id=getattr(env.packet, "from"), + to_node_id=env.packet.to, + payload=env.packet.SerializeToString(), + import_time=datetime.datetime.utcnow(), ) - seen = None - if not result.scalar_one_or_none(): - seen = PacketSeen( - packet_id=env.packet.id, - node_id=int(env.gateway_id[1:], 16), - channel=env.channel_id, - rx_time=env.packet.rx_time, - rx_snr=env.packet.rx_snr, - rx_rssi=env.packet.rx_rssi, - hop_limit=env.packet.hop_limit, - topic=topic, - import_time=datetime.datetime.utcnow(), - ) - session.add(seen) + session.add(packet) + + #result = await session.execute( + # select(PacketSeen).where( + # PacketSeen.packet_id == env.packet.id, + # PacketSeen.node_id == int(env.gateway_id[1:], 16), + # PacketSeen.rx_time == env.packet.rx_time, + # ) + #) + #seen = None + #if not result.scalar_one_or_none(): + seen = PacketSeen( + packet_id=env.packet.id, + node_id=int(env.gateway_id[1:], 16), + channel=env.channel_id, + rx_time=env.packet.rx_time, + rx_snr=env.packet.rx_snr, + rx_rssi=env.packet.rx_rssi, + hop_limit=env.packet.hop_limit, + topic=topic, + import_time=datetime.datetime.utcnow(), + ) + session.add(seen) if env.packet.decoded.portnum == PortNum.NODEINFO_APP: user = decode_payload.decode_payload( @@ -170,7 +170,7 @@ async def get_packets_from(node_id=None, portnum=None, limit=500): async def get_packet(packet_id): async with database.async_session() as session: - q = select(Packet).where(Packet.id == packet_id) + q = select(Packet).where(Packet.id == packet_id).limit(1) result = await session.execute(q) return result.scalar_one_or_none() diff --git a/meshview/web.py b/meshview/web.py index c2674f3..3c277c0 100644 --- a/meshview/web.py +++ b/meshview/web.py @@ -573,10 +573,11 @@ async def graph_traceroute(request): # It seems some nodes add them self to the list before uplinking path.append(tr.gateway_node_id) - for node_id in path[-2:]: - if node_id not in node_seen_time: - if tr.import_time: - node_seen_time[node_id] = tr.import_time + if not tr.done: + for node_id in path[-2:]: + if node_id not in node_seen_time: + if tr.import_time: + node_seen_time[node_id] = tr.import_time mqtt_nodes.add(tr.gateway_node_id) node_color[path[-1]] = '#' + hex(hash(tuple(path)))[3:9] @@ -599,7 +600,7 @@ async def graph_traceroute(request): else: node_name = f'[{node.short_name}] {node.long_name} - {node_id_to_hex(node_id)}' if node_id in node_seen_time: - ms = (node_seen_time[node_id] - first_time).total_seconds() / 1000 + ms = (node_seen_time[node_id] - first_time).total_seconds() * 1000 node_name += f'\n {ms:.2f}ms' style = 'dashed' if node_id == dest: