2008-01-06

11bか11gか

去年から引っ張っているネタとしてWifiInfoや WifiSwitcherで11b, 11gの種別を判定したいという宿題があります。
 
アクセスポイントの検索結果として取得できるNDIS_WLAN_BSSID_EXには NetworkTypeInUseというメンバがありますが、アドエスの場合は常に Ndis802_11OFDM24(11g)を返してくれるので役に立ちません。
 
でも正月に帰省先でボーっとテレビを観ていたとき、ふと SupportedRatesメンバの内容で判断できるのでは?と思いつきました。
SupportedRatesメンバには使用できる伝送レートがセットされているとの事。
11bで使用できる伝送レートは 1Mbps, 2Mbps, 5.5Mbps, 11Mbpsの 4種類。
11gはそれに加えて、9, 18, 36, 54, 6, 12, 24, 48Mbpsの合計12種類が使用できます。
SupportedRatesメンバに正しく値がセットされていれば、何種類の伝送レートが登録されているかを数えることで 11b, 11gの判定ができそうです。
INT iSupportedRatesCount = 0;

for (INT i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
    if (0 == ndisBssid.SupportedRates[i]) {
        break;
    }
    iSupportedRatesCount ++;
}
switch (iSupportedRatesCount) {
    case 4:
        // 11b
        break;
    case 8:
        // 11aは 8種類(だった...と思う)
        break;
    case 12:
        // 11g
        break;
    default:
        // その他?
        break;
}
 
WifiSwitcherに組み込んでみるとこんな感じ。
 
 
とりあえず正しく判定できているようです。
 
ただ この方法で取得できるのはアクセスポイントや自分自身のNICがサポートしている伝送レートなので、WifiInfoに組み込んで「現在のネットワーク種別」を取得することはできなさそうです。
やはり NetworkTypeInUseメンバに正しい値をセットして欲しいですよね。
 

5 件のコメント:

しかと さんのコメント...

おぉWifiSwitcherの表示項目が増えてる!!
リリース待ってます。

kazuaki さんのコメント...

しかとさん こんばんは。

表示項目は増えているのですが、怪しい動作はそのままです(笑
いっそのこと全面的に書き換えるかどうか悩み中です。

まず、上にも書いたように 11g,11bは SupportedRatesの数で推定しているので本当に合っているのか微妙です。
(11g/11a両対応や 11nは判定できません)

Auth欄も PeekPocketを参考にしましたが、本当に合っているのか確信が持てません。

W-ZERO3.org Uploaderにテスト版をアップしておきますので、もしよければ人柱お願います。

solipt さんのコメント...

たまたま昨日見つけたアプリ&先ほどエントリーUPしたのですが、こんなものもありました。

http://www.codeplex.com/sniffthat

.NETアプリということと、GPS含めてちょっと方向が多機能?&少し不安定?(^^;で、ご参考になるかはわかりませんが、一応ソースも公開されているようでしたので。

シューティングスター さんのコメント...

人柱報告です。
コレガのCG-WLBARAG2相手で試しました。

全て表示のみで、実際の接続はおこなっていません。

設定:表示
a/b/g:g
a/b:b
a/g:g
b/g:g
b:b

認証方式(暗号方式):表示
OpenSystem(WEP):WEP
OpenSystem(無効):空白
SharedKey(WEP);WEP
WPA2-PSK(TKIP):WPA2
WPA2-PSK(AES):WPA2
WPA2-EAP(TKIP):WPA2
WPA2-EAP(AES):WPA2
WPA/WPA2-PSK(AES/TKIP):WPA
WPA/WPA2-PSK(AES):WPA
WPA/WPA2-EAP(AES/TKIP):WPA
WPA/WPA2-EAP(AES):WPA

あと、テスト中に一度だけMAC Addressの取得ミスが有りました。

kazuaki さんのコメント...

こんばんは。

soliptさん>
情報ありがとうございます。

早速ソースを落としてみました。
基本的にはOpenNETCFの機能を利用しているみたいですね。

ちょうどGPSも気になっていたところなので、参考にさせてもらいます。
でも 結構なボリュームですね(笑


シューティングスターさん>
早速の人柱ありがとうございます(笑

a/gだと gになるんですね。
ちょっと小細工してみますので、また今度人柱お願いします。

MACアドレス取得失敗も気になります。
切り替えしないのであれば必要ない項目ですが、少し調べてみますね。