仕事で使う機会があったのでざっくりしたまとめを書きます。
サービス概要
IoT Core
IoT Core とは IoT デバイスを管理するツールです。
IoT デバイスの公開鍵を登録することでセキュアな通信が可能になります。
それからIoT CoreのAPIを叩けば、指定デバイスからデータを取得したり、指定したデバイスの設定を変更ができます。
ブラウザでできることはデバイスの登録とデバイス情報の確認程度で、APIもそうですが割とシンプルなサービスです。
Pub/Sub
PublisherとSubscriberの略で、一対多、多対一、多対多のデータのやりとりをするためのハブとなります。
これができて何が嬉しいかと言うと、複数の送信元からあるデータを一つのサーバーに送ったり、もしくは用途ごとに別のサーバに送ったり、ということができます。
IoT 案件の場合は多数のデバイスを使うことが多いですし、Webアプリやストレージなどの様々なサービスにセンサーデータを送ったりできるので相性が良いです。
Pub/Subにまつわる用語として以下があります。
- Publisher データ送信者
- Topic 中継地点
- Subscriber データ受信者
IoT 案件なら、デバイス(Publisher)がAPIを使ってTopicにデータを送信、すると設定したサービス(Subscriber)にデータを転送してくれる、というイメージです。
ブラウザ上ではTopic, Subscriberを設定できます。
Subscriberは以下の2種類があります。
- pull型 外部からAPIを叩くことでデータを取得
- App Engine, Functionからリクエスト
- push型 対応Topicにデータが届き次第、指定したAPIを叩く
- Pub/Subから送る
例えばApp Engineにpushハンドラーを用意しておいて、自動的にDataStoreに送るとかが出来て便利です。
Android Things
android の派生 OS です。
ラズパイなどのデバイスに載せることができます。
Androidアプリの要領でデバイスに搭載するアプリの開発が可能です。
ここからセンサーデータを取得、Pub/Subで設定したTopicにデータを送る、というアプリさえ載せれば最低限の機能は使えます。
よくある(実際あった)質問
実際使うとしたら?
- 大量のセンサーデータを収集、研究利用
- 工場などに設置して、異常検知
というのがありえそうなパターンですね。
センサーは温度、加速度、磁気、電力などなど多種多様なので応用可能性が高いと思います。
実際に開発するとしたら?
システム構成(アーキテクチャ)
最低限Android things + Cloud IoT Core + Cloud Pub/Subはあるとします。
(Android thingsじゃなくてもAPi叩ければLinux機でも良さそう)
これ以降のアーキテクチャ例を挙げていきます。
~Pub/Sub → Dataflow → BigQuery → Datastudio
なんとこれだとデバイス以外はブラウザポチポチするだけで可視化ができちゃいます。
Dataflowは前処理とかしてくれるところですが、Pub/SubからBigQueryならテンプレが用意されてるのでそれで終わりです。BigQueryも箱として入れとくだけで、後はDataStudioでカッコイイグラフを作りましょう。
問題としてはDataflowでお金かかっちゃうかもしれないので、Cloud Functionに差し替えるみたいな手法もあります。
~Pub/Sub → Function → IoT Core
しきい値超えたらアラート流すとか動作止めるAPI叩くみたいな。
監視系の別のツール使ってもよさそうだけど……。
~Pub/Sub → AppEngine ↔ DataStore
とりあえずDataStore入れといてWebアプリ上でなんか色々やる。
これが一番自由度が高い。
DataStudioだと時系列データの区切りが最低でも日ごとなので、
リアルタイム性を求めるとこのように自力でやっていくしかないのだ……。
IoT Core APIの使い方は?
上記のガイドとにらめっこする。あとはgithubに上がってる公式サンプルコードを試してみる。
APIの機能はそんなに多くないので比較的楽なはず。
また実機が無くてもIoT Coreの設定画面で仮想デバイス作れる(実機の公開鍵あるかないかの違い)ので、すぐ始められる。
費用は?
IoT Core, Pub/Sub自体はデータ量依存だけど大量にデータやりとりとかしない限りは無料枠なので安心。とはいえもちろん連携サービスで課金発生可能性はあるので各自最高のアーキテクチャを考えましょう。あと無論デバイスは課金不可避。
AWSと比べるとどう?
AWSでIoTやったことないのでなんとも言えないけど、個人的にはこっちの方がシンプルで安価かなと。
デバイスからPub/Sub直接叩けばIoT Core要らなくね?これいる?
わかる。
が、一応擁護すると
- デバイスの公開鍵を登録することでデバイスとのセキュアな通信が可能
- 複数デバイスに命令送る場合、1つ1つIPとか指定する必要が無い
- IoT Core上で設定したデバイスIDを指定して操作することは可能
- デバイスとTopicの紐付けがIoT Core上で設定可能
- API経由でデバイス操作が可能
- デバイスへの命令(正確にはupdate config)は1秒に最大1回、などの制限を設けてデバイスの負荷を減らす
といったメリットはあるかなと……。(最後は結構無理ある。)
場合によってはIoT Coreを使わずにやっていくのも1つだと思います。
まとめ
元々IoTにはそんなに興味なかったのですが、色々応用の可能性があって面白いかなと思います。
また割と最近出来たプロダクトで、僕自身IoT経験(?)が一カ月にも満たないので記述に誤りがあるかもしれませんがご容赦下さい。