【新機能】SORACOM Funnelを使ってLoRaゲートウェイからのデータをAWSに流す #scd2016 #soracom
こんにちは、せーのです。今日は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のゲートウェイからSORACOMネットワークを通じてインターネットへ繋がるわけですね。
SORACOMのサービスは使えるのか
SORACOMとLoRaが繋がる、ということは期待するのは「SORACOMのサービスは使えるのか」というところですね。
今回の発表ではSORACOMのコンソールが改修されてLoRa対応となり、SORACOM BeamとSORACOM FunnelがLoRaデバイスから使えるようになりました!
SORACOMのSIMとLoRaデバイスが一つのコンソールで同じように管理出来る、というのは非常に便利ですね。
今回はプレビュー版をいち早く触る機会がありましたので早速使ってみました。
やってみた
今回はLoRaモジュールをつけたArduinoにPIR(人感)センサーをつけて、そのデータをLoRaゲートウェイからSORACOM Funnelを通じてKinesis Firehose -> S3へと流してみたいと思います。
まずLoRaモジュールをArduinoにつけます。
右側の長四角いモジュールが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デバイス用の管理メニューが追加されています。押してみましょう。
登録されているLoRaモジュールのIDが表示されます。後はこのモジュールとSORACOM Funnelを設定したグループを紐付ければOKです。SORACOM Funnelをグループに設定する詳細はこちらの記事を御覧ください。
まずはSORACOMとAWSを繋げる認証情報を登録します。「セキュリティ」メニューから「認証情報ストア」ナビを開いて新規にAWS認証情報を登録します。具体的に言うとIAM Userを作り、Kinesis Firehoseへの操作権限をつけてAPI KeyとAPI Secret Keyをここに登録するわけですね。
次に新規グループを作成します。
SORACOM Funnelのパネルをクリックして
Kinesis FirehoseのURLと先程登録した認証情報を設定します。
これで完成です。後はグループを対象となるLoRaデバイスに設定すればデータがLoRaからSORACOMを通じてKinesis Firehoseに流れます。
一応AWS側の設定も見てみましょう。Firehoseは東京リージョンがないのでオレゴンリージョンに作ってます。こちらは単純に来たデータをS3のバケットに流す、というだけのものです。
後は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もこわくない!是非お試し下さい。