Windows8のProximity機能を使ってみる

Windows8以降ではWinRTの機能でNFCを使用することができます。(以降NFC機能)

NFC機能では端末やタグに含まれた情報の読み出しや書き込み、アプリの起動などができるようになっています。 ストアアプリは個人的にめんどくさいのでデスクトップアプリで実験をしてみました。

ストアアプリの機能をデスクトップアプリで使う方法はネットあるので参照をしてください。

まずは、NFC用のクラスは名前空間Windows.Networking.Proximityなのでusingに追加します。 [csharp] using Windows.Networking.Proximity; [/csharp]

ProximityDeviceクラスがメインとなるので定義しておきます。

[csharp] private ProximityDevice proximityDevice; private long publishUriId = -1; [/csharp]

ここでpublishUriIdと定義していますが、これは同時に複数のイベントが発行されないようにする識別子です。

次にProximityDeviceオブジェクトにNFCリーダーのデバイスとのひも付けを行います。 ひも付後はこのデバイスイベントハンドラを登録しておきます。 今回はNFCがリーダーの認識範囲に入った時のイベントに登録しています。

[csharp] public MainWindow() { InitializeComponent();

        proximityDevice = ProximityDevice.GetDefault();//デバイスの取得
        proximityDevice.DeviceArrived += proximityDevice_DeviceArrived;//ハンドラの登録
    }

[/csharp]

続いてイベントハンドラを記述します。

[csharp] void proximityDevice_DeviceArrived(ProximityDevice sender) { if (publishUriId != -1) {        //すでに使用されていた場合には現在の通知処理を停止させます。 proximityDevice.StopPublishingMessage(publishUriId); } //http://ueponx.expressweb.jp/ をPublishする publishUriId = proximityDevice.PublishUriMessage(new Uri("http://ueponx.expressweb.jp/")); } [/csharp]

proximityDevice.PublishUriMessage()はNFCデバイスに対してUriを送信します。 PublishUriMessage()処理を行うと正の整数を返しますので、それを一度終了させています。 この処理がないと、2回目以降の処理で例外が発生します。

これでNFCデバイスで指定されたURIに指定されたWebページを開こうとします。 (一応、ユーザに対しては開くかどうかの判断を仰ぎますが)

次はNFCに入った情報の読み出しになります。

[csharp] private void Button_Click_1(object sender, RoutedEventArgs e) { proximityDevice.SubscribeForMessage("WindowsUri",             (device, message) => { MessageBox.Show(message.DataAsString.Replace("\0", "")); }); } [/csharp]

proximityDevice.SubscribeForMessage()でNFCに格納された情報の読み取りができます。 読み取った文字列は途中で"\0"が入っているので削除する処理を行っています。 多分、文字コードを変更するほうがスマートだと思います。

ちなみにNFCデバイスは電源がついていないと使用できません。 また、デバイスによってはロック画面で認識するものもあれば、ロックを解除しないと認識できないものもあるみたいです。 手持ちのFeliCaカードでは全く使えませんが、WindowsPhone、Androidでは使用可能でした。