使用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:黄玉家族
  • 类型2:Mifare Ultralight系列,my-d-move,NTag
  • 类型3:Felica家族
  • 类型4:Desfire家族
  • 非标准化:Mifare标准
  • 关于NFC标签NDEF格式化:

  • WP8仅支持NDEF级别访问这些标签,这意味着该标签需要进行NDEF格式化或具有一个现有的NDEF消息(可以是空的)。 如果您尝试在非格式化的NFC标签上使用API​​,则它们将无法工作(因为WP8缺少对低级别标签类型特定命令/访问的支持)
  • 如果您想要NDEF格式化您的标签,您可以选择以下选项:当订购标签请求它们为NDEF格式(或/并且包含一个空的NDEF消息并且要解锁的标签)时,请使用适用于PC的NFC USB Reader / Writer硬件或者在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。 这应该很容易,因为这是标准的ISO功能。

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


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

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

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

  • 在第3页的所有4个字节的OTP内存(用于NDEF功能容器)
  • 用户可编程存储器的前6个字节(最小6个,可能需要填充8个以便干净填充前两个页面)。
  • 标签格式如下:(参考 - www.nfc-forum.org/specs/spec_list/#tagtypes)

  • 第3页,字节0-3:CC [魔数,版本,用户大小,读/写]
  • 第4页,BYTE 0-1:NDEF MESSAGE TLV HEADER [类型,长度](推荐类型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 * 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(是第一条记录,是最后一条记录,不是块,是一条短消息,头中没有标识,属于“外部类型”)。
  • [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,并且只写入L为零且不为V的TLV。(4,0 = 0x03和4,1 = 0x00 )。

    链接地址: http://www.djcxy.com/p/88605.html

    上一篇: Reading a Mifare tag using Windows Phone 8 NFC?

    下一篇: NFC standards (NFC Forum, ISO/IEC, ECMA