OSSでIoTプラットフォームを作ってみよう
2018年03月21日
- ITインフラ
- QNAP機能紹介
当記事は「オープンソースカンファレンス2017 Hamanako」で開催したセミナー内容の抜粋です。
Docker上でOSSアプリのコンテナを組み合わせて、プラットフォームを構築してみましょう。
デモンストレーションの環境
センサーデータ表示 ダッシュボード
Raspberry piから送ったセンサーデータをブラウザへダッシュボード形式で表示します。
環境構成(ハードウェア)
- Raspberry pi、Grove pi、センサー(光、傾き、距離)
- QNAP(TS-251+)
- ディスプレイ
環境構成(ソフトウェア)
①Raspberry piとコンテナの連携
- Raspberry pi→Ponte データ送信
- Raspberry piにGrove Piを利用するための環境をインストール
- Raspberry pi上でプログラムを実装
- サンプルコード を利用してセンサーの値を取得
- Ponteへhttp形式のメッセージを送信
②Ponte→Node-RED 連携
- Node-REDにmqttノードを作成
- ノードにPonteの情報を設定
③Node-RED→MongoDB 連携
- Node-Redのノード上でJson形式のクエリを作成
- Node-REDにMongoDBノードを作成
- ノードにMongoDBの情報を設定
④Node-RED→Dashing 連携
- Node-REDのノード上でJson形式のクエリを作成
- Node-RED上でhttp requestノードを作成
- ノードにDashingの情報を設定
Dockerを利用したIoTプラットフォーム
4種類のOSSアプリのコンテナを組み合わせて実現します。
- メッセージブローカー
受信したメッセージをサービス側のプロトコルに適応するように変換して、送信します。
- ルールエンジン
受信したメッセージを処理し、別のメッセージを送信したり、メッセージをDBへ保存したりします。 - データベース
メッセージブローカーやルールエンジンから送信されたメッセージを管理します。 - プレゼンテーション
メッセージブローカー、ルールエンジンから送信されたメッセージやDBの情報をWebアプリケーションで表示します。
QIoT(IoTプラットフォーム)についての詳しい説明は、以下の記事をご覧ください。
IoTプラットフォームのコンテナ
デモンストレーションで利用したコンテナの説明をします。
Ponte
- デバイスからのメッセージを受信してパブリッシュする
- Docker Continer起動時のオプションや設定ファイルで、変換ルールやセキュリティを指定可能
プロトコル変換 | HTTP、MQTT、CoAP |
---|---|
データフォーマット変換 | JSON、MsgPack、Byson、BSON、XML |
セキュリティ | デバイスとの認証 |
参考サイト:Ponte
Node-RED
MongoDB
- ドキュメント指向のDBで、BSON(Binary Json)形式でデータを保存
- 多数の開発言語からアクセス可能
(例:C、C++、Java、Javascript、.NET、Node.js、Perl、PHP、Python、Ruby等) - RDBと比較して読み書きが高速
- RDBMSのような固定的なスキーマを持たない
- リレーションやトランザクションが多いシステムには不向き
参考サイト:MongoDB
Dashing
- ダッシュボードを簡単に作成できるライブラリ
- ダッシュボード上のWidgetのレイアウトをRubyでカスタマイズ可能
- WidgetをHTML、SCSS、CofeeScriptでカスタマイズ可能
参考サイト:Dashing
構築のポイント
ネットワークの設定
Dockerを利用する場合、コンテナにはホストOSとは別にIPアドレスとポート番号が割り当てられます。
連携先を指定する場合には、以下の通り設定する必要があります。
連携先を指定する場合には、以下の通り設定する必要があります。
- コンテナ間の通信
→コンテナのIPアドレス、ポート番号を使用します。 - Raspberry piとコンテナの通信
→ホストのIPアドレス、ポート番号を使用します。
要件にあったコンテナを組み合わせて使う
今回のデモンストレーション環境では4つのコンテナ全てを使用しましたが、要件に合わせて必要なコンテナを選択することが可能です。
例)
例)
- セキュリティを強化したい・・・
Ponteに認証を追加できます。 - プロトコル変換が不要・・・
PonteでなくNode-REDへ直接メッセージを渡すことができます。 - データ処理が不要・・・
PonteからMongoDBへ直接データを蓄積することができます。