MODE JAPAN Developer Blog

Here you'll learn all you need to know about developing with MODE.

IoTクラウドとしてのMODEの紹介 〜通信機能編〜

どうもこんにちは。MODE の篠田です。

前回の私の回では弊社で提供しているのサービスの概要をお伝えしました。

今回は通信にまつわる機能を紹介していきます。Internet of thing (IoT) な開発基盤というからにはインターネットとモノとの通信は簡単にできる方が好都合です。MODEでは様々な検証プロジェクトやサービス開発で得られた経験から設計された、インターネットとモノとの通信を簡単にできる機能が提供されています。

今回は通信にまつわる機能として次のような機能を紹介していきたいと思います。

  1. イベント (Event)
  2. デバイス・コマンド (Device Command)
  3. デバイス・データ・プロキシ (Device Data Proxy)

1. イベント

イベント (Event) はもっとも基本的なMODEクラウドの機能と言えると思います。現実世界の把握の第一歩は現実世界のイベントを知ることにあります。

デバイスで発生した様々なイベントはMODEクラウドを通じて様々な箇所で利用できます。MODEクラウド内部でも重要な役割を果たしています。

f:id:takeshinoda-mode:20200203144956p:plain

デバイスはMODEクラウドにREST APIかMQTTでイベントを送信できます。IoTサービスは、WebSocketを通じて発生したイベントをリアルタイムに受け取る事ができます。

また、MODEクラウド内でもイベントを利用して、様々なサービスを提供しています。MODEクラウドにはスマート・モジュールと呼ばれる、追加機能のサービスをいくつか提供しています。例えば、時系列DBやWebHookサービスなどです。それらのスマート・モジュールは特定のイベントを受信すると例えば、時系列データベースに書き込んだり、イベントをそのまま外部サービスにWebHookとして再送信したりすることができます。

MODEが提供している、センサー・クラウドでも、デバイスの起動やセンサーの死活イベントなどを受け取り、Web画面でありながらリアルタイムなデバイスの状況を知ることができるようになっています。

2. デバイス・コマンド

デバイス・コマンド (Device Command) は名前の通り、デバイスにコマンドを送信できる機能です。一過性の制御コマンドをデバイスに送信する場面で便利です。

下図のようにJSONをMODEクラウドに送信すると、対象のデバイスがコマンドを受ける。シンプルな機構です。 f:id:takeshinoda-mode:20200203132634p:plain

デバイスがアクティブであれば、MODEクラウドはコマンドをデバイスに送信します。クライアントはJSONをMODEクラウドのREST APIにより送信するだけです。MODEクラウドはデバイスがアクティブであれば送信し、デバイスはWebSocketかMQTTでコマンドをMODEクラウドから受信します。もしも、送信時にデバイスがアクティブでなければコマンドはMODEクラウドにより捨てられますが、ちゃんとクライアントにはエラーが通知される仕組みです。

MODEのサービスのひとつであるセンサー・クラウドではこの仕組みを利用して、デバイスの接続センサーのスキャンや、デバイスの遠隔再起動やファームウェアアップデート実行指示などの機能を提供しています。

3. デバイス・データ・プロキシ

デバイス・データ・プロキシ (Device Data Proxy) は私の中 (MODE内でも) では割と推しの基本機能です。すこし地味なのでこれを推すのは「他にもっと良いの無いの?」と疑われそうですが (ありますよ!) 、IoT サービス開発基盤ならではの機能で面白いと思っています。

デバイス・データ・プロキシはMODEクラウドとデバイスが持つデータを同期するための機能です。データストアとデータの同期機能を同時に備えています。また、データストアとしては単なるキー・バリュー・ストアとして見ることができます。

下図は利用例です。左端はIoTサービスの画面です。例えばIoTサービスでセンサーの設定を与えると、デバイスにその設定値が送信されます。

f:id:takeshinoda-mode:20200203134623p:plain

デバイス・データ・プロキシが便利なのは、デバイスはポーリングすること無く値の作成・変更・削除を知ることができるところにあります。デバイスはMQTTもしくはWebSocketを利用することで、変更が即時にMODEクラウドから通知されます。

重要なことは、逆方向も同じ事ができることです。デバイスは値の作成・変更・削除をMODEクラウドに実行できます。インターネット上のサービスはその変更をMODEクラウドを通じて即時に受け取ることができます。IoTサービスの提供は状況に応じたサービスを提供することがこれにより簡単にできることができます。

仮にデバイスとMODEクラウドが接続してない場合は、再接続時にすべての値を採取することができます。MODEクラウドから取得できるJSONに最終更新時のタイムスタンプが付与されおり、その値とデバイスが持っている値を比較する事で最新かどうかを知ることができます。

IoTで悩ましいことのひとつは、デバイスのネットワーク接続が不安定なことでしょう。設定値や制御結果をクラウドとデバイスで同期を取る機構を作るのは「やればできるがスケーラブルに安定的に構築する作業というのは大変面倒」といった作業のひとつです。デバイス・データ・プロキシを利用することで、不安定な通信環境でも安定的にデータの同期や制御結果の同期を取ることができます。

おわりに

今回は基礎的な通信機能をご紹介しました。どれも、IoTな基盤には必要ながら、一見簡単に作れるけど、実際にプロダクションレベルでスケーラブルに安定的に作って運用するのは面倒な機能と思います。詳しい情報は https://dev.tinkermode.com/docs/ にて公開しております。もしよろしかったら参照してみてください!