初期化コードの実装
Thing SDK Embedded を使用するには、SDK の初期化処理を実行し、ソケットやタスク生成などの OS 依存の処理をコールバック関数として設定する必要があります。
ここでは、以下の処理を順に行います。
Thing-IF SDK を併用している場合、原則として OS 依存の処理の実装 のみを省略できます。
SDK の初期化
まず、Thing SDK Embedded の初期化 API を呼び出します。
kii_t kii;
/* Initialize Kii SDK Embedded. */
kii_impl_init(&kii, EX_APP_SITE, EX_APP_ID, EX_APP_KEY);
EX_APP_SITE
には "JP"
を指定してください。また EX_APP_ID
と EX_APP_KEY
の項目は、開発者ポータルにて取得した AppID と任意の値を設定してください。
初期化した結果は kii_t
構造体に格納されます。これは Thing SDK Embedded の API の呼び出しに必要な情報で、プログラムの終了まで保持しておきます。
以降、各 API の説明で &kii
と記述されている部分では、この初期化済みの kii_t
構造体を指定します。
Thing-IF SDK を併用する場合
Thing-IF SDK の kii_thing_if_t
構造体が持つ command_handler
メンバーまたは state_updater
メンバーは初期化済みの kii_t
構造体であるため、原理的にはこれらを使って Thing SDK Embedded の API を呼び出すことは可能です。ただしこの場合、Thing-IF SDK の内部処理と衝突する可能性があります。
意図的に Thing-IF SDK の処理を拡張する場合を除いて、Thing SDK Embedded の API 呼び出し用に新しい kii_t
を初期化してください。
複数のタスク(スレッド)から SDK の機能を実行する場合
複数のタスク(スレッド)から SDK の機能を実行する場合、タスクごとに初期化処理を実行して kii_t
構造体を準備してください。また、初期化済みの kii_t
構造体はタスク間で共有しないようにしてください。
通信用の領域の準備
次に、kii_t
構造体にある API の呼び出し用の通信バッファーを初期化します。
上記の SDK 初期化処理も含むサンプルコードを以下に示します。
#define EX_BUFFER_SIZE 4096
kii_t kii;
char buffer[EX_BUFFER_SIZE];
/* Initialize Kii SDK Embedded. */
kii_impl_init(&kii, EX_APP_SITE, EX_APP_ID, EX_APP_KEY);
/* Initialize the space used by the SDK for communication. */
memset(buffer, 0x00, sizeof(buffer) / sizeof(buffer[0]));
kii.kii_core.http_context.buffer = buffer;
kii.kii_core.http_context.buffer_size = sizeof(buffer) / sizeof(buffer[0]);
/* Initialize the space used for the socket. */
kii.kii_core.http_context.socket_context.app_context = NULL;
kii.kii_core.http_context.buffer
と kii.kii_core.http_context.buffer_size
に SDK が送受信で使用する領域を指定します。指定した領域は、送信処理と受信処理で共用されます。
この例でのサイズは 4096 バイトとしていますが、必要なサイズは REST API の送受信の内容に合わせて調整が必要です。たとえば、Object の作成や取得で大きな JSON を扱いたい場合、その JSON の文字列と REST API が使用する HTTP ヘッダーなどを含めた領域を用意する必要があります。
kii.kii_core.http_context.socket_context.app_context
は、下記に示す OS 依存の処理の実装 のうち、ソケットの処理で利用できるアプリケーション用の領域です。ソケットの実装にコンテキスト情報が必要であれば、その構造体へのポインタを格納しておくことができます。Linux のソケットの実装では不要であるため、NULL を指定しています。app_context
の利用例は、GitHub からダウンロードしたソースコードに含まれる、各種環境向けのサンプル実装をご覧ください。
OS 依存の処理の実装
Thing SDK Embedded では、通信処理やタスク生成などの OS に依存する処理を SDK の外部に持たせることで移植性を高めています。OS に依存する処理はユーザープログラム側で用意して、その処理への関数ポインタを kii_t
構造体の対象メンバーに設定します。
C コンパイラが動作する環境であれば、ここに示す OS 依存の実装を用意するだけで、基本的にどのようなプラットフォームにも SDK を移植することができます。
Linux のサンプルでは、kii_impl_init
関数で以下のように実装されています。
/* Set http socket callbacks. */
kii->kii_core.http_context.connect_cb = s_connect_cb;
kii->kii_core.http_context.send_cb = s_send_cb;
kii->kii_core.http_context.recv_cb = s_recv_cb;
kii->kii_core.http_context.close_cb = s_close_cb;
/* Set a logger callback. */
kii->kii_core.logger_cb = logger_cb;
/* Set MQTT socket callbacks. */
kii->mqtt_socket_connect_cb = mqtt_connect_cb;
kii->mqtt_socket_send_cb = mqtt_send_cb;
kii->mqtt_socket_recv_cb = mqtt_recv_cb;
kii->mqtt_socket_close_cb = mqtt_close_cb;
/* Set task callbacks. */
kii->task_create_cb = task_create_cb;
kii->delay_ms_cb = delay_ms_cb;
これらは、OS 依存の処理で必要な、以下の機能を初期化しています。
分類 | 機能 | 参照する kii_t のメンバー | Linux サンプルでの実装位置 |
---|---|---|---|
通信処理 (HTTP/ HTTPS) |
サーバーへの接続 | kii_t.kii_core. |
/kii-core/linux/ kii_core_secure_socket.c: s_connect_cb() |
データの送信 | kii_t.kii_core. |
/kii-core/linux/ kii_core_secure_socket.c: s_send_cb() |
|
データの受信 | kii_t.kii_core. |
/kii-core/linux/ kii_core_secure_socket.c: s_recv_cb() |
|
接続の終了 | kii_t.kii_core. |
/kii-core/linux/ kii_core_secure_socket.c: s_close_cb() |
|
ログ出力 | ログ出力 | kii_t.kii_core.logger_cb |
Linux/kii_init_impl.c: logger_cb() |
通信処理 (MQTT) |
サーバーへの接続 | kii_t.mqtt_socket_connect_cb |
/Linux/kii_socket_impl.c: mqtt_connect_cb() |
データの送信 | kii_t.mqtt_socket_send_cb |
/Linux/kii_socket_impl.c: mqtt_send_cb() |
|
データの受信 | kii_t.mqtt_socket_recv_cb |
/Linux/kii_socket_impl.c: mqtt_recv_cb() |
|
接続の終了 | kii_t.mqtt_socket_close_cb |
/Linux/kii_socket_impl.c: mqtt_close_cb() |
|
タスク管理 | スレッド/タスク生成 | kii_t.task_create_cb |
Linux/kii_init_impl.c: logger_cb() |
実行のスリープ | kii_t.delay_ms_cb |
/Linux/kii_task_impl.c: delay_ms_cb() |
Linux の場合は、サンプルプログラムの処理をそのまま利用できます。Linux 以外の環境で動作させる場合、次のように OS 依存の処理を用意します。
Intel Edison、Ti CC3200 を使用する場合
GitHub からダウンロードした KiiThingSDK-Embedded ディレクトリの直下に、それぞれ INTEL、TI ディレクトリとして、サンプル実装を用意しています。これらのディレクトリにあるサンプルをビルドし、スケルトンとして利用することもできます。
それ以外の環境を使用する場合
上記の表に示した各関数に相当する処理を、目的のプラットフォームに応じて用意します。
なお、KiiThingSDK-Embedded ディレクトリ直下の gt202、MTK、WinnerMicro ディレクトリは SDK 開発時に使用した各環境向けのテスト実装です。バージョンや環境の相違などで問題が発生する可能性があるため、これらの実装を参考にする場合は十分な検証や追加の実装を行ってください。