【问题标题】:Detect ISO/IEC 14443 (Mifare Ultralight or Classic) NFC Cards with CoreNFC使用 CoreNFC 检测 ISO/IEC 14443(Mifare Ultralight 或 Classic)NFC 卡
【发布时间】:2017-06-15 16:46:22
【问题描述】:

所以我参加了 WWDC,并且能够使用以下代码检测 Apple Labs 提供的 NFC 卡:

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 Ultralight(或经典)卡。

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

非常感谢!

【问题讨论】:

标签: ios swift nfc mifare core-nfc


【解决方案1】:

MIFARE Classic 1k 或 4k 芯片早于 ISO/IEC 14443 标准。在 WWDC CoreNFC 演示文稿中,没有明确提到 MIFARE Classic 受 CoreNFC 支持。

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

话虽如此,我可以成功读取 MIFARE Classic 1k 标签,如果所有 16 个扇区密钥 A&B 都保留为出厂默认设置,并且标签包含有效的 NDEF 消息。即使更改了一个键,阅读器也会以 readerSessionInvalidationErrorUserCanceled 中止。

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

编辑:NXP - MIFARE 标签的供应商 - 发布了一个规范,解释了如何在 MIFARE 经典标签中存储 NDEF 标签。我的测试表明,使用 CoreNFC 库可以毫无问题地读取此类标签。 Adafruit 为 Arduino 发布了一个库,允许根据此规范重新格式化 MIFARE 经典标签。

之前我使用了另一个 NDEF Arduino 库,该库使用了不同的方法,不符合规范。有时标签无论如何都可以读取,但并不可靠。

总结:100% 确保您使用的标签格式符合已发布的规范。如果您无法读取在抽屉中找到的标签,则可能不是 CoreNFC 库的问题。

【讨论】:

  • 感谢 Martin - 两个 cmets:1.) DESFire 是 Type 4 标签的一种实现;它们不是 MIFARE Classic 的直接继承者。 2.) 保持所有密钥不变是不好的做法,因为任何使用 NFC 写入设备(例如 Android 手机)的人都可以更改 NDEF。所以,使用可以锁定的标签肯定更好。
  • 感谢您的评论!无论如何,我关于加密密钥的评论都是错误的。 NDEF 规范要求将密钥 A 更改为特定于 NDEF 使用的值。我的通用 Arduino 阅读器没有检查这些非出厂默认键,并将标签报告为不可读。同时,iPhone 无法读取标签,但可能是因为它没有 100% 正确格式化为 NDEF。我错误地认为密钥是读取失败的原因。
【解决方案2】:

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

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

  • 标签上没有 NDEF --> iPhone 上没有操作
  • 标签上的无效 NDEF 需要在您的应用中正确处理,在最坏的情况下会导致崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多