CARD reader writer ACR122S
С помощью этого девайса возможно производить запись и чтение пластиковых карт (парковочные карты, скидочные карты, специальные карты). В данной статье кратно описан протокол взаимодействия с карт-ридером через 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