Вопрос или проблема
Я работаю над проектом по эмуляции NFC-метки с конкретными служебными кодами и блоками данных на Python с использованием nfcpy. Моя цель – считать карту, захватить ее данные (служебные коды, блоки и содержимое), а затем эмулировать эту метку с точно такой же структурой данных, чтобы считыватель распознавал ее как оригинальную карту. Код работает без ошибок, и я вижу сообщения об успешной активации метки, но считыватель по-прежнему не распознает эмулированную метку так, как оригинальную карту. Кроме того, я не могу правильно установить служебный код так, чтобы обеспечить корректное чтение и запись данных на основе блоков, полученных с оригинальной карты.
Вот что я сделал до сих пор:
-
Я успешно считываю данные с карты, включая служебные коды и данные блоков, используя
nfcpy
. -
На основе захваченных данных я настроил среду эмуляции с использованием
nfcpy
на USB NFC считывателе (Sony RC-S380). -
Я попробовал добавить сервисы с помощью
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("метка освобождена")
Мои вопросы:
- Как я могу правильно эмулировать NFC-метку с конкретными служебными кодами и данными блоков, чтобы считыватель интерпретировал ее точно так же, как оригинальную карту?
- Есть ли что-то специфическое в
nfcpy
, что я упускаю при установке служебных кодов или данных блоков, что могло бы повлиять на эмуляцию? - Существуют ли лучшие библиотеки или методы для достижения эмуляции тега FeliCa, особенно если у
nfcpy
есть ограничения в обработке служебных кодов?
Любые советы или предложения будут крайне полезны! Спасибо.
Ndef – это стандартизированный формат данных, основанный на различных типах тегов NFC, и если вы пытаетесь эмулировать захваченные “служебные коды, блоки и содержимое”, то использование высокоуровневого формата данных не сработает, так как он будет использовать конкретный поднабор того, что может делать тег.
Код подходит только для эмуляции данных Ndef на теге Felica, вам нужно будет прочитать документацию тега Felica и этого считывателя, чтобы иметь возможность контролировать считыватель достаточно хорошо для выполнения эмуляции на более низком уровне, если это возможно (и часто он не может эмулировать все точно)
Ответ или решение
Чтобы эмулировать NFC тег FeliCa с определёнными кодами сервиса и данными блоков, вам необходимо учесть несколько критически важных аспектов, особенно если вы используете библиотеку nfcpy. В следующем ответе мы рассмотрим, как правильно настроить эмуляцию, включая возможные нюансы в коде и ограничениях библиотеки, а также предложим альтернативные варианты, исходя из поставленных вами вопросов.
Как правильно эмулировать NFC тег с определенными кодами сервиса и данными блоков?
-
Понимание спецификации FeliCa: FeliCa является системой, которая использует собственные коды сервиса и схемы передачи данных. Каждый сервис имеет свой уникальный код, а блочные данные располагаются по определённым адресам. Вам необходимо знать, как эти блоки структурированы на оригинальной карте.
-
Считывание данных с оригинального тега: Если вы уже успешно считали данные с карты, убедитесь, что вы сохранили все нужные блоки и их контент. Убедитесь, что вы точно воспроизводите эти данные в вашем эмуляторе.
-
Настройка эмуляции в nfcpy:
- Коды сервиса: Используйте
tag.add_service()
для добавления нужных сервисов. Обратите внимание на kоды сервиса, которые вы указали. Они должны точно соответствовать оригинальной карте. - Функции чтения и записи: Убедитесь, что функции
ndef_read()
иndef_write()
корректно возвращают данные, соответствующие запросам. Возможно, вам потребуется адаптировать их под спецификации, уникальные для FeliCa. - Инициализация тегов: Ваша функция on_startup должна правильно настраивать
sensf_res
и другие параметры, чтобы эмулируемый тег корректно реагировал на запросы от считывателя.
- Коды сервиса: Используйте
Нюансы работы с nfcpy при эмуляции тегов
- Ограничения уровня абстракции: Nfcpy может быть ограничен в возможности обработки некоторых низкоуровневых команд, характерных для FeliCa. Если ваши сервисные коды имеют неожиданные ответы, это может быть связано с тем, что nfcpy не поддерживает необходимые протоколы полностью.
- Замечания на уровне блоков: Если библиотека предоставляет доступ лишь к высокоуровневым данным, вы можете столкнуться с трудностями, если прямой доступ к блокам данных необходим для корректной работы.
Альтернативные библиотеки и методы
Если nfcpy не удовлетворяет ваши потребности, рассмотрите возможность использования других библиотек или решений:
- PyNFC: Эта библиотека может обеспечить больше контроля низкого уровня, но также требует более глубокого понимания протоколов и специфики FeliCa.
- Открытые решения: Некоторые открытые платформы для NFC-разработки могут позволить вам создать кастомизированные решения с полным контролем над протоколами.
Заключение
Эмуляция FeliCa требует глубокого понимания как самой системы, так и особенностей реализации в выбранной библиотеке. Убедитесь, что ваша реализация полностью соответствует спецификациям оригинального тега, корректно настраивайте сервисные коды и активно используйте развитые блоки данных. Если nfcpy не обеспечивает необходимой гибкости, возможно, стоит рассмотреть другие инструменты или подходы для достижения ваших целей. Удачи в ваших усилиях!