OpenWrt ubus iwinfoオブジェクト
今回はUBUSのiwinfoオブジェクトを調査した内容をメモしました。
iwinfoオブジェクトはWi-Fiの制御情報や周辺環境のビーコン情報を確認することができるUBUSサーバーアプリケーションです。
iwinfoオブジェクトが持つ各メソッドの実行結果を踏まえて理解した内容をここに記載しました。
前提知識:Wi-Fiの物理インタフェースと仮想インタフェースについて
物理インタフェースとはRF(Radio Frequency)チップに1対1で対応するインタフェースで、OpenWrtではphy0やphy1といった名称で管理されます。
仮想インタフェース(VIF)は物理インタフェースを論理層で分割したもので、phy0-ap0やphy1-ap1などの名前が与えられます。OpenWrtのバージョンによってはwlan0やwlan1などの表記になることもあります。
仮想インタフェースは複数作成でき、ifconfigコマンドやipコマンドで確認できます。
IEEE 802.11のMACレイヤーは複数のBSSIDを順次送出するなどの仕組みで1本の搬送波を共有します。 つまり、時間やフレーム単位で論理チャネルを切り替えることで物理的な通信路を複数存在するかのように仮想化しています。
そのため、各仮想インタフェースはSSIDと対応するビーコン情報を管理し、1つのRFチップの搬送波上に論理ストリームを形成します。
今回紹介するiwinfoオブジェクトは、こうした物理インタフェースと仮想インタフェースに紐づく情報を管理・取得するためのUBUSエンドポイントです。
注意
仮想化できるのはソフトウェアでどうにでもなる論理部分のみです。 物理制御に関わる情報(例:チャネル、1024QAMなど)は仮想化できません。RFチップのサポート・仕様に依存します。
メソッド一覧
メソッド一覧を以下に掲載します。
root@OpenWrt:~# ubus -v list iwinfo
iwinfo' @bd92fb48
"devices":{}
"info":{"device":"String"}
"scan":{"device":"String"}
"assoclist":{"device":"String","mac":"String"}
"freqlist":{"device":"String"}
"txpowerlist":{"device":"String"}
"countrylist":{"device":"String"}
"survey":{"device":"String"}
"phyname":{"section":"String"}
iwinfoオブジェクトは無線に関する情報を管理するものなので、 予めWi-Fiなどが有効になっている必要があります。
※Wi-Fi無効時ではこの記事に記載したメソッドの実行が出来ない場合があります。
devices
iwinfoオブジェクトが認識している仮想インタフェース一覧を返します。出力例ではphy0-ap0とphy1-ap0が列挙され、現在有効なVIFを把握できます。
root@OpenWrt:~# ubus call iwinfo devices
{
"devices": [
"phy0-ap0",
"phy1-ap0"
]
}
info
指定したデバイスの基本情報をまとめて取得します。SSIDやBSSID、チャネル、ビットレート、暗号方式、対応ハードウェアモード、搭載チップ名など運用状態の指標を一度に確認できます。
root@OpenWrt:~# ubus call iwinfo info '{"device":"phy0-ap0"}'
{
"phy": "phy0",
"ssid": "OpenWrt",
"bssid": "XX:XX:XX:XX:XX:XX",
"country": "JP",
"mode": "Master",
"channel": 1,
"center_chan1": 1,
"frequency": 2412,
"frequency_offset": 0,
"txpower": 19,
"txpower_offset": 0,
"quality": 70,
"quality_max": 70,
"signal": -26,
"noise": -90,
"bitrate": 58500,
"encryption": {
"enabled": true,
"wpa": [
2
],
"authentication": [
"psk"
],
"ciphers": [
"ccmp"
]
},
"htmodes": [
"HT20",
"HT40"
],
"hwmodes": [
"b",
"g",
"n"
],
"hwmodes_text": "b/g/n",
"hwmode": "n",
"htmode": "HT20",
"hardware": {
"id": [
5315,
30229,
30229,
5315
],
"name": "MediaTek MT7615E"
}
}
scan
対象デバイスが受信した周辺のAP/BSS情報を列挙します。SSID、BSSID、受信信号強度、利用チャネル、暗号方式などが得られ、周囲の無線環境調査に利用できます(例ではプライバシー保護のため出力を省略)。
root@OpenWrt:~# ubus call iwinfo scan '{"device":"phy0-ap0"}'
プライバシーのため結果は省略
survey
チャンネルごとの統計を取得し、mhz単位でactive_timeやbusy_time、rx_time、tx_timeなどを確認できます。混雑チャネルやアイドル時間を把握し、最適なチャネル選定に役立ちます。
root@OpenWrt:~# ubus call iwinfo survey '{"device":"phy0-ap0"}'
{
"results": [
{
"mhz": 2412,
"noise": 165,
"active_time": 62215975,
"busy_time": 27517106,
"busy_time_ext": 0,
"rx_time": 32303211,
"tx_time": 2766731
},
{
"mhz": 2417,
"noise": 166,
"active_time": 116,
"busy_time": 18,
"busy_time_ext": 0,
"rx_time": 14,
"tx_time": 0
},
{
"mhz": 2422,
"noise": 165,
"active_time": 116,
"busy_time": 12,
"busy_time_ext": 0,
"rx_time": 5,
"tx_time": 0
},
{
"mhz": 2427,
"noise": 165,
"active_time": 116,
"busy_time": 18,
"busy_time_ext": 0,
"rx_time": 17,
"tx_time": 0
},
{
"mhz": 2432,
"noise": 169,
"active_time": 116,
"busy_time": 5,
"busy_time_ext": 0,
"rx_time": 18,
"tx_time": 0
},
{
"mhz": 2437,
"noise": 165,
"active_time": 116,
"busy_time": 20,
"busy_time_ext": 0,
"rx_time": 32,
"tx_time": 0
},
{
"mhz": 2442,
"noise": 204,
"active_time": 116,
"busy_time": 102,
"busy_time_ext": 0,
"rx_time": 28,
"tx_time": 0
},
{
"mhz": 2447,
"noise": 203,
"active_time": 116,
"busy_time": 101,
"busy_time_ext": 0,
"rx_time": 12,
"tx_time": 0
},
{
"mhz": 2452,
"noise": 203,
"active_time": 116,
"busy_time": 99,
"busy_time_ext": 0,
"rx_time": 20,
"tx_time": 0
},
{
"mhz": 2457,
"noise": 204,
"active_time": 116,
"busy_time": 95,
"busy_time_ext": 0,
"rx_time": 2,
"tx_time": 0
},
{
"mhz": 2462,
"noise": 201,
"active_time": 116,
"busy_time": 103,
"busy_time_ext": 0,
"rx_time": 12,
"tx_time": 0
},
{
"mhz": 2467,
"noise": 196,
"active_time": 116,
"busy_time": 95,
"busy_time_ext": 0,
"rx_time": 6,
"tx_time": 0
},
{
"mhz": 2472,
"noise": 195,
"active_time": 116,
"busy_time": 100,
"busy_time_ext": 0,
"rx_time": 0,
"tx_time": 0
},
{
"mhz": 2484,
"noise": 187,
"active_time": 156,
"busy_time": 126,
"busy_time_ext": 0,
"rx_time": 1,
"tx_time": 0
}
]
}
assoclist
対象のWi-Fiに接続している機器(子機)の無線情報を取得します。
対象の無線インタフェースを指定して以下のように実行することで、接続機器の無線情報を取得することができます。
root@OpenWrt:~# ubus call iwinfo assoclist '{"device":"phy0-ap0" }'
{
"results": [
{
"mac": "AA:BB:CC:DD:EE:F1",
"signal": -44,
"signal_avg": -44,
"noise": 0,
"inactive": 540,
"connected_time": 50674,
"thr": 0,
"authorized": true,
"authenticated": true,
"preamble": "long",
"wme": true,
"mfp": false,
"tdls": false,
"mesh llid": 0,
"mesh plid": 0,
"mesh plink": "",
"mesh local PS": "",
"mesh peer PS": "",
"mesh non-peer PS": "",
"rx": {
"drop_misc": 2,
"packets": 278412,
"bytes": 49439402,
"ht": false,
"vht": false,
"he": false,
"eht": false,
"mhz": 20,
"rate": 6000
},
"tx": {
"failed": 56203,
"retries": 56198,
"packets": 654340,
"bytes": 775824907,
"ht": false,
"vht": true,
"he": false,
"eht": false,
"mhz": 80,
"rate": 433300,
"mcs": 9,
"nss": 1,
"short_gi": true
}
},
{
"mac": "AA:BB:CC:DD:EE:F2",
"signal": -50,
"signal_avg": -50,
"noise": 0,
"inactive": 15250,
"connected_time": 10062,
"thr": 0,
"authorized": true,
"authenticated": true,
"preamble": "long",
"wme": true,
"mfp": false,
"tdls": false,
"mesh llid": 0,
"mesh plid": 0,
"mesh plink": "",
"mesh local PS": "",
"mesh peer PS": "",
"mesh non-peer PS": "",
"rx": {
"drop_misc": 1,
"packets": 1604,
"bytes": 211764,
"ht": false,
"vht": false,
"he": false,
"eht": false,
"mhz": 20,
"rate": 6000
},
"tx": {
"failed": 9,
"retries": 9,
"packets": 1042,
"bytes": 1103644,
"ht": false,
"vht": true,
"he": false,
"eht": false,
"mhz": 80,
"rate": 433300,
"mcs": 9,
"nss": 1,
"short_gi": true
}
},
{
"mac": "AA:BB:CC:DD:EE:F3",
"signal": -34,
"signal_avg": -33,
"noise": 0,
"inactive": 0,
"connected_time": 1342,
"thr": 0,
"authorized": true,
"authenticated": true,
"preamble": "long",
"wme": true,
"mfp": false,
"tdls": false,
"mesh llid": 0,
"mesh plid": 0,
"mesh plink": "",
"mesh local PS": "",
"mesh peer PS": "",
"mesh non-peer PS": "",
"rx": {
"drop_misc": 1,
"packets": 62122,
"bytes": 27662464,
"ht": false,
"vht": false,
"he": false,
"eht": false,
"mhz": 20,
"rate": 6000
},
"tx": {
"failed": 379,
"retries": 379,
"packets": 98409,
"bytes": 100112712,
"ht": false,
"vht": false,
"he": true,
"eht": false,
"mhz": 80,
"rate": 567100,
"mcs": 11,
"nss": 1,
"he_gi": 1,
"he_dcm": 0
}
}
]
}
上記の結果から無線インタフェースのphy0-ap0に接続している機器は3台(AA:BB:CC:DD:EE:F1、AA:BB:CC:DD:EE:F2、AA:BB:CC:DD:EE:F3)であることが分かります。
txpowerlist
設定可能な送信出力レベルをdBmとmWの組み合わせで一覧化し、active:trueの項目が現在有効な値を示します。
root@OpenWrt:~# ubus call iwinfo txpowerlist '{"device":"phy0-ap0"}'
{
"results": [
{
"dbm": 0,
"mw": 1,
"active": false
},
{
"dbm": 1,
"mw": 1,
"active": false
},
{
"dbm": 2,
"mw": 1,
"active": false
},
{
"dbm": 3,
"mw": 1,
"active": false
},
{
"dbm": 4,
"mw": 2,
"active": false
},
{
"dbm": 5,
"mw": 3,
"active": false
},
{
"dbm": 6,
"mw": 3,
"active": false
},
{
"dbm": 7,
"mw": 5,
"active": false
},
{
"dbm": 8,
"mw": 6,
"active": false
},
{
"dbm": 9,
"mw": 7,
"active": false
},
{
"dbm": 10,
"mw": 10,
"active": true
},
{
"dbm": 11,
"mw": 12,
"active": false
},
{
"dbm": 12,
"mw": 15,
"active": false
},
{
"dbm": 13,
"mw": 19,
"active": false
},
{
"dbm": 14,
"mw": 25,
"active": false
},
{
"dbm": 15,
"mw": 31,
"active": false
},
{
"dbm": 16,
"mw": 39,
"active": false
},
{
"dbm": 17,
"mw": 50,
"active": false
},
{
"dbm": 18,
"mw": 63,
"active": false
},
{
"dbm": 19,
"mw": 79,
"active": false
}
]
}
phyname
UCIのradio0などのセクション名から、カーネルが扱う実際のPHY名を取得します。設定ファイルの論理名とシステム内部のデバイス名を紐付けるスクリプト作成に便利です。
root@OpenWrt:~# ubus call iwinfo phyname '{"section":"radio0"}'
{
"phyname": "phy0"
}