ODRFID-N и ODRFID-M: работа со сторонними приложениями
Как подключить ODRFID к NFC Tools, Cardpeek, libnfc и другим программам в Linux: включение CCID, настройка драйвера и чтение MIFARE Classic.
С ODRFID-N и ODRFID-M можно просматривать память MIFARE Classic в
NFC Tools и Cardpeek, сохранять дампы через libnfc и читать карты из своих
программ на Python, Node.js и C. Для этого включите интерфейс CCID
в конфигураторе считывателя и настройте драйвер на компьютере.
CCID доступен в прошивке 3.14. Подходящую сборку для вашей
модели уточните в технической поддержке.
Руководство описывает чтение MIFARE Classic 1K в Linux. Для других карт, записи NDEF
и подключения в Windows и macOS уточните совместимость в поддержке.
CCID — USB-интерфейс считывателя смарт-карт. PC/SC позволяет
приложению найти считыватель и отправить ему команды через операционную
систему. В Linux за подключение отвечают служба pcscd из pcsc-lite
и драйвер libccid.
Одни программы обращаются к PC/SC напрямую, другие используют библиотеку
libnfc. От этого зависит подготовка рабочего места:
Для работы через libnfc нужна сборка с поддержкой ODRFID.
Исходники доступны в нашем форке libnfc-odrfid.
Подготовка исходников и сборка описаны во вкладке libnfc.
Что нужно для чтения карты
Подготовьте MIFARE Classic 1K и ключи к её секторам. UID — идентификатор
карты — можно получить без ключа. Чтобы прочитать защищённую память,
нужен ключ A или B от сектора, если чтение разрешено его битами доступа.
В командах ниже используется стандартный ключ FFFFFFFFFFFF. Если
ключи вашей карты изменены, подставьте свои. ATR, который показывают
PC/SC-программы, — это ответ активации карты, а не её UID.
Подготовка считывателя и Linux
Включите CCID в конфигураторе
Откройте ODRFIDConfig,
включите интерфейс CCID и выберите составной USB-профиль.
Сохраните настройки и перезапустите считыватель.
Профиль
Интерфейсы
0 — штатный
CDC, клавиатура HID, служебный HID
1 — составной
CCID, CDC, клавиатура HID, служебный HID
2 — только CCID
Только интерфейс смарт-карт; COM-порт CDC и клавиатура HID в этом профиле не используются
Для начала выберите профиль 1: в нём остаётся COM-порт CDC для
настройки устройства. CCID есть у моделей M и N; ODRFID-E работает
на 125 кГц и этот интерфейс не поддерживает.
Включение через AT-команды
Переключить профиль можно и через CDC-терминал. Закройте конфигуратор
и другие программы, использующие считыватель, затем запросите текущий профиль:
AT+USBMODE?
В ответе +USBMODE=<сохранённый>,<активный> первое число — профиль
в настройках, второе — профиль текущего подключения. Для включения CCID
выполните:
AT+USBMODE=1
AT+P
AT+Q
AT+P сохраняет настройку, AT+Q перезапускает считыватель и закрывает
открытые соединения. После подключения снова отправьте AT+USBMODE?.
Ответ +USBMODE=1,1 означает, что составной профиль сохранён и включён.
Если считыватель не отвечает на эту команду, обратитесь в поддержку
за прошивкой с поддержкой CCID.
Для возврата из профиля 1 в штатный режим повторите команды,
заменив первую на AT+USBMODE=0.
Настройте драйвер в Linux
Установите pcsc-lite, libccid и pcsc-tools средствами своего дистрибутива.
Затем добавьте ODRFID в список устройств драйвера libccid:
Найдите файл Info.plist. Обычно он находится по пути
/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist;
в вашем дистрибутиве путь может отличаться. Сохраните копию перед правкой.
Добавьте по одной строке в массивы ifdVendorID, ifdProductID
и ifdFriendlyName: 0x0483, 0xA26A и ODRFID CCID соответственно.
Позиции новых элементов в трёх массивах должны совпадать.
Чтобы libnfc могла отправлять считывателю служебные (Escape) команды,
в том числе без карты, задайте в том же файле ifdDriverOptions = 0x0001.
Перезапустите службу и запустите поиск считывателей:
sudo systemctl restart pcscd
pcsc_scan
В списке должен появиться ODRFID CCID. Поднесите карту: программа покажет
Card inserted и строку ATR. Обновление пакета libccid может заменить
Info.plist исходным файлом. Если после обновления ODRFID пропал из списка,
добавьте строки из шага 2 повторно.
Перед запуском другой программы
Закройте текущее приложение, чтобы освободить считыватель. Если после
libnfc программа с прямым доступом к PC/SC не видит карту, перезапустите
считыватель командой AT+Q через CDC и откройте программу заново.
Выберите программу
NFC Tools и Cardpeek показывают карту в окне приложения.
pcsc-tools помогает проверить подключение. libnfc, mfoc,
mfterm и mfoc-hardnested пригодятся для работы в терминале,
а nfc-pcsc, pyscard и libfreefare — для собственного ПО.
Нажмите на скриншот, чтобы открыть его в полном размере. Для консольных
программ показан фрагмент вывода в терминале.
NFC Tools Desktop 2.7
NFC Tools Desktop
показывает сведения о MIFARE Classic 1K и её память. Программа подключается
к ODRFID через PC/SC; собирать её из исходников или устанавливать libnfc
не требуется.
Настройте CCID и убедитесь, что pcsc_scan видит карту.
Запустите NFC Tools Desktop и выберите ODRFID.
Откройте Information, чтобы посмотреть UID, ATR и тип карты.
Перейдите в Memory для просмотра 64 блоков памяти Classic 1K.
Information: UID, тип карты и объём памяти.Memory: содержимое блоков карты после чтения.
Cardpeek 0.8.5
Cardpeek показывает секторы и блоки
MIFARE Classic 1K в виде дерева. Рядом с данными можно посмотреть права
чтения и записи, заданные битами доступа. Подключение работает через
PC/SC; libnfc не нужна.
Сборка
Для сборки версии 0.8.5 нужны GTK 3 и Lua 5.3. При работе с GCC 16
выберите стандарт GNU C11:
Флаг -std=gnu11 включает режим компилятора, в котором собирается
старый код Cardpeek.
Просмотр карты
Выберите PC/SC-считыватель ODRFID и запустите анализатор mifare reader.
Для карты со стандартными ключами выберите Use default keys.
Если ключи изменены, понадобятся действующие ключи к секторам.
После чтения раскройте нужный сектор: в дереве доступны все 16 секторов
и 64 блока Classic 1K. Кнопка Save сохраняет дерево в XML на компьютер,
не меняя содержимое карты.
Если другая программа не открывает сохранённый XML, проверьте первую
строку файла. Cardpeek 0.8.5 записывает в ней type="UTF-8" вместо
encoding="UTF-8". Исправьте эту строку или пропустите её при разборе файла.
Секторы, блоки памяти и права доступа прочитанной Classic 1K.Вкладка reader показывает команды и ответы считывателя.
pcsc-tools 1.7.5
Начните с pcsc_scan из
pcsc-tools, если приложение
не видит считыватель. Утилита показывает устройства PC/SC, наличие карты
и её ATR. Для чтения памяти выберите другую программу из этого руководства.
После настройки драйвера выполните:
pcsc_scan
Поднесите карту. В выводе должны появиться имя ODRFID CCID, состояние
Card inserted и строка ATR. Для выхода нажмите Ctrl+C.
Если ODRFID отсутствует в списке, проверьте включение CCID в конфигураторе,
запись VID:PID в libccid и работу службы pcscd. Специальная libnfc
для этой проверки не требуется.
ODRFID и карта в списке pcsc_scan.
libnfc-odrfid на основе libnfc 1.8.0
libnfc позволяет работать с картой
из терминала или собственного приложения. Утилита nfc-list показывает
UID и параметры карты, а nfc-mfclassic сохраняет память MIFARE Classic
в файл.
Установите Git, инструменты сборки и заголовки pcsc-lite.
Скачайте исходники и соберите библиотеку с драйвером PC/SC:
git clone https://github.com/progerstar/libnfc-odrfid.git
cd libnfc-odrfid
autoreconf -vis
./configure --with-drivers=acr122_pcsc
make
./utils/nfc-list -v
Перед запуском настройте CCID-драйвер и параметр ifdDriverOptions
для Escape-команд, как описано в разделе «Настройте драйвер в Linux».
Если имя считывателя в PC/SC не начинается с ODRFID или Open Development,
укажите его вручную в строке подключения libnfc:
acr122_pcsc:<полное имя PC/SC считывателя>.
Для локального запуска библиотеку не обязательно устанавливать в систему.
Укажите каталог собранной библиотеки в переменной окружения LD_LIBRARY_PATH. При сборке mfoc, mfterm и других
программ используйте заголовки и библиотеку из этой же копии libnfc.
Сохранение дампа Classic 1K
Команда ниже читает карту с UID A23C5B89 и сохраняет её память
в файл classic-1k.mfd. Запускайте её из каталога собранной libnfc:
./utils/nfc-mfclassic r a Ua23c5b89 classic-1k.mfd
r выбирает чтение, a — ключ A. Аргумент Ua23c5b89 — это буква U
и UID карты: замените его на UID своей карты. Если ключи карты изменены,
используйте свои. Полный дамп Classic 1K содержит 64 блока и занимает
1024 байта.
Если появилась ошибка No ACR122 firmware received, программа, вероятно,
использует системную libnfc. Запустите её с библиотекой из libnfc-odrfid.
UID и параметры карты в nfc-list.
mfoc 0.10.7
С mfoc можно сохранить дамп
MIFARE Classic 1K со стандартными ключами. Для сборки и запуска используйте
libnfc-odrfid.
Из корня собранного проекта выполните:
timeout 45 ./src/mfoc -P 1 -O classic-1k.mfd
timeout 45 завершает программу через 45 секунд, -O classic-1k.mfd
задаёт имя файла дампа. Для карты с ключами
A/B FFFFFFFFFFFF во всех 16 секторах программа сохраняет файл 1024 байта.
Фрагмент журнала чтения карты со стандартными ключами.
libfreefare 0.4.0
libfreefare позволяет читать
Classic из C-приложения: определить карту, получить UID, пройти
аутентификацию ключом A или B и прочитать блоки сектора.
Сборка
Сначала соберите libnfc-odrfid. В параметрах
configure для libfreefare укажите:
LIBNFC_CFLAGS — путь к заголовкам этой libnfc;
LIBNFC_LIBS — каталог библиотеки и -lnfc;
PKG_CONFIG_PATH — каталог её файла libnfc.pc.
Пример чтения
С libfreefare можно прочитать все 64 блока Classic 1K и сравнить данные
и байты доступа с контрольным дампом. Контрольный дамп — файл размером
1024 байта с ранее сохранённым содержимым вашей карты, например
сохранённый с помощью nfc-mfclassic. В коде своей программы укажите UID
и ключи вашей карты.
Чтение секторов Classic 1K из C-приложения.
mfterm 1.0.7
mfterm — интерактивный терминал для
MIFARE Classic. В нём можно прочитать карту, посмотреть блоки и права
доступа, сохранить дамп. Для подключения к ODRFID нужна
libnfc-odrfid.
Сборка
Если в архиве исходников нет файлов NEWS и ChangeLog, запустите
сборку в режиме automake foreign, чтобы она не прерывалась из-за их
отсутствия:
AUTOMAKE='automake --foreign' autoreconf -fi
При вызове configure задайте путь к заголовкам своей libnfc через
CPPFLAGS, а к библиотеке — через LDFLAGS. Для сборки с GCC 16
используйте:
make -j4 CFLAGS='-O2 -std=gnu11 -Wno-error'
Флаг -Wno-error позволяет продолжить сборку при предупреждениях
компилятора.
Чтение и сохранение
Задайте известный ключ A для каждого сектора командой
keys set A <сектор> <ключ>. Например, для сектора 0 со стандартным ключом:
keys set A 0 FFFFFFFFFFFF
Повторите команду для всех 16 секторов (номера 0–F в шестнадцатеричной
записи), указывая ключ каждого сектора. Затем прочитайте карту, посмотрите первый сектор
и права доступа, сохраните дамп:
read A
print head
print ac
save classic.mfd
quit
keys set задаёт ключи в памяти программы, а save сохраняет файл
на компьютер. Ключи и содержимое карты эти команды не меняют.
mfterm сохраняет файл 4096 байт даже для Classic 1K. Данные карты
занимают первые 1024 байта, остальная часть файла дополняется. Если другой
программе нужен дамп в 1024 байта, используйте первые 1024 байта файла.
Фрагмент сеанса чтения и просмотра карты в mfterm.
nfc-pcsc 0.8.1 для Node.js
nfc-pcsc позволяет получать события
карты и читать её память из Node.js. Для ODRFID используйте общий класс
Reader. Библиотека подключается через PC/SC напрямую, без libnfc.
Для сборки и запуска нативного модуля используйте одну версию Node.js.
Модуль, собранный для Node.js 20.20.2, для Node.js 22 нужно собрать
заново. При смене версии Node.js переустановите зависимость.
Если заголовки Node.js установлены в системный каталог /usr, добавьте
к команде установки --nodedir=/usr. Иначе используйте команду без этого
параметра.
Подключение из своей программы
При обнаружении карты библиотека выдаёт событие card с UID. Затем
можно вызвать authenticate() с ключом A или B и read() для чтения блока.
Так можно прочитать все 64 блока Classic 1K и сравнить данные
с контрольным дампом своей карты. В скрипте укажите серийный номер
считывателя, UID и ключи вашей карты и убедитесь, что модуль nfc-pcsc
установлен.
Событие карты, UID и чтение секторов из Node.js.
pyscard 2.3.1 для Python
С pyscard Python-приложение
может получить список считывателей, подключиться к ODRFID и отправить
карте команды через PC/SC. Для чтения Classic не нужна libnfc.
Установка и запуск примера
Установите pyscard в отдельное виртуальное окружение. Пример рассчитан
на Python 3.14.7 и pyscard 2.3.1:
Скрипт на pyscard получает ATR и UID, проходит аутентификацию ключами A/B
и читает все 16 секторов Classic 1K. Результат можно сравнить с контрольным
дампом вашей карты размером 1024 байта. В скрипте укажите серийный номер
считывателя, UID и ключи своей карты.
Для этого достаточно методов connect(), transmit() и disconnect().
Реакцию на снятие карты со считывателя добавьте в своё приложение.
Чтение Classic 1K и повторное подключение к карте из Python.
mfoc-hardnested 0.10.9
С mfoc-hardnested можно
прочитать Classic 1K со стандартными ключами и сохранить дамп.
Для ODRFID нужна libnfc-odrfid.
При сборке передайте configure пути к этой библиотеке через
PKG_CONFIG_PATH, libnfc_CFLAGS и libnfc_LIBS.
Команда сохраняет память Classic 1K в файл 1024 байта (-O задаёт имя
файла), а timeout 45 завершает программу через 45 секунд. Для карты
с ключами FFFFFFFFFFFF используется обычное чтение.
Фрагмент журнала обычного чтения карты с известными ключами.