見出し画像

【IoT】消費電力量低減のため、複数回の計測データをSORACOMに一括送信する2〜課題と解決方針〜

前回記事では、消費電力量低減のため、複数回の計測データをSORACOMに一括送信する意義と課題について、整理しました。本記事では課題解決案を考えます。


背景と目的

電池駆動型IoTデバイスにおいて、消費電力量の低減は最重要課題の一つです。消費電力量を下げる手段の一つとして、IoTデバイスに接続されたセンサーで現場データを取得後、毎回クラウドに送信するのではなく、IoTデバイスに一時保存し、一括で送信することが考えられます。

前回記事では、これを実現するための方針と、5つの課題を洗い出しました。本記事では、課題に対する解決案を考えます。

なお、前提としてArduinoマイコンxLTE-M Shield for Arduinoで、本方法を実現する方法を考えます。

詳細

1. 如何に計測データをIoTデバイス内に一時保存するか?

(a)マイコンのEEPROMに一時保存する方法と、(b)microSDに一時保存する方法とが考えられます。今回はArduinoマイコン+LTE-M Shield for Arduinoを想定しますが、Arduinoマイコンには標準でmicroSDが搭載されていないため、マイコンのEEPROMに一時的に保存するのがよいと考えました。

2. 送信エラー時の処理をどうするか?

これは、例えば24個のデータをまとめて送信する場合、送信のタイミングで送信エラーとなってしまった場合どうエラー処理するか、という意味です。24個目のデータをEEPROMに保存し、25回目で再度送信するという方向性が良さそうです。

ただし、EEPROMの容量が限られているため、送信エラーが続くと欠測してしまいます。何回分の送信エラーを想定するかや、欠測が許されるかどうかなど、要件を定義する必要があります。microSDの場合は容量がGBオーダーであるため、問題にはなりませんが、Arduino Uno R3のEEPROM容量は1024バイトであるため容量の考慮が必要です。

3. 計測時刻と送信時刻が異なるため、如何に計測時刻を記録するか?

計測のたびにクラウドに送信する場合、SORACOM側の受信時刻でグラフ化すればよく、原則、IoTデバイス側で現在時刻を取得する必要がありませんでした。

一方、一括送信する場合は、計測時刻と送信時刻が異なるため、計測データとともに計測時刻を送信する必要があります。これに関しては、通信時の時刻はNTP(Network Time Protocol)から取得した時刻とし、通信しないときの時刻は、NTPの時刻+sleep時間とするとしました。

4. 複数回分の計測データを、どのようなデータフォーマットで送信するか?

(a)1回分の計測データをループ処理で送信する方法と、(b)複数回分のデータを一括で送信する方法が考えられます。

ここで配慮すべきはSORACOM側の受信頻度の制約です。1つのSIMからの受信頻度は1秒以上が推奨されているようです。確かに、SORACOM Harvestの場合、同時刻(同秒)受信したデータは、上書きされてしまいます。(a)の場合、UDP送信の場合はmsオーダーでループ処理&データ送信できるものの、SORACOM側の制約で1秒以上delayさせる必要がでてきます。

よって、(b)の一括送信が良さそうです。ただし、ここにも一つ落とし穴があります。それは、IoTデバイスからバイナリ形式でデータ送信し、SORACOMのバイナリパーサーでJSONに変換する想定をすると、データ数が固定の場合は良いのですが、通信エラー等でデータ数が変わってしまった場合、バイナリの桁数が変わるため、バイナリパーサーで意図しない変換をしてしまう可能性が出てきます。これらを考慮すると、以前の記事で紹介した、バイナリの通信量の軽さと、JSONのデータフォーマットをわかりやすさを兼ね備え、データフォーマットをIoTデバイス側で自由に設計できるCBOR形式でのデータ送信が良さそうです。

5. 計測時刻と送信時刻が異なるため、クラウド側でどのようにグラフ化するか?

前述の通り、計測のたびにクラウドに送信する場合は、SORACOM側の受信時刻でグラフ化することができました。一方、計測時刻と送信時刻が異なる場合は、時刻付与が必要になります。SORACOM公式ブログを参考にすると、HTTPヘッダーにx-soracom-timestampを用いることで、タイムスタンプを付与できます。

タイムスタンプ付与方法としては、(a)IoTデバイス側でx-soracom-timestampを付与し、HTTPでクラウドに送信する方法と、(b)IoTデバイスからはUDPで送信し、クラウド側でx-soracom-timestampを付与する方法が考えられます。消費電力量の観点から、(b)がベターです。

SORACOM公式ブログを参考に、SORACOM Inventoryを用い、タイムスタンプを付与したデータをSORACOM Harvestにデータ戻すのがよいと考えました。IoTデバイスから送信されたデータを、SORACOM FunkでAWS Lambdaに転送し、AWS Lambdaでx-soracom-timestampで時刻付与し、さらに、SORACOM Inventoryで生成したキーを利用してSORACOM Harvestにデータを戻す作戦です。

まとめと今後の課題

消費電力量低減のため、複数回の計測データをSORACOMに一括送信する場合の5つの課題と、各課題に対する解決案を考えました。

方針と課題解決案を整理できたので、具体的なプログラムを進めます。

参考

・過去データをSORACOM Lagoonで可視化するには、x-soracom-timestampを用いれば良いです。

・SORACOM Inventoryを用いて、SORACOM Harvestにデータを入れる方法は、この記事が参考になります。

・CBOR送信に関しては、下記記事を参照ください。


この記事が気に入ったらサポートをしてみませんか?