Showing 1 changed files with 77 additions and 19 deletions
+77 -19
mqttGeo.py
... ...
@@ -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: