簡體   English   中英

python通過TCP套接字發送/接收十六進制數據

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

我有一個據說可以通過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.

只需將十六進制數據編碼為字符串即可:

'\x34\x82\xf6'

我將使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM