#!/usr/bin/python3 import time import csv2geojs import json import paho.mqtt.client as mqtt MAXLRR=4 filename="mqttGeo.csv" #filenameStatus="mqttGeo.html" filenameBase="mqttGeo" def htmlLatest(deveui,subID,FCnt,timeLatest,lat,lon,err,rssi): htmlOutput="\n" htmlOutput+="\n" htmlOutput+="\n" htmlOutput+=" mqttGeo Latest\n" htmlOutput+=" \n" htmlOutput+=" \n" htmlOutput+=" \n" htmlOutput+=csv2geojs.networkSurveyAddLeaflet() htmlOutput+="\n" htmlOutput+="\n" htmlOutput+="\n" htmlOutput+="

mqttGeo Latest

\n" htmlOutput+="
\n" if 0 != lat and 0 != lon: xmin=0.999999*lon xmax=1.000001*lon ymin=0.999999*lat ymax=1.000001*lat htmlOutput+="\n" htmlOutput+="

\n" htmlOutput+="

"+deveui+"
\n" htmlOutput+="
"+str(FCnt)+"
\n" htmlOutput+="
"+timeLatest+"
\n" htmlOutput+="
"+str(lat)+" "+str(lon)+" "+str(err)+"
\n" htmlOutput+="
"+str(rssi)+"
\n" htmlOutput+="

\n" htmlOutput+="

\n" htmlOutput+="

\n" htmlOutput+="

\n" htmlOutput+="\n" htmlOutput+="\n" filenameStatus=filenameBase+"-"+subID+".html" with open(filenameStatus,"w") as f2: f2.write(htmlOutput+"\n") f2.close # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("geoloc/#") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): json_data=str(msg.payload.decode('ASCII')) parseTopic=msg.topic.split('/') if "uplink" in msg.topic: csvLine="" #print("Uplink received for SubID: "+parseTopic[1]+" and DevEUI: "+parseTopic[3]) try: parsed=json.loads(json_data) pattern = '%Y-%m-%dT%H:%M:%S.%f%z' epoch = int(time.mktime(time.strptime(parsed['DevEUI_uplink']['Time'], pattern))) FCnt=parsed['DevEUI_uplink']['FCntUp'] csvLine+=parseTopic[1]+","+parseTopic[3]+","+parsed['DevEUI_uplink']['Time']+","+str(epoch)+","+str(FCnt) print("Uplink received for SubID: "+parseTopic[1]+" and DevEUI: "+parseTopic[3]+" Fcnt: "+str(FCnt)) except: print("Uh ho") lat=0 lon=0 err=0 if parsed['DevEUI_uplink']['payload'] is not None: if parsed['DevEUI_uplink']['payload']['messageType'] == "POSITION_MESSAGE": try: lat=parsed['DevEUI_uplink']['payload']['gpsLatitude'] lon=parsed['DevEUI_uplink']['payload']['gpsLongitude'] err=parsed['DevEUI_uplink']['payload']['horizontalAccuracy'] except: print("[WARN] GPS Timeout") else: print("[WARN] Not a position message:"+parsed['DevEUI_uplink']['payload']['messageType']) else: print("[WARN] No decoded payload") csvLine+=","+str(lat)+","+str(lon)+","+str(err) #print(csvLine) # Append GW details #parsed['DevEUI_uplink']['Lrrs']['Lrr'] #Lrrid #LrrRSSI #LrrSNR count=0 rssi=100 for lrr in parsed['DevEUI_uplink']['Lrrs']['Lrr']: count+=1 #print(lrr['Lrrid']) if rssi == 100: rssi=lrr['LrrRSSI'] csvLine+=","+lrr['Lrrid']+","+str(lrr['LrrRSSI'])+","+str(lrr['LrrSNR']) i = 0 for i in range(count,MAXLRR): csvLine+=",,," # Appending only if position is different from 0,0 if 0 != lat and 0 != lon: with open(filename,'a+') as f: f.write(csvLine+"\n") f.close() htmlLatest(parseTopic[3],parseTopic[1],FCnt,parsed['DevEUI_uplink']['Time'],lat,lon,err,rssi) csv2geojs.networkSurvey(filename,parseTopic[1]) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message broker_address="192.168.1.33" user="esp8266" password="NjWxXrEMnOeaNtv8b40u" port=1883 try: client.username_pw_set(user, password=password) except: print("[FAILED]MQTT Set") try: client.connect(broker_address, port, 60) except: print("[FAILED]MQTT connect") client.loop_forever()