def decode(freq, decoded): """ Export FMS Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if FMS decode failed """ try: fms_service = decoded[19] # Organisation fms_country = decoded[36] # Bundesland fms_location = decoded[65:67] # Ort fms_vehicle = decoded[72:76] # Fahrzeug fms_status = decoded[84] # Status fms_direction = decoded[101] # Richtung fms_directionText = decoded[103:110] # Richtung (Text) fms_tsi = decoded[114:117] # Taktische Kruzinformation if "CRC correct" in decoded: #check CRC is correct fms_id = fms_service+fms_country+fms_location+fms_vehicle+fms_status+fms_direction # build FMS id # if FMS is valid if re.search("[0-9a-f]{8}[0-9a-f]{1}[01]{1}", fms_id): # check for double alarm if doubleFilter.checkID("FMS", fms_id): logging.info("FMS:%s Status:%s Richtung:%s TSI:%s", fms_id[0:8], fms_status, fms_direction, fms_tsi) data = {"fms":fms_id[0:8], "status":fms_status, "direction":fms_direction, "directionText":fms_directionText, "tsi":fms_tsi, "description":fms_id[0:8]} # If enabled, look up description if globals.config.getint("FMS", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription("FMS", fms_id[0:8]) # processing the alarm try: from includes import alarmHandler alarmHandler.processAlarm("FMS", freq, data) except: logging.error("processing alarm failed") logging.debug("processing alarm failed", exc_info=True) pass # in every time save old data for double alarm doubleFilter.newEntry(fms_id) else: logging.warning("No valid FMS: %s", fms_id) else: logging.warning("FMS CRC incorrect") except: logging.error("error while decoding") logging.debug("error while decoding", exc_info=True)
def decode(freq, decoded): """ Export FMS Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if FMS decode failed """ timestamp = int(time.time()) # Get Timestamp fms_service = decoded[19] # Organisation fms_country = decoded[36] # Bundesland fms_location = decoded[65:67] # Ort fms_vehicle = decoded[72:76] # Fahrzeug fms_status = decoded[84] # Status fms_direction = decoded[101] # Richtung fms_directionText = decoded[103:110] # Richtung (Text) fms_tsi = decoded[114:117] # Taktische Kruzinformation if "CRC correct" in decoded: #check CRC is correct fms_id = fms_service+fms_country+fms_location+fms_vehicle+fms_status+fms_direction # build FMS id # if FMS is valid if re.search("[0-9a-f]{8}[0-9a-f]{1}[01]{1}", fms_id): # check for double alarm if fms_id == globals.fms_id_old and timestamp < globals.fms_time_old + globals.config.getint("FMS", "double_ignore_time"): logging.info("FMS double alarm: %s within %s second(s)", globals.fms_id_old, timestamp-globals.fms_time_old) # in case of double alarm, fms_double_ignore_time set new globals.fms_time_old = timestamp else: logging.info("FMS:%s Status:%s Richtung:%s TSI:%s", fms_id[0:8], fms_status, fms_direction, fms_tsi) data = {"fms":fms_id[0:8], "status":fms_status, "direction":fms_direction, "directionText":fms_directionText, "tsi":fms_tsi, "description":fms_id[0:8]} # If enabled, look up description if globals.config.getint("FMS", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription("FMS", fms_id[0:8]) # processing the alarm from includes import alarmHandler alarmHandler.processAlarm("FMS",freq,data) globals.fms_id_old = fms_id #save last id globals.fms_time_old = timestamp #save last time else: logging.warning("No valid FMS: %s", fms_id) else: logging.warning("FMS CRC incorrect")
def decode(freq, decoded): """ Export ZVEI Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if ZVEI decode failed """ try: zvei_id = decoded[7:12] # ZVEI Code zvei_id = removeF(zvei_id) # resolve F if re.search("[0-9]{5}", zvei_id): # if ZVEI is valid # check for double alarm if doubleFilter.checkID("ZVEI", zvei_id): logging.info("5-Ton: %s", zvei_id) data = {"zvei": zvei_id, "description": zvei_id} # If enabled, look up description if globals.config.getint("ZVEI", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription( "ZVEI", zvei_id) # processing the alarm try: from includes import alarmHandler alarmHandler.processAlarm("ZVEI", freq, data) except: logging.error("processing alarm failed") logging.debug("processing alarm failed", exc_info=True) pass # in every time save old data for double alarm doubleFilter.newEntry(zvei_id) else: logging.warning("No valid ZVEI: %s", zvei_id) except: logging.error("error while decoding") logging.debug("error while decoding", exc_info=True)
def decode(freq, decoded): """ Export ZVEI Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if ZVEI decode failed """ try: zvei_id = decoded[7:12] # ZVEI Code zvei_id = removeF(zvei_id) # resolve F if re.search("[0-9]{5}", zvei_id): # if ZVEI is valid # check for double alarm if doubleFilter.checkID("ZVEI", zvei_id): logging.info("5-Ton: %s", zvei_id) data = {"zvei":zvei_id, "description":zvei_id} # If enabled, look up description if globals.config.getint("ZVEI", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription("ZVEI", zvei_id) # processing the alarm try: from includes import alarmHandler alarmHandler.processAlarm("ZVEI", freq, data) except: logging.error("processing alarm failed") logging.debug("processing alarm failed", exc_info=True) pass # in every time save old data for double alarm doubleFilter.newEntry(zvei_id) else: logging.warning("No valid ZVEI: %s", zvei_id) except: logging.error("error while decoding") logging.debug("error while decoding", exc_info=True)
def decode(freq, decoded): """ Export ZVEI Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if ZVEI decode failed """ timestamp = int(time.time()) # Get Timestamp zvei_id = decoded[7:12] # ZVEI Code zvei_id = removeF(zvei_id) # resolve F if re.search("[0-9]{5}", zvei_id): # if ZVEI is valid # check for double alarm if zvei_id == globals.zvei_id_old and timestamp < globals.zvei_time_old + globals.config.getint("ZVEI", "double_ignore_time"): logging.info("ZVEI double alarm: %s within %s second(s)", globals.zvei_id_old, timestamp-globals.zvei_time_old) # in case of double alarm, zvei_double_ignore_time set new globals.zvei_time_old = timestamp else: logging.info("5-Ton: %s", zvei_id) data = {"zvei":zvei_id, "description":zvei_id} # If enabled, look up description if globals.config.getint("ZVEI", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription("ZVEI", zvei_id) # processing the alarm from includes import alarmHandler alarmHandler.processAlarm("ZVEI",freq,data) globals.zvei_id_old = zvei_id # save last id globals.zvei_time_old = timestamp # save last time else: logging.warning("No valid ZVEI: %s", zvei_id)
def decode(freq, decoded): """ Export POCSAG Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if POCSAG decode failed """ bitrate = 0 timestamp = int(time.time())#Get Timestamp if "POCSAG512:" in decoded: bitrate = 512 poc_id = decoded[20:27].replace(" ", "").zfill(7) poc_sub = decoded[39].replace("3", "4").replace("2", "3").replace("1", "2").replace("0", "1") elif "POCSAG1200:" in decoded: bitrate = 1200 poc_id = decoded[21:28].replace(" ", "").zfill(7) poc_sub = decoded[40].replace("3", "4").replace("2", "3").replace("1", "2").replace("0", "1") elif "POCSAG2400:" in decoded: bitrate = 2400 poc_id = decoded[21:28].replace(" ", "").zfill(7) poc_sub = decoded[40].replace("3", "4").replace("2", "3").replace("1", "2").replace("0", "1") if bitrate is 0: logging.warning("POCSAG Bitrate not found") logging.debug(" - (%s)", decoded) else: logging.debug("POCSAG Bitrate: %s", bitrate) if "Alpha:" in decoded: #check if there is a text message poc_text = decoded.split('Alpha: ')[1].strip().rstrip('<EOT>').strip() else: poc_text = "" if re.search("[0-9]{7}", poc_id): #if POC is valid if isAllowed(poc_id): # check for double alarm if poc_id == globals.poc_id_old and timestamp < globals.poc_time_old + globals.config.getint("POC", "double_ignore_time"): logging.info("POCSAG%s double alarm: %s within %s second(s)", bitrate, globals.poc_id_old, timestamp-globals.poc_time_old) # in case of double alarm, poc_double_ignore_time set new globals.poc_time_old = timestamp else: logging.info("POCSAG%s: %s %s %s ", bitrate, poc_id, poc_sub, poc_text) data = {"ric":poc_id, "function":poc_sub, "msg":poc_text, "bitrate":bitrate, "description":poc_id} # Add function as character a-d to dataset data["functionChar"] = data["function"].replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d") # If enabled, look up description if globals.config.getint("POC", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription("POC", poc_id) # processing the alarm from includes import alarmHandler alarmHandler.processAlarm("POC",freq,data) globals.poc_id_old = poc_id #save last id globals.poc_time_old = timestamp #save last time else: logging.debug("POCSAG%s: %s is not allowed", bitrate, poc_id) else: logging.warning("No valid POCSAG%s RIC: %s", bitrate, poc_id)
def decode(freq, decoded): """ Export POCSAG Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if POCSAG decode failed """ try: bitrate = 0 if "POCSAG512:" in decoded: bitrate = 512 poc_id = decoded[20:27].replace(" ", "").zfill(7) poc_sub = str(int(decoded[39])+1) elif "POCSAG1200:" in decoded: bitrate = 1200 poc_id = decoded[21:28].replace(" ", "").zfill(7) poc_sub = str(int(decoded[40])+1) elif "POCSAG2400:" in decoded: bitrate = 2400 poc_id = decoded[21:28].replace(" ", "").zfill(7) poc_sub = str(int(decoded[40])+1) if bitrate is 0: logging.warning("POCSAG Bitrate not found") logging.debug(" - (%s)", decoded) else: logging.debug("POCSAG Bitrate: %s", bitrate) if "Alpha:" in decoded: #check if there is a text message poc_text = decoded.split('Alpha: ')[1].strip().rstrip('<EOT>').strip() else: poc_text = "" if re.search("[0-9]{7}", poc_id) and re.search("[1-4]{1}", poc_sub): #if POC is valid if isAllowed(poc_id): # check for double alarm if doubleFilter.checkID("POC", poc_id+poc_sub, poc_text): logging.info("POCSAG%s: %s %s %s ", bitrate, poc_id, poc_sub, poc_text) data = {"ric":poc_id, "function":poc_sub, "msg":poc_text, "bitrate":bitrate, "description":poc_id} # Add function as character a-d to dataset data["functionChar"] = data["function"].replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d") # If enabled, look up description if globals.config.getint("POC", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription("POC", poc_id) # processing the alarm try: from includes import alarmHandler alarmHandler.processAlarm("POC", freq, data) except: logging.error("processing alarm failed") logging.debug("processing alarm failed", exc_info=True) pass # in every time save old data for double alarm doubleFilter.newEntry(poc_id+poc_sub, poc_text) else: logging.debug("POCSAG%s: %s is not allowed", bitrate, poc_id) else: logging.warning("No valid POCSAG%s RIC: %s SUB: %s", bitrate, poc_id, poc_sub) except: logging.error("error while decoding") logging.debug("error while decoding", exc_info=True)
def decode(freq, decoded): """ Export FMS Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if FMS decode failed """ try: fms_service = decoded[19] # Organisation fms_country = decoded[36] # Bundesland fms_location = decoded[65:67] # Ort fms_vehicle = decoded[72:76] # Fahrzeug fms_status = decoded[84] # Status fms_direction = decoded[101] # Richtung fms_directionText = decoded[103:110] # Richtung (Text) fms_tsi = decoded[114:117] # Taktische Kruzinformation if "CRC correct" in decoded: #check CRC is correct fms_id = fms_service + fms_country + fms_location + fms_vehicle + fms_status + fms_direction # build FMS id # if FMS is valid if re.search("[0-9a-f]{8}[0-9a-f]{1}[01]{1}", fms_id): # check for double alarm if doubleFilter.checkID("FMS", fms_id): logging.info("FMS:%s Status:%s Richtung:%s TSI:%s", fms_id[0:8], fms_status, fms_direction, fms_tsi) data = { "fms": fms_id[0:8], "status": fms_status, "direction": fms_direction, "directionText": fms_directionText, "tsi": fms_tsi, "description": fms_id[0:8] } # If enabled, look up description if globals.config.getint("FMS", "idDescribed"): from includes import descriptionList data["description"] = descriptionList.getDescription( "FMS", fms_id[0:8]) # processing the alarm try: from includes import alarmHandler alarmHandler.processAlarm("FMS", freq, data) except: logging.error("processing alarm failed") logging.debug("processing alarm failed", exc_info=True) pass # in every time save old data for double alarm doubleFilter.newEntry(fms_id) else: logging.warning("No valid FMS: %s", fms_id) else: logging.warning("FMS CRC incorrect") except: logging.error("error while decoding") logging.debug("error while decoding", exc_info=True)
def decode(freq, decoded): """ Export POCSAG Information from Multimon-NG RAW String and call alarmHandler.processAlarm() @type freq: string @param freq: frequency of the SDR Stick @type decoded: string @param decoded: RAW Information from Multimon-NG @requires: Configuration has to be set in the config.ini @return: nothing @exception: Exception if POCSAG decode failed """ try: bitrate = 0 if "POCSAG512:" in decoded: bitrate = 512 poc_id = decoded[20:27].replace(" ", "").zfill(7) poc_sub = str(int(decoded[39]) + 1) elif "POCSAG1200:" in decoded: bitrate = 1200 poc_id = decoded[21:28].replace(" ", "").zfill(7) poc_sub = str(int(decoded[40]) + 1) elif "POCSAG2400:" in decoded: bitrate = 2400 poc_id = decoded[21:28].replace(" ", "").zfill(7) poc_sub = str(int(decoded[40]) + 1) if bitrate is 0: logging.warning("POCSAG Bitrate not found") logging.debug(" - (%s)", decoded) else: logging.debug("POCSAG Bitrate: %s", bitrate) if "Alpha:" in decoded: #check if there is a text message poc_text = decoded.split('Alpha: ')[1].strip().rstrip( '<EOT>').strip() else: poc_text = "" if re.search("[0-9]{7}", poc_id) and re.search( "[1-4]{1}", poc_sub): #if POC is valid if isAllowed(poc_id): # check for double alarm if doubleFilter.checkID("POC", poc_id + poc_sub, poc_text): logging.info("POCSAG%s: %s %s %s ", bitrate, poc_id, poc_sub, poc_text) data = { "ric": poc_id, "function": poc_sub, "msg": poc_text, "bitrate": bitrate, "description": poc_id } # Add function as character a-d to dataset data["functionChar"] = data["function"].replace( "1", "a").replace("2", "b").replace("3", "c").replace("4", "d") # If enabled, look up description if globals.config.getint("POC", "idDescribed"): from includes import descriptionList data[ "description"] = descriptionList.getDescription( "POC", poc_id) # processing the alarm try: from includes import alarmHandler alarmHandler.processAlarm("POC", freq, data) except: logging.error("processing alarm failed") logging.debug("processing alarm failed", exc_info=True) pass # in every time save old data for double alarm doubleFilter.newEntry(poc_id + poc_sub, poc_text) else: logging.debug("POCSAG%s: %s is not allowed", bitrate, poc_id) else: logging.warning("No valid POCSAG%s RIC: %s SUB: %s", bitrate, poc_id, poc_sub) except: logging.error("error while decoding") logging.debug("error while decoding", exc_info=True)
pluginLoader.loadPlugins() filter.loadFilters() # ----- Test Data ----- # #typ = "FMS" #data = {"fms":"12345678", "status":"2", "direction":"1", "tsi":"III"} typ = "ZVEI" data = {"zvei":"25345"} #typ = "POC" #data = {"ric":"1234567", "function":"1", "msg":"Hello World!, "bitrate":"1200"} while True: try: time.sleep(1) print "" alarmHandler.processAlarm(typ,"0",data) except KeyboardInterrupt: logging.warning("Keyboard Interrupt") exit() except: logging.exception("unknown error") exit()