📄 tos.py
字号:
r.append(b) return r def _escape(self, packet): r = [] for b in packet: if b == self.HDLC_FLAG_BYTE or b == self.HDLC_CTLESC_BYTE: r.append(self.HDLC_CTLESC_BYTE) r.append(b ^ 0x20) else: r.append(b) return r def debug(self, debug): self._debug = debugclass SFClient: def __init__(self, host, port, qsize=10): self._in_queue = Queue(qsize) self._s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._s.connect((host, port)) data = self._s.recv(2) if data != 'U ': print "Wrong handshake" self._s.send("U ") print "Connected" thread.start_new_thread(self.run, ()) def run(self): while True: length = ord(self._s.recv(1)) data = self._s.recv(length) data = [ord(c) for c in data][1:] #print "Recv %d bytes" % (length), ActiveMessage(data) if self._in_queue.full(): print "Warning: Buffer overflow" self._in_queue.get() p = RawPacket() p.crc = 1 p.data = data self._in_queue.put(p, block=False) def read(self, timeout=0): return self._in_queue.get() def write(self, payload): print "SFClient: write:", payload if type(payload) != type([]): # Assume this will be derived from Packet payload = payload.payload() payload = [0] + payload self._s.send(chr(len(payload))) self._s.send(''.join([chr(c) for c in payload])) return Trueclass AM: def __init__(self, s): self._s = s def read(self, timeout=0): return ActiveMessage(self._s.read().data) def write(self, packet, amid): return self._s.write(ActiveMessage(packet, amid=amid))class Packet: """ The Packet class offers a handy way to build pack and unpack binary data based on a given pattern. """ def _decode(self, v): r = long(0) for i in v: r = (r << 8) + i return r def _encode(self, val, dim): output = [] for i in range(dim): output.append(int(val & 0xFF)) val = val >> 8 output.reverse() return output def __init__(self, desc, packet = None): offset = 0 boffset = 0 sum = 0 for i in range(len(desc)-1, -1, -1): (n, t, s) = desc[i] if s == None: if sum > 0: desc[i] = (n, t, -sum) break sum += s self.__dict__['_schema'] = [(t, s) for (n, t, s) in desc] self.__dict__['_names'] = [n for (n, t, s) in desc] self.__dict__['_values'] = [] if type(packet) == type([]): for (t, s) in self._schema: if t == 'int': self._values.append(self._decode(packet[offset:offset + s])) offset += s elif t == 'bint': doffset = 8 - (boffset + s) self._values.append((packet[offset] >> doffset) & ((1<<s) - 1)) boffset += s if boffset == 8: offset += 1 boffset = 0 elif t == 'string': self._values.append(''.join([chr(i) for i in packet[offset:offset + s]])) offset += s elif t == 'blob': if s: if s > 0: self._values.append(packet[offset:offset + s]) offset += s else: self._values.append(packet[offset:s]) offset = len(packet) + s else: self._values.append(packet[offset:]) elif type(packet) == type(()): for i in packet: self._values.append(i) else: for v in self._schema: self._values.append(None) def __repr__(self): return self._values.__repr__() def __str__(self): r = "" for i in range(len(self._names)): r += "%s: %s " % (self._names[i], self._values[i]) for i in range(len(self._names), len(self._values)): r += "%s" % self._values[i] return r# return self._values.__str__() # Implement the map behavior def __getitem__(self, key): return self.__getattr__(key) def __setitem__(self, key, value): self.__setattr__(key, value) def __len__(self): return len(self._values) def keys(self): return self._names def values(self): return self._names # Implement the struct behavior def __getattr__(self, name): #print "DEBUG: __getattr__", name if type(name) == type(0): return self._names[name] else: return self._values[self._names.index(name)] def __setattr__(self, name, value): if type(name) == type(0): self._values[name] = value else: self._values[self._names.index(name)] = value def __ne__(self, other): if other.__class__ == self.__class__: return self._values != other._values else: return True def __eq__(self, other): if other.__class__ == self.__class__: return self._values == other._values else: return False def __nonzero__(self): return True; # Custom def names(self): return self._names def sizes(self): return self._schema def payload(self): r = [] boffset = 0 for i in range(len(self._schema)): (t, s) = self._schema[i] if t == 'int': r += self._encode(self._values[i], s) boffset = 0 elif t == 'bint': doffset = 8 - (boffset + s) if boffset == 0: r += [self._values[i] << doffset] else: r[-1] |= self._values[i] << doffset boffset += s if boffset == 8: boffset = 0 elif self._values[i] != []: r += self._values[i] for i in self._values[len(self._schema):]: r += i return rclass RawPacket(Packet): def __init__(self, ts = None, data = None, crc = None): Packet.__init__(self, [('ts' , 'int', 4), ('crc', 'int', 1), ('data', 'blob', None)], None) self.ts = ts; self.data = data self.crc = crc class AckFrame(Packet): def __init__(self, payload = None): Packet.__init__(self, [('protocol', 'int', 1), ('seqno', 'int', 1)], payload)class DataFrame(Packet): def __init__(self, payload = None): if payload != None and type(payload) != type([]): # Assume is a Packet payload = payload.payload() Packet.__init__(self, [('protocol', 'int', 1), ('seqno', 'int', 1), ('dispatch', 'int', 1), ('data', 'blob', None)], payload)class NoAckDataFrame(Packet): def __init__(self, payload = None): if payload != None and type(payload) != type([]): # Assume is a Packet payload = payload.payload() Packet.__init__(self, [('protocol', 'int', 1), ('dispatch', 'int', 1), ('data', 'blob', None)], payload)class ActiveMessage(Packet): def __init__(self, gpacket = None, amid = 0x00, dest = 0xFFFF): if type(gpacket) == type([]): payload = gpacket else: # Assume this will be derived from Packet payload = None Packet.__init__(self, [('destination', 'int', 2), ('source', 'int', 2), ('length', 'int', 1), ('group', 'int', 1), ('type', 'int', 1), ('data', 'blob', None)], payload) if payload == None: self.destination = dest self.source = 0x0000 self.group = 0x00 self.type = amid self.data = [] if gpacket: self.data = gpacket.payload() self.length = len(self.data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -