X-Git-Url: http://www.average.org/gitweb/?a=blobdiff_plain;f=loctrkd%2Fbeesure.py;h=b3afae149e619875f7ec089a97690de182ba0459;hb=ed78cfbeae56fa31e844f2858b409f39464c93a0;hp=9e9e22b65667c3494338efd242ce19d33ad58321;hpb=42613c3084ae1371ce1141b0d66f8af5ce0ade39;p=loctrkd.git diff --git a/loctrkd/beesure.py b/loctrkd/beesure.py index 9e9e22b..b3afae1 100755 --- a/loctrkd/beesure.py +++ b/loctrkd/beesure.py @@ -43,6 +43,7 @@ __all__ = ( "Respond", ) +PMODNAME = __name__.split(".")[-1] PROTO_PREFIX = "BS:" ### Deframer ### @@ -116,7 +117,7 @@ class Stream: else: msgs.append( f"Packet does not end with ']'" - f" at {self.datalen+20}: {self.buffer=!r}" + f" at {self.datalen+20}: {self.buffer[:64]=!r}" ) self.buffer = self.buffer[self.datalen + 21 :] self.datalen = 0 @@ -602,8 +603,15 @@ def proto_handled(proto: str) -> bool: return proto.startswith(PROTO_PREFIX) +def _local_proto(packet: bytes) -> str: + try: + return packet[20:-1].split(b",")[0].decode() + except UnicodeDecodeError: + return "UNKNOWN" + + def proto_of_message(packet: bytes) -> str: - return PROTO_PREFIX + packet[20:-1].split(b",")[0].decode() + return PROTO_PREFIX + _local_proto(packet) def imei_from_packet(packet: bytes) -> Optional[str]: @@ -618,7 +626,7 @@ def is_goodbye_packet(packet: bytes) -> bool: def inline_response(packet: bytes) -> Optional[bytes]: - proto = packet[20:-1].split(b",")[0].decode() + proto = _local_proto(packet) if proto in CLASSES: cls = CLASSES[proto] if cls.RESPOND is Respond.INL: @@ -672,3 +680,13 @@ def exposed_protos() -> List[Tuple[str, bool]]: for cls in CLASSES.values() if hasattr(cls, "rectified") ] + + +def make_response(cmd: str, imei: str, **kwargs: Any) -> Optional[BeeSurePkt]: + if cmd == "poweroff": + return POWEROFF.Out() + elif cmd == "refresh": + return MONITOR.Out() + elif cmd == "message": + return MESSAGE.Out(message=kwargs.get("txt", "Hello")) + return None