IoT化の事例紹介
事例2:iot-mos(アイモス)
続いては、イー・フォース株式会社の製品で、iot-mos(読み方:アイモス)について紹介します。
iot-mosは、温度、湿度、人感、距離などの各種センサーから取得したデータをクラウドに送信するゲートウェイ端末で、センサー、ゲートウェイ、クラウド、Webアプリで構成されています。
各種センサーとセンサー制御をするマイコンは有線で、センサー制御モジュールとネットワーク制御モジュールはUARTで接続します。
iot-mosのプロトコルスタック構成
iot-mosのプロトコルスタック構成は下記です。
イー・フォース株式会社のリアルタイムOSであるμC3(マイクロ・シー・キューブ)をベースとし、その上にネットワークスタックであるμNet3を載せた構成です。
センサー制御とネットワーク制御の分離
センサー制御とネットワーク制御を分離させており、センサーを制御する部分はBluetoothやEnOceanなどに変更可能です。
長期間の安定動作
無線通信を使う場合、動作を長期間安定させるために切断検出や再接続処理を設計に盛り込む必要があります。
これまで無線を使用していなかった場所に新たに取り入れる際は、接続のタイムアウト時間やリトライ回数を調整し、「無線は必ず切断される」ということを前提に設計することが重要です。
また、ネットワークの設定方法や設定情報の保存方法についても考慮してください。例えば、IP設定、 SSID/Password設定、LTEを使用する際のAPN設定の検討が必要です。
クラウドへの接続
この事例では、MQTTでAWS IoT Coreに接続しています。
「組込み機器をIoT化するための勘所とは?既存製品のIoT化事例を紹介(1)」の事例と同様に、クラウドへ接続する場合はTLSが必須になるため、CA証明書やクライアント証明書などをFlashに書き込んで保持しています。
クラウドへのデータ送信形式
パブリッククラウドに送信する場合、クラウドへのデータ送信形式をJSONにして送信すると扱いやすくなります。
一例として、AWS IoTのデバッグコンソールを紹介します。JSONでデータを送ると、一目見て分かりやすいようにデータを成形してくれます。JSONではなくバイナリなどのデータでも表示可能ですが、JSONのほうが扱いやすいでしょう。
留意点として、JSON形式ではデータサイズが大きくなったり、オーバーヘッドが発生します。そのため、扱いやすさとデータサイズのどちらを重視するかは考慮しなければなりません。
AWSを使ったプロトタイピング
プロトタイピングをおこなう際はAWSを使用すると便利です。ほぼGUIの操作のみで環境の構築が可能で、すぐに試作開発をスタートできます。試作が順調にいけば、その部分を自動化するプログラムを作成して、スケールしていきます。
AWS IoTシステム構成例
AmazonのAWS IoTを使用したシステムの構成例を紹介します。
データサイズや送信頻度に応じて最適なコンポーネントが変わります。システム構成を考える際は通信料のコスト見積りがポイントになります。
この事例では、AWS IoTを使い、データはDynamoDBに溜めていました。
しかし、エッジデバイスからのデータの送信周期はセンサーの内容によって変わります。数秒~100msオーダーになると、クラウドのコスト(データ通信料)が大きく上がってしまいます。そこで、デバイス側を調整して送信間隔を空けたり、クラウドの構成を見直しながらコストバランスを検討しました。
今回は、AWS IoTの先に繋がるデータのストレージを、DynamoDBからKinesis Data Streamsに変更しました。Kinesis Data Streamsはデータを一時的にバッファリングするサービスです。Kinesis Data StreamsにLambdaを繋ぎ、S3にファイルとしてデータを保存する構成にしました。
そうすることで、短い送信周期数で秒~100msごとにおこなっていたオーダーから、頻度を下げてデータのやり取りができます。このような工夫をしてコストを抑えるシステム構築を実現しています。
クラウドへ保存したログデータのダウンロード
クラウドへ保存したログデータをダウンロードする際、問題が発生することがあります。ここでは、その課題を解決した事例を紹介します。
この事例では、汎用的にデータを扱えるように、JSON形式でデータを保存していました。そして、ユーザーがデータをダウンロードする際はCSVに変換しています。しかし、ダウンロードするデータの蓄積が長期間におよぶと、データ変換に時間がかかり、ブラウザがタイムアウトしてしまう事象が起きていました。
そこで、クラウド側でファイル生成処理を非同期化し、一度ファイル生成のリクエストを出してから、クラウド側でファイルを生成することにしました。ファイル生成の完了を待ってダウンロードするように変更したことで、タイムアウトになる事象を解決したのです。
このように、データ量が多かったり、処理に時間がかかる場合は、クラウド側のバックエンドの非同期化が有効です。