UWP アプリで Wi-Fi Direct プッシュボタン接続


はじめに

何月だか忘れてしまったが、 Windows 10 が正式リリースされた時に公開されたこのページ。
What's new for developers in Windows 10

Wi-Fi Direct API update

The device broker is updated to enable pairing with devices without leaving the app. Additions to the Windows.Devices.WiFiDirect namespace also let a device make itself discoverable to other devices, and let it listen for incoming connection notifications.
Note In this release, the Wi-Fi Direct feature improvements are not built into the UX, and they support only push-button pairing. Also, this release supports only one active connection.

意訳すると、
  • アプリ画面を開いたままWi-Fi Directのペアリングができるようになりました
  • プッシュボタン方式のペアリングだけがサポートされています
  • 同時接続数は1本のみです
という感じだった。

じゃあ試してみるかということで Xperia を相手に色々試していたのだが、何をやっても PIN 入力(相手が PIN 表示)方式でしかペアリングができなかった。自分が接続したい本命の相手はプッシュボタンしか受け付けてくれないのでこれは困る。

諦めていたのだが、11月30日に Windows 10 v1511 (Build 10586, Threshold 2) 向けのSDKが配布されていた。
What’s New for Developers in the Windows 10 SDK Build 10586 Update

どうやらWi-Fi Direct関連でもAPI追加があったようなのでもう一度API Docを確認してみたところ、WiFiDirectConnectionParameter クラスにプロパティが追加されていた。
WiFiDirectConnectionParameters.PreferenceOrderedConfigurationMethods property

WiFiDirectConfigurationMethod.PushButton

まさにこれでは・・・
ということで使ってみた。



準備

当然だが、まず Windows 10 SDK Build 10586 以降をインストールする。
そしてプロジェクトを右クリックしてプロパティを開き、Target versionを変更する。


(Min version も指定できるが、Visual Studio 2015 は Android Studio のようにAPIバージョン超過で警告を出してくれたりはしない。)
これで新規に追加された API 群が使用できるようになった。

実装

周辺の Wi-Fi Direct 機器を検索する。
public static Task<DeviceInformationCollection> FindWifiDirectPeersAsync()
{
    if (((PeerFinder.SupportedDiscoveryTypes & PeerDiscoveryTypes.Browse) != PeerDiscoveryTypes.Browse))
    {
        throw new NotSupportedException("Wi-Fi direct is not supported on your environment");
    }

    return DeviceInformation.FindAllAsync(WiFiDirectDevice.GetDeviceSelector(WiFiDirectDeviceSelectorType.AssociationEndpoint)).AsTask();
}
得られた DeviceInformation の持つ Id から WiFiDirectDevice を生成する。
WiFiDirectConfigurationMethod を適当な値に設定することで、望みの方法でペアリングを実行できる。
public static async Task<WifiDirectDevice> ConnectPbcAsync(DeviceInformation info)
{
    var param = new WiFiDirectConnectionParameters();
    param.PreferenceOrderedConfigurationMethods.Add(WiFiDirectConfigurationMethod.PushButton);

    return await WiFiDirectDevice.FromIdAsync(info.Id, param);
}
上記の WiFiDirectDevice.FromIdAsync() が呼ばれた時点でペアリングが実行される。また、UI 上にシステムダイアログが出るため FromIdAsync() は UI スレッド上から呼ばなくてはならない。

実行


モバイル環境で実行した結果がこちら。(UIは適当)
Wi-Fi Direct 画面で待ち受けている Xperia を発見。Direct-xperia を選択。
選択すると、全画面でプッシュボタンの確認ダイアログを表示。Yes を選択。
Xperia の画面上に承認ダイアログが表示される。「同意する」を選択したら接続完了。


デスクトップ環境で実行した結果がこちら。
確認ダイアログはさすがに全画面ではないが、これ以降は同じ。

感想

リリース当初のアナウンスは誤っていたが、正式に対応されたAPIはそれなりに使いやすいものだった。

まあそんなところはどうでもよく、一番気になったのは Windows 10のバージョンアップで追加された API がドキュメント上で目立ちにくい所にひっそりと書かれており、この頻度で API 更新されていったら結構な頻度で事故が起きるだろうなあという点。



この勢いでAPIが追加されていくのであれば、きっとビルド番号単位での呼び分けとかが必要になるのだろうが、正気の沙汰ではない気がする。まあ、Windows は大半のユーザが最新版を使ってるという前提でもいいのかもしれない。(呼び分け自体どのようにすればいいのかもわからないのだが。)

コメント

このブログの人気の投稿

Lumia 920買った - LTE有効化と開発端末登録

Android で Unicode絵文字入力

Nexus 5 買った