使用 CoreNFC 检测 ISO/IEC 14443(Mifare Ultralight 或 Classic)NFC 卡
Detect ISO/IEC 14443 (Mifare Ultralight or Classic) NFC Cards with CoreNFC
所以我在 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(或经典)卡。
每当我获得扫描视图时,什么也没有发生。错误回调或成功块也不会被调用。有没有办法读取这些卡片?
非常感谢!
你可以看看例如https://github.com/hansemannn/iOS11-NFC-Example or other tutorials (http://jamesonquave.com/blog/core-nfc-tutorial-for-nfc-on-ios-devices/) 谈论通过 iOS 使用 NFC。
一些观察:您的第一个代码片段显示 NFCISO15693ReaderSession
而不是 NFCNDEFReaderSession
.
最重要的是,您需要确保 tags/cards 包含有效的 NDEF 消息。我目前的观察是:
- 标签上没有 NDEF --> iPhone
上没有操作
- 标签上的无效 NDEF 需要在您的应用中妥善处理,在最坏的情况下会导致崩溃。
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 消息。即使更改了一个密钥,reader 也会中止并显示 readerSessionInvalidationErrorUserCanceled。
根据我的经验,Beta 2 在读取标签时更加可靠。在我的 phone 上,第一次读取总是失败,我必须停止并重新启动 reader 会话。从那时起,它工作正常。使用 beta 1,我经常不得不先重新启动 phone,甚至还要多次 cancel/retry。
编辑:NXP - MIFARE 标签的供应商 - 发布了一个规范,解释了如何在 MIFARE 经典标签中存储 NDEF 标签。我的测试表明,使用 CoreNFC 库可以毫无问题地读取此类标签。 Adafruit 已为 Arduino 发布了一个库,允许根据此规范重新格式化 MIFARE 经典标签。
之前我使用了另一个 NDEF Arduino 库,它使用了不同的方法,不符合规范。有时无论如何都可以读取标签,但不可靠。
结论:请 100% 确保您使用的标签格式符合已发布的规范。如果您无法读取在抽屉中找到的标签,那可能不是 CoreNFC 库的问题。
所以我在 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(或经典)卡。
每当我获得扫描视图时,什么也没有发生。错误回调或成功块也不会被调用。有没有办法读取这些卡片?
非常感谢!
你可以看看例如https://github.com/hansemannn/iOS11-NFC-Example or other tutorials (http://jamesonquave.com/blog/core-nfc-tutorial-for-nfc-on-ios-devices/) 谈论通过 iOS 使用 NFC。
一些观察:您的第一个代码片段显示 NFCISO15693ReaderSession
而不是 NFCNDEFReaderSession
.
最重要的是,您需要确保 tags/cards 包含有效的 NDEF 消息。我目前的观察是:
- 标签上没有 NDEF --> iPhone 上没有操作
- 标签上的无效 NDEF 需要在您的应用中妥善处理,在最坏的情况下会导致崩溃。
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 消息。即使更改了一个密钥,reader 也会中止并显示 readerSessionInvalidationErrorUserCanceled。
根据我的经验,Beta 2 在读取标签时更加可靠。在我的 phone 上,第一次读取总是失败,我必须停止并重新启动 reader 会话。从那时起,它工作正常。使用 beta 1,我经常不得不先重新启动 phone,甚至还要多次 cancel/retry。
编辑:NXP - MIFARE 标签的供应商 - 发布了一个规范,解释了如何在 MIFARE 经典标签中存储 NDEF 标签。我的测试表明,使用 CoreNFC 库可以毫无问题地读取此类标签。 Adafruit 已为 Arduino 发布了一个库,允许根据此规范重新格式化 MIFARE 经典标签。
之前我使用了另一个 NDEF Arduino 库,它使用了不同的方法,不符合规范。有时无论如何都可以读取标签,但不可靠。
结论:请 100% 确保您使用的标签格式符合已发布的规范。如果您无法读取在抽屉中找到的标签,那可能不是 CoreNFC 库的问题。