IoTSecJP Tokyo #5へ参加してきました
今年の3月16日、昨年9月ぶりに開催されたIoTSecJP Tokyo #5へ参加してきました.
はじめに
いつにもましてレベルが高く,貴重なお話を聞くことが出来ました.せっかくなのでメモを整理して参加記として残して置きます.
今回会場は株式会社ラック様のオフィスでした.ありがとうございます!
さて,今回の発表スケジュールは以下のとおりでした.
IoTSecJP東京 Version5.0 時刻 タイトル 時間 その他 12:30 開場 30[min] IoTSecJP運営 13:00 会場書注意など 5[min] IoTSecJP運営( @r00tapple ) 13:05 「{登壇内容調整中}」 30[min] kidasan ( @kidasan) 13:35 「{登壇内容調整中}」 30[min] NV ( @nvsofts) 14:05 「Hardware Trojan できるかな」 30[min] omoikane ( @jm6xxu) 14:35 休憩 10[min] 14:45 「ドローン コレクション 2019年 春」 15[min] hogehuga ( @hogehuga) 14:50 「IoT Securityコンサルトしてハードウェア設計/実機診断をやったときのリアルな事例を紹介してみますよ」 30[min] kawashin1 ( @kawashin1) 15:20 [LTEデバイス攻略までの3ステップ] 30[min] RyskUmts(@tansokun920) 15:50 [安全性の高いプログラミング言語でのIoTデバイス開発について] 30[min] LDScell(@LDScell) 16:20 [Wi-Fiのチャネルベース中間者攻撃とKRACKsの話] 30[min] Nao(@nsec_life) 16:50 [電力線通信に対するDoS攻撃の検討] 30[min] Hidekazu Asaba(@Belboz16) 17:20 「4Kカメラをハッキングしてインスタ映えしてみた」 30[min] 黒林檎 ( @r00tapple ) 17:50頃 終わりに 5[min] IoTSecJP運営 ( @r00tapple ) 18:00 撤収 参加各位
- はじめに
- 登壇内容
- 1. Kidasan「相関電力解析に期待するもの」
- 2. Omoikaneさん「Hardware Trojan できるかな」
- 3. NVさん「eMMCの話」
- 4. hogehugaさん「ドローンコレクション 2019年 春」
- 5. kawashin1さん「IoT Securityコンサルトしてハードウェア設計/実機診断をやったときのリアルな事例を紹介してみますよ」
- 6. Uematuさん「LTEデバイス攻略までの3ステップ」
- 7. LDScellさん「安全性の高いプログラミング言語でのIoTデバイス開発について」
- 8. Naoさん「Wi-Fiのチャネルベース中間者攻撃とKRACKsの話」
- 9. Hidekazu Asabaさん「電力線通信に対するDoS攻撃の検討」
- 10. 黒林檎さん「4Kカメラをハッキングしてインスタ映えしてみた」
- 最後に
- おまけ
- おまけ2
時間はかかりましたが、その分追加でいろいろ調べたりしつつ書きました。いやはや遅くなってしまい申し訳ないです・・・
登壇内容
1. Kidasan「相関電力解析に期待するもの」
CANのリアルタイム性を維持しつつ不正ECUを特定できるやつをSCIS2018で発表していたそうです.
相関電力解析とは?
相関電力解析攻撃(CPA, Correlation Power Analysis)とは、暗号回路の動作時の消費電力波形を複数観測し、それらを統計的に処理することで秘密鍵を求める攻撃手法です。統計処理には相関係数というある2つの値の関係の強さを示す数値を用います。
せっかくなのでラックさんのサイトから引用しました.
今回kidasanは,上記引用にある「秘密鍵を求める攻撃手法」としてではなく,対象機器がどういった処理をしているかを求めるようなリバースエンジニアリングとしての解析を指していました.
□相関電力解析に期待するもの
「サイドチャネル攻撃と呼ぶと範囲が広すぎる,これをもっと狭く呼びたい」そうです.
しかし,いまのコンピュータは一般的にマルチコアになっている→「非同期になっているので相関電力解析では読むのは非常に難しい」
この仕組を利用してCANバス上におけるTCU経由で汚染された不正ECUを検知することも可能であるかもしれないそうです.
□実際に試してみる
仮定「プロセスが動いおているのだから何らかの波形が見れるはず」
結果:実際に観測しても解析は難しい とのこと
目立つのはWiFiのScanくらい?プログラムの解析までは非常に困難
4コアで動いているので,どのプログラムがどこで走っているのかも難しい
□解析してわかること(わかったこと)
スケジューリングする際には電力が低下する(振幅が下がる?)
□やろうとしていること
波形の一つ一つをタスクに紐付け,何が見えるか検証してみる
デバイスの電源にAddするだけのエンドポイントセキュリティが最終的な目標
2. Omoikaneさん「Hardware Trojan できるかな」
NVさん「ちょっとSurfaceが死んだので」
Omoikaneさんが2番目に登壇されました.昨年から何かと話題なHardware Trojanについて,実際に自分で試すことができるかやってみようとの計画です.
「Hardware Trojanしたい」
Hardware Trojanとは
A Hardware Trojan (HT) is a malicious modification of the circuitry of an integrated circuit. A hardware Trojan is completely characterized by its physical representation and its behavior. The payload of an HT is the entire activity that the Trojan executes when it is triggered.
(tokina訳) Hardware Trojanは統合回路の回路レベルに悪意のある変更を加えたものです.また,その物理的な見た目や振る舞いなどから完全に特徴づけることができます.Hardware Trojanが意味する対象は「実行された全ての動作」です.
結論:できませんでした(できたら会社のブログに書きます)
年度末ということで,お忙しいとのことです.(それはそう)
□こんなの話題になりませんでした?
Bloomberg Businessweekより
小さいマイクロチップが中国にデータを送っているらしいといううさが昨年ひっそりと囁かれていましたが,実際には本当にHardware Trojanなのかは判明していないまま今に至ります.
またファーウェイの端末に不要な部品がみつかったらしいですが,それも結局は真相は不明なまま・・・.
最近はアメリカを初め,日本でもファーウェイ排除の動きが見られますが,どうなるんでしょうか・・・.
□今回のLTでのお話
今回は文献調査とのことで、文献からHardware Trojan Warの紹介いただきました。
The Hardware Trojan War: Attacks, Myths, and Defenses (English Edition)
- 出版社/メーカー: Springer
- 発売日: 2017/11/29
- メディア: Kindle版
- この商品を含むブログを見る
ハードウェアトロイとは特定の目的を達成するために回路の動作を変更するように設計された,回路の意図的かつ悪意のある改変
- NSA Toolkit
- ツールのリンクがわからなかったですが、Ghidraを開発しているNSAだと思われます
- SOLDERPEEK
- SLOTSCREAMER
- コンバータを利用してメモリを改変
- Bad USBーWiFi搭載
- 初期からTrojanが入っているタイプ
□簡単にまとめ
- PoCレベルはたくさんある。しかし,実際に存在しているかは現状不明
- 入っていても正常な動作を実現しないといけないので,わざわざハードウェアとして実現する意味は..
- ソフトウェアで実現したほうが楽なのでは・・・?
- 最初から入っているバックドアの検知は非常に難しい
3. NVさん「eMMCの話」
eMMCをいろいろする話を、ということでNVさんから「eMMCの吸い出し」をメインに聞くことが出来ました。
eMMCについて
eMMC: embedded Multi Media Card
最高400MB/sの転送速度、NANDフラッシュ処理が不要などの特徴を持つ
パーティション: ブート1,ブート2,ユーザデータ,RPMB (ユーザーデータは普段ユーザーがデータを格納するところ)
pinについて
- Vcc電源,VccQ,
- Vss, VssW: GND,
- CLK
- CMD command io
eMMCの吸出しツール
EXEなど専用の解析ソフトはVMで実行したほうがいい(怪しいので)
4. hogehugaさん「ドローンコレクション 2019年 春」
「最近のドローン」について紹介していただきました
水中ドローン、酒気帯び運転問題@ドローン
ドローンの事故率,故障率(少なくとも公開されていない?)、これらが必要になってくるだろうとのこと。
DJIのTelloがおすすめ,JSONでやりとりしているらしい?
ドローンの話の補足情報(1/2) 米国では登録義務対象になる最低重量について、記載のようなリスク評価をして 250g と決定した。 落下時のエネルギーと致死率、飛行時間等などを総合的に勘案し、許容できると考えられるものとしている。
ドローンの話の補足情報(1/2)
— 痺れを優先する四川麻婆豆腐 (@hogehuga) March 16, 2019
米国では登録義務対象になる最低重量について、記載のようなリスク評価をして 250g と決定した。
落下時のエネルギーと致死率、飛行時間等などを総合的に勘案し、許容できると考えられるものとしている。https://t.co/oUhBFrFEi8#IoTSecJP
ドローンの話の補足情報(2/2) 下記資料の6Pごろからドローンの事故報告の記載がある。2015/12以降、飛行申請して事故を起こしたら報告が必要。NEDO 国立研究開発法人新エネルギー・産業技術総合開発機構 でそこそこ情報がありそう。
ドローンの話の補足情報(2/2)
— 痺れを優先する四川麻婆豆腐 (@hogehuga) March 16, 2019
下記資料の6Pごろからドローンの事故報告の記載がある。2015/12以降、飛行申請して事故を起こしたら報告が必要。NEDO 国立研究開発法人新エネルギー・産業技術総合開発機構 でそこそこ情報がありそう。https://t.co/f2DusDfQ4T#IoTSecJP
5. kawashin1さん「IoT Securityコンサルトしてハードウェア設計/実機診断をやったときのリアルな事例を紹介してみますよ」
某社でCloud Security & IoT Securityを担当しているkawashin1さんからコンサル(営業?)の面から、結構がっつりと実例を通してお話を聞くことができました。
www.slideshare.net
今回は情報収集と勉強できた人向けのLT
Fセキュアについてざっと
- F-Secure 「車載IoT機器 セキュリティ診断サービス」
- 車載IoT以外にも,機内IoT,航空管制システムなど
□カーナビの攻撃テストについて
システムファームウェア抜出し,入れ替え可能か
CANBUS用のData Diode,他のシステムが,,
CAN BUSの分離が完璧か,ファームウェアアップデートの仕組みに脆弱性はないか,侵入できるかペネトレしてみる→さらにそれらに基づいて対策事例をアウトプットする????
具体的な攻撃手法は口外できない部分とのこと
にてFセキュアが発見した資料などを公開しているらしいので,是非活用ください?
□Q&Aがほしい!
ロゴがいつから赤になりましたね?
- 2017年にロゴが赤くなりました
車関係 - 日本とヨーロッパで意識の違いは何がある?
- ヨーロッパでは全体のテストのお願いがあった,日本ではやらなければいけないので探しています
- 最近問い合わせが着ている気がします
- アメリカもやっている(何社か口外は禁止とのこと,5−6年,テスラは?)
- ウェアラブルデバイスについてのペネトレもあったらしい
- 日本にもペネトレの人がいる?クラウドと飛行機を攻撃できる人がいるとかフィンランド人が強い(人が来る)
ライバル意識をもつより,一緒に良くしていきましょうとのこと
F-SecureさんのCTFレッドチームの動画です
6. Uematuさん「LTEデバイス攻略までの3ステップ」
LTE通信機器の診断に関してお話いただけました。あまり多くメモが取れなかったので、残っているものを整理して一部を抜粋して紹介します
- ”LTEFuzz”と名付けられたツールを用いて検証→認証バイパスできる脆弱性が発見されたらしい
- アタッチ,?,ハンドオーバ
□どうやってLTE通信を行うIoT機器を偽装するのか?
つまり、組み込まれているSIMを無理やり取り出して、自前のSIMに差し替えればいいのでは?
→実機で試したところ,実際にeSIMでむりやり普通のSIMに差し替えてみたら普通に出来たとのこと(これでテストSIMを指して脆弱性診断もできそう)
□参考になる書籍や論文ツールなど
- 役に立ちそうな書籍
- 携帯電話はなぜつながるのか?
- LTEの教科書
- その他標準ドキュメント・・・
LTEの独学用本は以下がおすすめ。 #IoTSecJP
— RyskUmts (@tansokun920) 2019年3月16日
■初級編
携帯電話はなぜつながるのか 第2版 中嶋信生 https://t.co/hzOF1H4ZEh
■中級編
インプレス標準教科書シリーズ 5G教科書 ―LTE/ IoTから5Gまで― 服部 武 https://t.co/IGRqJF0QvG
OpenAir Interfaceというものもあるらしい
The OpenAirInterfaceTM Software Alliance (OSA) is a non-profit consortium fostering a community of industrial as well as research contributors for open source software and hardware development for the core network (EPC), access network and user equipment (EUTRAN) of 3GPP cellular networks.
LTE Securityの論文
OpenLTEとSRS LTEは?SRS LTEのほうが手が入れやすい(通信事業単位のノード単位でソースコードが書かれているらしい)
#IoTSecJP で質問されていた内容を少し整理しました。セルラーOSSについてのまとめ。
— RyskUmts (@tansokun920) 2019年3月18日
SDRで使えるセルラーOSS https://t.co/3snPtMKUTb
7. LDScellさん「安全性の高いプログラミング言語でのIoTデバイス開発について」
「セキュアなプログラミングするためには? Rustはどうか?」から始まりました。
様々な安全機能
- メモリ安全
- バッファオーバーフロー/バッファオーバーラン
- Nullポインタ参照...
以前話題になったHeartBleed攻撃
- Point:メモリ操作の実装バグ(バッファオーバーラン)
情報漏えい<サービス停止(プロセスクラッシュ)
- コンパイルエラーになる(これが一番理想)
組み込みではC/C++でするしかないのでは?
- LLVM - GCCに匹敵するコンパイラ実装の敷居がさがった
- LLVMで解釈できる中間言語を出力できる言語でればいい→自作できる
- (実は)Go,Rustも現在対応している
- Tiny Goなるものがあるらしい
- https://github.com/tinygo-org/tinygo
Rust普及の課題として「Rustは簡単にかける言語ではない(難しい)」が挙げられるとのこと。そのかわり以下の利点があるそうです。
メモリ管理をコンパイラがかなり検証
その他方安全やメモリ検証などまでサポート
→コンパイラが厳しい!
- Rustではめちゃくちゃに厳しいコンパイルレベルがあるらしい
- 言語仕様特徴
- 所有権
- 借用
- ライフタイム
「RustではHeart Bleedは発生しなかったのではないのか?」
- 所有権の例:アドレスを参照して他の変数から他の変数の値を変更することが出来ない
- 所有権は一つのみ,もし所有権違反をした場合にはコンパイルエラーとなる
- これは動的配列でも同様
以下参考になりそうな情報
- Rustの組み込みの本を和訳したものが公開されているそうです
- Emmbedded Rust Book (和訳済み)
- https://tomoyuki-nakabayashi.github.io/book/
- Discovery (和訳中)
- IPv6 TCPエコーサーバ
これからの課題として・・・
C言語とのギャップが大きく,学習コストが高い
C/C++の資産が大きい,これから増やしていく必要があり
新しい言語「ZEN」
- connectFree社開発(2015~)
- Reduce your stress
8. Naoさん「Wi-Fiのチャネルベース中間者攻撃とKRACKsの話」
ラックでセキュリティエンジニアをしているNaoさんが、challen-based MitM Attacksを実際に試した報告をしてくれました。
CSAを利用したチャネルベース中間者攻撃の論文発表が2018年よりvanhoef氏らによって発表されたとのこと
Google Scholarで検索したらみつかりました
日本でも同攻撃の実現可能性
□実際に攻撃してみた / channel-based MitM Attacks
- 資料
- krachattacks-poc-zerokey(PoCのツールです)
- KRACKs demo tool
- KRACKの脆弱性があればWPA2の復号ができる
- 今までのIpアドレスが変わっている→ニセのAPにつながっている?
- 先と同様にネットにはつながる,しかし中間者攻撃が成功している
- WPA2の通信が復号されている→KRACKの脆弱性
- 再接続要求をビーコンを出して強制的にAPを変更する
□対策は?
通信が暗号化された状態のみチャネル情報を交換する
クライアント側でCSAを無効化
- APのチャネルを記録しておき、普段と異なる場合に通知
とりあえず・・・
2.4GHz帯でも攻撃が成功してしまう(5GHzでも関係ない(クライアントが対応していると結局同様))
攻撃に必要な情報はSSIDのみ
低レイヤパケット解析は楽しい!
#IotSecJP で@nsec_life さんから発表があったCSAsを使用したWifiのMitMに挑戦している。
— graneed (@graneed111) March 17, 2019
Wifi Hackingを試したのが半年以上前なので環境など全てを忘れていたが当時の自分のblog(https://t.co/VzoLjB2bOj)を読んで思い出してきた。半年前の自分を褒めてあげたい。
9. Hidekazu Asabaさん「電力線通信に対するDoS攻撃の検討」
電力線通信に対するDoS攻撃についてのお話をお伺いしました。
「電力線」と聞いて私はピンとこなかったのですが、これはPLCのことですね。
PLC(電力線通信)とは、Power Line Communications の略で、電気エネルギーを供給する電力線に高周波の通信用信号を重畳して伝送させることにより、電力線を通信ケーブルとしても使用する技術のことです。
https://www.m-system.co.jp/mstoday/backnum/2007/03/iandn2/index.html
「消防法」がキーワードですね。
我が国が長年蓄積してきた防災知識そのものである
□やってみた
- 火災の発生を検知、報告するのは「火災受信機」
- これに対して攻撃できれば影響が大きいのでは?
しかし「バレない攻撃は難しい」
火災検知ビットをなりすましてみる
- プロトコル上の火災検知データい、電圧(ビット)を印加して火災をご認知させる
(詳細な方法などについては公開しないこととします)
10. 黒林檎さん「4Kカメラをハッキングしてインスタ映えしてみた」
「プリンタからドメインコントローラへペンテストしてみました」
役に立つサイト!
Orange PiとLime SDRで基地局を偽装するデモ
- 解析してバックドアを開いてみる→自分で操作できますよね
- ただ,そこら辺ハックしても保証してませんよ
- 脆弱性の開示→IPAへ報告→バックドア消えました
□分析フェーズ
推測による指摘や公開は控えることにするそうです(とくに最近そういうの危険な流れが・・・)
脆弱性を見つけたらまずは届け出ることが先!
最後に
今回の #IoTSecJP の知見は2つ
— 黒林檎 (@r00tapple) March 18, 2019
・https://t.co/QXMEeYLU1J を使用したら質問が増える。(anonymousで質問可能)
・HDMIの出力ができないけど、参加者がHDMI出力Onlyだったら https://t.co/FXtMGFVmM9 経由で登壇者の画面を共有して出力することが可能。(※これは事前に運営が調べて報告しろ感)
今回の #IoTSecJP の知見は2つ
・sli.do を使用したら質問が増える。(anonymousで質問可能) ・HDMIの出力ができないけど、参加者がHDMI出力Onlyだったら appear.in 経由で登壇者の画面を共有して出力することが可能。(※これは事前に運営が調べて報告しろ感)
だそうです.sli.doというサービスは初めて知りました.SlackやTwitterを触っていない人でも質疑を匿名でできるので心理的障壁を減らしてくれますし,いい方法だなと思いました.
また最近,ちょっとしたことをきっかけに逮捕者が発生しており,界隈でもCTF writeupをクローズしたり,CTFサーバが停止したりととても良くない動きが見られます.Conhive事件が無罪になる、一般社団法人が寄付を募るなど、こうした動きが活発化し、その結果がどうにか良い方向に向かっている気がします。先行きは暗いですが・・・。
今後はセキュリティリテラシに注意することはもちろんですが,こうした技術がホワイトハットに基づいていることもしっかりと周知していく必要があると思います.ということで今回のこの記事もそういう意味を込めて公開したいと思っていました。
次回のIoTSecJPで登壇できることを期待して・・・
※紆余曲折あり(というか基本的に空いた時間やタスクの合間にすすめており)遅くなってしまったことご容赦ください
※不備、失言等ありましたらコメントやDMなどでお願い致します
おまけ
技術書典6にてIoTSecJP Vol.3の頒布が行われました(BOOTHでの販売は期間限定だそうです)。
また、中村行宏さんの「サイバー攻撃の教科書」も販売されております!
#IoTSecJP にて、圧倒的進捗を出した中村行宏氏が新しく本を出版いたしました!
— 黒林檎 (@r00tapple) 2019年3月19日
サイバー攻撃を図解で解説していく一冊となっています!
ご興味がある方は、お手にとっていただけると幸いです。
・amazon商品ページhttps://t.co/e7sKLWqtZC
・書籍公式サイトhttps://t.co/f5LdC2cfph
おまけ2
黒林檎傷害事件「〜黒林檎の部屋〜 未成年による傷害事件体験記」がBOOTHで公開されています。事件解決までの道のりが非常に役に立ちます!
@_tokina23
Dragino製 LoRaWAN GPS Trackerを試してみた&設定変更手順
TL;DR
How to configure LoRaWAN GPS Tracker (ABP to OTAA)?
というわけで、今回もLoRaWANネタです。
今回、Dragino製のLoRa GPS Trackerを試したみたので、そのメモを残して置きたいと思います。なお、検証は電波遮断シールド下で試しています。結果としては、上手く行かなかったので、マニュアル実行方法などについてまとめておこうと思います。
Dragino社はLoRaデバイスを代表に、様々なIoTデバイスを取り扱っている中国深センのベンチャー企業で、そのドラゴンのアイコンが特徴です。
Dragino社が提供している商品は、メイカーがプロトタイプを作成したり、メーカーのPoC作成レベルでは非常に試しやすいのが特徴です。また、LoRaデバイスも従量課金制やレンタル製ではなく、完全に買い切りで使用でき、LoRaWANではなくLoRa無線だけを利用したいユーザーもDragino製のシールドやデバイスが向いていると思います。
日本ではOpenwave社が代表してDragino製品の技適を取得しており、既にLoRa Mini Dev JPやゲートウェイ、Raspberry Pi HATが利用できます。ただ、日本で利用できるものはまだ1チャネルのもののみなので、今後に期待しています。
さて、昨年末、LoRaWAN GPS Trackerをある御方にお貸し頂いたのですが、2月までは修論や他のタスクで時間が取られてしまい、3月になって試してみたのですが、上手く位置情報が取れませんでした。今回は一応試してみたことについて残しておきます。
※LoRaWANやLoRa、TTN(The Things Network)については解説しません。
Dragino製 LoRaWAN GPS Tracker(LGT-92)について
現在、入手はAliExpress経由がいいかもしれないです。ただし、ヨーロッパの技適を取得しているものの、日本での技適取得はまだなので注意してください。
日本はAS923で動作しなければいけないので、ColorからAS923を選択すればOKです。
バンドについては以下参照。
EU433: Default frequency band EU433 CN470: Default frequency band CN470 EU868: Default frequency band EU868 IN865: Default frequency band IN865 KR920: Default frequency band KR920 AS923: Default frequency band AS923 AU915: Default frequency band AU915 US915: Default frequency band US915
Dragino製品としての名前はLGT-92です。
何ができるのか
The Dragino LoRaWAN GPS Tracker LGT-92 is an open source GPS tracker base on Ultra Low Power STM32L072 MCU and SX1276/1278 LoRa Module.
LGT-92 includes a low power GPS module L70 and 9-axis accelerometer for motion and attitude detection. The power for both of the GPS module and accelerometer can be controlled by MCU to achieve the best energy profile for different applications.
低消費電力で動作するGPSモジュールであり、その他にも9軸加速度センサを搭載しています。これらの値を定期的にLoRa無線で送信します。
公式のデータシートはこちら
使い方
まず、Dragino製品の紹介ページを確認してマニュアルを参照します。
ここの、以下にマニュアルが置いてあります。
まず、全体の動作概要はこんな感じです。
動作手順(マニュアルより)
- Step1: LoRaWANサーバー上(今回はTTN: The Things Network)でOTAA関係の鍵を作成します。
- これに必要な情報は箱に同梱されています。
- アプリケーションキー、各セッションキー、デバイスアドレス、デバイスEUIなどです。
- Step2: LGT-92 LoRaWAN GPS Trackerのスイッチをオンにします。
- 本体に物理スイッチがあり、リチウムイオンバッテリーをMicroUSB経由で充電できます。
- Step3: 自動的にTTNネットワークへ参加後、定期的にサーバへ情報を送信します。
注意
デフォルトでは5分に一度メッセージの送信(=位置情報の送信)を行いますが、GPSを受信する際には緑色のLEDが点灯します。一度GPS情報を受信すると、バッテリ情報、GPS情報、X軸Y軸加速度を送信します。もし2分間GPSが受信できない場合には、GPS情報を0としてメッセージを送信します。
TTNへのデバイス登録
TTNでアプリケーションを作成後、デバイスを登録します。アプリケーションEUIは複数設定できるので、箱に同梱されていたアプリケーションEUIをTTNコンソール上から手動で追加します。
(ABPで利用する場合)デバイスを一度作成後、設定からアクティベーション方式をOTAAからABPへ変更します。EUI関係を箱に同梱されていたものに変更します。ただし、デバイスアドレスは変更できないため、実際のデバイスの方の設定を、TTN上で生成したアドレスに変更する必要があります。
送信メッセージのペイロードフォーマットについて
Size(bytes) | 3 | 3 | 2 | 2 | 2 |
---|---|---|---|---|---|
Value | latitude | longitude | Battery | X accel | Y accel |
Example:
□ Latitude: 06765f ⇒ if (0x06765f & 0x800000 = 0 ): value = 0x06765f /10000 = 42.3519
□ Longitude: F2960a ⇒ if (0xF2960a & 0x800000 = 1 ): value = (0xf2960a – 0x 1000000)/10000 -87.9094
□ BAT: Ex1: 0x0B45 ⇒ 3850mV
□ X: 04D2 = if (0x04D2 & 0x8000 = 0 ): value = 0x04D2 / 1000 = +1234 ⇒ +1.234G
□ Y: FB2E =if (0xFB2E & 0x8000 = 1 ): value =( 0xFB2E - 0x10000)/1000(dec) ⇒ -1.234G
TTNや、その他の視覚化サービスで情報を利用するにはJSON変換コードを書く必要があります。
ペイロード変換コードの例
以下はTTNでの変換例(マニュアル記載あり)
//The function is : function Decoder(bytes, port) { // Decode an uplink message from a buffer // (array) of bytes to an object of fields. var value=bytes[0]<<16 | bytes[1]<<8 | bytes[2]; if(bytes[0] & 0x80) { value |=0xFFFFFF000000; } var latitude=value/10000;//gps latitude value=bytes[3]<<16 | bytes[4]<<8 | bytes[5]; if(bytes[3] & 0x80) { value |=0xFFFFFF000000; } var longitude=value/10000;//gps longitude value=bytes[6]<<8 | bytes[7]; var batV=value/1000;//Battery,units:V value=bytes[8]<<8 | bytes[9]; var roll=value/100;// value=bytes[10]<<8 | bytes[11]; var pitch=value/100; return { Latitude: latitude, Longitud: longitude, Roll: roll, Pitch:pitch, BatV:batV, }; }
AllThingsTalk Makerでの変換例(ABCL)
{ "sense": [ { "asset": "GPS", "value": { "type": "object", "propaties": { "latitude": { "type": "integer", "byte": 0, "bytelength": 3, "calculation": "(val / 10000)" }, "longitude": { "type": "integer", "byte": 3, "bytelength": 3, "calculation": "(val / 10000)" }, "altitude": { "type": "number" } } } }, { "asset": "Battery", "value": { "type": "integer", "byte": 6, "bytelength": 2, "calculation": "(val / 1000)" } }, { "asset": "Pitch", "value": { "type": "integer", "byte": 8, "bytelength": 2, "calculation": "(val / 100)" } }, { "asset": "Roll", "value": { "type": "integer", "byte": 10, "bytelength": 2, "calculation": "(val / 100)" } } ] }
基本的に計算方法が記載されているので、うまくリファレンス読みながら書けば問題ないはずです。
設定の変更方法(ABP→OTAA)
LoRaWANのノードのアクティベーション方式にはABP(Activation by Personalization)とOTAA(Over the air Activation)の2種類あります。
以下である程度詳しく解説しているので、必要に応じて参照してください。
LoRaWAN GPS Trackerは非常にシンプルなつくりなので、OTAA方式で自動でアクティベーションされるのが理想です。よりセキュアに位置情報を送信できます。
デフォルトではOTAAで動作しますが、問題なのはLoRaゲートウェイがOTAAに対応しているかどうかです。1チャネルゲートウェイのDragino LG01, LG02, OLG01などではOTAAには対応していないので(パケットフォワーダがうまくやる例外はありますが)、ABPで利用できるようにしなければいけません(一方的にメッセージの送信を行うのでダウンリンクは関係ないため)。
まず、USB-TTLシリアルコンバータを買います。秋葉原のマルツで安く売ってたやつを買ってきました。
LoRaWAN GPS TrackerにはMicroUSBケーブル接続口しかないので、それをTTLへ変換するケーブルが同梱されています。これをつかってこんな感じで繋ぎます。
黒:GND, 緑:RXD, 白:TXD
アクセスランプが点灯すればアクセスできます。LoRaWAN GPS Trackerの電源を入れるとアクセスランプが点灯するはずです。
WindowsからはTeraTermやputtyをつかってシリアルアクセスします。今回はMacなので、/dev/配下に見えます。cuコマンドなどでアクセスします。ボーレートは9600です。
アクセスすると以下のような出力があります。
$ cu -l /dev/tty.usb**** -s 9600 LGT-92 Device Image Version: V1.3 Frequency Band: AS923 DevEui= AB 4e 41 ee 01 81 ge 35 Please set the parameters or reset Device to apply change
ATコマンドで設定を変更します。詳しくはマニュアルに全て記載があるので、そちらを参照してください。今回はABPへの変更手順について説明します。「#」以降はコメントです。ATコマンドは見えないので出力とは異なります。
LGT-92 Device Image Version: V1.3 Frequency Band: AS923 DevEui= AB 4e 41 ee 01 81 ge 35 Please set the parameters or reset Device to apply change (入力)AT+FDR #工場出荷状態へ戻す OK #入力に不備がある場合はERRORと出力されます (入力)AT+NJM=0 #ABPモードへ切り替える OK (入力)AT+ADR=0 #Adaptive Data Rateをオフにします OK (入力)AT+DR=2 #データレートを指定します。マニュアルでは5になっています。 OK (入力)AT+TDC=300000 #送信間隔を指定します OK (入力)AT+CHS=923200000 #送信時の周波数を指定します OK (入力)AT+DADDR=** ** ** ** #デバイスアドレスを指定します。スペース込みです。 OK (入力)ATZ #MCUをリセットする OK LGT-92 Device Image Version: VI .3 Frequency Band: AS923 DevEui= A8 4B 41 ee el 81 9B 35 JOINED
JOINEDが表示されれば、ABPへ切り替わったことが分かります(参加フェーズがパスされています)。
これで、メッセージの送信が以下のように行われれば成功です。
LGT-92 Device Image Version: V1.3 Frequency Band: AS923 DevEui= AB 4e 41 ee el 81 9B 35 JOINED update_times: 30 update_times: 60 update_times: 90 update_times: 110 ***** UpLinkCounter= 0 ***** TX on freq 9232eeøee Hz at DR 2 GPS NO FIX txDone rxTimeOut rxTimeOut update_times: 30 update_times: 60 update_times: 90 update_times: 110 ***** UpLinkCounter=1 ***** TX on freq 9232eeeee Hz at DR 2 GPS NO FIX txDone rx TimeOut rxTimeOut update_times: 30 update_times: 60 update_times: 90 update_times: 110
なお、GPSが取得できると、たまに以下のように情報が表示される場合もありますが、このあとデバイスが動作を停止してしまうので再現性がありませんでした・・・。(もしかしたらファームウェアをアップデートすれば直っているかもしれません)。※ファームウェアアップデートではST Linkを使用します。
Roll=84 Pitch=329 South: 35.4542 East: 139.5986
TTN上でメッセージの確認
ABPへの変更後、TTN上で実際にメッセージが送信されているか確認します。
今回は自身が所有・管理しているゲートウェイでLoRaメッセージを受信したので、まずはTTN上のゲートウェイからメッセージの到達を確認します。
うまくアクティベーションされているっぽいので、登録したアプリケーションのデバイスを開いてみます。
これでメッセージの送信が行われていることが分かり、正しくアクティベーションは通っている(=デバイスが送信したデータが復号されている)ことが分かります。
しかし、payloadの部分に「FF FF FF FF 0F 17 00 2A 01 21」とあるように、GPSの情報はFFで埋められており、実際に送信できていませんでした。おそらく、バッテリと加速度の情報は送信できているようです。さらに、よく見ると11バイトです。もともと12バイトなので、変換コードがエラーを吐いて動かない可能性もあります(AllthingsTalkではエラーになっていました)。
正常に動作しない・・・
正常に動作しませんでした(結論)。
メッセージの送信はうまく行われているのですが、その内容が怪しいようです。
先の最後に書いたとおり、payloadにGPS情報などが正しく含まれていません。さらに、0が含まれた状態でメッセージが送られることもなく、11バイトのままでした。
さらに、GPS情報が取得できそうな場合でも、取得した瞬間に位置情報が表示されて端末がメッセージを送信することなく動作が終了してしまうようでした。
まとめると以下
- GPSが取得できていない?
- 急に動作を停止する
- 正常なメッセージを送信していない
- マニュアルに示されている0で埋め尽くされることと、11バイトであることに反している
- リトルエンディアンで1(bit)で埋め尽くされている?
- マニュアルに示されている0で埋め尽くされることと、11バイトであることに反している
最後に
今回お借りしたLoRaWAN GPS Trackerはかなり初期のものだった可能性があります。そのため、ファームウェアが古く、挙動がおかしかったのかもしれません。今回は位置情報は取得できなかったもののアクティベーションからメッセージの送信まではうまくいいきました。
非常にコンパクトで、なおかつ低消費電力で位置情報を送信できるGPS Trackerは人の流動管理などで非常に有益そうです。そのためにも、もっとLoRaWANのゲートウェイを増やしていく必要がありますね。ユースケースとしては、従業員につけて実際に仕事しているかの確認や、また動物につけてその生態を探るなどでしょうか。
なお、今回LoRaWAN GPS Trackerをお借りしたのはThe Things Networkアンバサダーの吉田さんです。以下は吉田さんのwebサイトです。最新のLoRaWAN情報をチェックできます!
今年の1月末〜2月頭に開催されたThe Things ConferenceでもGPS Tracker(おそらくDragino製のものではない)をAzure Central Bridgeで可視化するデモもありました。
今後のLoRaWANの日本での発展に私も少しでも貢献できればと思っています!
また、LoRaWAN GPS Trakcerはお返しすることになっているので、気が向いたら自分でも購入してまた試してみたいです(個人的にAzureを使って可視化してみたい)。
センスウェイさんのLoRaWANスターターキットを試してみた - サーバーレスにセンサデータ取得&可視化
Getting start the Senseway LoRaWAN Starter Kit - get the sensor data and visualize it
やっていくぞ!ということで今回はセンサデータの取得と可視化を試します.
キットなどについての前の記事はこちら.
スターターキットに含まれていたのは以下のものでした.
- Arduino Uno互換機
- LoRa (WAN)通信モジュール
- LoRaアンテナ(800MHz ~ 1GHz向け?)
- USB-Bケーブル
- LoRaWAN屋内用ゲートウェイ
- アンテナ
- Mini USBケーブル
- USB変換アダプタ
- LANケーブル
- 温度センサ(ADT7410)
今回はこのADT7410のデータ取得から,その値をMicrosoft Power BIを利用して可視化するまで試してみます.
- 実際にデータを取得して送ってみる
- Azureの利用 - 可視化を試す
- (おまけ)デバイスから取得したセンサの情報をスマホでみる
- (おまけ)通信費用
- (おまけ)KashiwaGeeksを少し改造
- 終わりに
実際にデータを取得して送ってみる
センサノードのキットなので,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
つなげるとこんな感じに.
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はマイクロソフトが提供する強力な可視化サービスの一つです).アーキテクチャは以下の通りです.
サーバーレスになっていますね!
まず公式でAzure IoT Hubとの連携ができるとアナウンスしていたので,センスウェイさんの公式サイトのマニュアルを参考に設定とかを行います.
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は今回無料版を利用しました(メールアドレスは所属団体のものを利用しないといけないので大学のメールアドレスを).無料版はなんかわかりにくいので注意してください.一部に制限があります.
うまく連携できると,Analytics JobsのMonitoringで以下のようにデータが届いていることを確認できます.うまく動作したので一度寝るときにデバイスの電源を抜き,起きてから再度デバイスを電源につないで大学にでかけたのが分かります.それ以降もデータが流れてきていますね.
参考:https://docs.microsoft.com/en-us/azure/iot-hub/tutorial-connectivity
とりあえず,マイクロソフトの公式リンクの通りに進めると,Power BIでこんな感じに見えました.なお,Stream Analytics JobsをStopするとPower BIにデータは送られなくなります.
このままだとデータが届くのは確認できますが,肝心の温度データが取れていないので,ちょっと試行錯誤.何もしていない状態だと,JSONの各Elementが取れていますが,これでは何もできないです.もちろんデータの中身も見れません.
ここで取れていたフィールドはSenseway Mission Connect→Azure IoT Hubで流れてきたものです.そこでこの中にデータが入っているはずなので,その中身を取り出す必要があります.
Azure IoT HubにはSenseWay Mission ConnectからなにかしらのJSON Formatで送られているはずです.以下を参考にデータをParseするQueryをStream Analytics JobsのQueryに書くことでPower BIで値が取れるはずです.
JSON Formatはセンスウェイさんが公開していないようだったので,Power BIに最初見えていたElementを元に,適当に当たりをつけて調べました(スターターキットに含まれていた資料のとあるページも合わせて参考にしました).どうやら主なデータは"mod"に入っているようでした.また複数のgwが受信することも想定しているようですが,JSON Arrayは対応していない?ようなので取れなかったです.なお,今回判明した仕様は下記クエリ以外については私からは公開しません.
!公式マニュアルにセンスウェイさんの各JSONフォーマットが公開されていました!
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のフィールドにこんな感じに見えると思うので,とりあえずそれぞれのデータをリスト表示してみました.
Queryで指定したElementがきちんとロードされており,とりあえずレポートでそれぞれのデータを見ることができました(固定の周波数じゃないのが気になります).
肝心の温度データは”temperature"に格納されています.ここで,Arduinoのプログラムは10進数でそのまま送るように(20.32度→2032として送信)変更しており,mod.dataの中身は10進数の温度データのみとしています.なので,bigint型にCASTしてそのままPower BIに流し込むことで,すぐに折れ線グラフにすることができるはず!
折れ線グラフを選択し,X軸にenqueuedtimeを,値にtemperatureを選択し,折れ線グラフにした結果はこちら(100倍した値になっています).
スケールとかは,ローラーのようなアイコンからいろいろいじれます.なお,Y軸はそのままなので,気温は×100した値になっていますがご愛嬌ということで.これで私の部屋の気温を無事グラフにすることができました.途中でばーんと上昇しているのは私がセンサを握ったからです.物理デバッグです.
これで実機を利用してセンサ値を取得,可視化することができました!!!おつかれさまでした
本当は公開したかったのですが,その機能はPro(めっちゃ高い)だけらしいです.ざんねん.
現在値の各可視化状況(リアルタイム)
↓現在値のグラフなどです(複数ページを作成しています)
- ページ1: 折れ線グラフ
- ページ2: 平均値+度数 (一番多かった温度の部分が尖っています)
- ページ3: 最終更新時刻 (UTC + 9H = JST)
- ページ4: 利用周波数 (GWが利用する周波数がばらついていたので棒グラフにしました)
- ページ5: 生データ履歴
(おまけ)デバイスから取得したセンサの情報をスマホでみる
Power BIにはElasticsearchのKibanaのように,ピンボードがあり,iOSアプリのPower BIからこのピンボードへとアクセスできます.これでセンサのグラフを遠隔から見れますね.
App StoreでPower BIアプリをダウンロードし,ログインするとダッシュボードが見えます.
今回は「SensewayTest」というダッシュボードを用意してみました.
いくつか表示形式を用意してみました.一番上は折れ線グラフ,その下は現在の値を表示しています.これで自宅の気温が一発でわかります!
もちろんグラフだけを表示する事もできます.
取得期間がそこまで長くないのでちょっと微妙ですが,とんがっている部分は私が寝るときで,寝ている間〜現在に気温が低下していることがわかります.最後にすこし尖っている部分がありますが,これは私が起きたタイミングです.
(おまけ)通信費用
センスウェイさんのサイトに価格について明示されています.
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して自分のリポジトリにおいています.
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月末まで,との約束だったのでギリギリセーフです!この記事がセンスウェイさんのお役に立てば幸いです.