2022年3月26日土曜日

さくらのクラウド「さくらのモノプラットフォーム」でLTE-Mを使ってCO2モニタリングしてみた

「さくらのIoT」でいち早くLTE接続対応のIoTデバイスとクラウドサービスの融合を実現していたさくらのインターネットがLTE-Mを使った新サービス
さくらのクラウド「さくらのモノプラットフォーム」をサービス開始しました。
https://iot.sakura.ad.jp/platform/

クローズドベータテスト募集がされていたので申し込み、いただいたアカウントと基板でサクッと試してみましたが、なかなか記事にできずにおりました

今回は、さくらのモノプラットフォームを使い作成したCO2モニタリングシステムについて紹介します。


テスター登録したところ、モノプラットフォームだけでなく、無料で各サービスを利用できるアカウントのログイン情報がメールで届きました。 また後日、

M5Stack対応LTEモジュール
DIP型LTEモジュール基板
LTEアンテナ
STM32Nucleo対応シールド基板
J-LINKコネクタ変換基板
のセットが到着しました。


利用開始前に、メールで届いたID、パスワードを使い、コンソールにログインしてSIMの登録を行います。
SIMはオンボードのeSIMで、基板上に書いてあるICCID、パスコードを入力して登録します。
あとはモノプラットフォームのメニューからプロジェクトを作成、SIMを紐付ければ準備完了です。
若干手順がありますが、このあたりはすべて丁寧なドキュメントがありますので、ドキュメントの手順どおりやれば問題ないです。
https://manual.sakura.ad.jp/cloud/manual-iotpf.html



さて、ハードウェア側です。Nucleoはあまり使っていないものの、M5Stackは出始めからいじっていたので早速つないでみました。
マニュアルにArduino用サンプルスケッチがあり、書き込むといきなりLTE-Mでさくらのサーバーと接続ができます。

サンプルは、M5StackのボタンA、ボタンB、ボタンCの押された回数をそれぞれ送信するもので、送信に成功すると、画面上の数字が増えていきます。

コンソールにログインすると、ブラウザ上で送信ログを確認できます。

もちろん、デバイスの送信データを受信するためのAPIもあります。
後述しますが、こちらはWebSocket APIになっており、デバイスがデータを送信するとJSONにシリアライズされて流れてくるストリーミングAPIです。

サンプルスケッチを見ると、LTEモジュールに送るコマンドフォーマットがわかるので、適宜改造すればサクッとデータを送信可能です。
データ形式は以下の通りです。

タグID
データ型 uint8からfloat64まで数種類
データ本文

これを設定して送信する形になります。
たとえば、温湿度センサーの値を送る場合、
タグID 0x01をfloat32で温度
タグID 0x02をint8で湿度
のようにして使うとそれぞれ別のものとして区別して送信できます。
サンプルスケッチでは、

ボタンAをタグID: 0x01のuint32
ボタンBをタグID: 0x02のuint32
ボタンCをタグID: 0x03のuint32

としてそれぞれ送信するようになっています。
試したところ、タグIDは0x00-0xFFまで使うことができたため、255個の変数を設定できそうです。

サンプルスケッチの、setup()にある接続周りの処理を実行すれば、あとはsipf_client.cppにある
SipfCmdTxコマンドでデータ送信が可能です。
先ほどの例で、気温を送信したい場合は、

SipfCmdTx(0x01, OBJ_TYPE_FLOAT32, (uint8_t*)&temperature, 4, buff);

のようにして送信できます。
引数は、第一引数から

//タグID(0x00-0xff)
uint8_t tag_id;
//spif_client.h enum SimpObjTypeId データ型enum
SimpObjTypeId type;
//データ本文
uint8_t *value;
//データレングス(バイト)
uint8_t value_len;
//モジュールからのレスポンスバッファー(?)
uint8_t *otid;

という理解で使うことができました。
それでは実際に任意の値を送ってみます。



M5StackにGROVE接続のSensirion SCD41 CO2 温湿度センサーを接続しました。
SCD41は、Sensirion公式のArduinoライブラリがあり、M5Stackで即動作させることが可能です。
SCD41のサンプルスケッチに、さくらのモノプラットフォームのサンプルスケッチを合体したものを作ってデータ送信してみました。
データ送信は、以下のようにしています。

//CO2送信コマンド発行
ret = SipfCmdTx(0x00, OBJ_TYPE_UINT16, (uint8_t*)&co2, 2, buff);
//気温送信コマンド発行
ret = SipfCmdTx(0x01, OBJ_TYPE_FLOAT32, (uint8_t*)&temperature, 4, buff);
//湿度送信コマンド発行
ret = SipfCmdTx(0x02, OBJ_TYPE_FLOAT32, (uint8_t*)&humidity, 4, buff);

タグID: 0x00をCO2
タグID: 0x01を気温
タグID: 0x02を湿度
にして、それぞれuint16 float32形式で送信しています。

測定は5秒に1度測定してLCDに表示、送信は1分に1度最新の値を送信するようにしました。

送信したデータは、WebSocket APIを使うとリアルタイムに確認することができます。



これはwscatを使ってコンソールで接続していますが、ブラウザのJavaScriptでWebSocket接続することも可能です。
(WebSocket APIのエンドポイントURLは公開しないほうがよさそうなので、公開するなら間にプロキシがいるかも)

デバイスが送信したデータを受信するAPIは、サービスアダプタと呼ぶようです。
サービスアダプタには、このWebSocket APIに加え、Outgoing Webhook、Incoming Webhookが作成できます。
HTTP APIを自前サーバーで作っておけば、データ受信時にHTTPリクエストで受け取ることも可能なようです。
それに加えて、今回は使っていませんが、デバイスからデータを送信するほかに、デバイスにデータを送信することも可能です。

それでは、データが送信できているのを確認したので、データ蓄積や表示ができるようにしたいと思います。

さくらのクラウドでは、もちろんVPSサーバーやデータベース、VPCルーターなどを作成可能であるため、
エッジデバイスのデータ送信からバックエンドまでワンストップで行うことが可能です。

モノプラットフォームのベータテストアカウントでは、なんと太っ腹なことにこれらのクラウドサーバーサービスも無料でトライアル可能でした。
非常にリッチなVPSなども立ち上げ可能ですが、1クライアントではそれほどのスペックは必要ないため、

プラン/2Core-2GB OSはUbuntuのサーバー ストレージは20GB SSD
MariaDB 10.4 シングル構成 1Core RAM2GB ディスク10GB
VPCルーター
スイッチ

という構成で組んでみました。



それぞれWebUIからぽちぽち押していくだけで作れるので簡単に設定できます。

Ubuntuサーバーを使って、Node.jsでWebSocket APIに接続し、データを受信したらデータベースに書き込み
別にNode.jsでHTTP APIも作ってデータベースから値を引っ張ってくるAPI動かすようにしました。
CO2、温度、湿度の順番でデータを送信しているため、それぞれ受信して3つが揃った段階でデータベースに書き込むようにしています。
あとはNginxで表示ページをホストして、Chart.jsでグラフを表示させるようにして完成です。



このへんはセンサー系のPoCではいつもどおりの作業ですね

使ってみた感想ですが、データ送信を非常に簡単に行えるのがメリットだと思います。

データ送信から受信までのプロセスを含め、1から作ることも可能ですが、
プロトコルを作るところから始まることになり非常に煩雑です。
モジュール、アンテナの技適やモデムコマンドを含むデータシートの開示のためのNDA契約など、
一切のプロセスを飛ばして、いきなりコマンドラインで受信可能な状態になることは
非常にアドバンテージがある仕組みだと思います。
セルラーIoTを初めたいけど、何からはじめていいかわからない、という方は1つのアカウントで
エッジデバイスからサーバーサイドまで管理できて明朗会計なさくらのモノプラットフォームがおすすめです!