# https://www.thethingsnetwork.org/forum/t/a-python-program-to-listen-to-your-devices-with-mqtt/9036/6 # Get data from MQTT server # Run this with python 3, install paho.mqtt prior to use import paho.mqtt.client as mqtt import json import base64 from datetime import datetime as dt from haversine import haversine from geojson import Feature, Point, dump longitudep = 0 latitudep = 0 timep = dt.now() APPEUI = "------" APPID = "dynamitron_test" PSW = '-------' #Call back functions # gives connection message def on_connect(mqttc, mosq, obj,rc): print("Connected with result code:"+str(rc)) # subscribe for all devices of user mqttc.subscribe('+/devices/+/up') # gives message from device def on_message(mqttc,obj,msg): try: #print(msg.payload) x = json.loads(msg.payload.decode('utf-8')) device = x["dev_id"] counter = x["counter"] payload_raw = x["payload_raw"] payload_fields = x["payload_fields"] datetime = x["metadata"]["time"] gateways = x["metadata"]["gateways"] SF = x["metadata"]["data_rate"] y = json.dumps(payload_fields) y_dict = json.loads(y) latitude = y_dict["latitude"] longitude = y_dict["longitude"] dist = round((haversine((50.626525,4.644700),(latitude,longitude,))),3) global longitudep global latitudep global timep distp = round((haversine((latitudep,longitudep),(latitude,longitude))),3) time_delta = dt.now()-timep speed = distp /((time_delta.total_seconds())/3600) print (longitudep) print (latitudep) longitudep = longitude latitudep = latitude timep = dt.now() print (longitudep) print (latitudep) print (distp) print (speed) for gw in gateways: gateway_id = gw["gtw_id"] rssi = gw["rssi"] snr = gw["snr"] #print(datetime + ", " + device + ", " + str(counter) + ", "+ gateway_id + ", "+ str(rssi) + ", " + str(snr) + ", "+ str(payload_fields)) print(datetime + ", " + gateway_id + ", "+ str(rssi) + ", " + str(snr) + ", "+ str(SF)+ ", "+ str(round(latitude,6)) + ", "+ str(round(longitude,6)) + ", " + str(dist) + ", " +str(round(speed,1))) my_point = Point((longitude,latitude)) my_feature = json.dumps(Feature(geometry=my_point, properties= {"datetime": str(datetime),"gateway_id": str (gateway_id),"rssi": str (rssi),"snr": str (snr),"SF": str (SF),"dist": str (dist),"speed":str (round(speed,1))})) print (my_feature) if ((latitude!=0) and (longitude!=0) and (distp>0.015)): # if ((latitude!=0) and (longitude!=0)): with open("track.geojson","a") as outfile: outfile.write (my_feature + '\n') outfile.close() except Exception as e: print(e) pass def on_publish(mosq, obj, mid): print("mid: " + str(mid)) def on_subscribe(mosq, obj, mid, granted_qos): print("Subscribed: " + str(mid) + " " + str(granted_qos)) def on_log(mqttc,obj,level,buf): print("message:" + str(buf)) print("userdata:" + str(obj)) mqttc= mqtt.Client() # Assign event callbacks mqttc.on_connect=on_connect mqttc.on_message=on_message mqttc.username_pw_set(APPID, PSW) mqttc.connect("eu.thethings.network",1883,60) # and listen to server run = True while run: mqttc.loop()