Toolkitインターフェースのディレクティブとイベントをシリアル化(エンコード)および逆シリアル化(デコード)するサンプルコードについて詳しく説明します。ここではC言語の実装を取り上げていますが、PythonやJavaなどのほかの言語にも、この概念を応用できます。最初の手順は、以下のリソースを取得することです。C言語でプロトコルバッファーを使用するには、nanopbの使用をお勧めします。C準拠で実装された小規模コードのプロトコルバッファーです。マイクロコントローラーでの使用に適していますが、あらゆるメモリが制限されたシステムに対応します。nanopbをインストールするには、以下の手順を実行します。Downloadsで、最新バージョンのnanopbをダウンロードします。nanopbダウンロードのコンテンツを抽出します。抽出されたnanopbディレクトリには、.protoファイルをコンパイルする実行可能ファイルが含まれます(つまり、*.cファイルおよび*.hファイルを取得します)。protobufエンコードされたデータをエンコードおよびデコードする関数とデータ構造を含むヘルパーファイルも含まれます。GadgetsサンプルコードGitHubリポジトリを取得します。.protoファイルとサンプルコードが含まれます。Gadgetsリポジトリの/examplesディレクトリに、nanopbディレクトリから以下のファイルをコピーします。これらのファイルは、protobufエンコードされたメッセージのエンコードとデコードに必要な手法とデータ構造を定義するユーティリティファイルです。.protoファイルを、ガジェットコードから参照できるクラスにコンパイルする必要があります。Gadgetsサンプルコードリポジトリの/examplesディレクトリに移動します。.protoコンパイラがあることを確認します。/examplesディレクトリから、compile_nanos.sh(MacまたはLinuxの場合)またはcompile_nanos.bat(Windowsの場合)を実行します。Gadgetsサンプルコードリポジトリの.protoファイルがすべてコンパイルされ、生成されたCファイルとヘッダーソースファイルが/examplesディレクトリに入ります。サンプルのコンパイル/examplesディレクトリから、以下のコマンドを使用してproto_sample.cをコンパイルします。コードをコピークリップボードにコピーされました。Gadgetsディレクティブとイベントをバイナリーからエンコードおよびデコードし、結果を印刷する./proto_sampleを実行します。ディレクティブをエンコードし、イベントをデコードする関数は、例を示すためだけに表示しています。現実のアプリケーションでは、ガジェットはディレクティブをデコードし、イベントをエンコードします(その逆ではありません)。以下の表に、サンプルコードに含まれる関数をまとめます。Gadgetsディレクティブをすべてデコードします。関数がインターフェースの名前空間とディレクティブ名を認識できない場合、エラーがプリントされます。この関数には自作のディレクティブの解析コードを追加できます。Gadgetsイベントをすべてデコードします。関数がインターフェースの名前空間とイベント名を認識できない場合、エラーがプリントされます。この関数には自作のイベントの解析コードを追加できます。encode_set_indicator_directive()以下のNotifications.SetIndicatorディレクティブをバイナリー形式にします。}}encode_sample_discover_response_event()以下のAlexa.Discovery.Discover.Responseイベントをバイナリー形式にします。}}encode_sample_discover_directive()以下のAlexa.Discovery.Discoverディレクティブをバイナリー形式にします。}}encode_sample_state_update_directive()以下のStateListener.StateUpdateディレクティブをバイナリー形式にします。このディレクティブは、タイマーが設定されたことをガジェットに通知します。}}encode_sample_speechmarks_directive()以下のSpeechData.Speechmarksディレクティブをバイナリー形式にします。上記の関数を呼び出します。出力サンプルを実行すると、以下のように出力されます。Gadgetsサンプルコードリポジトリには、ペイロードに1つ以上のフィールドを含む各ディレクティブおよびイベントの.protoファイルに対応するオプションファイルがあります。このオプションファイルは、ペイロードの各フィールドの最大サイズを指定します。これにより、フィールドのメモリを静的に割り当てるよう.protoコンパイラに指示します。Discover.Responseイベントのオプションファイルは、以下のようにcapabilities配列のサイズを定義します。max_count:32コンパイラがコードを生成すると、32の機能にメモリを割り当てます。max_countを変更してコードを再コンパイルすることはできますが、最大値を増やすとデコードが失敗する可能性がありますので、注意してください。メモリの使用状況を最適化したい場合は、max_count(またはその代わりに指定されたmax_size)を減らしてください。これにより、作成する.protoメッセージにコンパイラが静的に割り当てるメモリが減少します。