comparison server/dump.py @ 359:53b24a353e13

add dump program
author Matt Johnston <matt@ucc.asn.au>
date Sun, 24 Jun 2012 17:22:26 +0800
parents
children 6c18e0d12276
comparison
equal deleted inserted replaced
358:71d2cc90354a 359:53b24a353e13
1 #!/usr/bin/env python2.7
2
3 BTADDR = "00:12:03:27:70:88"
4 SLEEP_TIME = 5
5 # time that the bluetooth takes to get going?
6 EXTRA_WAKEUP = 0
7
8 FETCH_TRIES = 3
9
10 # avoid turning off the bluetooth etc.
11 TESTING = False
12
13 import sys
14 # for wrt
15 sys.path.append('/root/python')
16 import httplib
17 import time
18 import traceback
19 import binascii
20 import hmac
21 import zlib
22 import urllib
23 import urllib2
24
25 import config
26
27 from utils import monotonic_time, retry, readline, crc16
28
29 lightblue = None
30 try:
31 import lightblue
32 except ImportError:
33 import bluetooth
34
35 def get_socket(addr):
36 if lightblue:
37 s = lightblue.socket()
38 s.connect((addr, 1))
39 s.settimeout(3)
40 else:
41 s = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
42 s.connect((addr, 1))
43
44 s.setblocking(False)
45
46 return s
47
48
49 @retry()
50 def fetch(sock):
51 print "fetch"
52 sock.send("fetch\n")
53
54 crc = 0
55
56 lines = []
57 l = readline(sock)
58 if l != 'START\n':
59 print>>sys.stderr, "Bad expected START line '%s'\n" % l.rstrip('\n')
60 return None
61 crc = crc16(l, crc)
62
63 while True:
64 l = readline(sock)
65
66 crc = crc16(l, crc)
67
68 if l == 'END\n':
69 break
70
71 lines.append(l.rstrip('\n'))
72
73 print lines
74
75 l = readline(sock)
76 recv_crc = None
77 try:
78 k, v = l.rstrip('\n').split('=')
79 print k,v
80 if k == 'CRC':
81 recv_crc = int(v)
82 if recv_crc < 0 or recv_crc > 0xffff:
83 recv_crc = None
84 except ValueError:
85 pass
86
87 if recv_crc is None:
88 print>>sys.stderr, "Bad expected CRC line '%s'\n" % l.rstrip('\n')
89 return None
90
91 if recv_crc != crc:
92 print>>sys.stderr, "Bad CRC: calculated 0x%x vs received 0x%x\n" % (crc, recv_crc)
93 return None
94
95 return lines
96
97 @retry()
98 def turn_off(sock):
99 if TESTING:
100 return 99
101 print>>sys.stderr, "sending btoff"
102 sock.send("btoff\n");
103 # read newline
104 l = readline(sock)
105 if not l:
106 print>>sys.stderr, "Bad response to btoff\n"
107 return None
108
109 if not l.startswith('off:'):
110 print>>sys.stderr, "Bad response to btoff '%s'\n" % l
111 return None
112 off, next_wake = l.rstrip().split(':')
113 print>>sys.stderr, "Next wake %s" % next_wake
114
115 return int(next_wake)
116
117 @retry()
118 def clear_meas(sock):
119 sock.send("clear\n");
120 l = readline(sock)
121 if l and l.rstrip() == 'cleared':
122 return True
123
124 print>>sys.stderr, "Bad response to clear %s\n" % str(l)
125 return False
126
127 def send_results(lines):
128 enc_lines = binascii.b2a_base64(zlib.compress('\n'.join(lines)))
129 mac = hmac.new(config.HMAC_KEY, enc_lines).hexdigest()
130
131 url_data = urllib.urlencode( {'lines': enc_lines, 'hmac': mac} )
132 con = urllib2.urlopen(config.UPDATE_URL, url_data)
133 result = con.read(100)
134 if result == 'OK':
135 return True
136 else:
137 print>>sys.stderr, "Bad result '%s'" % result
138 return False
139
140 def do_comms(sock):
141 args = sys.argv[1:]
142 print "do_comms"
143 for a in args:
144 sock.send('%s\n', a)
145
146 while True:
147 l = readline(sock)
148 print l
149
150 testcount = 0
151
152 def sleep_for(secs):
153 until = monotonic_time() + secs
154 while True:
155 length = until - monotonic_time()
156 if length <= 0:
157 return
158 time.sleep(length)
159
160 def main():
161 next_wake_time = 0
162
163 while True:
164 sock = None
165 try:
166 sock = get_socket(BTADDR)
167 except Exception, e:
168 print>>sys.stderr, "Error connecting:"
169 traceback.print_exc(file=sys.stderr)
170 sleep_time = SLEEP_TIME
171 if sock:
172 next_wake = None
173 try:
174 next_wake_interval = do_comms(sock)
175 next_wake_time = time.time() + next_wake_interval
176 except Exception, e:
177 print>>sys.stderr, "Error in do_comms:"
178 traceback.print_exc(file=sys.stderr)
179 if next_wake_time > time.time():
180 sleep_time = min(next_wake_time - time.time() - EXTRA_WAKEUP, sleep_time)
181
182 print "Sleeping for %d" % sleep_time
183 sleep_for(sleep_time)
184
185 if __name__ == '__main__':
186 main()