-
Notifications
You must be signed in to change notification settings - Fork 4
/
scanBluetooth.py
141 lines (112 loc) · 5.12 KB
/
scanBluetooth.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# test for Weather Sensors
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------------------------
import sys
from subprocess import PIPE, Popen, STDOUT, run
from threading import Thread
#import json
import datetime
import config
import traceback
import MySQLdb as mdb
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------
# reset bluetooth
print("Starting Bluetooth Reset")
cmd = [ "/bin/hciconfig", "hci0", "reset"]
run(cmd)
print("---------------------------------------")
print("Starting Scan for new Bluetooth Sensors")
print("---------------------------------------")
cmd = [ '/usr/bin/hcitool', 'lescan']
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------
# database update functions
def addBluetooth(sLine):
splitline = sLine.split(" ")
pickaddresslist = splitline[0].split(":")
pickaddress = pickaddresslist[4] + ":" + pickaddresslist[5]
# find out if address exists in data base
try:
#print("trying database")
con = mdb.connect('localhost', 'root', config.MySQL_Password, 'SmartGarden3');
cur = con.cursor()
query = "SELECT * FROM BluetoothSensors WHERE fulladdress = '%s'" % (splitline[0])
#print("query=", query)
cur.execute(query)
myRecords = cur.fetchall()
except mdb.Error as e:
traceback.print_exc()
print("Error %d: %s" % (e.args[0],e.args[1]))
myRecords = [];
finally:
cur.close()
con.close()
del cur
del con
# add it if it doesnt exist
if (len(myRecords) == 0):
print("Adding New Sensor "+pickaddress+" to database")
try:
#print("trying database")
con = mdb.connect('localhost', 'root', config.MySQL_Password, 'SmartGarden3')
cur = con.cursor()
query = "INSERT INTO BluetoothSensors(timeadded, fulladdress, pickaddress ) VALUES(LOCALTIMESTAMP(), '%s', '%s')" % (splitline[0], pickaddress)
#print("query=%s" % query)
cur.execute(query)
con.commit()
except mdb.Error as e:
traceback.print_exc()
print("Error %d: %s" % (e.args[0],e.args[1]))
finally:
cur.close()
con.close()
del cur
del con
print("Restart for Next New Sensor")
exit()
else:
print("Sensor Detected: "+pickaddress+". Already in SmartGarden 3 Database")
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------
# A few helper functions...
def nowStr():
return( datetime.datetime.now().strftime( '%Y-%m-%d %H:%M:%S'))
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------
#stripped = lambda s: "".join(i for i in s if 31 < ord(i) < 127)
# We're using a queue to capture output as it occurs
try:
from Queue import Queue, Empty
except ImportError:
from queue import Queue, Empty # python 3.x
ON_POSIX = 'posix' in sys.builtin_module_names
def enqueue_output(src, out, queue):
for line in iter(out.readline, b''):
queue.put(( src, line))
out.close()
# Create our sub-process...
# Note that we need to either ignore output from STDERR or merge it with STDOUT due to a limitation/bug somewhere under the covers of "subprocess"
# > this took awhile to figure out a reliable approach for handling it...
p = Popen( cmd, stdout=PIPE, stderr=STDOUT, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=('stdout', p.stdout, q))
t.daemon = True # thread dies with the program
t.start()
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------
pulse = 0
while True:
# Other processing can occur here as needed...
#sys.stdout.write('Made it to processing step. \n')
try:
src, line = q.get(timeout = 1)
#print(line.decode())
except Empty:
pulse += 1
else: # got line
pulse -= 1
sLine = line.decode()
#print(sLine)
sys.stdout.write(".")
# See if the data is something we need to act on...
if ( sLine.find('Flower') != -1):
print("\n")
#sys.stdout.write('This is the raw data: ' + sLine + '\n')
action = addBluetooth(sLine)
sys.stdout.flush()