一覧NW-15-1 · Wi-Fiと無線通信

Wi-FiのSSID・信号強度・チャネル

同じSSIDのアクセスポイントを識別し、信号と利用帯域を比較します。

説明

Wi-Fiの一覧に同じネットワーク名が複数見える場合、それぞれ別のBSSIDや周波数で広告していることがあります。名前、受信信号、チャネルの混雑は、別々の情報として確認します。

固定した走査記録をPythonで絞り込み、SSIDとBSSID、dBmとSNRを照合します。続いて中心周波数とチャネル幅から重なる範囲を求め、幅を広げたときの共有条件を比較します。

1同じSSIDの二つのBSSID

走査結果をSSID、BSSID、中心MHz、幅MHz、受信dBm、雑音dBmの順に整理した教材記録です。

scan=走査記録の各欄[("Study","02:00:00:00:00:0a",2412,20,-50,-95),("Study","02:00:00:00:00:0b",2437,20,-68,-90),("Guest","02:00:00:00:00:0c",2412,20,-60,-95)]; scan候補を表示

Studyは同じ名前でもBSSIDが末尾0aと0bで異なります。BSSIDは接続先のBSSを識別する情報で、一つの物理APが複数SSIDやBSSIDを持つ構成もあります。名前だけで同じ無線リンクとは判断できません。

2SSIDを指定して候補を取り出す

Studyを広告している候補だけを残します。

candidates=SSIDが一致する行[r for r in scan if r[0]=="Study"]; [(r[1]BSSID・周波数・信号を比較,r[2],r[4]) for r in candidates]

末尾0aは2412MHz・-50dBm、0bは2437MHz・-68dBmです。受信信号が強いことと、そのAPが空いていること、上位の通信先へ速く届くことは同じではありません。

3dBmの差を電力比へ換算する

-50dBmと-68dBmの差18dBを、受信電力の比として計算します。

difference=受信電力のdB差candidates[0][4]-candidates[1][4]; (difference10のべき乗で電力比へ,round(10**(difference/10),2))

約63.1倍です。dBmは対数なので、-50と-68を普通の整数の比で割って電力比にすることはできません。また受信電力が63倍でも転送速度が63倍になるわけではありません。

4雑音との差を確認する

同じ記録の雑音値からSNRを求めます。

[(r[1],r[4]-r[5])BSSIDごとの信号対雑音比 for r in candidates]

SNRは45dBと22dBです。信号だけでなく雑音側も変わるため、信号値一つだけでは条件を説明できません。測定方法や無線方式によって解釈が変わるため、この値だけで特定の速度が出ると決めません。

5チャネル幅を周波数の区間で表す

中心周波数±幅/2の区間で重なりを調べる簡略モデルです。実際のスペクトル形状や帯域外放射は含めません。

def band(center,width):中心と幅を受け取る return下端と上端 center-width/2,center+width/2

20MHz幅なら中心から両側10MHzです。チャネル番号の差だけでなく中心周波数と幅を確認します。利用可能なチャネルや出力には地域・機器ごとの条件があるため、この計算は設定推奨ではなく重なりのモデルです。

620MHzと40MHzの重なりを比べる

相手は2437MHz・20MHzのまま、こちらを2412MHz・20MHzから中心2422MHz・40MHzへ広げます。

other=相手の帯域band(2437,20); narrow=20MHzの範囲band(2412,20); wide=40MHzの範囲band(2422,40); [(b,max重なる区間の長さ(0,min(b[1],other[1])-max(b[0],other[0]))) for b in (narrow,wide)]

20MHzのモデルでは重なり0、40MHzへ広げたモデルでは15MHz重なります。幅を広げると利用できる資源が増える一方、周辺と共有・干渉する範囲も広がります。隣接帯域の影響をこの重なり値だけで全て定量化できるわけではありません。

7混雑と信号を合わせて確認する

同じ観測窓1000msでbusy時間を測り、末尾0aを750ms、0bを150msとします。

survey=観測時間とbusy時間{"02:00:00:00:00:0a":(1000,750),"02:00:00:00:00:0b":(1000,150)}; [(b,100時間比率を百分率へ*busy/total) for b,(total,busy) in survey.items()]

busy比率は75%と15%です。強い信号の0aでも共有媒体が混んでいる場合があります。どちらが適切かを判断するには、再送、実効速度、認証や到達性も含めて確認します。

まとめ

同じSSIDでもBSSID・周波数・信号・混雑は別々に確認します。

幅を広げた場合の重なりと、信号の強さだけでは決まらない品質を確認します。

操作履歴と解説を振り返れます。

Python 3

1
scan=[("Study","02:00:00:00:00:0a",2412,20,-50,-95),("Study","02:00:00:00:00:0b",2437,20,-68,-90),("Guest","02:00:00:00:00:0c",2412,20,-60,-95)]; scan
[('Study', '02:00:00:00:00:0a', 2412, 20, -50, -95), ('Study', '02:00:00:00:00:0b', 2437, 20, -68, -90), ('Guest', '02:00:00:00:00:0c', 2412, 20, -60, -95)]
2
candidates=[r for r in scan if r[0]=="Study"]; [(r[1],r[2],r[4]) for r in candidates]
[('02:00:00:00:00:0a', 2412, -50), ('02:00:00:00:00:0b', 2437, -68)]
3
difference=candidates[0][4]-candidates[1][4]; (difference,round(10**(difference/10),2))
(18, 63.1)
4
[(r[1],r[4]-r[5]) for r in candidates]
[('02:00:00:00:00:0a', 45), ('02:00:00:00:00:0b', 22)]
5
def band(center,width): return center-width/2,center+width/2
6
other=band(2437,20); narrow=band(2412,20); wide=band(2422,40); [(b,max(0,min(b[1],other[1])-max(b[0],other[0]))) for b in (narrow,wide)]
[((2402.0, 2422.0), 0), ((2402.0, 2442.0), 15.0)]
7
survey={"02:00:00:00:00:0a":(1000,750),"02:00:00:00:00:0b":(1000,150)}; [(b,100*busy/total) for b,(total,busy) in survey.items()]
[('02:00:00:00:00:0a', 75.0), ('02:00:00:00:00:0b', 15.0)]

演習完了