名前のManagedとNativeが矛盾しているような感じもしますが、Native WifiというWin32 APIのマネージドラッパーという性格上、これが一番ストレートな気がしたので。
同種のものは既にManaged Wifiがありますが、これが大枠だけ提供するのに対して、このManaged Native Wifiはすぐ使えるメソッドを提供しています。非同期処理になるものについてはTAPでasync/awaitベースのメソッドも用意しています。
一応、ほぼ同じことはNetshでも可能ですが、反応がやはり遅いのと、処理の結果を非同期に受け取ることができないので(例えば、無線LANに接続するようリクエストはできても、接続できたか否かの結果は直接受け取れない)、使い勝手は劣ります。
1. 機能
現在の機能は以下のようなものです。
・利用可能なネットワーク、BSSネットワークの一覧取得。
・無線LANを(自動走査を待たずに)すぐ走査させる。
・無線プロファイルの一覧取得、追加、削除、順番の変更。
・無線LANへの接続、切断。
アプリのサブ機能でちょっと無線LANを利用したい、というぐらいのカジュアルな用途なら大体カバーできるんじゃないかと思います。というか、自分が昔ほしかった。
ただし、無線プロファイルの追加はプロファイルを構成するXMLを条件に合わせて自分で組み立てないといけないので、実は簡単ではないです。
2. 使用例
例として、現在利用可能な無線LANの中に、それに対応した無線プロファイルが存在していれば、そのうち最も信号状態のよい無線LANに接続するものです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static async Task<bool> ConnectAsync() | |
{ | |
var availableNetwork = NativeWifi.EnumerateAvailableNetworks() | |
.Where(x => !string.IsNullOrWhiteSpace(x.ProfileName)) | |
.OrderByDescending(x => x.SignalQuality) | |
.FirstOrDefault(); | |
if (availableNetwork == null) | |
return false; | |
return await NativeWifi.ConnectNetworkAsync( | |
interfaceId: availableNetwork.Interface.Id, | |
profileName: availableNetwork.ProfileName, | |
bssType: availableNetwork.BssType, | |
timeout: TimeSpan.FromSeconds(10)); | |
} |
まずこのProfileNameの有無でフィルターした後、同じくSignalQualityプロパティに信号状態が0-100の範囲で入っているので(大きいほどよい)、これの逆順で並び替え、最大のものを取得します。
これが取得できているかチェックした後、ConnectNetworkAsyncメソッドで非同期に接続を試みます。引数はAvailableNetworkPackオブジェクトから無線インターフェイスのID、プロファイル名、BSSの種別をそれぞれ渡します。最後はタイムアウト時間で、ここでは10秒を指定しています。この時間までに接続できればTrue、できなければFalseが戻り値として返ります。実際のところ、信号状態がよければ瞬時に繋がります。
こんな感じでさほど複雑ではないですが、WLAN Profile Viewerの中にもNativeWifiクラスの使用例があるので参考にしてください。
3. 課題
- エラー処理: Native Wifiで起こり得るエラーについてMSDNでは網羅されてないので、実際どんなエラーが起きてどう処理すればいいのか、まだ煮詰まってません。
- 取得する情報: Native Wifiで取得できる情報は多岐に渡るので、現在はその一部を拾い出している状態です。ここは使用シナリオに応じて検討の要あり。
- Wi-Fi Direct: Windows 8以降、Native WifiにWi-Fi Direct関係の関数が追加されていますが、そもそもデスクトップアプリからのWi-Fi Directの使用方法がよく分かってないので、手つかずの状態。
0 コメント :
コメントを投稿