ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

Windows 8,Windows Phone 8でアプリからNFCを使ってみる

Windows 8(ストアアプリ)とWindows Phone 8NFCを使ったデータのやり取りをしてみます(Windows 8Windows Phone 8方向にデータが行かないのですが。。。)。

一式のコードはこちらにあります。

近接通信

Windows 8(ストアアプリ:以下W8)およびWindows Phone 8(以下 WP8)でのNFCは近接通信とされ、データに応じてNFCBluetoothWifi Directで通信するようです。

それらを透過的に扱うクラスとしてWindows.Networking.Proximity名前空間のProximityDevice があります。このクラスを使うことで近接通信を簡単に扱うことができます。近接通信の機能を使うにはW8アプリでは「Package.appxmanifestの「機能|近接」にチェック」、WP8アプリでは「WMAppManifest.xmlの「機能|ID_CAP_PROXINITY」にチェック」を入れる必要があります。今回はNFCを利用するので、それぞれのデバイスにNFCが搭載されていることも必要です。

ProximityDeviceを使う

ProximityDeviceは大きく初期化、送信、受信に分けられます。

ProximityDeviceの初期化は、ProximityDevice.GetDefault()でインスタンスを取得します。インスタンスが返れば利用可能、nullが返る場合はNFCデバイスがない、例外が発生する場合はNFCデバイスがあるが利用が許可されていない(またはマニフェストの機能にチェックが入っていない)状態です。

try {

// NFCデバイスがない場合にはnullが返る

// NFCデバイスがあり、Package.appxmanifestの「機能|近接」にチェックがない場合は例外が発生する

proximityDevice = ProximityDevice.GetDefault();

if ( proximityDevice == null ) {

throw new Exception( "NFCデバイスが見つかりません" );

}

}

catch ( Exception ex ) {

TextMessage.Text = ex.Message;

}

データの送信はデータ種別によってPublishMessage、PublishBinaryMessage、PublishUriMessageがあります。それぞれ第一引数にメッセージプロトコル、第二引数に送るデータを設定します。必要によっては第三引数に送信完了のコールバックメソッドを設定します。

プロトコルの詳細はこちらを参照してください。

private void ButtonSend_Click( object sender, RoutedEventArgs e )

{

if ( proximityDevice != null ) {

proximityDevice.PublishMessage( "Windows.SampleMessageType", TextSendMessage.Text );

}

}

データの受信は、メッセージタイプによって呼ばれるメソッドをSubscribeForMessageで登録します。引数に受信したデータが渡されてきます。なお、このメソッドはUIスレッドではないため、UIにアクセスするためにはUIスレッドに戻す必要があります。

async private void MessageReceivedHandler( ProximityDevice sender, ProximityMessage message )

{

await Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () =>

{

TextRecieveMessage.Text = message.DataAsString;

} );

}

Windows Phone 8についてもProximityDeviceは同様のコードになります。スレッドディスパッチの部分が違うくらいでしょうか。