python通过TCP套接字发送/接收十六进制数据

时间:2010-03-14 15:53:26

标签: python sockets tcp access-control

我有一个ethenet访问控制设备,据说可以通过TCP进行通信。
如何通过输入HEX数据发送小袋,因为这是我手册中的内容(每个命令后发送和接收的通信包的标准格式)
你能否请一些示例代码或链接开始....

standard return packet from the terminal
                               Size (bytes) 
BS (0x08) : ASCII Character         1
STX (0x02) : ASCII Character        1 
LENGTH : length from BS to ETX      4 
TID : system unique I.D.            1 
RESULT                              1 
DATA : returned parameter           N 
CHECKSUM : byte sum from BS to DATA 1 
ETX (0x03) : ASCII Character        1 
Standard command packet to the terminal  
                               Size (bytes) 
ACK (0x06) : ASCII Character         1 
STX (0x02) : ASCII Character         1 
LENGTH : length from ACK to ETX      4 
TID : system unique I.D. (ex: 1)     1 
COMMAND                              1 
Access Key(Optional)                 6 
DATA : command parameter             N 
CHECKSUM : byte sum from ACK to DATA 1 
ETX (0x03) : ASCII Character         1 

This packet starts from ACK. 
In this packet, multiple byte value must be started from MSB. 
For example, if length was 10, LENGTH is 0x00 0x00 0x00 0x0a. 

2 个答案:

答案 0 :(得分:6)

只需将十六进制数据编码为字符串:

'\x34\x82\xf6'

答案 1 :(得分:4)

我将使用struct.pack从您要发送的数据中准备要发送的字节字符串。请务必使用>启动打包格式,以表示您需要大端排序和标准尺寸,因为它们可以清楚地记录下来!

所以(我不知道“可选”对于访问密钥意味着什么,我认为这意味着如果你没有访问密钥,那么字段可以是全零字节),如果“数据”已经是一串字节和“命令”一个小的无符号整数,例如......:

def stringfor(command, data, accesskey='\0'*6, tid=1):
  length = 16 + len(data)
  prefix = struct.pack('>BBIBB6s', 6, 2, length, tid, command, accesskey)
  checksum = sum(ord(c) for c in prefix) &0xFF
  return prefix + chr(checksum) + chr(3)