ソースコードの構成
Thing 上のサンプルプログラムは、hellothingif.c と hellothingif.h の 2 ファイルだけで構成されています。
内部構成
hellothingif.c の内部は以下のような構成になっています。
hellothingif.c は、Thing-IF SDK のフレームワークに基づいて、以下の要素で構成されています。
アクションハンドラー
action_handler()
Thing がモバイルアプリからのコマンドを受信すると、Thing-IF SDK は、その内部に含まれるアクションごとに
action_handler()
を呼び出します。アクションハンドラーでは、アクションを解析してその結果を処理します。Hello Thing-IF ではアクションの内容をコンソールに表示します(実際のソリューションでは Thing のハードウェアを操作する想定)。また、アクションのパラメーターから得られた LED ライトの状態を、ステートの送信用としてグローバル変数に保存しておきます。
ステートハンドラー
state_handler()
Thing-IF SDK は、ステートの送信が必要なタイミングでステートハンドラーを呼び出します。ハンドラー内では、グローバル変数に格納された LED ライトの状態とモーションセンサーの値を読み取って、JSON に整形しながら書き出します。
main()
main()
では、Thing-IF SDK の初期化と、Thing 側の初期登録を行います。初期化後は特に必要な処理がないため、while
による永久ループで待機します。ヘルパー関数
上記 3 つの主要関数から呼び出されるヘルパー関数です。最新の LED ライトの状態を保存または復元する処理や、モーションセンサーの値を読み出す処理などがあります。
スレッドの構成
上の内部構成の図に示したとおり、サンプルプログラムでは、以下の 3 つのスレッドを扱います。
メインスレッド
ここでは
main()
を実行するスレッドをメインスレッドと呼びます。このスレッドでは、初期化処理だけを行い、その後while (1) {}
によって永久ループに入ります。初期化の際に指定した、アクションハンドラーとステートハンドラーは Thing-IF SDK 内で生成された下記の 2 つのスレッドから呼び出されます。MQTT 受信スレッド
このスレッドでは、MQTT のプッシュ通知を受信して処理します。
Thing が初期化される際、Thing-IF SDK は 内部で MQTT 受信処理スレッドを生成し、サーバーとの間で MQTT コネクションを確立します。その後このスレッドは、モバイルアプリからのコマンドが MQTT プロトコルの PUBLISH コマンドとして届くのを待ちます。
PUBLISH コマンドを受け取ると、Thing-IF SDK はアクションハンドラーを呼び出してアクションを処理します。さらに、ステートハンドラーを呼び出して、コマンドを処理した後のステートを Thing Interaction Framework に送信します。
ステート定期更新スレッド
このスレッドでは、定期的なステートの更新処理を行います。
Thing-IF SDK は専用のスレッドを作成し、一定時間ごとにステートハンドラーを呼び出してステートを Thing Interaction Framework に送信します。
ステートハンドラーは MQTT 受信スレッドとステート定期更新スレッドの両方から呼び出される点にご注意ください。仕組み上、同時に実行される可能性もあります。
Hello Thing-IF では、Pthreads のミューテックスを使って排他処理を行っています。MQTT 受信スレッドと、ステート定期更新スレッドの同時実行により、不整合が発生するのを防止します。
Thing-IF SDK の Linux 向けリファレンス実装では、Pthreads を使ってスレッドを実装しています。スレッドの生成など OS に依存する部分は、ユーザープログラムの側で用意する設計になっているため、ターゲットとなる OS に依存した形でタスクやスレッドを利用することができます。
なお、SDK の内部では、これ以外に MQTT の PINGREQ を送信するタスクも生成されますが、アプリケーションから意識する必要はありません。
次は...
これ以降のページでは、初期化処理、コマンド受信処理、ステートの送信処理について順にコードを解説します。まずは初期化処理について取り上げます。
初期化処理 に移動してください。
より詳しく学びたい方へ
- Thing-IF SDK の内部構成や設計の概要については、Thing-IF SDK の構成 を参照してください。
- Thing-IF SDK を使用する際に注意すべきスレッド、データ型、メモリ管理などの詳細は、実装上の注意点 を参照してください。