Classic Bluetoothのデータパケット



Classic Bluetoothのデータパケット

ガジェットとEchoデバイスがClassic Bluetooth接続を介して情報を交換する際は、Serial Port Profile(SPP)が使用されます。このトピックでは、このケースに適したパケットの形式について説明します。

パケットの形式

パケットは転送中に複数のパーツに分割されるため、Alexa Gadgetsインターフェースは以下のルールを使ってパケットの境界を示します。

  • 各パケットは、Start of frame(SOF)= 0xF0で始まること。
  • 各パケットは、End of frame(EOF)= 0xF1で終了すること。
  • ペイロードの文字をエスケープするには、ESC = 0xF2を使用すること。

パケットは次のとおりです。

Alexa Gadgetパケット

パケットのコンポーネントは次のとおりです。

説明 バイト数

Start of frame(SOF)

1

常に0xF0

パケットID

1

常に0x02

エラーID

1

常に0x00

シーケンスID

1

パケットを送信するたびに増分するローテーションシーケンス。特殊文字(SOF、EOF、ESC)は無視されます。

ペイロード

不定

プロトコルバッファー形式の完全なディレクティブまたはイベント(Alexa Gadgetsのプロトコルバッファー形式を参照)

以下の公式を使用してペイロードを再フォーマットし、特殊文字(SOF、EOF、ESC)をエスケープする必要があります。
Result = (ESC<<8 | ESC^Byte)
つまり、1バイトは2バイトに置き換えられます。

チェックサム

2

以下の公式を使用して計算されたビッグエンディアンのチェックサム
Packet ID + Error ID + Payload (without escape)

End of frame(EOF)

1

常に0xF1

ガジェットが処理しなければならないケース

Classic BluetoothのRFCOMM接続では、ガジェットはストリームバッファーでEchoデバイスからデータを受信します(必ずしもパケット単位ではありません)。ガジェットのRFCOMMサーバーは、受信したすべてのバイトをストリームバッファーに格納しようとします。また、定期的にバッファーをフラッシュし、コールバックを使ってデータをアプリケーションレイヤー(パケット処理コード)に返します。

そのため、ガジェットのパケット処理コードはストリームバッファーそのものではなく、ストリームバッファーから抽出されたパケットで動作することを確認する必要があります。ガジェットは次のようなケースを処理できる必要があります。

  • 1つのパケット
  • 複数のパケット
  • パケットの一部

たとえば、ストリームバッファーからパケットを抽出する方法については、Alexa GadgetsサンプルコードGitHubリポジトリを参照してください。