-
Notifications
You must be signed in to change notification settings - Fork 6
/
gatewayScanner.py
85 lines (72 loc) · 2.52 KB
/
gatewayScanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/python3
##--Michael duPont
##--gatewayScanner.py : Access-granting iBeacon scanner
##--Query Azure SQL db to determine one-time access for device emitting an iBeacon
##--2015-04-08
import blescan , pyodbc , sys , os
from time import sleep
useBlink1 = True
#Connection Information
dsn = 'sqlserverdatasource' #From odbc.ini
user = 'user@server'
password = 'password'
database = 'mydatabase'
con_string = 'DSN={0};UID={1};PWD={2};DATABASE={3};'.format(dsn,user,password,database)
conn = pyodbc.connect(con_string)
cursor = conn.cursor()
#Convert 64:80:65:f9:2e:96,e20a39f473f54bc4a12f17d1ad07a961,0000,0003,c5
#Into E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 03 C5 00
def sanitizeBLEPacket(blePacket):
blePacket = blePacket[blePacket.find(',')+1:].upper()
blePacket = blePacket.replace(',' , '')
blePacket = ' '.join(a+b for a,b in zip(blePacket[::2], blePacket[1::2]))
return blePacket + ' 00'
#Queries beaconDB for rows where 'text' == blePacket
#Returns first ID from query results else empty string
def queryAzureDB(blePacket):
cursor.execute("select id, uuid from [Item] where uuid = ?" , blePacket[:len(blePacket)-6]]) #Edit query info
rows = cursor.fetchall()
#print(rows)
if rows: return rows[0][0]
return ''
#Delete row from table where 'id' == key
def deleteRowWithPacket(key):
deletedCount = cursor.execute("delete from [Item] where id='" + key + "'").rowcount #Edit delete info
conn.commit()
print('Deleted: ' + str(deletedCount))
#Handling function for each ble packet foud by parse_events
def respondToFoundPacket(blePacket):
blePacket = sanitizeBLEPacket(blePacket)
key = queryAzureDB(blePacket)
if key:
print('Azure query returned True for: ' + blePacket)
print('With this key: ' + key)
if useBlink1: os.system('blink1-tool --green')
deleteRowWithPacket(key)
else:
print('Packet not found: ' + blePacket)
if useBlink1: os.system('blink1-tool --red')
sleep(10)
if useBlink1: os.system('blink1-tool --off')
return None
def main():
#Open and configure ble scanning
devId = 0
try:
sock = blescan.getBLESocket(devId)
print("Now looking for iBeacon packets")
except:
print("Error accessing bluetooth device")
sys.exit(1)
blescan.hci_le_set_scan_parameters(sock)
#Begin Scanning
blescan.hci_enable_le_scan(sock)
#Main Loop
while True:
returnedList = blescan.parse_events(sock, 10) #This line will only return when at least one packet is found
print("----------")
for beacon in returnedList:
#print(beacon)
respondToFoundPacket(beacon)
if __name__ == '__main__':
main()