annotate service/beacon/rssiscan.py @ 1462:2b29f14eb6bd

try new graph+view widget Ignore-this: d5f9c5dc52f04324368716ba2f604fdb darcs-hash:44e85a5c075ef73c34a58deaa3a3c1e8390dae52
author drewp <drewp@bigasterisk.com>
date Sun, 24 Nov 2019 00:01:00 -0800
parents 1ddd1f057749
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 # BLE iBeaconScanner based on https://github.com/adamf/BLE/blob/master/ble-scanner.py
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 # JCS 06/07/14
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 # Adapted for Python3 by Michael duPont 2015-04-05
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 #DEBUG = False
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 # BLE scanner based on https://github.com/adamf/BLE/blob/master/ble-scanner.py
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 # BLE scanner, based on https://code.google.com/p/pybluez/source/browse/trunk/examples/advanced/inquiry-with-rssi.py
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 # https://github.com/pauloborges/bluez/blob/master/tools/hcitool.c for lescan
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10 # https://kernel.googlesource.com/pub/scm/bluetooth/bluez/+/5.6/lib/hci.h for opcodes
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 # https://github.com/pauloborges/bluez/blob/master/lib/hci.c#L2782 for functions used by lescan
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 import struct
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 import sys
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
15 import time
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 import bluetooth._bluetooth as bluez
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 import datetime
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 from dateutil.tz import tzlocal
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 from bson.binary import Binary
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
20 from influxdb import InfluxDBClient
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
21 from pymongo import MongoClient
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
22 from repoze.lru import LRUCache
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 LE_META_EVENT = 0x3e
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 OGF_LE_CTL=0x08
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26 OCF_LE_SET_SCAN_ENABLE=0x000C
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 # these are actually subevents of LE_META_EVENT
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 EVT_LE_CONN_COMPLETE=0x01
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 EVT_LE_ADVERTISING_REPORT=0x02
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 def hci_enable_le_scan(sock):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 enable = 0x01
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 cmd_pkt = struct.pack("<BB", enable, 0x00)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 bluez.hci_send_cmd(sock, OGF_LE_CTL, OCF_LE_SET_SCAN_ENABLE, cmd_pkt)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 # ported from android/source/external/bluetooth/hcidump/parser/hci.c
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 def evttype2str(etype):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 return {
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 0x00: "ADV_IND", # Connectable undirected advertising
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 0x01: "ADV_DIRECT_IND", # Connectable directed advertising
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44 0x02: "ADV_SCAN_IND", # Scannable undirected advertising
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45 0x03: "ADV_NONCONN_IND", # Non connectable undirected advertising
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 0x04: "SCAN_RSP", # Scan Response
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 }.get(etype, "Reserved")
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 def bdaddrtype2str(btype):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 return {
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 0x00: "Public",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52 0x01: "Random",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 }.get(btype, "Reserved")
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 # from https://github.com/google/eddystone/blob/master/eddystone-url/implementations/linux/scan-for-urls
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 schemes = [
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 "http://www.",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 "https://www.",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 "http://",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62 "https://",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 ]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 extensions = [
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66 ".com/", ".org/", ".edu/", ".net/", ".info/", ".biz/", ".gov/",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67 ".com", ".org", ".edu", ".net", ".info", ".biz", ".gov",
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68 ]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70 def decodeUrl(encodedUrl):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 """
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 Decode a url encoded with the Eddystone (or UriBeacon) URL encoding scheme
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73 """
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 decodedUrl = schemes[encodedUrl[0]]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76 for c in encodedUrl[1:]:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 if c <= 0x20:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 decodedUrl += extensions[c]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 else:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80 decodedUrl += chr(c)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
81
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82 return decodedUrl
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84 def decodeBeacon(data, row):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85 # this padding makes the offsets line up to the scan-for-urls code
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 padData = map(ord, '*' * 14 + data)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88 # Eddystone
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89 if len(padData) >= 20 and padData[19] == 0xaa and padData[20] == 0xfe:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 serviceDataLength = padData[21]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
91 frameType = padData[25]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 # Eddystone-URL
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 if frameType == 0x10:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95 row["Eddystone-URL"] = decodeUrl(padData[27:22 + serviceDataLength])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 elif frameType == 0x00:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
97 row["Eddystone-UID"] = Binary(data)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
98 elif frameType == 0x20:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
99 row["Eddystone-TLM"] = Binary(data)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
100 else:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
101 row["Eddystone"] = "Unknown Eddystone frame type: %r data: %r" % (frameType, data)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103 # UriBeacon
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104 elif len(padData) >= 20 and padData[19] == 0xd8 and padData[20] == 0xfe:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
105 serviceDataLength = padData[21]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
106 row["UriBeacon"] = decodeUrl(padData[27:22 + serviceDataLength])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108 else:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109 pass # "Unknown beacon type"
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 def decodeInquiryData(data, row):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
112 # offset 19 is totally observed from data, not any spec. IDK if the preceding part is variable-length.
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 if len(data) > 20 and data[19] in ['\x08', '\x09']:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114 localName = data[20:]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
115 if data[19] == '\x08':
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 row['local_name_shortened'] = Binary(localName)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 else:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
118 row['local_name_complete'] = Binary(localName)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
119 # more at android/source/external/bluetooth/hcidump/parser/hci.c ext_inquiry_data_dump
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
120
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
121 # from android/source/external/bluetooth/hcidump/parser/hci.c
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
122 def evt_le_advertising_report_dump(frm):
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
123 num_reports = ord(frm[0])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
124 frm = frm[1:]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
125
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
126 for i in range(num_reports):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
127 fmt = 'B B 6B B'
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
128 row = {}
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
129
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
130 evt_type, bdaddr_type, b5, b4, b3, b2, b1, b0, length = struct.unpack(fmt, frm[:struct.calcsize(fmt)])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
131 frm = frm[struct.calcsize(fmt):]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
132
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
133 row['addr'] = '%02x:%02x:%02x:%02x:%02x:%02x' % (b0, b1, b2, b3, b4, b5)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
134 row['addr_type'] = bdaddrtype2str(bdaddr_type)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
135 row['evt_type'] = evttype2str(evt_type)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
136
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
137 data = frm[:length]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
138 frm = frm[length:]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
139 row['data'] = Binary(data)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
140 #row['data_hex'] = ' '.join('%02x' % ord(c) for c in data)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
141
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
142 decodeBeacon(data, row)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
143 decodeInquiryData(data, row)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
144
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
145 row['rssi'], = struct.unpack('b', frm[-1])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
146 frm = frm[1:]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
147 yield row
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
148
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
149
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
150
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
151 def parse_events(sock, loop_count, source, influx, coll, lastDoc):
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
152 old_filter = sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
153 flt = bluez.hci_filter_new()
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
154 bluez.hci_filter_all_events(flt)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
155 bluez.hci_filter_set_ptype(flt, bluez.HCI_EVENT_PKT)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
156 sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, flt )
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
157
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
158 points = []
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
159 for i in range(0, loop_count):
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
160 pkt = sock.recv(255)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
161 ptype, event, plen = struct.unpack("BBB", pkt[:3])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
162 now = datetime.datetime.now(tzlocal())
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
163 nowMs = int(time.time() * 1000)
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
164 if event == bluez.EVT_INQUIRY_RESULT_WITH_RSSI:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
165 print "EVT_INQUIRY_RESULT_WITH_RSSI"
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
166 elif event == bluez.EVT_NUM_COMP_PKTS:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
167 print "EVT_NUM_COMP_PKTS"
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
168 elif event == bluez.EVT_DISCONN_COMPLETE:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
169 print "EVT_DISCONN_COMPLETE"
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
170 elif event == LE_META_EVENT:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
171 subevent, = struct.unpack("B", pkt[3:4])
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
172 pkt = pkt[4:]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
173 if subevent == EVT_LE_CONN_COMPLETE:
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
174 pass
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
175 elif subevent == EVT_LE_ADVERTISING_REPORT:
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
176 rows = list(evt_le_advertising_report_dump(pkt))
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
177 for row in sorted(rows):
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
178 rssi = row.pop('rssi')
1265
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
179 if row['addr_type'] == 'Public': # or, someday, if it's a device we know
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
180 points.append(dict(
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
181 measurement='rssi',
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
182 tags={'from': source, 'toAddr': row['addr']},
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
183 fields={'value': rssi},
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
184 time=nowMs,
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
185 ))
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
186 key = (row['addr'], row['evt_type'])
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
187 if lastDoc.get(key) != row:
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
188 # should check mongodb here- maybe another
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
189 # node already wrote this row
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
190 lastDoc.put(key, row)
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
191 row = row.copy()
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
192 row['t'] = now
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
193 coll.insert(row)
1ddd1f057749 some old Measurement and Locator edits
drewp <drewp@bigasterisk.com>
parents: 1113
diff changeset
194
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
195 influx.write_points(points, time_precision='ms')
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
196 sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
197
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
198
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
199 if __name__ == '__main__':
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
200 mongoHost, myLocation = sys.argv[1:]
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
201
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
202 influx = InfluxDBClient(mongoHost, 9060, 'root', 'root', 'beacon')
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
203 client = MongoClient(mongoHost)
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
204 coll = client['beacon']['data']
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
205
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
206 dev_id = 0
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
207 sock = bluez.hci_open_dev(dev_id)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
208 sock.getsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, 14)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
209
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
210 hci_enable_le_scan(sock)
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
211
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
212 lastDoc = LRUCache(1000) # (addr, evt_type) : data row
1096
f42fd56049dd start bt beacon tools
drewp <drewp@bigasterisk.com>
parents:
diff changeset
213 while True:
1113
0a864b90a0b4 beacon write to influxdb
drewp <drewp@bigasterisk.com>
parents: 1096
diff changeset
214 parse_events(sock, 10, source=myLocation, coll=coll, influx=influx, lastDoc=lastDoc)