简体   繁体   English

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

[英]python send/receive hex data via TCP socket

I have a ethenet access control device that is said to be able to communicate via TCP. 我有一个据说可以通过TCP进行通信的以太网访问控制设备。
How can i send a pachet by entering the HEX data , since this is what i have from their manual (a standard format for the communication packets sent and received after each command) 我如何通过输入十六进制数据来发送补丁 ,因为这是我从其手册中获得的信息(每个命令之后发送和接收的通信数据包的标准格式)
Can you please show some example code or links to get started.... 能否请您显示一些示例代码或链接以开始使用...。

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.

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

'\x34\x82\xf6'

I'd use struct.pack to prepare the string of bytes to send, from the data you want to send. 我将使用struct.pack从要发送的数据中准备要发送的字节字符串。 Be sure to start the packing format with > to mean you want big-endian ordering and standard sizes, since they document that so clearly! 请务必先从封装格式>意味着你要大端排序和标准尺寸,因为他们的文件,如此清晰!

So (I don't know what the "optional" means for the access key, I'll assume it means that the field can be all-zero bytes if you have no access key), if "data" is already a string of bytes and "command" a small unsigned integer for example, something like...: 因此(我不知道“可选”对访问密钥的含义,我假设这意味着如果没有访问密钥,则该字段可以为全零字节),如果“数据”已经是一个字符串字节和“命令”是一个小的无符号整数,例如...:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM