15

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

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 设备可以轻松读取此类标签。

4

4 回答 4

14

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

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

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

关于 NFC 标签 NDEF 格式:

  • WP8 只支持对这些标签的 NDEF 级别访问,这意味着标签需要是 NDEF 格式或有一个现有的 NDEF 消息给它(可以是空的)。如果您尝试在非格式化的 NFC 标签上使用 API,它们将无法工作(因为 WP8 缺乏对低级标签类型特定命令/访问的支持)
  • 如果您想对标签进行 NDEF 格式化,您有以下选择:在订购标签时要求它们采用 NDEF 格式(或/并包含空的 NDEF 消息和要解锁的标签),使用 PC 的 NFC USB 读/写器硬件或使用带有 NFC 书写应用程序的 Symbian/MeeGo/Android NFC 设备

此致
-- Justin Angel
诺基亚 Windows Phone 开发者体验首席工程师

于 2012-11-05T07:49:53.407 回答
5

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

虽然 Mifare 也与 NFC 标签一起使用,但相似之处就在于此:它是一种完全不同的协议,具有自己的(专有)数据格式。

因此,这段代码并没有真正的错误(WP8 上的 NFC 通常也不是“有缺陷的”),但如果您希望它能够读取 Mifare 标签,那么这种方法对您不起作用。

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

为了让您了解需要什么:在您获得 DeviceArrived 事件(这意味着阅读器检测到 ISO NFC 标签)后,您需要获取卡的 UID。这应该很容易,因为这是标准的 ISO 功能。

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

于 2012-11-03T09:20:09.350 回答
3

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

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

如果您有一个低级别的读写器,您可以使您的 UL 标签 NDEF 兼容,而无需修改您的大部分数据,但您将需要牺牲:

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

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

  • 第 3 页,字节 0-3:CC [幻数、版本、用户内存大小、读/写]
  • 第 4 页,字节 0-1:NDEF MESSAGE TLV HEADER [Type, Length](推荐类型 ExternalRtd)
  • 第 4 页,字节 2-3:记录描述符(包括一个指定记录类型的字符串,建议将其设置为 1 字节长以节省空间,或 3 字节长以整齐填充)
  • 第 5 页,字节 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 , Payload Length, 标签的其余部分。在这种情况下 40。
  • [5, 1] , 0x61 , 类型的第一个字节, 0x61 = 97 = 'a'
  • [5, 2] , 0x61 , 类型的第二个字节, 0x62 = 98 = 'b'
  • [5, 3] , 0x61 , 类型的第三个字节, 0x63 = 99 = 'c'

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

如果您只想初始化标签以便手机可以读取它并完成其余工作,只需写入 CC,并且只写入 L 为零且没有 V 的 TLV。(4,0 = 0x03 和 4,1 =0x00 )。

于 2013-04-10T13:41:38.080 回答
1

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

您可以在官方 WPdev Uservoice 页面上为低级 NFC API 功能投票:
为 NDEF 格式化和(解锁)标签提供低级 NFC API

于 2013-01-26T08:11:20.127 回答