【新機能】SORACOM Funnelを使ってLoRaゲートウェイからのデータをAWSに流す #scd2016 #soracom

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はSORACOM Conference "Discovery"というSORACOMさんのイベント会場に来ております。こちらからご紹介するのはSORACOM FunnelがLoRaに対応した、というお話です。

LoRaって何

"LoRa"とはLPWA(Low Power Wide Area Networkと呼ばれる 無線通信規格の1つです。Bluetoothとか赤外線通信とかの仲間ですね。特徴としてはなんといっても「長距離(最大15km)」というところです。LoRaはモジュールとゲートウェイからなるのですが、ゲートウェイが5〜6個あれば町ひとつをまるまるカバーする、ということも可能なレベルです。

他には「低消費電力」「周波数帯にサブギガ帯を使うため免許がいらない」等が挙げられます。

SORACOM meets LoRa

そんなこれからの時代の通信規格LoRaですが、この度SORACOMがそのプラットフォームを拡張してLoRaに対応することになりました。

lora_soracomfunnel1

具体的にはLoRaのゲートウェイからSORACOMネットワークを通じてインターネットへ繋がるわけですね。

SORACOMのサービスは使えるのか

SORACOMとLoRaが繋がる、ということは期待するのは「SORACOMのサービスは使えるのか」というところですね。
今回の発表ではSORACOMのコンソールが改修されてLoRa対応となり、SORACOM BeamとSORACOM FunnelがLoRaデバイスから使えるようになりました!

lora_soracomfunnel2

SORACOMのSIMとLoRaデバイスが一つのコンソールで同じように管理出来る、というのは非常に便利ですね。
今回はプレビュー版をいち早く触る機会がありましたので早速使ってみました。

やってみた

今回はLoRaモジュールをつけたArduinoにPIR(人感)センサーをつけて、そのデータをLoRaゲートウェイからSORACOM Funnelを通じてKinesis Firehose -> S3へと流してみたいと思います。

まずLoRaモジュールをArduinoにつけます。

lora_funnel8

右側の長四角いモジュールがLoRaです。更にPIRセンサーを取り付けたらArduinoのスケッチを書きます。LoRaは1回に11バイトしか飛ばないのでJSONをそのまま飛ばしたりするよりはバイナリ化して飛ばすのが良いでしょう。今回は一緒についていたGPSデータと共に飛ばしてみました。

#define LED_PIN 13

#define LoRa_RX_PIN 2 // Arduino 2pin to LoRa module TX
#define LoRa_TX_PIN 3 // Arduino 3pin to LoRa module RX
#define PIR_PIN 6

#define SERIAL_WAIT_TIME 5000
#define LoRa_SEND_INTERVAL 20000
...
...

void setup() {
  pinMode(12, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(PIR_PIN, INPUT_PULLUP);

  Serial.begin(9600);
  Serial.println("Start");

  LoRa.begin(9600);
  LoRa.setTimeout(SERIAL_WAIT_TIME);

  ...
}

void loop() {
  static int col = 0;

  unsigned long fix_age;
  int year;
  byte month, day, hour, minutes, second, hundredths;
  
  ...
  ...
  
  if (millis() - beforetime > LoRa_SEND_INTERVAL) {
    sendPIRaxis();
    //Reset Times and Counts
    beforetime = millis();
    pir = 0;
  }
}

bool sendATcmd(String cmd, int waitTime)
{
  // activate LoRa serial
  LoRa.listen();

  // serial command send
  LoRa.print(cmd);
  LoRa.print("\n");

  // command log
  Serial.print(">");
  Serial.println(cmd);

  delay(waitTime);

  // response check from serial buffer
  if(LoRa.find("OK")) {
    Serial.println("OK");
    return true;
  } else {
    Serial.println("NG");
    return false;
  }
}

boolean isHandsDetected()
{
  int sensorValue = digitalRead(PIR_PIN);
  if(sensorValue == HIGH)
  {
    return true;
  }
  else
  {
    return false;
  }
}

bool sendPIRaxis()
{
  char cmdline[256];
  short status = 1;

  sprintf(cmdline, "AT+DTX=22,%02x%08lx%08lx%04x", status, latitude, longtude, pir);
  if (!sendATcmd(cmdline, SERIAL_WAIT_TIME)) {
    Serial.println("Request Failed");
    return false;
  }
  return true;
}

これでLoRa_SEND_INTERVALの期間毎にPIRセンサーデータとGPSデータが合わせてLoRaモジュールに送られます。これをLoRaゲートウェイを通じてSORACOM Funnelに送ります。ではLoRaに対応したSORACOMコンソールを見てみましょう。

lora_funnel2

左上の所にLoRaデバイス用の管理メニューが追加されています。押してみましょう。

lora_funnel3

登録されているLoRaモジュールのIDが表示されます。後はこのモジュールとSORACOM Funnelを設定したグループを紐付ければOKです。SORACOM Funnelをグループに設定する詳細はこちらの記事を御覧ください。

まずはSORACOMとAWSを繋げる認証情報を登録します。「セキュリティ」メニューから「認証情報ストア」ナビを開いて新規にAWS認証情報を登録します。具体的に言うとIAM Userを作り、Kinesis Firehoseへの操作権限をつけてAPI KeyとAPI Secret Keyをここに登録するわけですね。

lora_funnel9

次に新規グループを作成します。

lora_funnel4

SORACOM Funnelのパネルをクリックして

lora_funnel5

Kinesis FirehoseのURLと先程登録した認証情報を設定します。

lora_funnel6

これで完成です。後はグループを対象となるLoRaデバイスに設定すればデータがLoRaからSORACOMを通じてKinesis Firehoseに流れます。

lora_funnel7

一応AWS側の設定も見てみましょう。Firehoseは東京リージョンがないのでオレゴンリージョンに作ってます。こちらは単純に来たデータをS3のバケットに流す、というだけのものです。

lora_funnel10

後はArduinoを動かしてデータを流すと、S3バケットにデータが溜まっていきます。

中身を見てみると、LoRaからのデータが入っています。

{"operatorId": "OP0058834581", "timestamp": 1467967090095, "destination": {"resourceUrl": "https://firehose.us-west-2.amazonaws.com/discovery_sample", "service": "firehose", "provider": "aws"}, "credentialsId": "discovery_test_funnel", "payloads": {"topic": "LoRa/soracom/0600001c", "message": {"gatewayData": {"gwip": "172.20.0.70", "snr": 113, "gwid": "00001c497b48dc39", "rssi": -81}, "moduleData": {"date": "2016-07-08T08:38:23.000Z", "macAddr": "0600001c", "data": "0100000000000000000000"}}}, "sourceProtocol": "lora", "deviceId": "0600001c"}
{"operatorId": "OP0058834581", "timestamp": 1467967105301, "destination": {"resourceUrl": "https://firehose.us-west-2.amazonaws.com/discovery_sample", "service": "firehose", "provider": "aws"}, "credentialsId": "discovery_test_funnel", "payloads": {"topic": "LoRa/soracom/0600001c", "message": {"gatewayData": {"gwip": "172.20.0.70", "snr": 105, "gwid": "00001c497b48dc39", "rssi": -81}, "moduleData": {"date": "2016-07-08T08:38:38.000Z", "macAddr": "0600001c", "data": "0100000000000000000001"}}}, "sourceProtocol": "lora", "deviceId": "0600001c"}
{"operatorId": "OP0058834581", "timestamp": 1467967130373, "destination": {"resourceUrl": "https://firehose.us-west-2.amazonaws.com/discovery_sample", "service": "firehose", "provider": "aws"}, "credentialsId": "discovery_test_funnel", "payloads": {"topic": "LoRa/soracom/0600001c", "message": {"gatewayData": {"gwip": "172.20.0.70", "snr": 108, "gwid": "00001c497b48dc39", "rssi": -76}, "moduleData": {"date": "2016-07-08T08:39:03.000Z", "macAddr": "0600001c", "data": "0100000000000000000001"}}}, "sourceProtocol": "lora", "deviceId": "0600001c"}
{"operatorId": "OP0058834581", "timestamp": 1467967155296, "destination": {"resourceUrl": "https://firehose.us-west-2.amazonaws.com/discovery_sample", "service": "firehose", "provider": "aws"}, "credentialsId": "discovery_test_funnel", "payloads": {"topic": "LoRa/soracom/0600001c", "message": {"gatewayData": {"gwip": "172.20.0.70", "snr": 108, "gwid": "00001c497b48dc39", "rssi": -78}, "moduleData": {"date": "2016-07-08T08:39:28.000Z", "macAddr": "0600001c", "data": "0100000000000000000000"}}}, "sourceProtocol": "lora", "deviceId": "0600001c"}

まとめ

いかがでしたでしょうか。LoRaデバイスでもインターフェースがSORACOM Airと全く同じなので、特に迷うことなく設定することが出来ました。特にFunnelの設定は今までと変わらないので、今まで作っていたグループを使いまわしも出来そうですね。これでLoRaもこわくない!是非お試し下さい。

参考リンク