UWP で WiFi ネットワークに接続する
WiFi ネットワークに接続したいとき,UWPではいずれかのAPIを使うことになります。
- System.Devices.WiFi
- System.Devices.Radios
- System.Devices.WiFiDirect
ここでは System.Devices.WiFi
を使ってWiFiネットワークに接続してみます。
Package.appxmanifest の編集
Capabilities
に wifiControl
を追加します。実際にネットワークに出て行くには Internet
なども追加しておく必要があるでしょう。
VisualStudio上のマニフェストデザイナでは追加できないので,別のエディタを使って Package.appxmanifest
を開きます。
<!-- アセットの指定などに続いて --> <Capabilities> <DeviceCapability Name="wifiControl" /> </Capabilities> <!-- 以下略 -->
アダプタの列挙
アダプタを列挙して,接続に使うアダプタを特定します。 まずはWiFi管理機能へのアクセス権があるかチェックしましょう。
var accessStatus = await WiFiAdapter.RequestAccessAsync(); if (accessStatus != WiFiAccessStatus.Allowed) { // 許可されなかった return; } var adapters = await WiFiAdapter.FindAllAdaptersAsync();
WiFiAccessStatus
には,AllowedのほかにDeniedBySystem,DeniedByUserがあり許可されなかった理由を特定できます。
FindAllAdaptersAsync()
が成功すると,adapters
にインストールされているWiFiアダプタ一覧が入ります。
スキャンと接続
列挙したアダプタから,実際に接続に使うアダプタを選んでおきます。手軽に行くならadapters.First()
。
アダプタがつかんでいるWiFiアクセスポイントを取得しましょう。
WiFiAdapter adapter = adapters.First(); await adapter.ScanAsync(); var availableNetworks = adapter.NetworkReport.AvailableNetworks;
NetworkReport
にはスキャンした日時と,その時点で見えていたネットワークのリストが入っています。
ここから接続したいネットワークを選択して,接続を試行していきます。ここではセキュリティキーの有効なネットワークに接続してみます。
var network = availableNetworks.Single(n => n.Ssid == "接続するSSID"); var credential = new PasswordCredential { Password = "セキュリティキー" }; var result = await adapter.ConnectAsync(network, WiFiReconnectionKind.Manual, credential); if (result.ConnectionStatus == WiFiConnectionStatus.Success) { // 接続成功 }
キーの不要なネットワークであれば単純に引数を減らし,ステルスSSIDのネットワークであれば最後にSSIDを指定することになります(この場合,availableNetworksにはSSIDなしのネットワークが現れている…はず,未テスト)。
WiFiReconnectionKind
で接続が切れたとき自動で再試行するかどうかを指定できます。
WiFiConnectionStatus
で接続できなかったときの事由などはわかりますが,詳細なエラーが返るかは接続先のアクセスポイントやデバイスによるようです。
これでWiFiネットワークに接続できました。