Bluetooth Low Energyハンドシェイクのサンプルコード
このトピックでは、EchoデバイスとガジェットがBluetooth Low Energy(BLE)経由のハンドシェイクで交換するパケットのエンコードとデコードを行うサンプルコードについて詳しく説明します。ここではC言語の実装を取り上げていますが、PythonやJavaなどのほかの言語にも、この概念を応用できます。
- ステップ1: リソースの取得
- ステップ2: ユーティリティファイルのコピー
- ステップ3: .protoファイルのコンパイル
- ステップ4: サンプルのコンパイル
- ステップ5: サンプルの実行
- (オプション)ステップ6: サンプルコードパラメーターの設定
ステップ1: リソースの取得
最初の手順は、以下のリソースを取得することです。
- nanopb .protoコンパイラをダウンロードする – C言語でプロトコルバッファーを使用するには、nanopbの使用をお勧めします。nanopbは、ANSI C準拠で実装された小規模コードのプロトコルバッファーです。特にマイクロコントローラーでの使用に適していますが、あらゆるメモリが制限されたシステムに対応します。nanopbをインストールするには、以下の手順を実行します。
- Nanopb Downloadsで、最新バージョンのnanopbをダウンロードします。
- nanopbダウンロードのコンテンツを展開します。展開されたnanopbディレクトリには、.protoファイルをコンパイルする実行可能ファイルが含まれます(つまり、*.cファイルおよび*.hファイルを取得します)。また、protobufエンコードされたデータをエンコードおよびデコードする関数とデータ構造を含むヘルパーファイルも含まれます。
- Alexa Gadgetsサンプルコードをダウンロードする – GitHubのAlexa Gadgetsサンプルコードリポジトリを取得します。このリポジトリには、Alexa Gadget .protoファイルとサンプルコードが含まれます。
ステップ2: ユーティリティファイルのコピー
前の手順でダウンロードしたAlexa Gadgetsリポジトリの/ConnectionHelpers/BLE/Handshakeディレクトリに、nanopbディレクトリから以下のファイルをコピーします。これらのファイルは、protobufエンコードされたメッセージのエンコードとデコードに必要な手法とデータ構造を定義するユーティリティファイルです。
- pb.h
- pb_common.c
- pb_common.h
- pb_decode.c
- pb_decode.h
- pb_encode.c
- pb_encode.h
ステップ3: .protoファイルのコンパイル
以下のように、Alexa Gadgets .protoファイルを、ガジェットコードから参照できるクラスにコンパイルする必要があります。
- ダウンロードしたAlexa Gadgetsサンプルコードリポジトリの/ConnectionHelpers/BLE/Handshakeディレクトリに移動します。
- compile_nanos.sh(MacまたはLinuxの場合)またはcompile_nanos.bat(Windowsの場合)を開き、指定した
PROTO_COMPILE_PATH
にnanopb .protoコンパイラがあることを確認します。 - /ConnectionHelpers/BLE/Handshakeディレクトリから、compile_nanos.sh(MacまたはLinuxの場合)またはcompile_nanos.bat(Windowsの場合)を実行します。この操作で、Alexa Gadgetsサンプルコードリポジトリの.protoファイルがすべてコンパイルされ、生成されたCファイルとヘッダーソースファイルが/ConnectionHelpers/BLE/Handshakeディレクトリに入ります。
ステップ4: サンプルのコンパイル
/ConnectionHelpers/BLE/Handshakeディレクトリから、以下のコマンドを使用してコードをコンパイルします。
gcc -I. -DPB_FIELD_16BIT *.c -o sample
ステップ5: サンプルの実行
./sample
(MacまたはLinuxの場合)、sample.exe
(Windowsの場合)と入力して、サンプルを実行します。これにより、BLEハンドシェイクコマンドと応答のバイナリー形式へのエンコードとバイナリー形式からのデコード、結果の出力が行われます。以下の表に、サンプルコードに含まれる関数をまとめます。
関数 | 説明 |
---|---|
runSampleCreateAdvertisingPacket() |
アドバタイズパケットのサンプルを作成します。 |
runSampleProtocolVersionPacket() |
プロトコルバージョンパケットのサンプルを作成します。 |
runSample(createCommandGetDeviceInformation()) |
DeviceInformationコマンドを作成します。コマンドを受信するガジェットをエミュレートし、応答を生成し、応答を処理するEchoデバイスをエミュレートします。 |
runSample(createCommandGetDeviceFeatures()) |
DeviceFeaturesコマンドを作成します。コマンドを受信するガジェットをエミュレートし、応答を生成し、応答を処理するEchoデバイスをエミュレートします。 |
runSample(createCommandUpdateComponentSegment()) |
UpdateComponentSegmentコマンドを作成します。コマンドを受信するガジェットをエミュレートし、応答を生成し、応答を処理するEchoデバイスをエミュレートします。 |
runSample(createCommandApplyFirmware()) |
ApplyFirmwareコマンドを作成します。コマンドを受信するガジェットをエミュレートし、応答を生成し、応答を処理するEchoデバイスをエミュレートします。 |
runSample(createAlexaDiscoveryDiscoverDirective()) |
Alexa.Discovery.Discover ディレクティブを作成します。コマンドを受信するガジェットをエミュレートし、応答を生成し、応答を処理するEchoデバイスをエミュレートします。さまざまなAlexa Gadgets Toolkitディレクティブを解析する方法のその他の例については、データのシリアル化と逆シリアル化の例を参照してください。 |
runSample(testMyPacketCapturesFromEchoDevice()) |
ガジェットがEchoデバイスから受け取ったBLEパケットをデコードします。 |
出力
サンプルを実行すると、以下のように出力されます。
(オプション)ステップ6: サンプルコードパラメーターの設定
サンプルコードでは、config.hで宣言したコンフィギュレーションを使用します。このコンフィギュレーションでは、トランザクションの最大サイズと最大転送単位(MTU)を次のように設定しています。
#define SAMPLE_MAX_TRANSACTION_SIZE (5000U)
#define SAMPLE_NEGOTIATED_MTU (128U)
必要に応じてこれらのコンフィギュレーションを変更し、サンプルを再ビルドできます。