Вам, конечно же, знакомы карточки и брелки, которые нужно подносить к считывателю, а они при этом пропускают на работу или дают проехать в метро. Такие брелки и карточки используют технологию под названием RFID, Radio Frequency IDentification. Сегодня мы познакомимся с основами этой технологии, а также узнаем, как использовать ее в своих проектах на базе Arduino.
Работа RFID неплохо расписана в соответствующей статье на Википедии . Если в двух словах, большую часть карточки или брелка, которые далее мы будем называть RFID-метками, занимает антенна. Также в метке содержится очень маленький чип, реализующий всю логику. В ридере также есть антенна, притом регулярно передающая сигнал, и следовательно создающая электромагнитное поле. При поднесении метки в это поле на ее антенне индуцируется ток, который и питает метку. Теперь метка и ридер могут пообщаться друг с другом при помощи радиосигнала, используя какой-то свой протокол и модуляцию сигнала.
Стоит отметить, что это описание касалось пассивных меток. Бывают и активные метки, имеющие собственный источник питания, а также полупассивные. Что же касается радиосигнала, в RFID сигнал типично передается на частоте 125 КГц или 13.56 МГц. Существует множество стандартов передачи сигнала и их реализаций. Довольно распространенным является стандарт ISO/IEC 14443 и его реализация MIFARE от компании NXP Semiconductors. Еще одним известным стандартом является NFC , основанный на ISO 14443. Одна из его реализаций называется NTAG, также от NXP Semiconductors. Стоит отметить, что в общем случае реализации одного стандарта от разных производителей могут быть не вполне совместимы друг с другом и содержать расширения, которых нет в самом стандарте.
Fun fact! В метках MIFARE используется секретный шифр Crypto-1, выжигаемый прямо в железе, что изначально делало невозможным клонирование этих меток. Шифр со временем отреверсили и предали широкой огласке, поэтому последние лет 10 метки MIFARE может свободно клонировать кто угодно. Кое-какие подробности описаны в этих слайдах . Эта история наглядно демонстрирует, почему безопасность через неясность (security by obscurity) не работает.
Для Arduino существует несколько модулей для работы с RFID. Пожалуй, самым дешевым, и в то же время самым популярным, является модуль под названием RC522 на базе чипа MFRC522 от NXP ( даташит [PDF] ). На eBay комплект из такого модуля вместе с метками в виде карточки и брелка можно приобрести за 2$ . Чип MFRC522 поддерживает технологии MIFARE и NTAG, радиосигнал передается на частоте 13.56 МГц. С микроконтроллером чип общается по SPI. Однако прямо по SPI ходить в чип нам не придется, так как для работы с модулем существует готовая библиотека MFRC522 . Ее можно установить прямо из Arduino IDE.
Подключение модуля к Arduino Uno осуществляется так:
- Пины 3.3V и GND Arduino подключаем к аналогичным пинам модуля;
- Пины с 9 по 13 Arduino подключаем к пинам RST, SDA, MOSI, MISO и SCK модуля соответственно;
В итоге должно получиться что-то в таком стиле:
Рассмотрим простейший пример кода:
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522 ( SS_PIN, RST_PIN ) ;
void setup ( ) {
Serial. begin ( 9600 ) ;
SPI. begin ( ) ;
mfrc522. PCD_Init ( ) ;
Serial. println ( «Ready.» ) ;
}
void loop ( ) {
if ( ! mfrc522. PICC_IsNewCardPresent ( ) )
return ;
if ( ! mfrc522. PICC_ReadCardSerial ( ) )
return ;
mfrc522. PICC_DumpToSerial ( & ( mfrc522. uid ) ) ;
}
Этот код полностью считывает содержимое метки и передает его в компьютер по UART. Если теперь поднести карточку к считывателю, вы увидите что-то вроде:
Card SAK: 08
PICC type: MIFARE 1KB
Sector Block 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AccessBits
15 63 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
14 59 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
… и так далее …
0 3 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
0 EF FB F6 01 E3 08 04 00 62 63 64 65 66 67 68 69 [ 0 0 0 ]
Отсюда мы можем узнать, что метка имеет 32-х битный идентификатор (UID), а также содержит в себе 1 Кб данных. Также можно заметить, что UID на самом деле представляет собой данные, хранящиеся в нулевом блоке.
Теперь допустим, что у нас есть дверь, и мы хотим открывать ее только тем, кто приложит правильную карточку. Проще всего это сделать, проверяя UID карточки:
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522 ( SS_PIN, RST_PIN ) ;
const uint8_t valid_uid [ ] = { 0xEF , 0xFB , 0xF6 , 0x01 } ;
void setup ( ) {
Serial. begin ( 9600 ) ;
SPI. begin ( ) ;
mfrc522. PCD_Init ( ) ;
}
void loop ( ) {
if ( ! mfrc522. PICC_IsNewCardPresent ( ) )
return ;
if ( ! mfrc522. PICC_ReadCardSerial ( ) )
return ;
if ( ( mfrc522. uid . size == sizeof ( valid_uid ) ) &&
( memcmp ( & mfrc522. uid . uidByte , & valid_uid,
sizeof ( valid_uid ) ) == 0 ) )
{
Serial. println ( «ACCESS GRANTED!» ) ;
} else {
Serial. println ( «Access denied.» ) ;
}
}
Вместо UID можно с тем же успехом использовать другие блоки. Как вариант, в них можно хранить битовую маску, определяющую, какие двери можно открывать с помощью этой карты, а какие нельзя. Чтобы нельзя было так просто изготовить мастер-ключ, открывающий все двери, данные на карте можно подписывать, например, при помощи эллиптической криптографии .
Как видите, пользоваться модулем достаточно просто. С его помощью вы без проблем добавите в ваши проекты аутентификацию по карточкам. Стоит только иметь в виду, что MIFARE-метки достаточно легко клонируются. Вместе с библиотекой MFRC522 идет еще масса примеров, включая смену UID и полное клонирование карт.
А доводилось ли вам делать что-то с RFID-метками и если да, то каковы ваши последние достижения на этом поприще?