うたカモ技術ブログ

Linux OpenWrt

OpenWrt   ubus iwinfoオブジェクト

post: 

今回は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

調査中です。

    

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"
}