0

我有一个以太网访问控制设备,据说可以通过 TCP 进行通信。
我如何通过输入十六进制数据来发送一个小包,因为这是我从他们的手册中得到的(每个命令后发送和接收的通信数据包的标准格式)
你能否显示一些示例代码或链接以开始.. ..

来自终端的标准返回数据包
                               大小(字节)
BS (0x08) : ASCII 字符 1
STX (0x02) : ASCII 字符 1
LENGTH : 从 BS 到 ETX 4 的长度
TID : 系统唯一 ID 1
结果 1
DATA : 返回参数 N
CHECKSUM : 从 BS 到 DATA 1 的字节总和
ETX (0x03) : ASCII 字符 1
到终端的标准命令包  
                               大小(字节)
ACK (0x06) : ASCII 字符 1
STX (0x02) : ASCII 字符 1
LENGTH : 从 ACK 到 ETX 4 的长度
TID : 系统唯一 ID (ex: 1) 1
命令 1
访问密钥(可选) 6
DATA : 命令参数 N
CHECKSUM : 从 ACK 到 DATA 1 的字节总和
ETX (0x03) : ASCII 字符 1

此数据包从 ACK 开始。
在这个数据包中,多字节值必须从 MSB 开始。
例如,如果长度为 10,则长度为 0x00 0x00 0x00 0x0a。
4

2 回答 2

6

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

'\x34\x82\xf6'
于 2010-03-14T15:55:11.527 回答
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)
于 2010-03-14T16:06:29.477 回答