2010-03-14 3 views
0

У меня есть устройство контроля доступа ethenet, которое, как говорят, может связываться через TCP.
Как я могу отправить pachet, введя данные HEX, так это то, что я есть от их руководства (стандартный формат для пакетов связи отправленных и полученных после каждой команды)
Можете ли вы показать некоторые примеры кода или ссылки, чтобы начать ....

python отправлять/получать шестнадцатеричные данные через 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. 
+0

и когда я получить данные, отправленные с s.send, я получаю ответ от s.recv, как могу ли я отобразить то, что возвращается на HEX с «печатью»? – Mike

+0

вы используете 'struct.unpack' (для 8-байтового начала пакета ответа) - опять же, гарантируя, что вы получаете весь ответ, является ключевым, поскольку TCP является потоковым протоколом, а не протоколом дейтаграммы, поэтому может быть произвольным урезать вещи - маловероятно, но зачем рисковать? Так же, как вы должны использовать 'sendall' вместо' send', чтобы убедиться, что весь упакованный передан, как я упоминал в ответ на ваш комментарий к моему ответу. –

ответ

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) 
+0

очень приятно :) спасибо. , а затем отправить это с помощью s.send? – Mike

+0

@Mike, конечно, или 's.sendall' (вероятно, лучше, если вы хотите быть на 100% уверенным, что весь пакет отправлен - но тогда MTU вашего соединения, вероятно, достаточно большой, чтобы это не имело значения), см. Http : //docs.python.org/library/socket.html? highlight = socket.send # socket.socket.sendall. –

6

Просто кодировать данные шестигранные в строке:

'\x34\x82\xf6' 
+0

, и если у шестнадцатеричных данных нет эквивалента ASCII, это проблема? – Mike

+1

Вы представляете необработанные байты. 'str' не волнует, является ли это ASCII; только такие вещи, как 'print'. –

Смежные вопросы