うさぎ駆動開発

UWP, Xamarin.Macを中心によしなしごとを書いていきます。

UWP で WiFi ネットワークに接続する

WiFi ネットワークに接続したいとき,UWPではいずれかのAPIを使うことになります。

  • System.Devices.WiFi
  • System.Devices.Radios
  • System.Devices.WiFiDirect

ここでは System.Devices.WiFi を使ってWiFiネットワークに接続してみます。

Package.appxmanifest の編集

CapabilitieswifiControl を追加します。実際にネットワークに出て行くには 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ネットワークに接続できました。

参考 Windows.Devices.WiFi namespace - Windows app development