Python отправлять / получать шестнадцатеричные данные через TCP-сокет - PullRequest
0 голосов
/ 14 марта 2010

У меня есть устройство контроля доступа 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 ]

6 голосов
/ 14 марта 2010

Просто закодируйте шестнадцатеричные данные в строку:

'\x34\x82\xf6'
4 голосов
/ 14 марта 2010

Я бы использовал 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...