Обнаружение NFC-карт ISO/IEC 14443 (Mifare Ultralight или Classic) с помощью CoreNFC

Поэтому я был на WWDC и смог обнаружить карты NFC, предоставленные Apple Labs, с помощью следующего кода:

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)
        }
    }
}

Однако я хочу обнаружить сверхлегкую (или классическую) карту Mifare по протоколу ISO/IEC 14443.

Всякий раз, когда я получаю просмотр сканирования, ничего не происходит. Не вызывается ни обратный вызов ошибки, ни блок успеха. Есть ли способ прочитать эту карту?

Большое спасибо!

2 ответа

Решение

Чипы 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 Tag, если все 16 секторных клавиш A&B остаются с заводскими настройками по умолчанию и если тег содержит действительное сообщение NDEF. Если хотя бы один ключ изменен, читатель прерывается с помощью readerSessionInvalidationErrorUserCanceled.

По моему опыту, бета 2 намного надежнее при чтении тегов. На моем телефоне всегда происходит первое чтение, и мне нужно остановить и перезапустить сеанс чтения. С тех пор все работает нормально. В бета-версии 1 мне часто приходилось сначала перезагружать телефон, а то и много раз отменять / повторять попытки.

РЕДАКТИРОВАТЬ: NXP - производитель тегов MIFARE - опубликовал спецификацию, которая объясняет, как хранить теги NDEF внутри классического тега MIFARE. Мои тесты показывают, что такие теги могут быть прочитаны с библиотекой CoreNFC без проблем. Adafruit опубликовал библиотеку для Arduino, которая позволяет переформатировать классический тег MIFARE в соответствии с этой спецификацией.

Ранее я использовал другую библиотеку NDEF Arduino, в которой использовался другой подход, не соответствующий спецификации. Иногда теги могут быть прочитаны в любом случае, но не надежно.

В заключение: убедитесь, что вы используете тег, отформатированный в соответствии с опубликованными спецификациями, на 100%. Если вы не можете прочитать тег, найденный в своем ящике, возможно, это не ошибка библиотеки CoreNFC.

Вы можете посмотреть, например, 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 для тега должен быть правильно обработан в вашем приложении и привести к падению в худшем случае.
Другие вопросы по тегам