Я работаю над проектом для моего местного Makerspace, у нас ограниченный бюджет, поэтому я надеялся использовать RFID-RC522 el'cheap'o RFID / NFC-ридеры на eBay, я получил пару плат на основе SPI, они работают, однако примеры кода для них ограничены.
Я нашел несколько разных библиотек и остановился на этой: https://github.com/ljos/MFRC522
Беда в том, что весь код, доступный в Интернете, создается из кода Python некоторых китайских парней, который люди перевели и взломали в библиотеку Arduino.
Код работает, но карты Mifare должны иметь 4, 7 или 10-байтовые UID, а пример / библиотека возвращает 5-байтовый серийный номер.
Документации нет, а таблица данных NXP непонятна ... Кроме того, кажется, что она работает с большинством карт, но не работает с картами Mastercard PayWave, которые соответствуют стандарту ISO 14443. Более дорогой считыватель RDM880, основанный на MFRC500, работает нормально и имеет приятную библиотеку, но стоимость делает реализацию невозможной.
Итак, может кто-нибудь помочь мне получить этот модуль на базе NXP MFRC522, считывающий UID со всех карт ISO 14443.
#include <SPI.h>
#include <MFRC522.h>
#define RFID_SS 10
#define RFID_RST 5
MFRC522 rfid( RFID_SS, RFID_RST );
void setup() {
SPI.begin();
Serial.begin(115200);
rfid.begin();
}
void loop() {
byte data[MAX_LEN];
byte uid[5];
if ( rfid.requestTag( MF1_REQIDL, data ) == MI_OK ) {
if ( rfid.antiCollision( data ) == MI_OK ) {
memcpy( uid, data, 5 );
for ( int i = 0; i < 5; i++ ) {
Serial.print( uid[i], HEX );
Serial.print( ' ' );
}
Serial.println();
}
}
}
uid
массив имеет длину 5. Вы пытались использовать массив большего размера, поскольку хотите получить 10-байтовый результат?Ответы:
Извините, но я должен не согласиться с вашей «таблицей NXP непостижимо» . С ПЕРВОЙ СТРАНИЦЫ MFRC522:
«Примечание: MFRC522 поддерживает все варианты протоколов идентификации MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 и MIFARE Plus»
Здесь говорится, что MFRC522 покрывает только часть ISO / IEC 14443. Для NXP RC522 не хватает следующего:
* MIFARE DESFire EV1 (включает шифрование AES)
MIFARE DESFire EV2 (включает в себя MIsmartApp, Transaction MAC, неограниченные приложения MIFARE Plus для замены MIFARE Classic с сертифицированным уровнем безопасности (на основе AES 128))
MIFARE SAM AV2 (модуль безопасного доступа, обеспечивающий безопасное хранение криптографических ключей и криптографических функций) *
Это, вероятно, те, которые используются в банковских картах. Опять же, с ПЕРВОЙ СТРАНИЦЫ спецификации MFRC500:
«Поддерживаются все уровни протокола ISO / IEC 14443 A».
Вам нужно будет просмотреть все различные спецификации MIFARE / ISO / IEC 14443, чтобы узнать, сколько байтов идентификатора существует для разных типов (я подозреваю, что разные типы возвращают разное количество байтов).
Так что, в принципе, ты облажался. Spring для дорогого ридера на базе MFRC500. Я предполагаю, что с более высокой стоимостью вы также получите высококлассный API, документацию и примеры или даже (задыхайтесь!) Техническую поддержку.
ура
источник
MFRC522 :: requestTag () возвращает тип карты в первых двух байтах второго параметра ( данные в вашем примере выше). Вам нужно будет посмотреть на это значение, чтобы определить тип карты. Используйте эту информацию, чтобы распечатать необходимые N байтов идентификатора.
В крайнем случае, вы можете выгрузить все 16 байтов (MAX_LEN) и протестировать их с различными типами карт, чтобы увидеть, какие байты изменяются детерминистическим образом, что позволяет вам определить правильную длину идентификатора.
И в случае, если это экономит ваше время, если вы вызываете функции самопроверки этой библиотеки - getFirmwareVersion () и digitalSelfTestPass (); необходимо снова вызвать MFRC522 :: begin (), иначе невозможно прочитать RFID-идентификаторы (на момент написания, конечно.)
источник
Попробуйте использовать самый популярный.
https://github.com/miguelbalboa/rfid
Это работает для меня. Он возвращает UID как то, что вы хотите. Просто удалите другие функции, только получив uid из его примера.
источник