ソースコードの構成

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 を使用する際に注意すべきスレッド、データ型、メモリ管理などの詳細は、実装上の注意点 を参照してください。