サンプルの実行
モバイルアプリと Thing のプログラムを両方ビルドできたら、それらを実行してコマンドとステートのやりとりを行ってみます。
モバイルアプリは自由に操作できますが、ここでは以下の手順でひととおりの動作を確認します。
ID の共有
IoT ソリューションでは、モバイルアプリと Thing との間で ID を共有する必要があります。
Hello Thing-IF の構成 で見たように、Kii Cloud のアプリケーション上には多数のユーザーと Thing が存在しています。モバイルアプリでは操作対象の Thing を ID によって識別する必要があります。
今回の実行例では、以下のようなユーザー名と vendorThingID を使用することにします。
vendorThingID とは、Thing をアプリケーション上で一意に識別するための文字列で、ベンダー(開発者)が自由に定めることができます。
今回の場合、工場からの出荷時に、Thing のハードウェアのそれぞれに対して、あらかじめ vendorThingID が割り当てられているものとします。エンドユーザーは、以下の図のように、購入した製品のラベルを通して vendorThingID とパスワードを知っているというシナリオを想定します。
vendorThingID を使って Thing を登録すると、Kii Cloud 側で thingID が割り当てられます。これは、ベンダーが決めた値ではなく、サーバー側で自動的に割り当てられる ID です。
以降、プログラムからは、ベンダーが定めた vendorThingID を使っても、サーバー側で割り当てた thingID を使っても同一の Thing を識別することができます。
なお、thingID を持っている Thing は、サーバーで登録済みであることを意味する点にもご注意ください。
vendorThingID がシリアル番号のように予測可能な文字列になっていると、第三者からの攻撃のリスクが高まります。できるだけ予測不可能なランダムな文字列を使用することをおすすめします。
Thing 側で工場出荷時に vendorThingID を割り当てるのが困難な場合、モバイルアプリで自動生成することもできます。詳細は、このチュートリアルの最後のページ 次のステップへのヒント を参照してください。
Thing の準備
まず、Thing 側のプログラムを実行します。
今回のサンプルでは、コマンドラインの引数に vendorThingID と Thing のパスワードを指定します。vendorThingID と Thing のパスワードは工場出荷時に製品ごとに設定されているため、Thing のイニシャルプログラムローダがこのコマンドライン相当の処理を自動実行しているという想定です。
$ ./hellothingif 1111 456DEF
実行すると、Waiting for commands
と表示され、待機状態になります。このとき、内部では Thing 側の初期登録操作が行われます。つまり、Thing Interaction Framework 上に、コマンドラインで指定した vendorThingID とパスワードで Thing が登録されます。
このまま待ち続けると、1 分間に 1 度、ステートのアップロードを示す Sending the state
が表示されます。
Waiting for commands
Sending the state
Sending the state
Sending the state
モバイルアプリの実行
次に、Android でモバイルアプリを起動します。Android Studio のデバッグ機能で実行しても構いません。
ここでは、以下の操作を行ってみます。
モバイルアプリと Thing はインターネット経由でつながっています。テストの際、Thing とモバイルアプリは近い距離で操作しているはずですが、実環境では、外出先からの遠隔操作を行っている状態に相当します。
モバイルアプリの起動
モバイルアプリが起動すると、次のような画面が表示されます。この画面では、操作ユーザーとスマート LED ライトの認証情報を入力して、初期登録を行います。
このページの冒頭に示した条件で利用するため、以下の情報を入力します。
- Username:
user1
- Password:
123ABC
- vendorThingID:
1111
- ThingPassword:
456DEF
- Username:
ユーザーの作成
初期登録の際、Kii Cloud 上の Thing オブジェクトは必要に応じて作成されますが、Thing のオーナーとなるユーザーはあらかじめ作成しておく必要があります。
Username と Password を入力した状態で ADD USER をクリックすると、ユーザーを作成できます。
2 回以上クリックすると、同一ユーザーを重複作成することになるため作成エラーとなりますが、初期登録の実行には問題ありません。
初期登録の実行
ユーザーが作成できたら、ONBOARD ボタンをクリックして初期登録を実行します。これによって、指定されたユーザーと Thing が紐付けられ、Thing のオーナーとなります。
コマンドの実行
初期登録が完了すると、コマンド実行画面に自動的に遷移します。このとき、プッシュ通知の初期化がバックグラウンドで行われ、結果がトーストで表示されます。
画面の上半分では、スマート LED ライトに送信するコマンドの内容を入力します。電源のオン/オフと明るさを指定します。ここでは、そのまま SEND COMMAND をクリックします。
コマンドの送信結果の確認
画面上には、以下のようにコマンドの送信結果がトーストで表示されます。表示される文字列は、実行したコマンドに対するコマンド ID です。
このとき、SEND COMMAND ボタンのすぐ下に、コマンドの実行結果が表示されます。
The command succeeded.
は、コマンドに含まれるすべてのアクションが、Thing 側で成功のステータスとして処理された状態を表します。The command succeeded.
が表示されない場合、プッシュ通知の設定が正しくないものと思われます。プッシュ通知のトラブルシューティング(Android、iOS)で対処方法を確認してください。また、Hello Thing-IF の実装は、プッシュ通知設定チュートリアル の内容に沿って実装されているため、問題を解決できない場合は、新しいプロジェクトで、プッシュ通知設定チュートリアルを初めから実行してみるのも有効な方法です。なお、Thing 側のプログラムが起動していない場合、Thing Interaction Framework へのコマンド送信は成功するため、コマンド ID は表示されますが、Thing はコマンドを受信できないため、
The command suceeded.
は返ってきません。Thing 側のコンソールで Ctrl + C を入力して停止させた状態で、モバイルアプリからコマンドを送信してみてください。試した後は、もう一度起動しておいてください。Thing の確認
コマンドの送信と同時に、Thing のプログラムを実行しているコンソールでは、以下のようにアクションを受信したことが表示されます。
Sending the state Sending the state Sending the state Schema=HelloThingIF-Schema, schema version=1, action name=turnPower, action params={"power":true} Light: Power on, Brightness: 0 Schema=HelloThingIF-Schema, schema version=1, action name=setBrightness, action params={"brightness":100} Light: Power on, Brightness: 100 Sending the state
ここでは、コマンドの送信 1 回に対して、2 件のアクションを受け取ったことが読み取れます。1 件目が
turnPower
で、パラメーターが{"power":true}
、2 件目がsetBrightness
で、パラメーターが{"brightness":100}
です。その下の
Light:
から始まる行は、Thing での LED 電球の状態です。アクション 2 件を受け取った結果、電源がオンで明るさが 100 になったことを表します。サンプルプログラムでは、これらをprintf()
で出力していますが、実際は I/O ポートを操作する処理に置き換わるはずです。コマンド実行エラーの確認
次に、モバイルアプリで明るさが 100 のまま、もう一度 SEND COMMAND をクリックしてコマンドを送信してみます。
今回は、コマンドの実行結果として、
Bulb is overheating
エラーが表示されます。Thing では以下のようなエラーメッセージが表示されます。
Schema=HelloThingIF-Schema, schema version=1, action name=turnPower, action params={"power":true} Light: Power on, Brightness: 100 Schema=HelloThingIF-Schema, schema version=1, action name=setBrightness, action params={"brightness":100} Error: Bulb is overheating. Sending the state
これは、Thing 側でのエラーをテストする機能です。Thing 側は、2 回連続で明るさが 100 の
setBrightness
アクションを受け取ると、エラーのテスト用にBulb is overheating
を返すように実装されています。Thing-IF SDK では、このように Thing からモバイルアプリにエラーを返すこともできます。明るさの変更
次に、明るさを変更してコマンドを送信してみます。
Thing では送信した明るさに応じて
setBrightness
アクションのパラメーターが変化する様子が読み取れるはずです。Schema=HelloThingIF-Schema, schema version=1, action name=turnPower, action params={"power":true} Light: Power on, Brightness: 0 Schema=HelloThingIF-Schema, schema version=1, action name=setBrightness, action params={"brightness":69} Light: Power on, Brightness: 69 Sending the state
ステートの受信
最後に、ステートを受信します。REFRESH STATE ボタンをクリックすると、Thing が登録した最新のステートを取得して画面に反映します。
条件を変えながら、SEND COMMAND ボタンでコマンドを送信し、REFRESH STATE ボタンをクリックすると、
Power
とBrightness
は最後に送信したコマンドの値に応じて変化するはずです。また、Thing でステートが登録されるたびに、モーションセンサーの値Motion
が変化する様子が読み取れるはずです。
次は...
以上で、概要のセクションは終わりです。次は、Android のモバイルアプリを解説します。
Android モバイルアプリの解説 に移動してください。
より詳しく学びたい方へ
- Thing での ID の割り当て方法についての詳細は、初期登録 を参照してください。