いろんな技術にふれたい

いろんな技術に触れたい

日頃色々触れた技術を自分なりにまとめておきたいと思ってます。難しいものほどブログ書く時間がかかるのが問題・・・

センスウェイさんのLoRaWANスターターキットを試してみた - サーバーレスにセンサデータ取得&可視化

Getting start the Senseway LoRaWAN Starter Kit - get the sensor data and visualize it

やっていくぞ!ということで今回はセンサデータの取得と可視化を試します.

キットなどについての前の記事はこちら.

tokina.hatenadiary.jp

スターターキットに含まれていたのは以下のものでした.

  • Arduino Uno互換機
  • LoRa (WAN)通信モジュール
    • LoRaアンテナ(800MHz ~ 1GHz向け?)
    • USB-Bケーブル
  • LoRaWAN屋内用ゲートウェイ
    • アンテナ
    • Mini USBケーブル
    • USB変換アダプタ
    • LANケーブル
  • 温度センサ(ADT7410)

今回はこのADT7410のデータ取得から,その値をMicrosoft Power BIを利用して可視化するまで試してみます.

実際にデータを取得して送ってみる

センサノードのキットなので,LoRaWANでセンサデータを収集しましょう.

センサを試す(センサ値取得)

さっき(前の記事)はとりあえず何もないデータを送っていただけなので,センサ値取得も試してみます.

キットに含まれていたのはADT7410というI2C温度センサです(以下はAnalog Devicesのリンク).

ADT7410 データシートおよび製品情報 | アナログ・デバイセズ

  • 温度精度
    • ±0.5℃@-40℃~+105℃(2.7V~3.6V)
    • ±0.4℃@-40℃~+105℃(3.0V)
  • 16ビット温度分解能:0.0078℃
  • 高速な最初の温度の変換時間:パワアップ後6ms
  • 温度範囲:-55℃~+150℃
  • 電圧範囲:2.7V~5.5V
  • I2C互換インターフェース

ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール: センサ一般 秋月電子通商-電子部品・ネット通販

​ 基板上の入出力端子:4個(VDD,GND,SCL,SDA)

ちなみにピンはLoRaWAN ShieldがそのままUnoに乗ってるので,Unoのピン配置のI2Cを確認.

https://ht-deko.com/arduino/uno.html

つなげるとこんな感じに.

ConnectPin

KashiwaGeeksのサンプルにあった「I2C_Temp_Sensor_and_GPS_Sample」とwsnakさんのブログを参考に,とりあえずKashiwaGeeksを利用して温度の値だけ取れるようにしてみます.I2Cの利用はWire.hが使えるとか.8bitで値を取得します(16bitでもできるっぽい?).

KashiwaGeeks/examples/I2C_Temp_Sensor_and_GPS_Sample at master · ty4tw/KashiwaGeeks · GitHub

I2C温度センサADT7410を使う(1) | wsnakのブログ

I2C温度センサADT7410を使う(5) 16bitで読み出し | wsnakのブログ

改めて作成したサンプルはここに.

KiwiLoRaShield/I2C_Temp_Sensor.ino at master · himitu23/KiwiLoRaShield · GitHub

シリアルモニタでログが見れます.

**** I2C_Temp_Sensor_Sample (only get the temp data) *****

_/_/_/ KashiwaGeeks 0.10.3 _/_/_/

Temp=21.31 [C]
Sleep.
Wakeup.
Temp=21.38 [C]
Sleep.
Wakeup.
Temp=24.88 [C]
Sleep.
Wakeup.
Temp=26.19 [C]
Sleep.

これでデータが取得できました.これをベースに送信プログラムを作成します.

LoRaWANサーバへセンサデータを送る&確認する

取得したデータを送るようにします.これも他のサンプルとかを見て適当に.

作成したプログラムはこちら.

KiwiLoRaShield/I2C_Temp_Send.ino at master · himitu23/KiwiLoRaShield · GitHub

取得した温度のデータを1分に1回送信します.シリアルモニタログはこんな感じ.

**** I2C_Temp_Send *****
try to join... accepted.

_/_/_/ KashiwaGeeks 0.10.3 _/_/_/

Temp=21.75 [C]
2175.00

Send  =>lorawan tx ucnf 16 2175<=

Recv  =>lorawan tx ucnf 16 2175

>> Ok

>> tx_ok

> <=
Error Code(0 is Sccess): 0
Sleep.
Wakeup.
Temp=21.63 [C]
2162.00

Send  =>lorawan tx ucnf 16 2162<=

Recv  =>lorawan tx ucnf 16 2162

>> Ok

>> tx_ok

> <=
Error Code(0 is Sccess): 0
Sleep.
Wakeup.
Temp=21.50 [C]
2150.00

あとの視覚化のために送信時のデータフォーマットをちょっといじって10進数にしています.以下の部分です(全体はプログラムをみてね).

int result = LoRa.sendData(portTemp, ECHO,F("%04d"),(int)temp);

Senseway Mission Connectのデバイスの通信量が増えていることを前の記事と同様に確認します.ノードの詳細→通信回数で確認できます.

しかしこれだとセンサのデータの中身を見ることができません.

そこでAzure IoT Hubに投げて可視化してみます.

Azureの利用 - 可視化を試す

昨年末センスウェイさんがAzure IoT Hubとの連携をサポートしてから、いまだそのデモのようなものがなさそうなので、これは私が作るしかない!というのが最初のモチベでした。

今回このAzure IoT Hubを利用して可視化サービスであるPower BIを試します(Power BIはマイクロソフトが提供する強力な可視化サービスの一つです).アーキテクチャは以下の通りです.

Arch

サーバーレスになっていますね!

まず公式でAzure IoT Hubとの連携ができるとアナウンスしていたので,センスウェイさんの公式サイトのマニュアルを参考に設定とかを行います.

service.senseway.net

Azureのアカウントは既に持っていたので,そのままAzure PortalからIoT HubとSenseway Mission Connectを連携設定しました.

連携できると以下のメッセージを確認できます(うまくいかないとErrorを吐きます).

項目   値
外部連携設定  Azure IoT-Hub
外部連携最終結果    2019/01/30T01:32 OK

こちらのサイトを参考にAzure IoT Hub→Analytics Jobs→Power BIを繋ぎます.Power BIは今回無料版を利用しました(メールアドレスは所属団体のものを利用しないといけないので大学のメールアドレスを).無料版はなんかわかりにくいので注意してください.一部に制限があります.

docs.microsoft.com

うまく連携できると,Analytics JobsのMonitoringで以下のようにデータが届いていることを確認できます.うまく動作したので一度寝るときにデバイスの電源を抜き,起きてから再度デバイスを電源につないで大学にでかけたのが分かります.それ以降もデータが流れてきていますね.

AzureIoTHubMetricsCheck

参考:https://docs.microsoft.com/en-us/azure/iot-hub/tutorial-connectivity

とりあえず,マイクロソフトの公式リンクの通りに進めると,Power BIでこんな感じに見えました.なお,Stream Analytics JobsをStopするとPower BIにデータは送られなくなります.

PowerBI_0

このままだとデータが届くのは確認できますが,肝心の温度データが取れていないので,ちょっと試行錯誤.何もしていない状態だと,JSONの各Elementが取れていますが,これでは何もできないです.もちろんデータの中身も見れません.

ここで取れていたフィールドはSenseway Mission Connect→Azure IoT Hubで流れてきたものです.そこでこの中にデータが入っているはずなので,その中身を取り出す必要があります.

Azure IoT HubにはSenseWay Mission ConnectからなにかしらのJSON Formatで送られているはずです.以下を参考にデータをParseするQueryをStream Analytics JobsのQueryに書くことでPower BIで値が取れるはずです.

docs.microsoft.com

JSON Formatはセンスウェイさんが公開していないようだったので,Power BIに最初見えていたElementを元に,適当に当たりをつけて調べました(スターターキットに含まれていた資料のとあるページも合わせて参考にしました).どうやら主なデータは"mod"に入っているようでした.また複数のgwが受信することも想定しているようですが,JSON Arrayは対応していない?ようなので取れなかったです.なお,今回判明した仕様は下記クエリ以外については私からは公開しません.

!公式マニュアルにセンスウェイさんの各JSONフォーマットが公開されていました!

service.senseway.net

JSON Format判明後,Stream Analytics JobsのJop topologyに以下のクエリを書きます(#のコメント部分は消してください).

SELECT
    IoTHub.ConnectionDeviceGenerationId,#IoT Hubで割り当てられるID
    DATEADD(hour, 9, IoTHub.EnqueuedTime) as EnqueuedTime, #IoT HubにInputされた時刻
    mod.fq,
    mod.cnt,
    CAST (mod.data AS bigint) as Temperature,
    mod.devEUI,
    mod.dr,
    mod.port
INTO
    SensewayVisualizeTestOutput #設定に依存
FROM
    SensewayNodeVisualizeTest #設定に依存

Azure IoT Hubが付与するJSONはこちらを参考:https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-define-inputs

Stream Analytics Jobs上のSQL Data Types:https://docs.microsoft.com/en-us/stream-analytics-query/data-types-azure-stream-analytics

SQLクエリ中の型変換についての参考Q&A:https://stackoverflow.com/questions/45550481/azure-stream-analytics-sql-to-convert-string-to-float

SELECT文はデフォルトだと「*」と,とりあえずJSONの中身を全て取ってくる仕様だったので,Senseway Mission Connectから取れそうなものを引っ張りました.周波数やメッセージカウントが取得できそうです.なお,そのままだとmod.dataはStringなので,公式のマニュアルに従ってbigint型へCASTします.ここ大事!

一度Stream Analytics Jobsを停止後,Queryを書き換えて再度Startします.するとPower BIのフィールドにこんな感じに見えると思うので,とりあえずそれぞれのデータをリスト表示してみました.

PowerBI_2

Queryで指定したElementがきちんとロードされており,とりあえずレポートでそれぞれのデータを見ることができました(固定の周波数じゃないのが気になります).

肝心の温度データは”temperature"に格納されています.ここで,Arduinoのプログラムは10進数でそのまま送るように(20.32度→2032として送信)変更しており,mod.dataの中身は10進数の温度データのみとしています.なので,bigint型にCASTしてそのままPower BIに流し込むことで,すぐに折れ線グラフにすることができるはず!

折れ線グラフを選択し,X軸にenqueuedtimeを,値にtemperatureを選択し,折れ線グラフにした結果はこちら(100倍した値になっています).

PowerBI_3

スケールとかは,ローラーのようなアイコンからいろいろいじれます.なお,Y軸はそのままなので,気温は×100した値になっていますがご愛嬌ということで.これで私の部屋の気温を無事グラフにすることができました.途中でばーんと上昇しているのは私がセンサを握ったからです.物理デバッグです.

これで実機を利用してセンサ値を取得,可視化することができました!!!おつかれさまでした

本当は公開したかったのですが,その機能はPro(めっちゃ高い)だけらしいです.ざんねん.

現在値の各可視化状況(リアルタイム)

↓現在値のグラフなどです(複数ページを作成しています)

  • ページ1: 折れ線グラフ
  • ページ2: 平均値+度数 (一番多かった温度の部分が尖っています)
  • ページ3: 最終更新時刻 (UTC + 9H = JST)
  • ページ4: 利用周波数 (GWが利用する周波数がばらついていたので棒グラフにしました)
  • ページ5: 生データ履歴

(おまけ)デバイスから取得したセンサの情報をスマホでみる

Power BIにはElasticsearchのKibanaのように,ピンボードがあり,iOSアプリのPower BIからこのピンボードへとアクセスできます.これでセンサのグラフを遠隔から見れますね.

App StoreでPower BIアプリをダウンロードし,ログインするとダッシュボードが見えます.

App1

今回は「SensewayTest」というダッシュボードを用意してみました.

App2

いくつか表示形式を用意してみました.一番上は折れ線グラフ,その下は現在の値を表示しています.これで自宅の気温が一発でわかります!

もちろんグラフだけを表示する事もできます.

App3

取得期間がそこまで長くないのでちょっと微妙ですが,とんがっている部分は私が寝るときで,寝ている間〜現在に気温が低下していることがわかります.最後にすこし尖っている部分がありますが,これは私が起きたタイミングです.

(おまけ)通信費用

センスウェイさんのサイトに価格について明示されています.

service.senseway.net

バイスあたりの課金金額はその月で一番通信した1日の接続回数で決まり、利用デバイスの課金額の合計で課金請求されます。

1日の接続回数  通信間隔の目安   通信形態    税抜金額(円)
12  2時間 上り・下り 30
48  30分   上り・下り 50
144 10分   上り・下り 100
288 5分    上り・下り 200
480 3分    上り・下り 300
1,440   1分    上り・下り 400

そんなに安くない気がします.

SenseWay Mission Connectにログインし,デバイス一覧から各デバイスの最大通信量を見ることができます.今回,キットを試した後はこんな感じになっていました.

No.  DevEUI      名前  タイプ   ステータス UpLink今月最大
1   **********  Senseway LoRa node example  ADB922S 使用中   919

これだと300円の繰り上がりの400円くらいでしょうか.この月はどれだけ使ってもこれを下回れば400円ということになります?

(おまけ)KashiwaGeeksを少し改造

KashiwaGeeksにおけるTASKの実行頻度は"interval by minute"とあるように分単位でしか設定できません(利用用途としては十分です).

ライブラリのApplication.cppにあるaddTask()では引数の型がuint32_tなので小数点も無理です..

デバッグがしづらいですね.というわけでちょっと改造しました.

forkして自分のリポジトリにおいています.

github.com

Applicationをいじってuint32_tをfloatに変更しています.

これで

TASK(taskTemp, 0, 0.1),

とすると,0.1分(=6秒)間隔で実行できるはずです.ただし,デューティサイクルには気をつけてください.電波を扱う場合はお互いにマナーを守りましょう.

※なんか4回目くらいで停止するのでライブラリ側で何かしら制限されているかもしれません

終わりに

修論があって,一息ついてから初めたのでちょっと遅くなってしまいました.センスウェイさんにせっかくキットを送っていただいたのに申し訳なかったです.

今回最も大変だったのは..

  • KashiwaGeeksの理解
  • Senseway Mission ConnectのAPIフォーマット周辺(仕様を公開したほうがいいと思います!)→公開されていました!!
  • Power BIでグラフを表示するためのJSONの変換周辺
  • Online Power BIについての情報が少なすぎる
    • Desktop版の資料が豊富です..

あたりでしょうか.

やり残したこと(研究風に言うと今後の課題)

  • 取り出した値を100で割りたい
    • Power BI上で可能?
  • 負の値に対応する
    • 送信時に+50して,受信側で再度-50したい
  • 消費電力などを調査したい

今回サーバーレスで構築したので,特に必要なメンテナンスもなく今後も利用できる仕組みになりました.また,インスタンスを借りたりするよりだいぶ楽です.

またちょうど2週間位前からAzureを触り始めていたので,ちょうどいいタイミングでした.Azure IoT Hubは初体験だったので,他のIoT関係でも活かせそうです.

もう少しキットを借りたままでも大丈夫?みたいなので,デバイスの解析やその他サービスとの連携,Node Redとの連携とか試してみたいですね.

1月末まで,との約束だったのでギリギリセーフです!この記事がセンスウェイさんのお役に立てば幸いです.

センスウェイさんのLoRaWANスターターキットを試してみた

Getting start the Senseway LoRaWAN Starter Kit

こんにちは.最近修論をどうにかやっつけたtokina(himitu)です.来週修論発表です(どうでもいい).今回はセンスウェイさんにLoRaWANスターターキットを頂いたので,その紹介をします!1月に間に合いました!!

長いので記事を分けました.センサ値取得〜可視化とか具体的な実装の話は次の記事を見てください

tokina.hatenadiary.jp

HIRATA Kenjiさん(@field_k),ありがとうございます!

www.senseway.net

私はLoRa/LoRaWANの研究をしており,理解しきれていない部分もあり,いまでも勉強中の身です.最近OpenwaveさんのDragino LoRaモジュールをいじったりしていました.

ではまず,入手した経緯から.

きっかけ

昨年「IoTつくるよ!」というIoTのプチ博覧会のようなイベントにてアールエスコンポーネンツさんのお仕事を手伝いました.

IoTMaking

www.tsukuruyo.net

アールエスコンポーネンツ(RS Components)社は電子部品の販売代理店で,Raspberry Piの正規代理店でもあります.もしかしたらロゴをみたことがあるかもしれません.

jp.rs-online.com

実は私はアールエスコンポーネンツのブランドである「DesignSpark」にて記事を書いたり翻訳したりしています.

そんなこんなで,IoTつくるよ!にてお手伝いさせていただいていたのですが,アールエスコンポーネンツさんのブースの近くにセンスェイさんがいました(なおとなりはDoroneのOS開発をされているDoCoJAのブースでした).

このとき数週間前からLoRaWANのサービスを提供しているというセンスェイさんについてはTwitterで目にしていました.

twitter.com

IoTつくるよ!にセンスェイさんがいるのは当日,開始時間になってから知りました.

これがきっかけとなり,スターターキットをいただくことになりました.それが昨年末のことです(あれから研究をずっとやっていました).

IoTMaking_Senseway

LoRaWANスターターキット

LoRaとLoRaWANの違いについては無限回述べているので今回は簡単に.

LoRaはSemtech社が開発している無線の変調方式で,LoRaWANはSemtech社含むLoRa Allianceが公開するLoRa無線を利用した全体のシステムを表しています(昔はMAC層以上のプロトコルを指していたこともある?).

センスウェイさんが提供しているLoRaWANサービスはSenseWay Mission Connectと呼ばれているIoT通信プラットフォームです,

https://www.senseway.net より

LoRaWANデバイスのデータを収集,デバイスを管理する総合的なプラットフォームです.

スターターキットには以下のものが含まれていました.なお,スターターキットの購入案内ページはこちらです.

store.senseway.net

  • Arduino Uno互換機
  • LoRa (WAN)通信モジュール
    • LoRaアンテナ(800MHz ~ 1GHz向け?)
    • USB-Bケーブル
  • LoRaWAN屋内用ゲートウェイ
    • アンテナ
    • Mini USBケーブル
    • USB変換アダプタ
    • LANケーブル
  • 温度センサ(ADT7410)

StarterKit

実際のLoRaノード(デバイス)はこちら.アンテナがごつい!

LoRaNode

試してみた

実際に試してみたので,簡単に何ができそうかまとめてみます.

一応参考にした資料は有償であるキットに含まれているので,具体的な手順については言及しないことにします.

Senseway Mission Connect

センスウェイさんが提供するLoRaWANサービスの名称が「Senseway Mission Connect」です.

ここでデバイスの登録などができます.

MissionConnect

まず,このデバイス管理のところへキットに入っているLoRaノードのDevEUIを追加します.Dev EUIはLoRaWANにおいてデバイスを識別するためのIDで,他のサービスでもこれは必要になってきます.

また,今回はPINコードも必要でした.これをなくすとまずいですね.

これで入手したデバイスのActivationはできたようです.

LoRaWANゲートウェイの用意

ここまでで入手したデバイスと,LoRaWANゲートウェイ上の仮想のデバイスのリンクができたので,今度は実際のゲートウェイの準備をします.

案内されたマニュアルにはゲートウェイについては触れられていなかったので,適用に調べてこちらがヒット.

service.senseway.net

今回,私の環境ではWiFiでWANへと接続します.なお,本体にはUSB電源から電源を供給可能です.適当にそこらへんに落ちていたMini USBケーブルでつないで少し放置すると自動的に初期化が終わり,SSID:AP-XXXXXという無線LANを吹きます.なお,ここはきちんと暗号化されているので比較的安心です.

あとは上のセンスウェイさんのマニュアル通り.

なお,今回WiFiを選びましたが,もちろん使用用途によっては携帯回線とかもあると思います.ゲートウェイの設定画面では3G/4G LTEも選択可能でした.

※ここで特に受信したLoRaノードのメッセージの送信先となるLoRaWANサーバは選べないようです.多分ファームウェアレベルで書き込まれているっぽい?

うまく接続すると,webコンソールのStatus>Overviewで確認できます.DHCPでアドレスを割り当てる場合はここから確認すればいいはず.ゲートウェイ自体もAPになりますが,そっちは192.168.55.0/24で割り当てられます.

SSH接続を試みてみたところ,username/Passwordを聞かれますが,認証情報は公開されていません.Nmapすると80,22番ポートが空いていました(??).

ノードのプログラミング

仕様とライブラリ -KashiwaGeeks

LoRaノードはArduino Uno互換ボードとモジュールで構成されているので,Arduino Unoでプログラミングします.(今回試した私の環境ではArduino 1.8.8です)

LoRaWAN Shieldについてのマニュアルはこちら.

service.senseway.net

マニュアルにはありませんでしたが,確認してみたところ,シリアルポートとはボーレート57600で通信してるっぽいです(プログラムのConsoleBegin()がSerial.begin()に相当するみたい).

Windowsで試したのですが,ドライバの関係か,最初は認識されませんでした.なお,書き込み時のボードにはArduino/Genuino Unoを選択します.

Arduinoとモジュールとの通信はD11/D12ピンをUARTシリアルで行っているようなので,基本的にArduinoのSoftware Serialから行うことができます(D11 UART_TX,D12 UART_RX).

しかしこれだと1からプログラミングすることになってしまうので,用意されているライブラリを使います.これには「KashiwaGeeks」というツールが利用できるそうです.山口知昭さんという有名な方が開発したそうです.

github.com

LoRaWAN Application framework for Arduino. This framwork consists of Application,LoRaWAN devices and Payload Classes. These classes provide following functions:

  1. Power saving with various sleep modes.
  2. Wake up by watchdog timer.
  3. Interrupt handling for INT0 and INT1.
  4. Task execution control.
  5. LoRaWAN devices control.
  6. Allow payload to be created bit by bit.

ITメディアでも取り上げられています.

blogs.itmedia.co.jp

 KashiwaGeeksを導入すると、
 1)スリープ機能による省電力化 
 2)タイマーによるウェイクアップ機能
 3)INT0、INT1割り込み機能
 4)タスク実行管理機能
が提供されます。

多分Kiwitechのデバイスが主な対象なようです.ソラコムさんのデバイスでも利用できるみたいです.

これにより,ピン配置が正しければ問題なくLoRaモジュールを使うことができるようになります.

なお,ADB922S.cppで以下のように定義されていますね.

#define LoRa_Rx_PIN               11
#define LoRa_Tx_PIN               12
#define LoRa_WAKEUP_PIN            7

また,ノードのActivationの方式としてABPとOTAAという2種類があるのですが,センスウェイさんのLoRaWANサーバではOTAAのみ利用可能だそうです(最初ちょっと面倒ですが,こっちのほうがセキュアですね).違いはぐぐってください.

KashiwaGeeksの特徴(メモ)

KashiwaGeeksをいじってて思ったこととしては,間欠動作を便利にプログラミングできるように作られているんだなということです.

全体のプログラムのイメージを簡単なフロー図にまとめてみました.

KashiwaGeeksImg

定期動作を原則とし,用意したタスクを定期実行するようです.このとき,動作時間が重ならないように気をつける必要があります.多分重なると処理に遅延が発生する原因とかになると思います.

プログラムの長さは少し冗長気味にはなりますが,わかりやすくなっています.

テスト

いくつかのサンプル例が用意されているので,普通に「End-node_sample」のスケッチ例から試してみました.

ソースコードはこれです.Arduino IDEでこれを書き込めば終了です.

KashiwaGeeks/examples/End-node_Sample at master · ty4tw/KashiwaGeeks · GitHub

書き込み成功しているようなので,Arduino IDE上からツール>シリアルモニタを開き,ボーレード57600(bps)で見てみます.

**** End-node_Sample *****
try to join... accepted.

_/_/_/ KashiwaGeeks 0.10.3 _/_/_/


  Task1 invoked

Temperature:  1020 degrees C
%RH: 2020 %
Pressure: 5005 Pa

Send  =>lorawan tx ucnf 12 03fc07e40000138d<=

Recv  =>lorawan tx ucnf 12 03fc07e40000138d

>> Ok

>> tx_ok

> <=

 SUCCESS
LoRa sleep.

temperature: 1020 Degreesが気になりますが(このサンプルではセンサ値をダミーとして送信しているみたいです),とりあえずOTAAでActivationとネットワークへのJOINを行い,成功していることがわかります.次にLoRaを送信して,Ackかなにかが返ってきており,最後にスリープモードに入っていることが確認できますね.

ここでもしやと思い,webのSenseWay Mission Connectを見てみると,Uplinkのカウンタが増えています.ということは,とりあえずこれでLoRaWANサーバにデータの送信が成功していることがわかります.

Message

私はこれでできるとは思っていなかったので驚きました.なぜなら普通はArduinoのプログラム中にDev EUIを書き込まないとLoRaWANサーバがノードを認識できない(はず)からです.なのにこうしてUplinkのカウンタが増えているこということは,ユーザが変更できない領域にDev EUIが書き込まれていることを指しているということになります.

つまり,正規のDev EUIを書き込まれたノードじゃないと(センスウェイさんのLoRaWANサーバでは)使えないということです(ベンダーロックインなのでそれはそう).

ひとまずこれでLoRaデバイス→LoRaゲートウェイ→LoRaWANサーバの通信がテストできました.

ですがこれだとセンサ値とか送れてないのでセンサノードとしてはなんの意味もなしていないです.

長いので次の記事でセンサを試したことをまとめたいと思います.

とりあえず感想

ここまでの感想としては

  • 利用,テストが簡単
  • GatewayのUsername/Passwordを教えてほしい
  • KashiwaGeeks使ったほうがいいかも
  • Dev EUI周辺がどうなっているのか全くわからない!

個人的に,LoRa無線を簡単に使うためのRadioHeadライブラリや,LoRaWANプロトコルに対応するためのLMiCライブラリ(IBMのやつ)が使えるのか気になります.書き込みだけはできるっぽい?

それでは具体的な実装とか,実際にプログラム〜可視化を行っているのはこちらです↓

tokina.hatenadiary.jp

RTL-SDR(nano 3)とURH(Universal Radio Hacker)を使ってみた

こちらはセキュリティキャンプアドベントカレンダー9日目(12/9)の記事になります.

adventar.org

私はセキュリティキャンプ全国大会2016の卒業生で.今年の全国大会チューター、その他地方大会のチュータなどしてました.

先月,PacSecにてTrend Microさん主催のRF CTFという世界初のCTFに参加してきました.

www.pacsec.jp

PacSecセキュリティカンファレンス」は、世界先端の情報セキュリティ専門家による最新の研究発表の講義と国際交流できる環境を兼ね備えた場を用意し、日本での先進的なセキュリティ人材育成への技術教育の場を提供する国際カンファレンスです。

また,PacSecでのメインのCTFはZero day Initiative主催のPWN2OWNです.

Zero Day Initiative | Home

来年以降も様々なイベントでRF CTFを主催したいと考えているそうです.

今回はその際にいただいたnano 3というSDRの利用方法のメモなどを残して置きたいと思います.セキュリティは関係ないかも?

また、私は現在SDRについては勉強中の身なのですがさいきんやっといろいろできるようになりました。そこでUniversal Radio hackerという便利なツールを見つけたので、ついでに紹介しようと思います。

SDR(Software Defined Radio)

皆さんご存知、ソフトウェア(定義)無線です(?)

ソフトウェア無線(Software-defined radio)とは、電子回路ハードウェア)に変更を加えることなく、制御ソフトウェアを変更することによって、無線通信方式を切り替えることが可能な無線通信、又はその技術。一般的には、広い周波数範囲において多くの変調方式が可能となるよう、ソフトウェアが、なるべく汎用性の高いプログラム可能なハードウェアを制御するものとして考えられている。

ソフトウェア無線 - Wikipedia

簡単に言うと、従来はマシンスペックが足りずできなかった処理をソフトウェアレベルで行うことで、ソフトウェアでより柔軟に無線を扱えるようになったものです。詳細はぐぐってください。

その歴史は1970年代の軍事利用目的の開始までさかのぼります。一般的な利用は1990年代の携帯電話網の送受信(トランシーバ)目的で開発されたことのようです。

また、日本語のSDRのページより英語版のほうが内容が充実しています(というか未翻訳状態)。

Software-defined radio - Wikipedia

現在、SDRの利用の目的は大きく分けて軍事利用アマチュア無線/個人利用と言われています。GNURadioについても取り上げられています。

More recently, the GNU Radio using primarily the Universal Software Radio Peripheral (USRP) uses a USB 2.0 interface, an FPGA, and a high-speed set of analog-to-digital and digital-to-analog converters, combined with reconfigurable free software. Its sampling and synthesis bandwidth is a thousand times that of PC sound cards, which enables wideband operation.

無料で利用でき、FPGAの設定をいろいろいじって利用できるため現在は多くの人に使われています。この前私が試したLoRaWANのデコードもGNURadioを使いました。電波のソースにSDRサーバを指定できたりと、様々な利用が可能になっています。

nano 3を試す!

いただいたnano 3はこんな感じの非常に小さくかわいいコンパクトなモジュールです。現在はこれに小さなヒートシンクをつけて使っています。

IMG_4993

IMG_5279

IMG_5036

こんな感じで,非常にシンプルなSDRとなっています.なお,”HOT⚠️"です.

検索すると,以下のNooElecのサイトがヒットします.

www.nooelec.com

The ultimate SDR bundle for USB On-The-Go applications.

Includes NESDR Nano 3 in an anodized aluminum enclosure, nano-sized antenna, 4 USB OTG adapters. heatsink and an articulating adapter for SMA antennas.

すぐにいろいろな端末で使えるのが利点だそうです.

Amazonでも取扱いしています.

RTL-SDRとは

RTL-SDR is a very cheap software defined radio that uses a DVB-T TV tunerdongle based on the RTL2832U chipset. ... Essentially, this means that a cheap $20 TV tuner USB dongle with the RTL2832U chip can be used as a computer based radio scanner.

https://www.rtl-sdr.com

だそうです.安価で利用できるSDRのことを指しており,TVチューナーなども含まれるそう.

US$32.95!安い!

気になるスペック等はこちら

USB Interface IC RTL2832U
Tuner IC R820T2
Frequency Range (approximate) 25MHz - 1750MHz
TCXO clock Yes
Antenna Connector Type MCX
Antenna Included? Yes
Remote Included? No
Additional Accessories Includes anodized aluminum enclosure, heatsink, articulating adapter for SMA antennas, nano-sized antenna and 4 USB OTG adapters.

HackRF ONEといった高価かつ高機能なSDRとの大きな違いはサンプリングレート,つまり1秒間あたりの信号サンプル数,時間分解能です.HackRF ONEでは20Mbps (up to 20 million samples per second)ですが,RTL-SDRでは約3Mbpsです.

また,公式サイトにてnano 3を利用するためのいくつかのソフトウェアが提供されています.

product_download

ここでは以下のOSに向けてソフトウェアやインストール手順が紹介されています.

Android端末とあるように,nano 3はモバイル端末でもSDRが利用しやすくなっており,一般的なツールと互換性があるようです.手元にあるAndroid端末はUSBホスト機能がなかったので試せなくて残念でした.

入手時のパッケージにもUSB typeAをマイクロUSBに変換するケーブルやアダプタが同梱されています.残念ながらiPhoneでは使えなさそうです.

また,パッケージには小さなヒートシンクも同梱されており,HOTへの対策はきちんとされています.

今回は一般的な用途で、このコンパクトなSDRがどれだけ使えるのか試したかったため、色々調査してみました。

結論から述べると,特に問題なく使えることが分かりました.

nano 3で電波のモニタ

それでは実際に利用する方法や様子をまとめておきます。

まず,MacOS上でlsusbしてデバイス情報を確認してみます.

 〉lsusb
...
Bus 020 Device 018: ID 0bda:2838 Realtek Semiconductor Corp. NESDR Nano 3  Serial: ***
...

やはり電波をとりあえず見るにはGqrxというツールが一番利用が楽ですし便利です.nano 3の公式サイトではその利用方法については書かれていませんでした,

http://gqrx.dk

Macではそのまま認識され、Gqrxを開くとそのまま利用することができます。Configはこんな感じになります.Input rateを1200000に設定します.

FMラジオはだいたい80MHz~100MHzです.とりあえず確認して,なにか音が聞こえるか試してみました.

TOKYO FMは周波数80.0MHzで、東京タワーから、檜原中継局(2015年12月開局)は西多摩郡檜原村から周波数86.6MHzで放送しています。

https://www.tfm.co.jp/listen/sp/

ノイズが多いですが,なにか聞こえます.

今回試す環境ではVirtualboxを利用しているので,「Devices→USB→NooElec NESDR Nano 3」で追加します.しかしLinux上で動かすには,そのままでは利用できませんでした.

そこで, "/etc/modprobe.d/fbdev-blacklist.conf"に以下を追加します.

blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830

設定後,再起動したら認識されました.

IMG_6330

こちらは飛行機の中で電波を観測している様子です.

LoRaWANのデコードをしてみる

こちらで紹介していたgr-loraをnano 3でも利用してみました。特に問題はなく利用できるようです。

tokina.hatenadiary.jp

github.com

/gr-lora_n3/apps$ python lora_receive_realtime.py 
linux; GNU C++ version 5.3.1 20151219; Boost_105800; UHD_003.009.002-0-unknown

Using Volk machine: avx_64_mmx_orc
gr-osmosdr 0.1.4 (0.1.4) gnuradio 3.7.9
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy redpitaya 
Using device #0 NooElec NESDR Nano 3 SN: ******
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Exact sample rate is: 1000000.026491 Hz
[R82XX] PLL not locked!
Bits (nominal) per symbol:  5.5
Bins per symbol:    2048
Samples per symbol:     16384
Decimation:         8

研究でLoRaWANの実機も利用することが多々あるので,非常に便利になりました.

URH (Universal Radio Hacker)を使ってみる

先日,ちらっと「Universal Radio Hacker」なるツールがあることを耳にしましたので調べてみました.

無線の解析にめっちゃ便利だったのでもっと利用されるべきでは?

適当に検索してもURHについて日本語の情報はあまり見つかりませんでしたので,少しまとめておきます.

もちろんオープンソースです.

github.com

The Universal Radio Hacker (URH) is a software for investigating unknown wireless protocols. Features include

  • 一般的なSDRのハードウェアを利用可能
    • hardware interfaces for common Software Defined Radios
  • 信号を簡単に復調できる
    • easy demodulation of signals
  • データの解析支援
    • assigning participants to keep overview of your data
  • デコーディングのカスタマイズ
    • customizable decodings to crack even sophisticated encodings like CC1101 data whitening
  • プロトコルロジック解析のためのラベル付
    • assign labels to reveal the logic of the protocol
  • セキュリティの脆弱性を見つけるためのファジングコンポーネント
    • fuzzing component to find security leaks
  • システムにリプレイ攻撃するための変調をサポート
    • modulation support to inject the data back into the system
  • 攻撃の再現性のためのシミュレーション環境
    • simulation environment to perform stateful attacks

とあるように,URHは未知の無線プロトコルの解析ツールであり,様々なハードウェアを利用でき,復調が可能です.また,ファジングや電波の記録,再送も簡単になっており,シミュレーションも可能です.もちろんGUI上で操作が可能です.この前新しいバージョンが出たばっかりです.頻繁に更新されるので、興味のある人はGithubでWatchingしておいたほうがいいでしょう。私もまだ使い始めたばかりなので,まだわかってないことも多いです.

インストーラガイドでは以下での利用方法を公開しています.

私はSDRの環境はまとめてXubuntu 16.04 LTS上に構築しているので,今回もそちらに環境を用意しました.

Linux (今回はXubuntuですが,Ubuntuやその他のDebian系でもいけそう)の環境に応じたパッケージマネージャでのインストーラ経由のインストール方法について示されています.今回はpipを利用します.

> $ sudo apt-get update
> $ sudo apt-get install python3-numpy python3-psutil python3-zmq python3-pyqt5 g++ libpython3-dev python3-pip cython3
> $ sudo pip3 install urh

これでインストールできました.

もしかしたらグラフ関係でぶつかる人もいるかも知れません.私は以前にpythonのグラフ描画系のライブラリは一通り入れていたので,ゼロの環境から入れる人は気をつけてください.

アプリケーション一覧にて"urh"と検索するか,Terminal上でurhと入力するとURHを起動できます.

URHの基本的な機能

基本的に何ができるかは,以下の動画が参考になります.

www.youtube.com

  • リアルタイムスペクトラムのモニタリング,解析→Spectrum Analyzer
  • 電波の記録→Record Signal
  • 記録した電波の解析→メインの画面
  • プロトコルスニッフィング→Sniff Protocol
  • デコード→Decoding

これらのツールがセットになっています.

URHを起動するとこんなシンプルな画面が.タブのFile,もしくはEditから各種ツールを呼び出します.

URH_Top

URHは基本的にはモニタリングより,ログを取る→解析する,に適したツールです.細かいところ(例えばログを取得した状態の設定が解析に引き継がれるなど)に気がきいており,非常に好感が持てます.

それでは,各機能について簡単にまとめたいと思います.

スペクトラムのモニタリング(Spectrum Analyzer)

SpectrumAnalyzer

これはリアルタイムに実際の電波をモニタリングするツールです.赤く見えているのは最大時のスペクトラムです.

スペクトラムのモニタリングだけならGqrxのほうが便利でしょう.しかし,その他のツールと組み合わせて使うときは,一度このアナライザで周波数を確認したほうが良いでしょう.ここで周波数やサンプルレートなどを指定しておくと,例えばRecord Signalツールを利用するときに同様の設定で開かれます.

電波の記録(Record Signal)

RecordSignal

電波を記録できます(そのまま)

Startを押すと記録を開始します.ファイルサイズがリアルタイムに表示されているので便利です.Saveボタンで保存してないと破棄されるので注意してください.

記録したシグナルは.complex形式で保存され,どうやらこれはバイナリファイルらしい.

一応GHexで開いてみるとこんな感じです.

GHEx

記録したシグナルの解析

さっき記録したファイルを保存して,Record Signalの画面を閉じるとメインの画面(解析画面)が勝手に開きます.このときファイルサイズが大きいほど時間がかかるので待ちましょう.

メインの画面には以下のタブがあります.

  • Interpretation → シグナルを確認するメインの画面
  • Analysis → シグナルのデコードの解析
  • Generator → 波形データの生成
  • Simulator → 記録したシグナル,もしくはGenerateしたものからプロトコルを作成し,仮想のParticipantsを用意してシミュレーションシナリオの作成

また,試してないですが,保存しているシグナルから,Generatorを使って送信データを生成することもできるようです.LoRaのハッキングに使えそう?

あと,うまくデコードできた場合には,この仕組みを逆に,自由なInputで出力波形をGeneratorで作成できるっぽいです.

LoRaWANのデータを例に少し解析してみます.以下はSF=12のときのLoRaの電波を受信してみた様子です.

URH_interpretation

青い選択されている部分が1秒間のシグナルです.

URH_interpretation2

非常に拡大すると,最大分解能は500nsであることが分かります.

なお,画面したに01ビットが表示されていますが,これはとりあえず自動的にデコードされただけで特に意味があるわけではありません.これだと分かりづらいので,SF=7のときのシグナルを以下に示します.

URH_interpretation3

LoRaWANのSF=12のとき,送信時間は理論上約1318msですが,SF=7のときは約55msです(最適化なし).図におけるブロックのように見えるところは,LoRa変調であると推測されます.

プロトコルのスニッフィング(Sniff protocol)

SniffProcotol

どうやらリアルタイムで,対象の周波数の変調を試みるツールのようです.

今の所,私はあまりこれを有効活用したことはありません.

受信メッセージの解析,デコード

ASK/OOKの復号には以下の動画が参考になるでしょう.

www.youtube.com

RF CTFではOOKの問題がでました.GNURadioで保存した01のシグナルのバイナリファイルをロードしてみるとこんな感じになります.

Decode1

同じ01の列が連続している事がわかります.これはGNURadioで,既に01に変換されているため,Modulation:ASK(OOK),Error Tolerance:0,Bit Length:1にします.すると,画面したに01のそれっぽいビット列が現れるはずです.

Decode2

また,スペクトラムの強さで01を変えたい場合があります.例えば受信Gainが小さい状態で受信したシグナルは起伏が弱いです.この「0と1を判断するしきい値」を設定することもできます.Signal View:Demodulatedに設定します.ドラッグでこの閾値を変更できます.

Decode3

この状態で,EditタブからDecodingを開くと,様々な符号化方式でのDecodeが試せます.このDecodeに関してはあまり使い方が公開されていない+自分もわかっていないのでまだ勉強が必要です.

Decode4

選択できるのは,今の所NRZ,マンチェスターⅠ,マンチェスターⅡ,差動マンチェスター符号化っぽいです.例えば,ここでNRZ,Remove Redundancyが適切な場合,これを保存し,メイン画面のAnalysisなどで選択できるようになるようです.

最後に

今回はPacSec2018のRF CTFでもらったRTL-SDRであるnano 3 SDRについての使用してみたレビューと,ついでにURH(Universal Radio Hacker)についてまとめてみました.

まだまだURHについてはこれから使いこなしたいです.本当はAnalysisにもっと多くの機能やらなんやらあるようなのですが,まだ良くわかっていません..

最近,研究ではシミュレーションからLoRaWANの実機の計測を行うことが多くなってきたので,そのついでというのも少しありました(あっちはHackRF ONEの利用を予定しています).

と,アドベントカレンダー担当日の前日にこの記事を書いていると,センスウェイさんからLoRaWANスターターキットが届きました.これも試したいですね(というか記事を書くことがマストになっている).

また今後もこういったCTFはもちろん,社のレッドチームに入るべく,普通のCTFにもチャレンジしていこうと思い,「ネコチャンナノ!(NekochanNano!)」というCTFチームを何人かとともに立ち上げました.アイコンも自作しました!!

さて,次のアドベントカレンダーは12/12にtex2eさんによる「秘密分散技術(ホワイトハッカ飴の解説)」です.お楽しみに.

今年もあと僅かです!