Разговор с устройством чтения карт NFC ACR1252U через Node.js

Я пытаюсь установить связь с устройством считывания карт ACR1252U NFC ( http://www.acs.com.hk/en/products/342/acr1252u-usb-nfc-reader-iii-nfc-forum-certified-reader/), используя Node.js и модуль NPM https://github.com/nonolith/node-usb.

Я создал простой скрипт для получения устройства чтения USB-устройств и прослушивания событий.

Когда карта NFC вступает в контакт с ридером, я получаю буфер:

<Buffer 50 03>

Когда карта NFC отнимается от чтения, я получаю буфер:

<Buffer 50 02>

Это указывает на то, что я, по крайней мере, могу получить базовое общение с работающим читателем.

Моя проблема сейчас в том, что я пытаюсь получить информацию о плате NFC, когда она вступает в контакт с ридером. Я пытался отправить данные читателю, но не могу получить последовательный ответ (иногда я получаю ответ буфера, а иногда нет, выполняя одну и ту же команду снова и снова).

Я решил упростить команду, которую отправлял, чтобы просто включить и выключить внутренний зуммер считывателя, поэтому я посмотрел документацию по API ( http://www.acs.com.hk/download-manual/6402/API-ACR1252U-A1-1.07.pdf), который говорит, что для активации зуммера вы отправляете через:

E0h 00h 00h 28h 01h + 1 byte to determine duration of buzzer activation

Имея это в виду, я создал буфер:

var buf = new Buffer(6);
buf.write('e00000280108', 'hex');

Затем использовал конечную точку USB-модуля для отправки данных:

outEndpoint.transfer(buf, function (err) {
    console.log('out transfer', err);
});

Консоль регистрирует "исходящую передачу" без ошибок, но от конечной точки "in" ничего не получено.

Если я вместо этого создаю 64-байтовый буфер:

var buf = new Buffer(64);
buf.write('e00000280108', 'hex');

outEndpoint.transfer(buf, function (err) {
    console.log('out transfer', err);
});

Я получаю ответ от конечной точки "in":

<Buffer e0 00 00 00 00 01 00 42 ff 00>

Это не соответствует тому, что ожидается от руководства, и вообще не активирует зуммер.

Я очень новичок в непосредственном общении с USB-устройствами, подобным этому, и мой последний опыт такого типа - отправка AT-команд модемам в тот день:)

Может ли кто-нибудь пролить свет на то, что я делаю неправильно? Я полагаю, что отправка 64 байтов вместо 6 имеет какое-то отношение к стандарту USB, требующему заданную длину или что-то в этом роде?!? Кто-нибудь еще имел опыт общения с NFC-ридером (не HID) с Node.js? В конечном итоге все, что я хочу сделать, - это записать некоторые данные в тег NFC и прочитать их позже, когда тег будет представлен.

Я думал, что это будет довольно простой процесс, но я в тупике! Может быть, я должен по-разному закодировать данные? Может я не правильно прекращаю данные? Я просто не знаю!

Я попытался увеличить размер буфера на 1 и добавить терминатор \0 в буфер с помощью:

buf.write('\0', 6, 'utf-8');

Но это не имело никакого значения вообще.

Спасибо!

1 ответ

Решение

Команды, описанные в спецификации API, являются (псевдо) командами APDU для обмена со считывателем через ПК /SC. Когда вы получаете доступ к считывателю напрямую через USB без уровня абстракции PS/SC (см. http://www.pcscworkgroup.com/specifications/overview.php), вы должны реализовать эту абстракцию самостоятельно. Следовательно, вы должны самостоятельно реализовать интерфейс класса USB CCID (интерфейс устройства с чип-картой). По сути, это означает, что вы должны инкапсулировать команды APDU в протокол CCID. Вы можете найти спецификацию здесь: http://www.usb.org/developers/docs/devclass_docs/

Другие вопросы по тегам