2012-04-27 7 views
1

私は現在、マイクロハード・セルラー・モデムIPn3Gと通信する必要があるプロジェクトに取り組んでいます。私はTCPを介してコンピュータにメッセージを送信するようにモデムを設定しており、ソケットでメッセージを受け取ることができます。Pythonでソケットからバイナリデータを解析するには?

メッセージは、このかかわらず、次のようになります。

���������DKReadyCANRogersWirelessInc. Home354626030393530302720391029547 

を今、私は最終的にステータスやCarrierinfoだけでなく、IMEIとIMSIのようなこれらのフィールドのいくつかを認識することができます。

私の問題は、どのように私は面白い見た目を解析するのですか?私は構造体を試しましたが、それは非常に私を助けるように見えませんでした。

Modem_eventメッセージ構造:

  • 固定ヘッダ(固定サイズ20バイト)
  • モデムID(uint64_tを(8バイト))
  • 私はこれを発見したモデムのドキュメントで

  • メッセージタイプマスク(uint8_t(1バイト))
  • 予約
  • パケット長(uint16_t(2バイト)) 注:パケット長=固定ヘッダーの長さ+メッセージペイロードの長さ。

キャリア情報:

  • コンテンツの長さ2バイト(UINT16_T)
  • RSSI 1 BYTE(UINT8_T)
  • RFバンド2バイト(UINT16_T)
  • サービスタイプSTRING、(1- 30バイト)
  • チャネル番号STRING(1-30バイト)
  • SIMカード番号STRING(1-30バイト)
  • 電話番号STRING(1-30バイト)

私にもそれをすることになっているものと整列しないメッセージのように思えます。誰かがこの問題に取り組む方法について助言を得たなら、私は非常にうれしいでしょう。

+1

「どのようなメッセージが表示されますか」あなたのコンソールに印刷されたときはあまり役に立ちません。特にNUL( ''\ x00''')バイトは表示されません。'print message'の代わりに' print repr(message) 'を実行してください。 –

+0

" reserved "の長さを示す文書がありますか? 「ステータスまたはCarrierinfoのようないくつかのフィールドを認識できます」で「または」とはどういう意味ですか? "ステータス"とは何ですか? 「固定ヘッダー」には何が必要ですか? –

+0

@JohnMachin:repr(メッセージ)を含む新しい出力は、 "\ xb7 \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ x04 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00Z \ x00D \ x00 \ xf3 \ x00 \ x00Ready \ x00CANRogersWirelessInc。\ x00Home \ x00354626030393530 \ x00302720391029547 \ x00 "と表示されます。 – masterlampe

答えて

0

のPythonありがとう、あなたがバイナリデータをパックして解凍することができます偉大なstructモジュールを、持っています。

私はあなたがすでにそれを使用しようとしていることを知っています。私はあなたのデバイスのためのドキュメントを持っていない(行くとそれをチェック!)、私は仮定することができます、その文字列はヌル終端されています(彼らは前に与えられたサイズを持っていない)。

(他のフィールドのサイズとパケット長から)メッセージの文字列部分のサイズを取得し、<number>sを使用してすべての文字列を1つのPython文字列に読み込み、それらを分割してヌル文字を見つけます。

関連する問題