def read_lora_message(): global last_heartbeat print("Calling receiveLoRaMessage to receive message...") msg0 = lora_interface.receiveLoRaMessage(receive_timeout) msg = msg0 # Copy the message safely. status = lora_interface.getLoRaStatus() print("Msg: " + msg + ", Status: " + str(status)) write_packet() gateway_snr = lora_interface.getLoRaSNRValue() gateway_rssi = lora_interface.getLoRaRSSIValue() gateway_rssi_packet = lora_interface.getLoRaRSSIpacketValue() # If no message available, try again. if len(msg) == 0: # Send a heartbeat message if it was last sent 10 mins ago. if (datetime.datetime.now() - last_heartbeat).total_seconds() < 10 * 60: return None last_heartbeat = datetime.datetime.now() device_state = { "message": "heartbeat", "address": gateway_address, "gateway": gateway_address, "gateway_snr": gateway_snr, "gateway_rssi": gateway_rssi, "gateway_rssi_packet": gateway_rssi_packet } return device_state device_address = lora_interface.getLoRaSender() recipient_address = lora_interface.getLoRaRecipient() packet_number = lora_interface.getLoRaPacketNumber() device_state = { "address": device_address, "gateway": recipient_address, "packet_number": packet_number, "gateway_snr": gateway_snr, "gateway_rssi": gateway_rssi, "gateway_rssi_packet": gateway_rssi_packet } try: # Msg contains an array of sensor data. Convert to dictionary. msg_split = msg.split("|") col = 0 for value in msg_split: key = fields[col] col = col + 1 value = value.strip() if value == "": continue # Allow "||" to denote skipping of fields. # If field is integer or decimal, convert accordingly. if key != "timestamp" and value.isdecimal(): if '.' in value: value = float(value) else: value = int(value) device_state[key] = value except Exception as e: # In case of parse errors e.g. due to Low Data Rate Optimization, record the error and continue. device_state["error"] = str(e) return device_state
while True: try: # Wait a while to receive a message. print("Calling receiveLoRaMessage to receive message...") msg = lora_interface.receiveLoRaMessage(receive_timeout) status = lora_interface.getLoRaStatus() print("Msg: " + msg + ", Status: " + str(status)) # Read the LoRa counters. status = lora_interface.getLoRaStatus() setup_done = lora_interface.getLoRaSetupDone() send_count = lora_interface.getLoRaSendCount() receive_count = lora_interface.getLoRaReceiveCount() snr = lora_interface.getLoRaSNRValue() rssi = lora_interface.getLoRaRSSIValue() rssi_packet = lora_interface.getLoRaRSSIpacketValue() timestamp = datetime.datetime.now().isoformat() msg = str(device_address) + "|" + \ str(gateway_address) + "|" + \ str(status) + "|" + \ str(setup_done) + "|" + \ str(send_count) + "|" + \ str(receive_count) + "|" + \ str(snr) + "|" + \ str(rssi) + "|" + \ str(rssi_packet) + "|" + \ str(timestamp) print("Calling sendLoRaMessage to send device state to LoRa gateway " + str(gateway_address) + "...\n" + msg) status = lora_interface.sendLoRaMessage(gateway_address, msg) print("Status: " + str(status))