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

1 投票
2 回答
15137 浏览
提问于 2025-04-15 20:25

我有一个以太网门禁控制设备,听说它可以通过TCP进行通信。
我该如何通过输入十六进制数据来发送一个数据包,因为这是我从他们的手册上得到的信息(这是发送和接收每个命令后通信数据包的标准格式)。
能不能给我一些示例代码或者链接,让我可以开始学习……

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 个回答

6

只需要把十六进制的数据放进一个字符串里就可以了:

'\x34\x82\xf6'
4

我会使用 struct.pack 来准备要发送的字节串,这个字节串是从你想发送的数据中生成的。记得在打包格式的开头加上 >,这样表示你想要使用大端字节序和标准大小,因为他们在文档中讲得很清楚!

所以(我不太明白“可选”的意思,假设这意味着如果你没有访问密钥,这个字段可以全是零字节),如果“data”已经是一个字节串,而“command”是一个小的无符号整数,比如说,像这样...:

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)

撰写回答