]> www.average.org Git - loctrkd.git/commitdiff
cleanup framing/deframing of beesure
authorEugene Crosser <crosser@average.org>
Sat, 9 Jul 2022 17:58:29 +0000 (19:58 +0200)
committerEugene Crosser <crosser@average.org>
Thu, 14 Jul 2022 20:39:57 +0000 (22:39 +0200)
loctrkd/beesure.py
loctrkd/collector.py
loctrkd/watch.py
loctrkd/zx303proto.py

index 9b0255c2401a7d65f817afcb7363d9190122f073..a0d802bb1df306e888e87218028241210ffd5695 100755 (executable)
@@ -24,6 +24,7 @@ from typing import (
 __all__ = (
     "Stream",
     "class_by_prefix",
+    "enframe",
     "inline_response",
     "parse_message",
     "probe_buffer",
@@ -67,11 +68,6 @@ class Stream:
         self.imei: Optional[str] = None
         self.datalen: int = 0
 
-    @staticmethod
-    def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes:
-        assert imei is not None and len(imei) == 10
-        return f"[LT*{imei:10s}*{len(buffer):04X}*".encode() + buffer + b"]"
-
     def recv(self, segment: bytes) -> List[Union[bytes, str]]:
         """
         Process next segment of the stream. Return successfully deframed
@@ -96,12 +92,13 @@ class Stream:
                     )
                     self.buffer = self.buffer[toskip:]
                     # From this point, buffer starts with a packet header
-                if self.imei is not None and self.imei != imei:
+                if self.imei is None:
+                    self.imei = imei
+                if self.imei != imei:
                     msgs.append(
                         f"Packet's imei {imei} mismatches"
-                        f" previous value {self.imei}"
+                        f" previous value {self.imei}, old value kept"
                     )
-                self.imei = imei
                 self.datalen = datalen
             if len(self.buffer) < self.datalen + 21:  # Incomplete packet
                 break
@@ -125,6 +122,13 @@ class Stream:
         return ret
 
 
+def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes:
+    assert imei is not None and len(imei) == 10
+    off, vid, _, dlen = _framestart(buffer)
+    assert off == 0
+    return f"[{vid:2s}*{imei:10s}*{dlen:04X}*".encode() + buffer[20:]
+
+
 ### Parser/Constructor ###
 
 
@@ -289,7 +293,8 @@ class BeeSurePkt(metaclass=MetaPkt):
 
     @property
     def packed(self) -> bytes:
-        return self.encode().encode()  # first is object's, second str's
+        buffer = self.encode().encode()
+        return f"[LT*0000000000*{len(buffer):04X}*".encode() + buffer + b"]"
 
 
 class UNKNOWN(BeeSurePkt):
@@ -411,7 +416,7 @@ def proto_by_name(name: str) -> str:
 
 
 def proto_of_message(packet: bytes) -> str:
-    return PROTO_PREFIX + packet.split(b",")[0].decode()
+    return PROTO_PREFIX + packet[20:-1].split(b",")[0].decode()
 
 
 def imei_from_packet(packet: bytes) -> Optional[str]:
index 136ecba99aeeb602ee85028caadc0caa0caf744d..98345007b708ad446c80c39d04d42fe7c52fd6e1 100644 (file)
@@ -27,16 +27,16 @@ MAXBUFFER: int = 4096
 
 class ProtoModule:
     class Stream:
-        @staticmethod
-        def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes:
-            ...
-
         def recv(self, segment: bytes) -> List[Union[bytes, str]]:
             ...
 
         def close(self) -> bytes:
             ...
 
+    @staticmethod
+    def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes:
+        ...
+
     @staticmethod
     def probe_buffer(buffer: bytes) -> bool:
         ...
@@ -139,9 +139,9 @@ class Client:
         return msgs
 
     def send(self, buffer: bytes) -> None:
-        assert self.stream is not None
+        assert self.stream is not None and self.pmod is not None
         try:
-            self.sock.send(self.stream.enframe(buffer, imei=self.imei))
+            self.sock.send(self.pmod.enframe(buffer, imei=self.imei))
         except OSError as e:
             log.error(
                 "Sending to fd %d (IMEI %s): %s",
index ab041edc832c7ae78198ea5deb3375d9e32dff29..7221d2b716595fb05623f1f66a8d476aaeee9d3c 100644 (file)
@@ -39,11 +39,11 @@ def runserver(conf: ConfigParser) -> None:
     try:
         while True:
             zmsg = Bcast(zsub.recv())
-            print("Bcast:", zmsg)
+            print("I" if zmsg.is_incoming else "O", zmsg.proto, zmsg.imei)
             for pmod in pmods:
                 if zmsg.proto.startswith(pmod.PROTO_PREFIX):
                     msg = pmod.parse_message(zmsg.packet, zmsg.is_incoming)
-                    print("I" if zmsg.is_incoming else "O", zmsg.imei, msg)
+                    print(msg)
     except KeyboardInterrupt:
         pass
 
index ebead92e0e28c88f64517547ed8ac1828fa5d301..c47c216134c1e6ff737d01c4107c79351c3c07ea 100755 (executable)
@@ -92,10 +92,6 @@ class Stream:
     def __init__(self) -> None:
         self.buffer = b""
 
-    @staticmethod
-    def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes:
-        return b"xx" + buffer + b"\r\n"
-
     def recv(self, segment: bytes) -> List[Union[bytes, str]]:
         """
         Process next segment of the stream. Return successfully deframed
@@ -150,6 +146,10 @@ class Stream:
         return ret
 
 
+def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes:
+    return b"xx" + buffer + b"\r\n"
+
+
 ### Parser/Constructor ###