CARD reader writer ACR122S

 

nfc card writer

С помощью этого девайса возможно производить запись и чтение пластиковых карт (парковочные карты, скидочные карты, специальные карты). В данной статье кратно описан протокол взаимодействия с карт-ридером через COM-порт.

 

Бесконтактный считыватель ACR122S
В данной статье рассмотрена работа с картами типа Mifare

Считыватель питается от USB, данные передаются по COM-порту

Все команды на считыватель я отправлял с помощью программы Terminal

Все посылки делятся на три больших типа:
1) активация ридера
2) деактивация ридера
3) прочие команды

В начале работы активируем ридер (далее все коды типа $xx - шистнадцатеричные байты)
активация
 $02$62$00$00$00$00$00$01$01$00$00$62$03

    при этом сначала приходит ответ о том, что ридер получил запрос на активацию (приходит команда 02 00 00 03, затем через примерно секунду ответ на запрос инициализации). Если команда отправлена не правильно по каким-либо причинам, то вместо 02 00 00 03 придет 02 FF FF 03 если не правильное CRC, 02 99 99 03 если не правильная длина сообщения и прочие.

Любая команда передается следующим пакетом (побайтно):
1) $02 - заголовок (1 байт), всегда одинаковый
2) $62 - активация
    $63 - деактивация
    $6F прочие команды соответственно (1 байт)

3) Младший Далее 4 байта - длина команды псевдо-АПДУ (такое название этого протокола прочих команд)
4)
5)
6) Старший байт длины команды (как правило 0)

7) Идентификатор слота команды ($00 - $FF), я использовал 0 или из примера
8) Последовательность команды... Аналогично с байтом 7
9) Ислользуется если выставлен таймаут блока, та же история, что и с 7 8
10) 0x00 wLevelParametr
11) 0x00 wLevelParametr

Могут быть еще параметры
Далее
CRC - обычный XOR, заголовок не считается
$03 - завершающий байт, всегда $03

Этапы работы со считывателем:

1) Активация ридера
   $02$62$00$00$00$00$00$01$01$00$00$62$03


По желанию:
  Прочитать статусы светодиодов
    $FF$00$40$00$04$00$00$00$00$00


  включить светодиод
    $FF$00$40$0F$04$00$00$00$00
    $02$6F$09$00$00$00$00$00$00$00$00$FF$00$40$0F$04$00$00$00$00$D2$03

  выключить свет
    $FF$00$40$04$04$00$00$00$00
    $02$6F$09$00$00$00$00$00$00$00$00$FF$00$40$04$04$00$00$00$00$D9$03


  Включить красный на пару секунд и попищать
    $FF$00$40$50$04$14$00$01$01
    $02$6F$09$00$00$00$00$00$00$00$00$FF$00$40$50$04$14$00$01$01$99$03
 
$14 - длительность сигнала. Если меняем длительность, то надо переделать CRC - делаем $99 xor $14 xor $new_value

  Пикнуть (длительность $02):
    $02$6F$09$00$00$00$00$00$00$00$00$FF$00$40$50$04$02$01$01$01$8E$03

  Пикнуть и моргнуть с зеленым светодиодом
    $02$6F$09$00$00$00$00$00$00$00$00$FF$00$40$70$04$02$01$01$01$AE$03


2) Выполнить функцию retry time
$02$6F$0B$00$00$00$00$01$00$00$00$FF$00$00$00$06$D4$32$05$00$00$01$7E$03

3) Выполнить функцию polling mifare - запрос наличия карты
$02$6F$09$00$00$00$00$01$00$00$00$FF$00$00$00$04$D4$4A$01$00$03$03

Ответы, которые я получил
Если нет карты:
02 00 00 03 02 80 05 00 00 00 00 01 02 00 00 D5 4B 00 90 00 88 03

есть карта 1:
02 00 00 03 02 80 0E 00 00 00 00 01 02 00 00 D5 4B 01 01 00 04 08 04 CC D7 82 C0 90 00 D2 03

есть карта 2:
02 00 00 03 02 80 0E 00 00 00 00 01 02 00 00 D5 4B 01 01 00 04 08 04 4C A6 7D C0 90 00 DC 03

Подчеркнутые данные определяют ID карты.

 

Расшифровка
Polling
$02$6F$09$00$00$00$00$01$00$00$00$FF$00$00$00$04$D4$4A$01$00$03$03


02 00 00 03
02 80 0E 00 00 00 00 01 02 00 00
D5 4B -01- -01- -00 04- -08- -04-   =CC D7 82 C0=   90 00 D2 03


02 00 00 03
02 80 0E 00 00 00 00 01 02 00 00
D5 4B -01- -01- -00 04- -08- -04-   =DE 3D C8 58=   90 00 F8 03

================================================

Пробуем ключи A и B для того чтобы открыть карту на запись:

Key A
$02$6F$14$00$00$00$00$01$00$00$00$FF$00$00$00$0F$D4$40$01$60$04$FF$FF$FF$FF$FF$FF$CC$D7$82$C0$22$03

Ответ:

02 00 00 03
02 80 05 00 00 00 00 01 02 00 00
D5 41 00 90 00 82 03

================================================
Key B
$02$6F$14$00$00$00$00$01$00$00$00$FF$00$00$00$0F$D4$40$01$61$04$FF$FF$FF$FF$FF$FF$CC$D7$82$C0$23$03

Ответ:

02 00 00 03
02 80 05 00 00 00 00 01 02 00 00
D5 41 00 90 00 82 03

================================================
Read data
$02$6F$0A$00$00$00$00$01$00$00$00$FF$00$00$00$05$D4$40$01$30$04$3F$03

Ответ:
02 00 00 03
02 80 15 00 00 00 00 01 02 00 00
D5 41 00

= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 = Block data 16 byte
90 00 92 03

================================================
Write data (Update data)
$02$6F$1A$00$00$00$00$01$00$00$00$FF$00$00$00$15$D4$40$01$A0$04$01$02$03$04$05$06$07$08$09$0A$0B$0C$0D$0E$0F$10$BF$03

Ответ:

02 00 00 03
02 80 05 00 00 00 00 01 02 00 00
D5 41 00 90 00 82 03