diff --git a/aprs.py b/aprs.py index 6665828..79aa35a 100644 --- a/aprs.py +++ b/aprs.py @@ -6,6 +6,7 @@ import irc.client import irc.client_aio from ax253 import Frame +from datetime import datetime import kiss import aprslib @@ -21,6 +22,22 @@ nickname = os.environ.get('BOT_NICK', "aprsbot") logger = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) ## TODO: Make logging level configurable +def parse_frame(date, frame): + try: + parsed = aprslib.parse(str(frame)) + except (aprslib.ParseError, aprslib.UnknownFormat) as exp: + logger.error(f"Failed to parse frame: {frame}") + return str(frame) + formatted_string = date.strftime('%H:%M:%S.%f')[:-3] + " " + "{} -> {} -> {}:".format(parsed["from"], parsed["via"], parsed["to"]) + formatted_string += " <{:.4f} {:.4f}>".format(parsed["latitude"], parsed["longitude"]) if "longitude" in parsed and "latitude" in parsed else "" + formatted_string += " tUNIT: " + ",".join(parsed["tUNIT"]) if "tUNIT" in parsed else "" + formatted_string += " tPARM: " + ",".join(parsed["tPARM"]) if "tPARM" in parsed else "" + formatted_string += " tEQNS: " + ",".join([''.join(str(i)) for i in parsed["tEQNS"]]) if "tEQNS" in parsed else "" + formatted_string += " tBITS: {}".format(parsed["tBITS"]) if "tBITS" in parsed else "" + formatted_string += " {}".format(parsed["comment"]) if "comment" in parsed else "" + formatted_string += " {}".format(parsed["title"]) if "title" in parsed else "" + return formatted_string + async def main(): logger.info(f"Connecting to {server}:{port} as {nickname}") loop = asyncio.get_event_loop() @@ -36,16 +53,13 @@ async def main(): loop=loop, ) - irc_client.privmsg(channel, '[APRS] Starting...') + irc_client.privmsg(channel, 'Starting...') async for frame in kiss_protocol.read(): - try: - packet = aprslib.parse(str(frame)) - except (aprslib.ParseError, aprslib.UnknownFormat) as exp: - pass - ## TODO: Build APRS message from packet + time = datetime.utcnow() + logger.debug(f"Received frame: {frame}") - irc_client.privmsg(channel, str(frame)) ## TODO: Parse frame and send to channel + irc_client.privmsg(channel, parse_frame(time, frame)) if __name__ == "__main__": diff --git a/packets.log b/packets.log new file mode 100644 index 0000000..2a2e8ca --- /dev/null +++ b/packets.log @@ -0,0 +1,35 @@ +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-6:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-1:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-6::HP2PCO-13:BITS.11111111,HP2PCO-3 Telemetry +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-6::HP2PCO-13:EQNS.0,0.079,0,0,10,0,0,10,0,0,1,0,0,0,0 +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-6::HP2PCO-13:UNIT.Volt,Pkt,Pkt,Pcnt,None,On,On,On,On,Hi,Hi,Hi,Hi +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-1::HP2PCO-13:PARM.Vin,Rx1h,Dg1h,Eff1h,A5,O1,O2,O3,O4,I1,I2,I3,I4 +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-1:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-6:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAO,HP2DFA-6:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-1:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-1:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-6::HP2PCO-13:BITS.11111111,HP2PCO-3 Telemetry +HP2PCO-13>APMI04,DIRECT,qAO,HP2DFA-6::HP2PCO-13:EQNS.0,0.079,0,0,10,0,0,10,0,0,1,0,0,0,0 +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-6::HP2PCO-13:UNIT.Volt,Pkt,Pkt,Pcnt,None,On,On,On,On,Hi,Hi,Hi,Hi +HP2PCO-13>APMI04,DIRECT,qAR,HP2DFA-1::HP2PCO-13:PARM.Vin,Rx1h,Dg1h,Eff1h,A5,O1,O2,O3,O4,I1,I2,I3,I4 +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-1:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-6:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI04,WIDE2-1,qAR,HP2DFA-1:=0921.46N/07953.61W_ DIGIPEATER PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP2PCO-13>APMI02,WIDE2-2,qAR,HP2DFA-1:=0921.46N/07953.61W_ WX STATION PCARA OESTE EN LA CIUDAD DE COLON RED APRS PANAMA II 12.7V +HP1CDB-10>APHP01,TCPIP*,qAC,T2SJC:!0902.40N/07925.04W-HP1CDB Carlos Daniel Baquero 73. / Raspbian Proyect by hp3icc +HP1CDB-10>APHP01,TCPIP*,qAC,T2MCI:!0902.40N/07925.04W-HP1CDB Carlos Daniel Baquero 73. / Raspbian Proyect by hp3icc +HP1CDB-10>APHP01,TCPIP*,qAC,T2MCI:!0902.40N/07925.04W-HP1CDB Carlos Daniel Baquero 73. / Raspbian Proyect by hp3icc +UR4UWA-4>APMI03,WIDE2-2,qAR,UT3UKU-10:@221717z5032.04N/03036.30E-PLXDigi U=12.3V. +UR4UWA-4>APMI03,WIDE2-2,qAR,UT3UKU-10::UR4UWA-4 :BITS.11111111,PLXDigi Telemetry +UR4UWA-4>APMI03,WIDE2-2,qAR,UT3UKU-10::UR4UWA-4 :EQNS.0,0.075,0,0,1,0,0,1,0,0,1,0,0,1,0 +UR4UWA-4>APMI03,WIDE2-2,qAR,UT3UKU-10::UR4UWA-4 :UNIT.Volt,Pkt,Pkt,Pcnt,Pcnt,On,On,On,On,Hi,Hi,Hi,Hi +UR4UWA-4>APMI03,WIDE2-2,qAR,UT3UKU-10::UR4UWA-4 :PARM.Vin,Rx1h,Dg1h,Eff1h,Eff,O1,O2,O3,O4,I1,I2,I3,I4 + +UT3UKU-10>APJI43,UR4UWA-4,WIDE2-1: {} -> {}:".format(parsed["from"], parsed["via"], parsed["to"]) + formatted_string += " <{:.4f} {:.4f}>".format(parsed["latitude"], parsed["longitude"]) if "longitude" in parsed and "latitude" in parsed else "" + formatted_string += " tUNIT: " + ",".join(parsed["tUNIT"]) if "tUNIT" in parsed else "" + formatted_string += " tPARM: " + ",".join(parsed["tPARM"]) if "tPARM" in parsed else "" + formatted_string += " tEQNS: " + ",".join([''.join(str(i)) for i in parsed["tEQNS"]]) if "tEQNS" in parsed else "" + formatted_string += " tBITS: {}".format(parsed["tBITS"]) if "tBITS" in parsed else "" + formatted_string += " {}".format(parsed["comment"]) if "comment" in parsed else "" + formatted_string += " {}".format(parsed["title"]) if "title" in parsed else "" + #print(parsed) + print(formatted_string) \ No newline at end of file