MFRC522 контроль наличия карты

kost82
Offline
Зарегистрирован: 30.11.2015

Добрый день!

Собираю устройство, которое использует считыватель RFID-карт RC522. Использую довольно распространенную библиотеку

Мне необходимо, чтобы замок был открыт пока карточка поднесена к считывателю, как только карту убираем - замок должен закрыться (не обязательно мгновенно, но в пределах 1-2 секунд).

В библиотеке для организации логики работы с картами я нашел всего две функции: PICC_IsNewCardPresent() - возвращает true если к считывателю поднесли карту и PICC_ReadCardSerial() - которая читает серийный номер карты. В описании последней указано, что перед ее вызовом надо обязательно сделать вызов PICC_IsNewCardPresent(), PICC_RequestA() или PICC_WakeupA(). Но дажже если соблюдать это условие - серийник карты читается только если ее убрать от считывателя и снова поднести. Если карта постоянно лежжит на считывателе - серийник не считывается. Мне жн адо отследить именно момент убирания карты от считывателя, чтобы в этот момент закрыть замок.

Поэтому прошу совета у знающих людей: каким образом (программным или даже аппаратным) отследить, что карта находится у считывателя? Может есть другая православная библиотека, которую я не заметил на просторах гуглопоиска?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, а если не спрашивать PICC_IsNewCardPresent, а просто читать серийный номер. Разве не будет читать пока карта там столько раз, сколько надо, пока её не уберут?

kost82
Offline
Зарегистрирован: 30.11.2015

В том то и дело, что нет. Я попробовал просто читать серийник, вырезал из примера проверку PICC_IsNewCardPresent - в ответ тишина. Полез в библиотеку - а там в описании написано... Попробовал другие методы из описания - тоже работает только при поднесении карты заново.

kost82
Offline
Зарегистрирован: 30.11.2015

Я извиняюсь, проблему решил сегодня с утра. Я вызвал два (PICC_IsNewCardPresent(), PICC_RequestA()) из трех предложенных методов перед чтением карты. Думал что везде результат одинаковый будет. Сегодня с утра попробовал вызвать PICC_WakeupA() перед чтением - и все заработало. То есть надо делать так:

byte atqa_answer[2];
byte atqa_size = 2;
mfrc522.PICC_WakeupA(atqa_answer, &atqa_size);
if ( mfrc522.PICC_ReadCardSerial()) { 
// тут логика работы с серийником
}

Тогда начинается постоянное считывание.

У меня остался только аппаратный вопрос: с картой ведь ничего не должно приключиться, если у нее серийник считывать непрерывно по нескольку часов?

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Соц. карты, когда они на майфер классике были, атакуя читал их от 4х до 7ми часов непрерывно.
Нагреваются они немножко, но ни одна карти не пострадала.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Читать серийник, ни чем не защищенный по определению, для проверки валидности карты - это как ключик от замка под коврик прятать :)

kost82
Offline
Зарегистрирован: 30.11.2015

Алексей. пишет:
Соц. карты, когда они на майфер классике были, атакуя читал их от 4х до 7ми часов непрерывно. Нагреваются они немножко, но ни одна карти не пострадала.

Понял, спасибо. Теперь я спокоен.

Алексей. пишет:
Читать серийник, ни чем не защищенный по определению, для проверки валидности карты - это как ключик от замка под коврик прятать :)

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

AronVit
Offline
Зарегистрирован: 05.11.2019

kost82 пишет:

Я извиняюсь, проблему решил сегодня с утра. Я вызвал два (PICC_IsNewCardPresent(), PICC_RequestA()) из трех предложенных методов перед чтением карты. Думал что везде результат одинаковый будет. Сегодня с утра попробовал вызвать PICC_WakeupA() перед чтением - и все заработало. То есть надо делать так:

byte atqa_answer[2];
byte atqa_size = 2;
mfrc522.PICC_WakeupA(atqa_answer, &atqa_size);
if ( mfrc522.PICC_ReadCardSerial()) { 
// тут логика работы с серийником
}

Тогда начинается постоянное считывание.

Спасибо большое, решал подобную задачу.