0

TCP経由で通信できると言われているイーサネットアクセス制御デバイスがあります。
HEXデータを入力してパチェットを送信するにはどうすればよいですか.これは私が彼らのマニュアルから持っているものです(各コマンドの後に送受信される通信パケットの標準フォーマット)
. ..

端末からの標準返信パケット
                               サイズ (バイト)
BS (0x08) : アスキー文字 1
STX (0x02) : アスキー文字 1
LENGTH : BS から ETX までの長さ 4
TID : システム固有 ID 1
結果1
DATA : 返されたパラメータ N
CHECKSUM : BS から DATA 1 までのバイト合計
ETX (0x03) : ASCII 文字 1
端末への標準コマンド パケット  
                               サイズ (バイト)
ACK (0x06) : ASCII 文字 1
STX (0x02) : アスキー文字 1
LENGTH : ACK から ETX までの長さ 4
TID : システム固有の ID (例: 1) 1
コマンド 1
アクセスキー(オプション) 6
DATA : コマンドパラメータ N
CHECKSUM : ACK から DATA 1 までのバイト合計
ETX (0x03) : ASCII 文字 1

このパケットは ACK から始まります。
このパケットでは、MSB から複数のバイト値を開始する必要があります。
たとえば、長さが 10 の場合、LENGTH は 0x00 0x00 0x00 0x0a です。
4

2 に答える 2

6

16 進データを文字列にエンコードするだけです。

'\x34\x82\xf6'
于 2010-03-14T15:55:11.527 に答える
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)
于 2010-03-14T16:06:29.477 に答える