Windows 8(ストアアプリ)とWindows Phone 8でNFCを使ったデータのやり取りをしてみます(Windows 8 → Windows Phone 8方向にデータが行かないのですが。。。)。
一式のコードはこちらにあります。
近接通信
Windows 8(ストアアプリ:以下W8)およびWindows Phone 8(以下 WP8)でのNFCは近接通信とされ、データに応じてNFC、Bluetooth、Wifi 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は同様のコードになります。スレッドディスパッチの部分が違うくらいでしょうか。