2010-03-14 216 views
0

我有一個ethenet訪問控制設備,據說可以通過TCP進行通信。
我怎樣才能通過輸入十六進制數據發送pachet,因爲這是我從他們的手工有(標準格式發送,每個命令後收到的通信數據包)
能否請你展示一些示例代碼或鏈接上手....

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,如何應對我可以使用「打印」顯示以十六進制顯示的內容嗎? – Mike 2010-03-14 16:22:29

+0

您使用'struct.unpack'(用於響應數據包的8字節開始) - 再次確保您獲得整個響應是關鍵,因爲TCP是流協議,而不是數據報協議,因此可能會任意截斷東西 - 不太可能,但爲什麼冒險呢?就像你應該使用'sendall'而不是'send'來確保整個包裝被傳輸一樣,正如我在回覆你對我的答案的評論中所提到的那樣。 – 2010-03-14 17:23:01

回答

4

我想用struct.pack來準備要發送的數據字節串。請務必使用>開始打包格式,這意味着您需要big-endian訂購和標準尺寸,因爲它們記錄得非常清楚!所以(我不知道訪問密鑰的「可選」意味着什麼,我假設它意味着如果你沒有訪問密鑰,該字段可以是全零字節),如果「數據」是已經是一個字節的字符串,並「命令」,例如一個小的無符號整數,像...:

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 2010-03-14 16:18:10

+0

@Mike,當然還是's.sendall'(可能會更好,因爲你希望100%確定所有的數據包都被髮送 - 但是,然後你的連接的MTU可能足夠大,這沒有什麼區別),請參閱http ://docs.python.org/library/socket.html?highlight = socket.send#socket.socket.sendall。 – 2010-03-14 17:20:01

6

只是編碼字符串中的十六進制數據:

'\x34\x82\xf6' 
+0

,如果十六進制數據沒有ASCII等價物,這是一個問題嗎? – Mike 2010-03-14 16:05:08

+1

您代表的是原始字節。 'str'不關心它是否是ASCII;只有像'print'這樣的東西可以。 – 2010-03-14 16:13:56

相關問題