Об RFID-метках и работу с ними при помощи Arduino

30 октября 2017

Вам, конечно же, знакомы карточки и брелки, которые нужно подносить к считывателю, а они при этом пропускают на работу или дают проехать в метро. Такие брелки и карточки используют технологию под названием 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 модуля соответственно;

В итоге должно получиться что-то в таком стиле:

RFID-модуль для Arduino

Рассмотрим простейший пример кода:

#include <SPI.h>
#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 UID: EF FB F6 01
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 <SPI.h>
#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-метками и если да, то каковы ваши последние достижения на этом поприще?

Метки: , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.