使用Windows Phone 8 NFC读取Mifare标签?

Windows Phone 8 NFC是否支持基于Mifare Ultralight / Classic的标签? 我使用此代码访问诺基亚Lumia 920上的NFC设备(代码示例取自NDEF标签阅读器 – NFC NDEF标签阅读器 )

public partial class MainPage : PhoneApplicationPage { public MainPage() { InitializeComponent(); ProximityDevice device = ProximityDevice.GetDefault(); device.DeviceArrived += DeviceArrived; device.DeviceDeparted += DeviceDeparted; device.SubscribeForMessage("NDEF", MessageReceived); } private void DeviceArrived(ProximityDevice sender) { // this event occurs when I am tapping any of my tags (tried 5 different Mifare Ultralight/Classic) } private void DeviceDeparted(ProximityDevice sender) { // this event occurs when I am moving away any tag } private void MessageReceived(ProximityDevice sender, ProximityMessage message) { // this event is never fired!!! :( } } 

WP8上的NFC有缺陷还是这个代码错了?

更新:从本文档NFC论坛类型标签您可以发现Mifare Ultralight与NDEF兼容。 Android设备可以轻松读取此类型的标签。

WP8和Lumia 920支持Mifrare。我猜这里,但很可能你的Mifare NFC标签没有格式化/初始化为NDEF。 购买NFC标签时,您可以要求NFC标签为NDEF格式。

Lumia 920芯片(恩智浦PN544系列)支持以下标签类型(至少):

  • 类型1:黄玉家族
  • Type 2:Mifare Ultralight系列,my-d-move,NTag
  • 类型3:Felica家族
  • Type 4:Desfire家族
  • 非标准化:Mifare标准

关于NFC标签NDEF格式化:

  • WP8仅支持对这些标记的NDEF级别访问,这意味着标记需要是NDEF格式的,或者具有现有的NDEF消息(可以是空的)。 如果您尝试在非格式化的NFC标签上使用API​​,它们将无法工作(因为WP8不支持低级Tag Type特定命令/访问)
  • 如果你想要NDEF格式化你的标签,你有以下选择:当订购标签要求它们是NDEF格式化(或/和包含空的NDEF消息和要解锁的标签)时,使用NFC USB读/写器硬件用于PC或使用带有NFC编写应用程序的Symbian / MeeGo / Android NFC设备

此致
– 贾斯汀天使
诺基亚Windows Phone开发人员体验首席工程师

您发布的代码应该从NFC标签读取NDEF消息。

而Mifare也与NFC标签一起使用,这就是相似性结束的地方:它是一种完全不同的协议 ,具有自己的(专有)数据格式。

所以,这段代码并没有真正错误(WP8上的NFC通常也没有’缺陷’),但是如果你希望它能读取Mifare标签,这种方法对你来说就不适用了。

我不知道是否可以用WP8读取Mifare标签:这取决于硬件(因为Mifare使用一些非ISO帧)以及API支持。 一个快速的谷歌搜索表明,旧款诺基亚手机的Java SDK确实支持Mifare,因此可能存在硬件支持。 但是没有为WP8找到任何东西,所以这很可能需要一些广泛的编码,如果它可以工作的话。

为了让您了解所需内容:在您获得DeviceArrived事件后(这意味着读者检测到了ISO NFC标签),您需要获取卡的UID。 这应该是非常简单的,因为它是标准的ISOfunction。

接下来,您需要能够直接向标签发送Mifare身份validation和读/写扇区命令。 由于这些命令不是ISO标准,因此事情变得更加棘手且依赖于读者。 通过这个阶段真的需要协议文档和手机的Mifare测试工具。 最后,大多数Mifare卡完全不可读,除非你至少知道一个扇区密钥,并且应用程序数据格式也是专有的(特定于发卡机构),所以即使完成所有工作,也不能保证你可以获得有用的信息。卡片…

Windows Phone 8应用程序只能访问非常高级别的库,并且无法读取非NDEF格式的标签。

MIFARE UL标签必须使用NFC论坛NDEF Type 2标准,由于标签的48字节用户内存很小,因此标准简单。

如果您有一个低级别的读写器,您可以在不修改大部分数据的情况下使您的UL标签符合NDEF标准,但您需要牺牲:

  • 第3页的所有4字节OTP内存(对于NDEF能力容器)
  • 用户可编程存储器的前6个字节(最少6个,可能需要填充到8以干净地填充前两个页面)。

标签的格式如下:(参考 – http://www.nfc-forum.org/specs/spec_list/#tagtypes)

  • 第3页,BYTES 0-3:CC [MAGIC NUMBER,VERSION,USER MEM SIZE,READ / WRITE]
  • 第4页,BYTES 0-1:NDEF MESSAGE TLV HEADER [类型,长度](推荐类型ExternalRtd)
  • 第4页,BYTES 2-3:RECORD DESCRIPTOR(包含一个指定记录类型的字符串,建议将其保留1个字节以节省空间,或者将3个字节长用于整齐填充)
  • 第5页,BYTES 0-1或3:记录描述符
  • 其余的页面/字节是记录/数据

示例:标签的消息类型为ExternalRtd,记录类型为“abc”(记录类型在技术上应该是“urn:nfc:ext:companyname.com:typename”格式,完全符合NDEF标准,但我们负担不起那么多空间)

[页号,字节号],价值,评论

  • [3,0],0xE1,幻数
  • [3,1],0x10,NDEF版本号,主要版本1,次要版本0。
  • [3,2],0x06,标签的用户存储器大小/ 8.在这种情况下为6,因为6 * 8 = 48
  • [3,3],0x00,允许读/写。 0x00 =允许写入,0x0F =只读
  • [4,0],0x03,TLV中的T,类型。 在这种情况下,NDEF消息。
  • [4,1],0x2E,TLV中的L,长度。 在这种情况下,标签的其余部分为46个字节。
  • [4,2],0xD4,记录MB_ME_CF_SR_IL_TNF。 在这种情况下,11010100(是第一条记录,是最后一条记录,不是块,是短消息,标题中没有id,是“外部类型”类型)
  • [4,3],0x03,记录类型长度。 在这种情况下3(类型“abc”是3长)
  • [5,0],0x28,有效载荷长度,标签的其余部分。 在这种情况下40。
  • [5,1],0x61,类型的第一个字节,0x61 = 97 =’a’
  • [5,2],0x61,类型的第二个字节,0x62 = 98 =’b’
  • [5,3],0x61,类型的第三个字节,0x63 = 99 =’c’

  • 标签的剩余40个字节(第6到11页)是您的有效负载。

如果你只想初始化标签以便手机可以读取它并完成剩下的工作,那么只需写入CC,只有TL为零且不为V.(4,0 = 0x03和4,1 = 0x00) )。

我有类似的问题,我在eBay上买了一包NFC标签,但它们不是NDEF格式的。 WP8只能使用NDEF格式的标签,因此我必须找到一种如何格式化它们的方法。 我在Twitter上找到了一个配备NFC配备Android手机的人,他为我格式化了这些标签。 太糟糕了,Windows Phone 8也无法做到这一点。

您可以在官方WPdev Uservoice页面上投票获取低级NFC APIfunction:
为NDEF格式化和(un)锁定标记提供低级NFC API