Mercurial > templog
annotate server/ts.py @ 22:885532437100
A bit of work on the server python
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 26 May 2012 10:17:27 +0800 |
parents | 2029633912c2 |
children | b5925cb4f264 |
rev | line source |
---|---|
21
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
1 #!/usr/bin/env python2.7 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
2 |
22
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
3 BTADDR = "00:12:03:27:70:88" |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
4 SLEEP_TIME = 180 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
5 |
21
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
6 import sys |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
7 import httplib |
22
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
8 import time |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
9 import traceback |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
10 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
11 from utils import monotonic_time, retry |
21
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
12 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
13 lightblue = None |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
14 try: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
15 import lightblue |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
16 except ImportError: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
17 import bluetooth |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
18 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
19 def get_socket(addr): |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
20 if lightblue: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
21 s = lightblue.socket() |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
22 s.connect(addr, 1) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
23 else: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
24 s = bluetooth.BluetoothSocket( bluetooth.RFCOMM ) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
25 s.connect((addr, 1)) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
26 |
22
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
27 s.setnonblocking(True) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
28 |
21
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
29 return s |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
30 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
31 # from http://blog.stalkr.net/2011/04/pctf-2011-32-thats-no-bluetooth.html |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
32 def crc16(buff, crc = 0, poly = 0x8408): |
22
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
33 l = len(buff) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
34 i = 0 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
35 while i < l: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
36 ch = ord(buff[i]) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
37 uc = 0 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
38 while uc < 8: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
39 if (crc & 1) ^ (ch & 1): |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
40 crc = (crc >> 1) ^ poly |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
41 else: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
42 crc >>= 1 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
43 ch >>= 1 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
44 uc += 1 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
45 i += 1 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
46 return crc |
21
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
47 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
48 |
22
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
49 @retry() |
21
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
50 def fetch(sock): |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
51 sock.send("fetch\n") |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
52 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
53 crc = 0 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
54 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
55 lines = [] |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
56 l = readline(sock) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
57 if l != 'START\n': |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
58 print>>sys.stderr, "Bad expected START line '%s'\n" % l.rstrip('\n') |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
59 return None |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
60 crc = crc16(l, crc) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
61 lines.append(l) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
62 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
63 while true: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
64 l = readline(sock) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
65 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
66 crc = crc16(l, crc) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
67 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
68 if l == 'END\n': |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
69 break |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
70 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
71 lines.append(l) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
72 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
73 l = readline(sock) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
74 recv_crc = None |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
75 try: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
76 k, v = l.rstrip('\n').split('=') |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
77 if k == 'CRC': |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
78 recv_crc = int(v) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
79 if recv_crc < 0 or recv_crc > 0xffff: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
80 recv_crc = None |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
81 except ValueError: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
82 pass |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
83 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
84 if recv_crc is None: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
85 print>>sys.stderr, "Bad expected CRC line '%s'\n" % l.rstrip('\n') |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
86 return None |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
87 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
88 if recv_crc != crc: |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
89 print>>sys.stderr, "Bad CRC: calculated 0x%x vs received 0x%x\n" % (crc, recv_crc) |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
90 return None |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
91 |
2029633912c2
untested simple server proxy code
Matt Johnston <matt@ucc.asn.au>
parents:
diff
changeset
|
92 return ''.join(lines) |
22
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
93 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
94 @retry() |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
95 def turn_off(sock): |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
96 sock.send("btoff\n"); |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
97 # read newline |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
98 l = readline(sock) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
99 if not l: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
100 print>>sys.stderr, "Bad response to btoff\n" |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
101 return None |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
102 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
103 off, next_wake = l.rstrip().split(':') |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
104 if off != 'Off': |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
105 print>>sys.stderr, "Bad response to btoff '%s'\n" % l |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
106 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
107 return int(next_wake) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
108 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
109 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
110 def do_comms(sock): |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
111 d = None |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
112 # serial could be unreliable, try a few times |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
113 for i in range(FETCH_TRIES): |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
114 d = fetch(sock) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
115 if d: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
116 break |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
117 time.sleep(1) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
118 if not d: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
119 return |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
120 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
121 res = send_results() |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
122 if not res: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
123 return |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
124 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
125 clear_meas(sock) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
126 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
127 next_wake = turn_off(sock) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
128 sock.close() |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
129 return next_wake |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
130 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
131 testcount = 0 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
132 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
133 def sleep_for(secs): |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
134 until = monotonic_time + secs |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
135 while True: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
136 length = until < monotonic_time() |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
137 if length <= 0: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
138 return |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
139 time.sleep(length) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
140 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
141 def main(): |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
142 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
143 while True: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
144 sock = get_socket() |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
145 sleep_time = SLEEP_TIME |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
146 if sock: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
147 next_wake = None |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
148 try: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
149 next_wake = do_comms(sock) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
150 except Exception, e: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
151 print>>sys.stderr, "Error in do_comms:" |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
152 traceback.print_last(file=sys.stderr) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
153 if next_wake: |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
154 sleep_time = min(next_wake, sleep_time) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
155 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
156 sleep_for(sleep_time) |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
157 |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
158 if __name__ == '__main__': |
885532437100
A bit of work on the server python
Matt Johnston <matt@ucc.asn.au>
parents:
21
diff
changeset
|
159 main() |