先にリポジトリを置いておきます。
パケットのPHY部の分析機能はほぼ実装完了していますが、MAC部の分析機能は未実装のため引き続き実装予定です。
作った背景
ソフトウェア無線機(SDR:Software Defined Radio)を2台ほど所持しており、スペアナがわりに920MHz帯を観察していたところ、明らかに変調された信号が大量に飛び交っていたため、復調してパケットを分析するための機能を勉強の意味も込めて作りました。
Wi-SUNとは
Wi-SUNは Wireless Smart Utility Networkの略で、日本では特定小電力無線と呼ばれる920MHz帯で使用され、2.4GHzや5GHz帯を使用するWi-Fiと比べると、通信速度は遅いものの、通信距離は長く、障害物にも強くてつながりやすく、しかも低消費電力で通信が可能な規格です。
電力会社のスマートメーターに利用されており、Wi-SUNには大きく4つの規格が存在しています。
1つ目は「Wi-SUN ECHONET プロファイル」で、主にスマートメーター ←→ HEMS間の1対1通信に使用されています。
2つ目は「Wi-SUN HAN(Home Area Network)」で、主に屋内 HEMS ←→ 家電間の1対多通信を目的として規格化されました。
3つ目は「Wi-SUN JUTA(Japan Utility Telemetering Association)」で、おもにガスメーター検針システムとして規格化されました。
4つ目は「Wi-SUN FAN(Field Area Network)」で、主にスマートメーター ←→ スマートメーターor電力事業者設備といった通信に利用されており、多段、マルチホップメッシュネットワークがおもな特長です。
(出典:1:Wi-SUN FANって?)
Wi-SUNの仕様について
Wi-SUNには大きく4つの規格が存在すると記載しましたが、物理層は大体同じです。
ECHONETはHANと物理層は全く同じ?ようで、JUTAについてはデータが見つからなかったので、HAN向けモジュールのBP35C0のデータシート、FAN向けモジュールのBP35C5のデータシートを参考にしてみました。
- Wi-SUN HAN
- 変調方式:2値GFSK
- データレート:100kbps固定
- 使用チャンネル:33〜60ch
- Wi-SUN FAN
- 変調方式:2値GFSK
- データレート:50kbps、100kbps、150kbps、300kbps可変
- 使用チャンネル:24〜61ch
ちなみに920MHz帯のチャンネルは以下のように定められています。
(出典:920MHz特定小電力のチャンネルと周波数)
Wi-SUN HANはデータレートが100kbps固定のため61chが使えないようになっている一方、FANは24〜32chを含む広い範囲での利用が可能になっています。
| ch | 50kbps選択時 | 100kbps選択時 | ||
|---|---|---|---|---|
| 中心周波数(MHz) | 帯域(MHz) | 中心周波数(MHz) | 帯域(MHz) | |
| 24 | 920.6 | 0.2 | 920.7 | 0.4 |
| 25 | 920.8 | 0.2 | 920.9 | 0.4 |
| 26 | 921 | 0.2 | 921.1 | 0.4 |
| 27 | 921.2 | 0.2 | 921.3 | 0.4 |
| 28 | 921.4 | 0.2 | 921.5 | 0.4 |
| 29 | 921.6 | 0.2 | 921.7 | 0.4 |
| 30 | 921.8 | 0.2 | 921.9 | 0.4 |
| 31 | 922 | 0.2 | 922.1 | 0.4 |
| 32 | 922.2 | 0.2 | 設定禁止 | - |
| 33 | 922.4 | 0.2 | 922.5 | 0.4 |
| 34 | 922.6 | 0.2 | 922.7 | 0.4 |
| 35 | 922.8 | 0.2 | 922.9 | 0.4 |
| 36 | 923 | 0.2 | 923.1 | 0.4 |
| 37 | 923.2 | 0.2 | 923.3 | 0.4 |
| 38 | 923.4 | 0.2 | 923.5 | 0.4 |
| 39 | 923.6 | 0.2 | 923.7 | 0.4 |
| 40 | 923.8 | 0.2 | 923.9 | 0.4 |
| 41 | 924 | 0.2 | 924.1 | 0.4 |
| 42 | 924.2 | 0.2 | 924.3 | 0.4 |
| 43 | 924.4 | 0.2 | 924.5 | 0.4 |
| 44 | 924.6 | 0.2 | 924.7 | 0.4 |
| 45 | 924.8 | 0.2 | 924.9 | 0.4 |
| 46 | 925 | 0.2 | 925.1 | 0.4 |
| 47 | 925.2 | 0.2 | 925.3 | 0.4 |
| 48 | 925.4 | 0.2 | 925.5 | 0.4 |
| 49 | 925.6 | 0.2 | 925.7 | 0.4 |
| 50 | 925.8 | 0.2 | 925.9 | 0.4 |
| 51 | 926 | 0.2 | 926.1 | 0.4 |
| 52 | 926.2 | 0.2 | 926.3 | 0.4 |
| 53 | 926.4 | 0.2 | 926.5 | 0.4 |
| 54 | 926.6 | 0.2 | 926.7 | 0.4 |
| 55 | 926.8 | 0.2 | 926.9 | 0.4 |
| 56 | 927 | 0.2 | 927.1 | 0.4 |
| 57 | 927.2 | 0.2 | 927.3 | 0.4 |
| 58 | 927.4 | 0.2 | 927.5 | 0.4 |
| 59 | 927.6 | 0.2 | 927.7 | 0.4 |
| 60 | 927.8 | 0.2 | 927.9 | 0.4 |
| 61 | 928 | 0.2 | 設定禁止 | - |
Snifferの仕様について
作成中のプログラムについては、実際の無線信号を受信・復調してパケットを可視化しており、実際の無線信号を受信するためにソフトウェア無線機(SDR)と呼ばれる装置を利用しています。
自分は「USRP B210(USRP-2901)」と「LibreSDR B220mini(USRP Clone)」の2台のSDRを所持しており、この2台のSDRで動作することを確認しています。
Snifferの構成は以下のようになります。
各々のブロックの処理についてはコードを確認いただきたいのと、また別途記事を書くかもしれないので、この記事での説明は割愛します。
1スレッドの処理では間に合わないので、「SDRからの受信用スレッド」、「チャネライザ用スレッド」、「復調用スレッド」の3つのスレッドを起動し、マルチスレッドで処理を行っています。
プログラムを実行すると、以下のようにリアルタイムでパケットの解析結果やMACペイロードが出力されます。
今後の予定
現状は、MACのペイロードがそのまま出力される仕様です。そのため、MACのヘッダーを分析する機能を実装予定になります。


