From 5b07ec73307a63f6cca339fe7f4b6fd319fada6d Mon Sep 17 00:00:00 2001 From: Dan White Date: Mon, 8 May 2017 17:16:16 -0500 Subject: [PATCH] cleanup decoder and example Jupyter notebook for analysis --- decode-to-json.py | 74 ++++++++++--- packet-analysis.ipynb | 251 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 309 insertions(+), 16 deletions(-) create mode 100644 packet-analysis.ipynb diff --git a/decode-to-json.py b/decode-to-json.py index ee62d34..1de714f 100755 --- a/decode-to-json.py +++ b/decode-to-json.py @@ -3,6 +3,7 @@ # by convention, built-in imports are listed first # see: https://www.python.org/dev/peps/pep-0008/ import base64 +from collections import defaultdict import fileinput import json import sys @@ -34,6 +35,13 @@ def debug(*args): # Example: # python3 decode-to-json.py *.log < another-log-file.log # + +protolist = [] +jsonlist = [] +dictlist = [] + +nStats = defaultdict(int) + for line in fileinput.input(): # Official database line format # ----------------------------- @@ -45,6 +53,9 @@ for line in fileinput.input(): # 5 - nodeID of sender's radio (may be a relay's nodeID) # 6 - radioAddress # 7 - data + + nStats['inLines'] += 1 + line = line.rstrip() fields = line.split() @@ -61,6 +72,7 @@ for line in fileinput.input(): else: debug(line) debug('Wrong number of fields in database line.') + nStats['badNFields'] += 1 continue # packet data is sometimes not in the correct format @@ -69,6 +81,7 @@ for line in fileinput.input(): except: debug(line) debug('Not a valid hex string:', hexdata) + nStats['badHexStr'] += 1 continue @@ -81,6 +94,7 @@ for line in fileinput.input(): # protodata.ParseFromString(bindata[:N]) # would need to validate that you found the correct N somehow after this # maybe increment N downwards from a known "too big" number??? + nStats['badDecode'] += 1 #subtract on success, failure is difficult detect for n in range(128, 0, -1): b = bindata[:n] try: @@ -90,11 +104,16 @@ for line in fileinput.input(): continue else: # debug('decoded SensorData using', n) + nStats['badDecode'] -= 1 #good decode, not bad break # now that we have a decode, check the first field to fixup the correct # decoder given the first field (which is nodeID) if this was really node 42 # or 43 + # + # this is possible because NodeData.proto has a subset of the field numbers + # of SensorData (but different datatypes in places). Valid NodeData will + # always decode as SensorData (but with bogus numbers). if protodata.sensorId in (42, 43): protodata = NodeData() protodata.ParseFromString(b) #re-use the known-good length???? @@ -117,22 +136,45 @@ for line in fileinput.input(): nodeID = data['sensorId'] #protobuf->JSON->dict route else: debug('Cannot find nodeID in the data') + nStats['badID'] += 1 continue - # This is the point in the code where you either collect all the data into - # some large array, or filter again, looking for specific nodeID or other - # thing you are looking for. - # - # Just print the various representations for your enjoyment for now. - if nodeID in (43, ): # or nodeIDsender in ('42', '43'): - # print() - # print('#############') - # print('protobuf text:\n', protodata) #in protobuf text format - # print('JSON:\n', jsondata) #the JSON string - # print('py dict:\n', data) #the python dictionary - #print(gatewayTimestamp, (protodata.temperature/1e3-0.5)/10e-3) - print(gatewayTimestamp, protodata.vbatt/1e3) - - # if nodeID == 15: - # print(gatewayTimestamp, radioFrequency, nodeIDsender, data) + nStats['goodLines'] += 1 + + # collect all decoded data in several formats + protolist.append(protodata) + jsonlist.append(jsondata) + + # save all info we know and have decoded as dictionary key-value pairs + data['gatewayIP'] = gatewayIP + data['databaseTimestamp'] = databaseTimestamp + data['gatewayTimestamp'] = gatewayTimestamp + data['radioFrequency'] = radioFrequency + data['RSSI'] = RSSI + data['nodeIDsender'] = nodeIDsender + data['radioAddress'] = radioAddress + data['hexdata'] = hexdata + dictlist.append(data) + + + +# we have decoded as many database lines as we could. +# +# dump our counts for interest +print(nStats) + +#save the loaded data for later analysis in python to speed things up +import pickle + +pickle.dump(protolist, open('protolist.pkl', 'wb')) +pickle.dump(jsonlist, open('jsonlist.pkl', 'wb')) + +#this one is the easiest to deal with for later analysis +# +# #example usage (also see packet-analysis.ipynb) +# datalist = pickle.load(open('dictlist.pkl')) +# for d in datalist: +# sensorId = d['sensorId'] +# +pickle.dump(dictlist, open('dictlist.pkl', 'wb')) diff --git a/packet-analysis.ipynb b/packet-analysis.ipynb new file mode 100644 index 0000000..c62619e --- /dev/null +++ b/packet-analysis.ipynb @@ -0,0 +1,251 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pickle\n", + "\n", + "# defaultdict(, {\n", + "# 'badHexStr': 5712,\n", + "# 'badNFields': 43530,\n", + "# 'badDecode': 1717,\n", + "# 'badID': 1766,\n", + "# 'goodLines': 215949,\n", + "# 'inLines': 266957,\n", + "#})\n", + "\n", + "with open('dictlist.pkl', 'rb') as infile:\n", + " lines = pickle.load(infile)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "215949" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(lines)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "mpl.rcParams['figure.figsize'] = (15, 10)\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Histogram of the seen nodeIDs\n", + "(having valid database packets)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "defaultdict(int,\n", + " {1: 11442,\n", + " 4: 4,\n", + " 9: 1,\n", + " 10: 6804,\n", + " 11: 4232,\n", + " 12: 11310,\n", + " 13: 2364,\n", + " 14: 9681,\n", + " 15: 74879,\n", + " 16: 27191,\n", + " 17: 0,\n", + " 18: 0,\n", + " 19: 0,\n", + " 20: 0,\n", + " 21: 12307,\n", + " 22: 0,\n", + " 23: 9514,\n", + " 24: 0,\n", + " 25: 56,\n", + " 26: 0,\n", + " 27: 0,\n", + " 31: 11483,\n", + " 42: 9581,\n", + " 43: 14307,\n", + " 45: 17,\n", + " 93: 10752,\n", + " 95: 24})" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from collections import defaultdict\n", + "\n", + "counts = defaultdict(int) #gracefully handle new nodeID's\n", + "#pre-fill with the assigned nodeID list\n", + "for i in range(10, 28):\n", + " counts[i] = 0\n", + "\n", + "for line in lines:\n", + " if 'nodeID' in line:\n", + " nodeID = line['nodeID']\n", + " elif 'sensorId' in line:\n", + " nodeID = line['sensorId']\n", + " else:\n", + " #should not get here\n", + " print(\"BOGUS\")\n", + " \n", + " counts[nodeID] += 1\n", + " \n", + "counts #jupyter notebook automagically pretty-prints the last variable in a cell MATLAB-style" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Extract data for nodeID 43\n", + "\n", + "This node is powered by 2xAA batteries and was moved around a bit to assist others with Relay and Gateway testing. It reports the current value of `millis()` as a timestamp, voltage output of a TMP36 sensor (in mV), and battery voltage (in mV)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#collect data into lists\n", + "from datetime import datetime\n", + "\n", + "ds = []\n", + "vbatt = []\n", + "tempC = []\n", + "for line in lines:\n", + " if not ('nodeID' in line and line['nodeID']==43):\n", + " continue\n", + " #strptime only handles microsecond resolution or larger, it chokes on ns resolution\n", + " d = datetime.strptime(line['gatewayTimestamp'][:26], '%Y-%m-%dT%H:%M:%S.%f')\n", + " ds.append(d)\n", + " \n", + " vb = line['vbatt']\n", + " vbatt.append(vb / 1e3) #convert to V\n", + " \n", + " vt = line['temperature']\n", + " t = (vt - 500) / 10.0 #convert to Celsius\n", + " tempC.append(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#deal with dates on the x-axis\n", + "import matplotlib.dates as mdates\n", + "#import seaborn #conda install -y seaborn\n", + "\n", + "fig, ax = plt.subplots(1)\n", + "\n", + "ax.plot(ds, vbatt, '.')\n", + "ax.grid('on')\n", + "\n", + "fig.autofmt_xdate()\n", + "ax.fmt_xdata = mdates.DateFormatter('%Y-%m-%d %H')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [Root]", + "language": "python", + "name": "Python [Root]" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} -- 2.25.1