检测ISO/IEC 14443(的Mifare超轻型或经典)NFC卡与CoreNFC

问题描述:

所以我在WWDC,并能检测NFC卡在苹果实验室用下面的代码提供:检测ISO/IEC 14443(的Mifare超轻型或经典)NFC卡与CoreNFC

nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false) 
nfcSession.begin() 

和委托方法:

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) { 
    DispatchQueue.main.async { 
     print("Error:" + error.localizedDescription) 
    } 
} 

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) { 
    print("Did detect NDEFs.") 
    for message in messages { 
     for record in message.records { 
      print(record.identifier) 
      print(record.payload) 
      print(record.type) 
      print(record.typeNameFormat) 
     } 
    } 
} 

如何过,我要检测的ISO/IEC 14443协议下的Mifare超轻(或经典)卡。

每当我得到扫描视图,什么都不会发生。也不会调用错误回调或成功块。有没有办法看这张卡片?

非常感谢!

MIFARE Classic 1k或4k芯片早于ISO/IEC 14443标准。在WWDC CoreNFC介绍中,MIFARE Classic没有明确提及CoreNFC的支持。

支持MIFARE Ultralight或任何其他类型2标签(例如NTAG 203)。我认为,MIFARE Classic的继任者将是Type 4(DESFire)。

话虽如此,我可以成功读取MIFARE经典1K标签,如果所有的16个扇区密钥的& B以出厂默认留下的,如果标签包含一个有效的NDEF消息。如果即使一个键被改变,阅读器也会以readerSessionInvalidationErrorUserCanceled中止。

根据我的经验,阅读标签时Beta 2更可靠。在我的手机上,第一次阅读总是失败,我必须停止并重新启动阅读器会话。从那时起,它工作正常。在测试版1中,我经常必须先重新启动手机,然后再次取消/重试。

编辑:恩智浦 - MIFARE标签的供应商 - 已经发布了一个规范,说明如何在MIFARE经典标签内存储NDEF标签。我的测试表明,这样的标签可以在没有问题的情况下通过CoreNFC库读取。 Adafruit已经发布了Arduino库,允许根据此规范重新格式化MIFARE经典标签。

早些时候,我使用了另一个NDEF Arduino库,使用了不同的方法,不符合规范。有时标签可以被读取,但不可靠。

结论:100%确定您使用的是根据发布的规范格式化的标签。如果您无法读取您在抽屉中找到的标签,则可能不是CoreNFC库的错误。

+0

感谢Martin - 两条评论:1.)DESFire是Type 4标签的一个实现;他们不是MIFARE Classic的直接接班人。 2.)将所有密钥保持不变的做法是不好的做法,因为任何使用NFC写入设备(例如Android手机)的人都可以更改NDEF。所以,使用可以锁定的标签绝对会更好。 – ErikM

+0

感谢您的评论!无论如何,我对加密密钥的评论都是错误的。 NDEF规范要求将密钥A更改为特定于NDEF使用情况的值。我的通用Arduino阅读器没有检查这些非工厂默认键,并且将该标签报告为不可读。同时,iPhone无法读取标签,但可能是因为它没有100%正确格式化为NDEF。我错误地得出结论认为键是读取失败的原因。 – Martin

你可以看看例如https://github.com/hansemannn/iOS11-NFC-Example或其他教程(http://jamesonquave.com/blog/core-nfc-tutorial-for-nfc-on-ios-devices/)讨论使用NFC与iOS。 一些观察:您的第一个代码片段显示NFCISO15693ReaderSession而不是NFCNDEFReaderSession

最重要的是,您需要确保您的标签/卡片包含有效的NDEF消息。据我的观察,到目前为止是:

  • 没有NDEF上的标签 - >标签上的iPhone
  • 无效NDEF没有动作需要你的应用程序中要妥善处理,并导致在最坏的情况下崩溃。