From 1d8fea891ac887b457d1a8daa683d4eb74cbe989 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 27 Aug 2019 23:13:26 +0200 Subject: [PATCH] additional types; parse messages --- owrx/aprs.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/owrx/aprs.py b/owrx/aprs.py index e257119..fce978c 100644 --- a/owrx/aprs.py +++ b/owrx/aprs.py @@ -25,6 +25,9 @@ altitudeRegex = re.compile("(^.*)\\/A=([0-9]{6})(.*$)") # regex for parsing third-party headers thirdpartyeRegex = re.compile("^([a-zA-Z0-9-]+)>((([a-zA-Z0-9-]+\\*?,)*)([a-zA-Z0-9-]+\\*?)):(.*)$") +# regex for getting the message id out of message +messageIdRegex = re.compile("^(.*){([0-9]{1,5})$") + def decodeBase91(input): base = decodeBase91(input[:-1]) * 91 if len(input) > 1 else 0 @@ -231,9 +234,37 @@ class AprsParser(object): elif dti == "}": # third party aprsData.update(self.parseThirdpartyAprsData(information[1:])) + elif dti == ":": + # message + aprsData.update(self.parseMessage(information[1:])) + elif dti == ";": + # object + aprsData["type"] = "object" + elif dti == ")": + # item + aprsData["type"] = "item" return aprsData + def parseMessage(self, information): + result = {"type": "message"} + if len(information) > 10 and information[10] == ":": + result["adressee"] = information[0:9] + message = information[10:] + if len(message) > 3 and message[0:3] == "ack": + result["type"] = "messageacknowledgement" + result["messageid"] = int(message[3:8]) + elif len(message) > 3 and message[0:3] == "rej": + result["type"] = "messagerejection" + result["messageid"] = int(message[3:8]) + else: + matches = messageIdRegex.match(message) + if matches: + result["messageid"] = int(matches[2]) + message = matches[1] + result["message"] = message + return result + def parseThirdpartyAprsData(self, information): matches = thirdpartyeRegex.match(information) if matches: