Bluetooth Low Energyハンドシェイクのサンプルコード



Bluetooth Low Energyハンドシェイクのサンプルコード

このトピックでは、EchoデバイスとガジェットがBluetooth Low Energy(BLE)経由のハンドシェイクで交換するパケットのエンコードとデコードを行うサンプルコードについて詳しく説明します。ここではC言語の実装を取り上げていますが、PythonやJavaなどのほかの言語にも、この概念を応用できます。

ステップ1: リソースの取得

最初の手順は、以下のリソースを取得することです。

  1. nanopb .protoコンパイラをダウンロードする – C言語でプロトコルバッファーを使用するには、nanopbの使用をお勧めします。nanopbは、ANSI C準拠で実装された小規模コードのプロトコルバッファーです。特にマイクロコントローラーでの使用に適していますが、あらゆるメモリが制限されたシステムに対応します。nanopbをインストールするには、以下の手順を実行します。
    1. Nanopb Downloadsで、最新バージョンのnanopbをダウンロードします。
    2. nanopbダウンロードのコンテンツを展開します。展開されたnanopbディレクトリには、.protoファイルをコンパイルする実行可能ファイルが含まれます(つまり、*.cファイルおよび*.hファイルを取得します)。また、protobufエンコードされたデータをエンコードおよびデコードする関数とデータ構造を含むヘルパーファイルも含まれます。
  2. 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ファイルを、ガジェットコードから参照できるクラスにコンパイルする必要があります。

  1. ダウンロードしたAlexa Gadgetsサンプルコードリポジトリの/ConnectionHelpers/BLE/Handshakeディレクトリに移動します。
  2. compile_nanos.sh(MacまたはLinuxの場合)またはcompile_nanos.bat(Windowsの場合)を開き、指定したPROTO_COMPILE_PATHにnanopb .protoコンパイラがあることを確認します。
  3. /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)

必要に応じてこれらのコンフィギュレーションを変更し、サンプルを再ビルドできます。