×
Namespaces

Variants
Actions

Windows Phone中用NFC 读写 Ndef tag

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon NFC.png
WP Metro Icon WP8.png
Article Metadata

代码示例
兼容于
文章
renlin 在 27 Nov 2012 创建
最后由 hamishwillee 在 04 Jul 2013 编辑

Contents

Introduction

NFC通信技术是一种近场通信技术,通信行为在设备间距离小于4cm时产生,通信频段为13.56MHz,通信速率最高可达424KBit/s。
在Windows Phone 8 SDK中提供了Windows.Networking.Proximity 命名空间用来接入NFC设备,包括判断设备是否支持NFC功能,设备间的配对、通信,读、写NFC Tag。本文将集中讨论用Proximity API进行Tag读写要注意的问题,而设备间配对和通信的问题暂不作讨论。

API介绍

读写Tag的方法在ProximityDevice 类中实现。
1,首先要判断设备是否支持NFC通信,用静态方法GetDefault()方法实现,如果设备具有NFC通信功能,该方法将返回一个ProximityDevice的实例并激活NFC硬件,例如:

ProximityDevice pDevice = ProximityDevice.GetDefault();
if(pDevice!=null)
{
//Do something;
}

2,发布消息的方法有几种,简单的字符串消息可直接用PublishMessage(String, String)方法,Uri消息可用PublishUriMessage(Uri),其他消息用PublishBinaryMessage(String, String)方法,例如:

 long pid = pDevice.PublishBinaryMessage("Windows:WriteTag.MySubType", dataWriter.DetachBuffer());

要注意第一个参数是一个代表消息类型的字符串,这些消息类型的定义在msdn的文档中可找到,它们也是我们进行消息发布和订阅要注意的事项。第二个参数是待发送的数据。返回值是一个long型的id值,用来标识某个具体的发布行为,在需要终止该发布行为时需要用到这个id号,例如:

 pDevice.StopPublishingMessage(pid);

在消息成功发布后可进行事件处理,此时需要用方法PublishBinaryMessage(String, IBuffer, MessageTransmittedHandler),第三个参数就是消息发布后的事件处理方法。 3,订阅消息的方法如下所示:

long sid = pDevice.SubscribeForMessage("Windows.MySubType", MessageReceivedHandler);

第一个参数表示订阅的消息类型,第二个参数是收到消息后的事件处理方法,同样返回一个标识符用来终止这个订阅行为。

消息类型

前文提到了消息类型,消息类型的选择对我们读写Tag很关键。下面介绍常用的消息类型。

WriteableTag

此消息类型只能用于订阅消息,可通过收到的消息获取Tag的可写容量,要注意一个Tag的容量不是全部可写,比如:

 if (pDevice != null)
{
long sid= pDevice.SubscribeForMessage("WriteableTag", MessageReceivedHandler);
}
private void MessageReceivedHandler(ProximityDevice sender, ProximityMessage message)
{
int WriteableSize = System.BitConverter.ToInt32(message.Data.ToArray(), 0); //可写的容量
}

Windows

Windows消息类型用于开发者自定义子类型,比如“Windows.MySubType”;

WindowsMime

WindowsMime消息类型用于发布或者订阅Mime消息,比如联系人信息、图片信息等,以图片信息为例,“WindowsMime.imae/jpeg”表示发布或订阅一张图片信息。

WindowsUri

WindowsUri用于发布或订阅Uri消息。

LaunchApp:WriteTag

此消息类型只能用于发布消息到一个Tag中,表示写入的是一个启动应用的消息,比如下面我写入一个启动全景应用的Tag,

 private  long WriteLaunchTag()
{
long pid = 0;
if (pDevice != null)
{
var launchArgs = "user=default";
//var appId = Windows.ApplicationModel.Store.CurrentApp.AppId;
var appId = "8124bf8c-0db0-4688-8ec7-698a3c313f2b"; //全景应用的AppId
 
//Argument : argument passed use by application
//WindowsPhone : plateform type. It could be Windows or
//ApplicationId : WindowsPhone Application ID.
var launchMessage = launchArgs + "\tWindowsPhone\t{" + appId+"}";
var dataWriter = new Windows.Storage.Streams.DataWriter();
dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
dataWriter.WriteString(launchMessage);
 
pid = pDevice.PublishBinaryMessage("LaunchApp:WriteTag", dataWriter.DetachBuffer(),MessageTransmittedHandler);
}
return pid;
}

将写入后的Tag贴近手机,系统提示你是否打开全景应用,如图所示:
Panorama.png

NDEF

Windows Phone中只可操作NDEF消息,一个NDEF消息包括一些消息头和负载信息,消息头用来定义type,id,length等字段,前面所述的Windows*的消息类型都不可操作消息头中的包含的信息,如果你有这种需要,就要用“NDEF“消息类型,但是Proximity API中没有提供NDEF消息的封装类型,所以我们需要自己进行封装和解析,不过第三方库NDEF Library 提供了封装库,它可以方便的定义NDEF消息,多种记录以及进行解析。

在你的应用中用Nuget工具搜索Ndef ,安装NDEF Library For Proximity APIs, 或者在CodePlex 中下载这个库,这是一个从QtMobility移植的库,支持Tag中NDEF数据的读写,包括Text、Uri,SmartPoster等类型的消息。一个Tag中可以写入多条不同类型的记录。 要注意的是目前Windows Phone 并不支持对Tag本身信息的读取,比如Tag 的UID等。

写联系人信息

注意在写vcard时,type为“text/x-vCard”,payload的内容则是按vCard格式写好的字符串,例如:

           Stringbuilder text = new StringBuilder();
text.Append("BEGIN:VCARD\n");
text.Append("VERSION:3.0\n");
text.Append("N;");
text.Append(selectContact.DisplayName );
 
text.Append("\n");
text.Append("TEL;TYPE=CELL,VOICE:");
foreach (ContactPhoneNumber phoneNumber in selectContact.PhoneNumbers)
{
text.Append(phoneNumber.PhoneNumber);
}
 
text.Append("\n");
text.Append("END:VCARD");

Summary

本文所述代码可参考:File:NdefApp.zip

This page was last modified on 4 July 2013, at 05:50.
367 page views in the last 30 days.
×