【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送信に関しては、下記記事を参照ください。