実装上の注意点

Thing-IF SDK v2 を使って Thing 上で実装する際には、以下の点にご注意ください。

TIO インスタンス

Thing-IF SDK v2 では2つのインスタンスを使用して処理を行っていきます。

  • tio_handler_t インスタンス

    初期登録、コマンド受信タスクに関連するリソース管理用のインスタンスになります。

  • tio_updater_t インスタンス

    初期登録、ステート更新タスクに関連するリソース管理用のインスタンスになります。

初期登録に関してはどちらかのインスタンスで実行後、登録情報を共用することが可能です。

タスク

Thing-IF SDK v2 を用いた実装では、複数のタスク(スレッド)を利用します。

一例として、Thing の実装ではいくつかのコールバック関数を用意しますが、これらは SDK 内部で生成された実行タスクから呼び出されます。また、初期化処理等、Thing 上のプログラム側から SDK を呼び出すタスクもあります。

以下の表にタスクをまとめます。

処理 実行タスク 説明
初期登録 任意 初期登録処理は Thing 上のプログラムの任意のタスクから実行できます。初期登録処理が完了すると、これ以降このタスクより Thing-IF SDK v2 の処理を実行する必要はありません。待機状態とするか、Thing Interaction Framework 以外の処理を割り当てることができます。
アクションハンドラーの実行 コマンド受信タスク アクションハンドラーは、SDK が作成したコマンド受信用タスクから呼び出されます。
ステートアップローダーの実行 ステート更新タスク ステートアップローダーは、 SDK が作成したステート更新用タスクから定期的に呼び出されます。その際、以下の 2 つのコールバック関数が呼び出されます。
  • ステートサイズ要求コールバック関数
  • ステートデータ要求コールバック関数
これら 2 つのコールバック関数によりアップロードするステートを SDK が取得しサーバーへ送信します。
JSON 解析用リソースの確保 解析呼び出し元タスク JSON のトークン解析に必要なリソースを確保するために動的にリソースを確保させるようにコールバック関数を設定できます。コールバック関数は、JSON の解析を行うすべてのタスクからそれぞれ呼び出されます。同時に実行される可能性もあるため、再入可能にして同時に動くようにするか、同期処理によってシリアライズする必要があります。(利用リソースを予め設定した場合はコールバック関数を設定する必要はありません。)

その他、以下の点にご注意ください。

  • Thing 上のすべての API はブロッキング API として動作します。API を呼び出すと、処理が完了するまでの間、呼び出したタスクの動作は停止します。

データ型

Thing-IF SDK v2 内では、様々なデータ型が使用されています。本ガイドでは、それらのデータ型をサンプルコードとともに説明していますが、共通で使用されるものをここに示します。

tio_bool_t

以下の tio_bool_t は SDK 全体で共通して使用される、ブール型のデータ型です。 実体には kii_bool_t のエイリアスです。

typedef kii_bool_t tio_bool_t;
typedef enum kii_bool_t {
    KII_FALSE = 0,
    KII_TRUE
} kii_bool_t;

このデータ型は tio.h をインクルードすれば自動的に組み込まれます。

文字列の扱い

Thing-IF SDK v2 の C ライブラリで扱う文字列は、特に記載がないものを除いて UTF-8 でエンコードされた NULL ターミネートされている文字列となります。

通常は ASCII 範囲内の文字を扱いますが、たとえばコマンドのパラメータとして ASCII 文字のコード範囲外の文字列が指定された場合などは、UTF-8 の多バイト文字を扱う必要があります。

メモリ管理

Thing-IF SDK v2 では、特定の用途に使用する専用のメモリ領域をユーザープログラムから受け取ります。

専用領域を使った処理

SDK は初期化の際に以下の目的で使用する専用のメモリ領域を取得します。各インスタンスの初期化 API では、ユーザープログラムが各メモリ領域を確保しインスタンスを初期化します。

  • tio_handler_t で HTTP 通信処理で利用する領域
  • tio_handler_t で MQTT 通信処理で利用する領域
  • tio_updater_t で HTTP 通信処理で利用する領域

こちらは任意で設定することが可能ですが、設定しなければ SDK がヒープ領域から自動で確保する領域です。

  • tio_handler_t で HTTP ヘッダー処理で利用する領域
  • tio_handler_t で HTTP ボディ処理で利用する領域
  • tio_updater_t で HTTP ヘッダー処理で利用する領域
  • tio_updater_t で HTTP ボディ処理で利用する領域

メモリの指定方法の詳細は、SDKの初期化 のサンプルコードで示します。

ビルド設定用のマクロ

Thing-IF SDK v2 ではマクロにより、ビルド条件をカスタマイズできる箇所がいくつかあります。これらは基本的に変更する必要がありません。SDK の組み込み時にソースの参照が必要になった際には、以下の情報を参考にしてください。

ビルド設定用マクロを以下にまとめます。なお、下記の「デフォルト」は、リファレンス実装での初期設定を表します。

シンボル デフォルト 説明
HANDLER_KEEP_ALIVE_SEC 300 MQTT のキープアライブタイマーの設定値を秒単位で指定します。60 以上の値を指定することを推奨します。
JKII_NOASSERT 未定義 システムのライブラリに assert がないシステムではこのマクロを定義します。リファレンス実装では環境に合わせて定義されるため、未定義のまま使用します。
JSMN_PARENT_LINKS 未定義 JSON の解析用に内部で使用しているライブラリの設定です。Thing Interaction Framework では未定義のまま使用します。
JSMN_STRICT 未定義 JSON の解析用に内部で使用しているライブラリの設定です。Thing Interaction Framework では未定義のまま使用します。