FJCT Tech blog

富士通クラウドテクノロジーズ公式エンジニアブログです

富士通クラウドテクノロジーズ

FJCT/Tech blog

SORACOM Air for LoRaWANを使ってみた

はじめに

こんにちは富士通クラウドテクノロジーズの呉屋です。
デジタルIoTソリューション部に所属しており、普段はデータを主軸にした新規サービスの開発をやっています。

今回はLPWAのサービスを使ってのデータ通信を試してみました。

※ LPWAそのものについては多くの人が記事や説明を書いているので省略します。
以下の記事などが参考になります。

動機

我々のチームではこれまでBLE,Wi-Fi,ZigBee,セルラーなど様々な通信方式を使ってきました。

※ これまで使用した通信モジュールやデバイス

通信方式やデバイスにはそれぞれ強み弱みがあり、求められている要件に応じて適切に選ぶ必要があります。
また我々のチームではPoCの速度を重視しているため、知識としてだけではなく実際に使えるようになっていることが求められています。

元々LPWAについては調べてはいましたが、使ったことがありませんでした。
そこで今回は、LPWAの中でもPoCとの相性がよさそうなSORACOM Air for LoRaWANサービスを使ってみました。

SORACOM Air for LoRaWANについて

SORACOMが提供しているLoRaWANのサービスです。
具体的には以下を提供しています。

SORACOM Air for LoRaWANではデバイスからLoRaゲートウェイへ最大11byteまで送信することができます。

f:id:goya813:20180322192036p:plain

LoRaデバイス

SORACOM Air for LoRaWANは3つの製品を販売しています。

  • LoRa Arduino 開発ボード AL-050
  • STM32L0 LoRa Discovery Kit
  • LoRa GPS トラッカー LT-100

Arduinoが慣れているためLoRa Arduino 開発ボードで進めていきます。

LoRaゲートウェイ

SORACOMのゲートウェイには「所有モデル」と「共有サービスモデル」の2種類あります。
違いを簡単にまとめると以下のとおりです。

  • 所有モデル
    • ゲートウェイを所有権を月単位で契約する
    • 所有権を持っているため設置場所やゲートウェイの公開・非公開を自由に決められる
    • その代わり比較的高い
  • 共有サービスモデル
    • ゲートウェイの所有権をSORACOMのまま月単位でレンタルする
    • 所有権は持っていないため設置場所はSORACOmに申請する必要がある
    • ゲートウェイは非公開にできず、必ず公開になる ← ここ重要
    • その代わり比較的安い

共有サービスモデルで公開されたゲートウェイには、SORACOMのLoRaWANデバイスであれば誰でも通信することができます。
他ベンダーはLoRaWANのゲートウェイを自前で準備するケースが多いですが、SORACOMはユーザの力を借りてゲートウェイを広げることができます。
このモデルはSORACOM特有なのかなと思います。

料金などの詳しい内容についてはSORACOMのページに書かれています。

今回は共有サービスモデルで公開してくれているゲートウェイを使用し通信しました。
ゲートウェイを公開してくれているユーザには感謝しかありません。

公開されているゲートウェイはSORACOM LoRa Spaceで探すことができます。

余談ですが、会社(西新宿)の周りには公開されているゲートウェイは残念ながら無かったので、六本木一丁目駅すぐ近くにあるTechShopで作業していました。(六本木周りはゲートウェイが多い気がする)

SORACOM Platform

SORACOM Air for LoRaWANでは3つのSORACOM Platformが使えます。

  • SORACOM Beam
    • LoRaデバイスから送られてきたデータを他サーバに転送するサービス
  • SORACOM Funnel
    • LoRaデバイスから送られてきたデータを他サービスに転送するサービス
    • Beamとは違いクラウドサービスに特化していて、対応したサービスであればほぼ設定いらずに利用が可能
    • 対応サービス
      • AWS IoT
      • Amazon Kinesis
      • Amazon Kinesis Firehose
      • Microsoft Azure Event Hubs
      • Google Cloud Pub/Sub
      • アクロクエストテクノロジー株式会社 Torrentio
      • 株式会社アプレッソ DataSpider Cloud
      • ブレインズテクノロジー株式会社 Impulse
      • インフォテリア株式会社 Platio
      • Kii Thing Interaction Framewor
      • ウィングアーク1st株式会社 MotionBoard
  • SORACOM Harvest
    • データの収集・蓄積・可視化するサービス

使ってみた

使ってみる前に

まずは動作するかを確認するため、SORACOMが公開している↓の「LoRaWANデバイス設定ガイド」に沿って設定を行います。

上手く設定できた場合には、SORACOMのダッシュボード上で何かしら可視化されているかと思います。

構成

今回はArduinoで温度、湿度データを5秒おきに送信して、SORACOM Harvestで可視化しました。

f:id:goya813:20180322192132p:plain

送られてくるバイナリデータのパース

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);
}

可視化画面

f:id:goya813:20180322192407p:plain

使ってみての所感

  • 共有してくれているゲートウェイを使ってて言うのもなんですが、ネットワークは結構繋がらない時もあったので今後に期待です(我々も共有サービスモデル立てたい)
  • データを使った新規サービスのPoCをやる上でデータの収集・蓄積・可視化は必須となるのでそちらを委譲できるのはうれしいです
    • バイナリパーサーも機能がリッチでかなり良かったです
  • 全体的に使い勝手良かったですが、欲を言うとPoCで使う際を考えると↓の機能が欲しくなりました
    • 通知機能
      • 所属しているグループの接続数やデータの値を元にSlackなどの他サービスへの通知
      • 通知機能がないとPoC中ちゃんと繋がっているかを定期的にダッシュボードを見にいくのは辛い
    • URL共有機能
      • Harvestの可視化部分のみをURLで共有
        • 可視化部分のみを見れるアカウントを発行
      • 我々はPoCをする際お客さんと共同でやることが多いため、動作状況をお客さんにも見せる必要がある
        • 現状だとお客さんにデータを見せるには別途用意する必要がある

最後に

SORACOMのLoRaWAN以外にもLPWAは試してみたりしているので、また時間ある時に他のLPWAについても書いていきたいと思います!