Как эмулировать тег NFC FeliCa с конкретным кодом службы и данными блока?

Вопрос или проблема

Я работаю над проектом по эмуляции NFC-метки с конкретными служебными кодами и блоками данных на Python с использованием nfcpy. Моя цель – считать карту, захватить ее данные (служебные коды, блоки и содержимое), а затем эмулировать эту метку с точно такой же структурой данных, чтобы считыватель распознавал ее как оригинальную карту. Код работает без ошибок, и я вижу сообщения об успешной активации метки, но считыватель по-прежнему не распознает эмулированную метку так, как оригинальную карту. Кроме того, я не могу правильно установить служебный код так, чтобы обеспечить корректное чтение и запись данных на основе блоков, полученных с оригинальной карты.

Вот что я сделал до сих пор:

  1. Я успешно считываю данные с карты, включая служебные коды и данные блоков, используя nfcpy.

  2. На основе захваченных данных я настроил среду эмуляции с использованием nfcpy на USB NFC считывателе (Sony RC-S380).

  3. Я попробовал добавить сервисы с помощью tag.add_service() и определить функции ndef_read и ndef_write для предоставления данных на уровне блоков.

Я успешно считываю данные с карты, включая служебные коды и данные блоков, используя nfcpy. На основе захваченных данных я настроил среду эмуляции с использованием nfcpy на USB NFC считывателе (Sony RC-S380). Я попробовал добавить сервисы с помощью tag.add_service() и определить функции ndef_read и ndef_write для предоставления данных на уровне блоков.

Вот образец моего кода на данный момент:

    import nfc
    import struct

    ndef_data_area = bytearray(64 * 16)
    ndef_data_area[0] = 0x10  # Версия маппинга NDEF '1.0'
    ndef_data_area[1] = 12    # Количество блоков, которые могут быть считаны за раз
    ndef_data_area[2] = 8     # Количество блоков, которые могут быть записаны за раз
    ndef_data_area[4] = 63    # Количество блоков, доступных для данных NDEF
    ndef_data_area[10] = 1    # Операции чтения и записи NDEF разрешены
    ndef_data_area[14:16] = struct.pack('>H', sum(ndef_data_area[0:14]))  # Контрольная сумма

    def ndef_read(block_number, rb, re):
        if block_number < len(ndef_data_area) / 16:
            first, last = block_number * 16, (block_number + 1) * 16
            return ndef_data_area[first:last]

    def ndef_write(block_number, block_data, wb, we):
        global ndef_data_area
        if block_number < len(ndef_data_area) / 16:
            first, last = block_number * 16, (block_number + 1) * 16
            ndef_data_area[first:last] = block_data
            return True

    def on_startup(target):
        idm, pmm, sys="03FEFFE011223344", '01E0000000FFFF00', '12FC'
        target.sensf_res = bytearray.fromhex('01' + idm + pmm + sys)
        target.brty = "212F"
        return target

    def on_connect(tag):
        print("метка активирована")

        tag.add_service(0x1A88, ndef_read, ndef_write)
        tag.add_service(0x000B, ndef_read, lambda: False)
        return True

    with nfc.ContactlessFrontend('usb:054c:06c1') as clf:
        while clf.connect(card={'on-startup': on_startup, 'on-connect': on_connect}):
            print("метка освобождена")

Мои вопросы:

  1. Как я могу правильно эмулировать NFC-метку с конкретными служебными кодами и данными блоков, чтобы считыватель интерпретировал ее точно так же, как оригинальную карту?
  2. Есть ли что-то специфическое в nfcpy, что я упускаю при установке служебных кодов или данных блоков, что могло бы повлиять на эмуляцию?
  3. Существуют ли лучшие библиотеки или методы для достижения эмуляции тега FeliCa, особенно если у nfcpy есть ограничения в обработке служебных кодов?

Любые советы или предложения будут крайне полезны! Спасибо.

Ndef – это стандартизированный формат данных, основанный на различных типах тегов NFC, и если вы пытаетесь эмулировать захваченные “служебные коды, блоки и содержимое”, то использование высокоуровневого формата данных не сработает, так как он будет использовать конкретный поднабор того, что может делать тег.

Код подходит только для эмуляции данных Ndef на теге Felica, вам нужно будет прочитать документацию тега Felica и этого считывателя, чтобы иметь возможность контролировать считыватель достаточно хорошо для выполнения эмуляции на более низком уровне, если это возможно (и часто он не может эмулировать все точно)

Ответ или решение

Чтобы эмулировать NFC тег FeliCa с определёнными кодами сервиса и данными блоков, вам необходимо учесть несколько критически важных аспектов, особенно если вы используете библиотеку nfcpy. В следующем ответе мы рассмотрим, как правильно настроить эмуляцию, включая возможные нюансы в коде и ограничениях библиотеки, а также предложим альтернативные варианты, исходя из поставленных вами вопросов.

Как правильно эмулировать NFC тег с определенными кодами сервиса и данными блоков?

  1. Понимание спецификации FeliCa: FeliCa является системой, которая использует собственные коды сервиса и схемы передачи данных. Каждый сервис имеет свой уникальный код, а блочные данные располагаются по определённым адресам. Вам необходимо знать, как эти блоки структурированы на оригинальной карте.

  2. Считывание данных с оригинального тега: Если вы уже успешно считали данные с карты, убедитесь, что вы сохранили все нужные блоки и их контент. Убедитесь, что вы точно воспроизводите эти данные в вашем эмуляторе.

  3. Настройка эмуляции в nfcpy:

    • Коды сервиса: Используйте tag.add_service() для добавления нужных сервисов. Обратите внимание на kоды сервиса, которые вы указали. Они должны точно соответствовать оригинальной карте.
    • Функции чтения и записи: Убедитесь, что функции ndef_read() и ndef_write() корректно возвращают данные, соответствующие запросам. Возможно, вам потребуется адаптировать их под спецификации, уникальные для FeliCa.
    • Инициализация тегов: Ваша функция on_startup должна правильно настраивать sensf_res и другие параметры, чтобы эмулируемый тег корректно реагировал на запросы от считывателя.

Нюансы работы с nfcpy при эмуляции тегов

  • Ограничения уровня абстракции: Nfcpy может быть ограничен в возможности обработки некоторых низкоуровневых команд, характерных для FeliCa. Если ваши сервисные коды имеют неожиданные ответы, это может быть связано с тем, что nfcpy не поддерживает необходимые протоколы полностью.
  • Замечания на уровне блоков: Если библиотека предоставляет доступ лишь к высокоуровневым данным, вы можете столкнуться с трудностями, если прямой доступ к блокам данных необходим для корректной работы.

Альтернативные библиотеки и методы

Если nfcpy не удовлетворяет ваши потребности, рассмотрите возможность использования других библиотек или решений:

  1. PyNFC: Эта библиотека может обеспечить больше контроля низкого уровня, но также требует более глубокого понимания протоколов и специфики FeliCa.
  2. Открытые решения: Некоторые открытые платформы для NFC-разработки могут позволить вам создать кастомизированные решения с полным контролем над протоколами.

Заключение

Эмуляция FeliCa требует глубокого понимания как самой системы, так и особенностей реализации в выбранной библиотеке. Убедитесь, что ваша реализация полностью соответствует спецификациям оригинального тега, корректно настраивайте сервисные коды и активно используйте развитые блоки данных. Если nfcpy не обеспечивает необходимой гибкости, возможно, стоит рассмотреть другие инструменты или подходы для достижения ваших целей. Удачи в ваших усилиях!

Оцените материал
Добавить комментарий

Капча загружается...