...
|
...
|
@@ -28,7 +28,7 @@ broker = None
|
28
|
28
|
latestHtml = ""
|
29
|
29
|
previousLastFcnt = 0
|
30
|
30
|
|
31
|
|
-def htmlLatest(deveui,subID,FCnt,timeLatest,lat,lon,err,rssi,comment=None):
|
|
31
|
+def htmlLatest(deveui,subID,FCnt,timeLatest,lat,lon,err,rssi,comment=None,solver=0):
|
32
|
32
|
global latestHtml
|
33
|
33
|
global previousLastFcnt
|
34
|
34
|
htmlOutput="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n"
|
...
|
...
|
@@ -68,7 +68,11 @@ def htmlLatest(deveui,subID,FCnt,timeLatest,lat,lon,err,rssi,comment=None):
|
68
|
68
|
htmlOutput+=" zoomOffset: -1\n"
|
69
|
69
|
htmlOutput+=" }).addTo(mymap);\n"
|
70
|
70
|
|
71
|
|
- htmlOutput+=" L.circle(["+str(lat)+","+str(lon)+"],{color: '"+color+"', fillcolor: '"+color+"', fillOpacity: "+str(circleOpacity)+", radius:"+str(err)+"}).addTo(mymap);\n"
|
|
71
|
+ #DO not plot TPXLE err radius
|
|
72
|
+ if solver == 0:
|
|
73
|
+ htmlOutput+=" L.circle(["+str(lat)+","+str(lon)+"],{color: '"+color+"', fillcolor: '"+color+"', fillOpacity: "+str(circleOpacity)+", radius:"+str(err)+"}).addTo(mymap);\n"
|
|
74
|
+ else:
|
|
75
|
+ htmlOutput+=" L.circle(["+str(lat)+","+str(lon)+"],{color: '"+color+"', fillcolor: '"+color+"', fillOpacity: "+str(circleOpacity)+", radius:"+str(10)+"}).addTo(mymap);\n"
|
72
|
76
|
htmlOutput+="</script>\n"
|
73
|
77
|
|
74
|
78
|
htmlOutput+="<p>\n"
|
...
|
...
|
@@ -100,12 +104,59 @@ def on_connect(client, userdata, flags, rc):
|
100
|
104
|
def on_message(client, userdata, msg):
|
101
|
105
|
json_data=str(msg.payload.decode('ASCII'))
|
102
|
106
|
parseTopic=msg.topic.split('/')
|
103
|
|
- if "uplink" in msg.topic:
|
|
107
|
+ doProcess=True
|
|
108
|
+ try:
|
|
109
|
+ parsed=json.loads(json_data)
|
|
110
|
+ doProcess=True
|
|
111
|
+ except:
|
|
112
|
+ error("JSON parse failure")
|
|
113
|
+ doProcess=False
|
|
114
|
+ return
|
|
115
|
+
|
|
116
|
+ try:
|
|
117
|
+ # To differenciate AS message vs TPXLE message
|
|
118
|
+ #print("Uplink received for SubID: "+parseTopic[1]+" and DevEUI: "+parseTopic[3])
|
|
119
|
+ FCnt=parsed['processedFeed']['sequenceNumber']
|
|
120
|
+ devEUI=parseTopic[3].upper()
|
|
121
|
+ #print(parsed)
|
|
122
|
+ if "NEW" == parsed['validityState']:
|
|
123
|
+ posType=parsed['rawPosition']['rawPositionType']
|
|
124
|
+ #print(parsed)
|
|
125
|
+ #say("UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCnt)+" "+posType)
|
|
126
|
+ err=parsed['rawPosition']['horizontalAccuracy']
|
|
127
|
+ lat=parsed['rawPosition']['coordinates'][1]
|
|
128
|
+ lon=parsed['rawPosition']['coordinates'][0]
|
|
129
|
+ err=parsed['rawPosition']['horizontalAccuracy']
|
|
130
|
+ toto=parsed['rawPosition']['coordinates']
|
|
131
|
+ messageType="POSITION_MESSAGE"
|
|
132
|
+ # Gateway
|
|
133
|
+ snr=parsed['processedFeed']['processedPacket']['SNR']
|
|
134
|
+ rssi=parsed['processedFeed']['processedPacket']['RSSI']
|
|
135
|
+ lrrid=parsed['processedFeed']['processedPacket']['baseStationId']
|
|
136
|
+ timeP=parsed['time'].replace("Z","+00:00")
|
|
137
|
+ htmlLatest(devEUI,parseTopic[1],FCnt,timeP,lat,lon,err,snr,posType,solver=1)
|
|
138
|
+ ok("TPXLE UL ID: "+parseTopic[1]+" D: "+devEUI+" F: "+str(FCnt)+" Type: "+posType+" "+str(lat)+" "+str(lon)+" "+str(err))
|
|
139
|
+
|
|
140
|
+ pattern = '%Y-%m-%dT%H:%M:%S.%f%z'
|
|
141
|
+ epoch = int(time.mktime(time.strptime(parsed['time'], pattern)))
|
|
142
|
+ csvLine=parseTopic[1]+","+devEUI+","+timeP+","+str(epoch)+","+str(FCnt)+","+str(lat)+","+str(lon)+","+str(err)+","+lrrid+","+str(rssi)+","+str(snr)+",,,,,,,,,1"
|
|
143
|
+ with open(server['rawCsv'],'a+') as f:
|
|
144
|
+ f.write(csvLine+"\n")
|
|
145
|
+ f.close()
|
|
146
|
+ #print(csvLine)
|
|
147
|
+ else:
|
|
148
|
+ warn("TPXLE UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCntUp)+" TPXLE frame not supported")
|
|
149
|
+
|
|
150
|
+ return
|
|
151
|
+
|
|
152
|
+ except:
|
|
153
|
+ doProcess=True
|
|
154
|
+
|
|
155
|
+ if "uplink" in msg.topic and doProcess == True:
|
104
|
156
|
csvLine=""
|
105
|
157
|
#print("Uplink received for SubID: "+parseTopic[1]+" and DevEUI: "+parseTopic[3])
|
106
|
|
- #print(json_data)
|
|
158
|
+ #print(parsed)
|
107
|
159
|
try:
|
108
|
|
- parsed=json.loads(json_data)
|
109
|
160
|
pattern = '%Y-%m-%dT%H:%M:%S.%f%z'
|
110
|
161
|
epoch = int(time.mktime(time.strptime(parsed['DevEUI_uplink']['Time'], pattern)))
|
111
|
162
|
FCnt=parsed['DevEUI_uplink']['FCntUp']
|
...
|
...
|
@@ -120,14 +171,17 @@ def on_message(client, userdata, msg):
|
120
|
171
|
try:
|
121
|
172
|
say("Notification "+parseTopic[1]+" DevEUI: "+parseTopic[3]+" "+parsed['DevEUI_notification']['Type'])
|
122
|
173
|
except:
|
123
|
|
- with open(server['logfile'],'a+') as f:
|
124
|
|
- f.write("------------------------------\nMQTT Error: topic: "+msg.topic+" content: "+msg.payload.decode('ASCII')+"\n------------------------------\n")
|
125
|
|
- f.close()
|
126
|
|
- warn("Uh ho")
|
|
174
|
+ #with open(server['logfile'],'a+') as f:
|
|
175
|
+ # f.write("------------------------------\nMQTT Error: topic: "+msg.topic+" content: "+msg.payload.decode('ASCII')+"\n------------------------------\n")
|
|
176
|
+ # f.close()
|
|
177
|
+ #warn("Uh ho")
|
|
178
|
+ pass
|
127
|
179
|
return
|
128
|
180
|
messageType = "UNKNOWN"
|
|
181
|
+ posType= "UNKNOWN"
|
129
|
182
|
try:
|
130
|
183
|
messageType = parsed['DevEUI_uplink']['payload']['messageType']
|
|
184
|
+ posType = parsed['DevEUI_uplink']['payload']['rawPositionType']
|
131
|
185
|
except:
|
132
|
186
|
pass
|
133
|
187
|
|
...
|
...
|
@@ -138,14 +192,17 @@ def on_message(client, userdata, msg):
|
138
|
192
|
isPosition=True
|
139
|
193
|
if parsed['DevEUI_uplink']['payload'] is not None:
|
140
|
194
|
if parsed['DevEUI_uplink']['payload']['messageType'] == "POSITION_MESSAGE":
|
141
|
|
- try:
|
142
|
|
- lat=parsed['DevEUI_uplink']['payload']['gpsLatitude']
|
143
|
|
- lon=parsed['DevEUI_uplink']['payload']['gpsLongitude']
|
144
|
|
- err=parsed['DevEUI_uplink']['payload']['horizontalAccuracy']
|
145
|
|
- except:
|
146
|
|
- #warn("GPS Timeout")
|
147
|
|
- warn("UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCnt)+" Type: "+messageType+" GPS Timeout")
|
148
|
|
- htmlLatest(parseTopic[3],parseTopic[1],FCnt,parsed['DevEUI_uplink']['Time'],lat,lon,err,parsed['DevEUI_uplink']['LrrSNR'],"GPS TImeout or Non-GPS position")
|
|
195
|
+ if posType == "GPS_TIMEOUT":
|
|
196
|
+ # Message is GPS timeout
|
|
197
|
+ warn("UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCnt)+" Type: "+messageType+" "+posType)
|
|
198
|
+ htmlLatest(parseTopic[3],parseTopic[1],FCnt,parsed['DevEUI_uplink']['Time'],0,0,0,parsed['DevEUI_uplink']['LrrSNR'],"GPS TImeout")
|
|
199
|
+ else:
|
|
200
|
+ try:
|
|
201
|
+ lat=parsed['DevEUI_uplink']['payload']['gpsLatitude']
|
|
202
|
+ lon=parsed['DevEUI_uplink']['payload']['gpsLongitude']
|
|
203
|
+ err=parsed['DevEUI_uplink']['payload']['horizontalAccuracy']
|
|
204
|
+ except:
|
|
205
|
+ warn("UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCnt)+" Type: "+messageType+" "+posType)
|
149
|
206
|
return
|
150
|
207
|
else:
|
151
|
208
|
isPosition=False
|
...
|
...
|
@@ -161,7 +218,8 @@ def on_message(client, userdata, msg):
|
161
|
218
|
return
|
162
|
219
|
csvLine+=","+str(lat)+","+str(lon)+","+str(err)
|
163
|
220
|
|
164
|
|
- ok("UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCnt)+" Type: "+messageType+" "+str(lat)+" "+str(lon)+" "+str(err))
|
|
221
|
+ if 0 != lat and 0 != lon:
|
|
222
|
+ ok("UL ID: "+parseTopic[1]+" D: "+parseTopic[3]+" F: "+str(FCnt)+" Type: "+messageType+" "+str(lat)+" "+str(lon)+" "+str(err))
|
165
|
223
|
|
166
|
224
|
# Append GW details
|
167
|
225
|
#parsed['DevEUI_uplink']['Lrrs']['Lrr']
|
...
|
...
|
@@ -185,7 +243,7 @@ def on_message(client, userdata, msg):
|
185
|
243
|
f.write(csvLine+"\n")
|
186
|
244
|
f.close()
|
187
|
245
|
if True == isPosition:
|
188
|
|
- htmlLatest(parseTopic[3],parseTopic[1],FCnt,parsed['DevEUI_uplink']['Time'],lat,lon,err,rssi)
|
|
246
|
+ htmlLatest(parseTopic[3],parseTopic[1],FCnt,parsed['DevEUI_uplink']['Time'],lat,lon,err,rssi,solver=0)
|
189
|
247
|
|
190
|
248
|
def httpFromParse(obj):
|
191
|
249
|
if ".css" not in obj.path and "favicon" not in obj.path and ".png" not in obj.path and ".js" not in obj.path:
|