×
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 02:50.
310 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×