diff server/ts.py @ 327:5639c74f2cbb

untested simple server proxy code
author Matt Johnston <matt@ucc.asn.au>
date Tue, 22 May 2012 23:45:16 +0800
parents
children 885532437100
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/ts.py	Tue May 22 23:45:16 2012 +0800
@@ -0,0 +1,95 @@
+#!/usr/bin/env python2.7
+
+import sys
+import httplib
+
+lightblue = None
+try:
+    import lightblue
+except ImportError:
+    import bluetooth
+
+BTADDR = "00:12:03:27:70:88"
+
+def get_socket(addr):
+    if lightblue:
+        s = lightblue.socket()
+        s.connect(addr, 1)
+    else:
+        s = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
+        s.connect((addr, 1))
+
+    return s
+
+# from http://blog.stalkr.net/2011/04/pctf-2011-32-thats-no-bluetooth.html
+def crc16(buff, crc = 0, poly = 0x8408):
+    l = len(buff)
+    i = 0
+    while i < l:
+        ch = ord(buff[i])
+        uc = 0
+        while uc < 8:
+            if (crc & 1) ^ (ch & 1):
+                crc = (crc >> 1) ^ poly
+            else:
+                crc >>= 1
+            ch >>= 1
+            uc += 1
+        i += 1
+    return crc
+
+
+def fetch(sock):
+    sock.send("fetch\n")
+
+    def readline(self):
+        buf = ''
+        while true:
+            c = self.recv(1)
+            if c == '\r':
+                continue
+
+            buf.append(c)
+            if c == '\n':
+                return buf
+
+    crc = 0
+
+    lines = []
+    l = readline(sock)
+    if l != 'START\n':
+        print>>sys.stderr, "Bad expected START line '%s'\n" % l.rstrip('\n')
+        return None
+    crc = crc16(l, crc)
+    lines.append(l)
+
+    while true:
+        l = readline(sock)
+
+        crc = crc16(l, crc)
+
+        if l == 'END\n':
+            break
+
+        lines.append(l)
+
+    l = readline(sock)
+    recv_crc = None
+    try:
+        k, v = l.rstrip('\n').split('=')
+        if k == 'CRC':
+            recv_crc = int(v)
+        if recv_crc < 0 or recv_crc > 0xffff:
+            recv_crc = None
+    except ValueError:
+        pass
+
+    if recv_crc is None:
+        print>>sys.stderr, "Bad expected CRC line '%s'\n" % l.rstrip('\n')
+        return None
+
+    if recv_crc != crc:
+        print>>sys.stderr, "Bad CRC: calculated 0x%x vs received 0x%x\n" % (crc, recv_crc)
+        return None
+
+    return ''.join(lines)