はじめに
こんにちは富士通クラウドテクノロジーズの呉屋です。
デジタルIoTソリューション部に所属しており、普段はデータを主軸にした新規サービスの開発をやっています。
今回はLPWAのサービスを使ってのデータ通信を試してみました。
※ LPWAそのものについては多くの人が記事や説明を書いているので省略します。
以下の記事などが参考になります。
動機
我々のチームではこれまでBLE,Wi-Fi,ZigBee,セルラーなど様々な通信方式を使ってきました。
※ これまで使用した通信モジュールやデバイス
- RN42
- BL600
- ESP-WROOM-02
- ESP32
- Xbee
- RaspberryPi3
通信方式やデバイスにはそれぞれ強み弱みがあり、求められている要件に応じて適切に選ぶ必要があります。
また我々のチームではPoCの速度を重視しているため、知識としてだけではなく実際に使えるようになっていることが求められています。
元々LPWAについては調べてはいましたが、使ったことがありませんでした。
そこで今回は、LPWAの中でもPoCとの相性がよさそうなSORACOM Air for LoRaWANサービスを使ってみました。
SORACOM Air for LoRaWANについて
SORACOMが提供しているLoRaWANのサービスです。
具体的には以下を提供しています。
SORACOM Air for LoRaWANではデバイスからLoRaゲートウェイへ最大11byteまで送信することができます。
LoRaデバイス
SORACOM Air for LoRaWANは3つの製品を販売しています。
Arduinoが慣れているためLoRa Arduino 開発ボードで進めていきます。
LoRaゲートウェイ
SORACOMのゲートウェイには「所有モデル」と「共有サービスモデル」の2種類あります。
違いを簡単にまとめると以下のとおりです。
- 所有モデル
- 共有サービスモデル
共有サービスモデルで公開されたゲートウェイには、SORACOMのLoRaWANデバイスであれば誰でも通信することができます。
他ベンダーはLoRaWANのゲートウェイを自前で準備するケースが多いですが、SORACOMはユーザの力を借りてゲートウェイを広げることができます。
このモデルはSORACOM特有なのかなと思います。
料金などの詳しい内容についてはSORACOMのページに書かれています。
今回は共有サービスモデルで公開してくれているゲートウェイを使用し通信しました。
ゲートウェイを公開してくれているユーザには感謝しかありません。
公開されているゲートウェイはSORACOM LoRa Spaceで探すことができます。
余談ですが、会社(西新宿)の周りには公開されているゲートウェイは残念ながら無かったので、六本木一丁目駅すぐ近くにあるTechShopで作業していました。(六本木周りはゲートウェイが多い気がする)
SORACOM Platform
SORACOM Air for LoRaWANでは3つのSORACOM Platformが使えます。
- SORACOM Beam
- LoRaデバイスから送られてきたデータを他サーバに転送するサービス
- SORACOM Funnel
- SORACOM Harvest
- データの収集・蓄積・可視化するサービス
使ってみた
使ってみる前に
まずは動作するかを確認するため、SORACOMが公開している↓の「LoRaWANデバイス設定ガイド」に沿って設定を行います。
上手く設定できた場合には、SORACOMのダッシュボード上で何かしら可視化されているかと思います。
構成
今回はArduinoで温度、湿度データを5秒おきに送信して、SORACOM Harvestで可視化しました。
- マイコン
- シールド
- LoRa Arduino 開発ボード(以下 LoRaシールド)
- Grove ベースシールド(以下 Groveシールド)
- センサ
- Grove デジタル温湿度センサ
- LoRaゲートウェイ
- 公開されているゲートウェイを使用
- SORACOMサービス
- Harvest
送られてくるバイナリデータのパース
ArduinoはSORACOM Platformにバイナリデータを送信します。
デフォルトだとSORACOM Platformでは送られてきたバイナリデータをそのまま数値として認識されてしまいます。
そのため、SORACOM PlatformではバイナリデータをパースするバイナリパーサーがPlatform内に実装されています。
これにより送られてきたバイナリデータを、所望のデータ型に変換することできます。
今回はバイナリパーサーを以下のように設定します。
humi:0:float:32 temp:4:float:32
上のバイナリパーサーでは
- 変数humiには0byteから32bit分のデータを代入しfloat型として認識
- 変数tempには4byteから32bit分のデータを代入しfloat型として認識
という設定をしています。
これで0-3バイトを湿度、4-7バイトを温度と認識させることができます。
SORACOMのバイナリパーサーの仕様は以下のページにあります。
ソースコード
提供されているライブラリでは以下の送信方法が実装されています。
- 文字列
- 1つのlong型
- バイト列
32bitのfloat型を送りたい場合はバイト列に変換する必要があります。
複数バイトのデータ型(int型やfloat型)を送信する場合はエンディアンネスに注意する必要があります。
ArduinoIDEが使用しているgccではfloat型はリトルエンディアンになっていますが、SORACOM Platformに搭載しているバイナリパーサーはデフォルトではビッグエンディアンになっています。
そのためバイト列に変換する際に順番を逆にする必要があります。
※ バイナリパーサーのオプションでリトルエンディアンが使えることはプログラム書いた後に気づきました
#include <lorawan_client.h> #include "DHT.h" #define DHTPIN A0 #define DHTTYPE DHT11 LoRaWANClient client; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.print("Connecting ... "); if(! client.connect()) { Serial.println(" failed to connect. Halt..."); for(;;){}; } dht.begin(); } void pack_float(byte* packet, float data, int offset) { for (short i = 0; i < 4; i++){ *(packet + offset + i) = ((byte *)&data)[3 - i]; } } void pack_sensing_data(byte* packet) { float humi = dht.readHumidity(); float temp = dht.readTemperature(); Serial.print("Humi: "); Serial.print(humi); Serial.print(", Temp: "); Serial.println(temp); pack_float(packet, humi, 0); pack_float(packet, temp, 4); } void loop() { byte packet[11] = {0}; pack_sensing_data(packet); Serial.print("Send: "); client.sendBinary((byte *)packet, 8); flag_send_data = false; delay(1000 * 5); }
可視化画面
使ってみての所感
- 共有してくれているゲートウェイを使ってて言うのもなんですが、ネットワークは結構繋がらない時もあったので今後に期待です(我々も共有サービスモデル立てたい)
- データを使った新規サービスのPoCをやる上でデータの収集・蓄積・可視化は必須となるのでそちらを委譲できるのはうれしいです
- バイナリパーサーも機能がリッチでかなり良かったです
- 全体的に使い勝手良かったですが、欲を言うとPoCで使う際を考えると↓の機能が欲しくなりました
- 通知機能
- 所属しているグループの接続数やデータの値を元にSlackなどの他サービスへの通知
- 通知機能がないとPoC中ちゃんと繋がっているかを定期的にダッシュボードを見にいくのは辛い
- URL共有機能
- Harvestの可視化部分のみをURLで共有
- 可視化部分のみを見れるアカウントを発行
- 我々はPoCをする際お客さんと共同でやることが多いため、動作状況をお客さんにも見せる必要がある
- 現状だとお客さんにデータを見せるには別途用意する必要がある
- Harvestの可視化部分のみをURLで共有
- 通知機能
最後に
SORACOMのLoRaWAN以外にもLPWAは試してみたりしているので、また時間ある時に他のLPWAについても書いていきたいと思います!