Rfid reader как пользоваться

от admin

RFID идентификация

RFID метка

Предисловие

В современном мире, несомненно, ценится возможность быстро и просто получать большие объёмы информации. Каждый год ведутся разработки для создания удобных и компактных носителей для хранения, передачи и защиты тех или иных данных.

На сегодняшний день человечество сделало большой шаг в эру цифровых технологий, обеспечив практически каждого человека возможностью выхода в Интернет. Цифровизируется всё: начиная со старых рукописных книжек, заканчивая документами и деньгами. Люди всё меньше пользуются наличными, отдавая предпочтение бесконтактным банковским картам, в государственных ведомствах всё больше говорят о введении единых электронных паспортов с доступом к любой информации о человеке за два клика. Больше не нужно проводить часы в очередях за получением той или иной бумажки – можно просто подать заявление через сайт. Нельзя отрицать, что подобные изменения упрощают жизнь простого человека. И касаются эти удобства не только таких вещей как документы. Это касается целых отраслей промышленности.

В этой статье мы затронем тему RFID индефикации – технологии, которая получила широкое применение в десятках сфер производства и, что самое главное, которой пользуется каждый день практически каждый из вас.

Так что же такое RFID и с чем его едят?

RFID (Radio-frequency identification) в переводе с английского означает радиочастотную идентификацию. Иными словами, это способ опознания объектов, при котором радиосигналы записывают или считывают информацию, хранящуюся на RFID-метках (ещё их называют трансподерами).

RFID относится к беспроводной системе, состоящей из двух компонентов: метки и считывателя. Считыватель – это устройство, которое имеет одну или несколько антенн, которые излучают радиоволны и принимают сигналы обратно от RFID-метки.

Общая схема работы RFID

Общая схема работы RFID

RFID-метки могут хранить различную информацию от одного серийного номера до нескольких страниц данных. Считыватели могут быть мобильными (отсюда и название «транспондеры»), чтобы их можно было переносить в руке, или они могут быть установлены на столбе или над головой.

В принципе, RFID-транспондеры могут быть предоставлены практически во всех формах, материалах, размерах и цветах. Их конкретная конструкция зависит от того, как они используются. Общей чертой всех различных транспондеров RFID является то, что они состоят из двух компонентов. Внутри каждый транспондер RFID состоит как минимум из одного микрочипа и одной напечатанной, уложенной или вытравленной антенны. Чип и антенна (также называемая вставкой) очень чувствительны, что означает, что их устойчивость к механическим, термическим и химическим воздействиям ограничена. Следовательно, становится необходим специальный «пакет» этих электронных компонентов. Самая простая форма упаковки — это RFID-этикетка.

«Одночиповый» транспондер состоит из подложки, содержащей антенну и чип, краткое название которых — вкладка. Система транспондера состоит из считывающего устройства, программного обеспечения и прикладного процесса, включая соответствующую услугу.

Классификация RFID

По типу источника питания

Существует два основных типа транспондеров — активные и пассивные.

Активные RFID — транспондеры имеют собственную систему энергоснабжения, например встроенный аккумулятор, и могут передавать данные на большое расстояние (до 100 м).

Пассивные транспондеры RFID получают энергию для передачи данных только от электромагнитного поля устройства записи-считывания RFID.

Кроме того, существует промежуточный тип, представленный полуактивными или полупассивными транспондерами, которые, с одной стороны, имеют собственный источник питания, но сами не функционируют как отправители. Электропитание транспондера RFID осуществляется через батарею, и, следовательно, нет необходимости полагаться на характеристики электромагнитного поля, но ответ создается посредством модуляции поля, которое не усиливает поле дальше.

По типу используемой памяти

RO (Read Only) – в эти метки информация записывается лишь единожды. Их очень удобно использовать для единоразовой идентификации.

WORM (Write Once Read Many) – содержит блок однократно записываемой памяти, которую можно считать много раз.

RW (Read and Write) – транспондеры, в которые можно записывать и считывать данные много раз.

По рабочей частоте

Низкочастотные (LF = 125 кГц)

Эта свободно доступная полоса частот характеризуется низкой скоростью передачи и короткими расстояниями передачи. В большинстве случаев создание этих систем дешево, легко в обращении и не требует регистрации, а также дополнительных сборов. Транспондеры RFID используют электромагнитные волны ближнего поля и получают энергию через индуктивную связь. Преимущество состоит в том, что транспондеры RFID в этой полосе частот относительно устойчивы к металлам или жидкостям, что делает их подходящими для использования при идентификации животных и людей. Для этих транспондеров свойственны коллизии – ошибки одномоментной передачи информации в среде с коллективным доступом.

Высокочастотные (HF 13,56 МГц)

Высокочастотные транспондеры универсальны и отличаются высокими скоростями передачи и высокими тактовыми частотами. Соответствующие транспондеры RFIDработают на частоте 13,56 МГц. Это короткая длина волны, требующая всего нескольких витков антенны. Следовательно, антенны RFID могут быть меньше и проще. Это позволяет использовать вытравленные или печатные антенны, что, в свою очередь, означает, что вкладки (= чип + антенна) могут изготавливаться в виде непрерывной катушки, и это значительно упрощает последующую обработку до тех пор, пока большое количество продукции в ролевой -ролевой процесс.

Сверхвысокочастотные (UHF 860 — 950 МГц, разделенная на частичные полосы)

Эти системы действительно имеют очень высокие скорости и дальности передачи. Из-за более коротких длин волн в качестве антенны вместо катушки достаточно диполя, для лучевой оптики достаточно расширения поля, что, в свою очередь, обеспечивает целевое распространение. Кроме того, UHF-транспондеры в основном производятся в виде фольги, что полезно для обработки больших объемов в ролевом процессе.

Также стоит упомянуть в этом контексте, что некоторые полосы частот в микроволновом спектре еще не стали доступными с финансовой точки зрения рентабельности, и, более того, они могут подпадать под действие местных разрешительных ограничений.

Применение

Пожалуй, рассмотрим применение в сфере медицины.

Системы RFID используют радиоволны на нескольких разных частотах для передачи данных. В медицинских учреждениях и больницах технологии RFID включают следующие приложения:

Обнаружение выхода из постели и обнаружение падения

Обеспечение того, чтобы пациенты получали правильные лекарства и медицинские устройства.

Предотвращение распространения поддельных лекарств и медицинских изделий.

Наблюдение за пациентами

Предоставление данных для систем электронных медицинских карт

FDA не известно о каких-либо побочных эффектах, связанных с RFID. Однако есть опасения по поводу потенциальной опасности электромагнитных помех (EMI) для электронных медицинских устройств от радиочастотных передатчиков, таких как RFID. Электромагнитные помехи — это ухудшение характеристик оборудования или систем (например, медицинских устройств), вызванное электромагнитными помехами.

И это использование только в одной сфере!

Так же технология применяется в:

Транспортной и складской логистике, предотвращение краж в торговых залах;

Системах контроля и управления доступом

Системы управления багажом

Преимущества использования технологии

Каждая микросхема имеет уникальный серийный номер, который назначается только один раз во всем мире (UID или TID). Это гарантирует четкую назначаемость в рамках отдельного продукта и обеспечивает индивидуализацию всего диапазона продукта.

Перезаписываемая память данных в микросхеме. Информация на носителе данных RFID может быть изменена, стерта или дополнена в любое время. Данные о продукте, обслуживании, производстве или обслуживании доступны непосредственно на продукте. (Преимущество перед обычными штрих-кодами)

Связь, которая осуществляется между носителем данных RFID и системой записи-считывания без требования визуального контакта, обеспечивает устойчивость к грязи за счет размещения в защищенных местах, а также для невидимой интеграции в существующие продукты и упрощения процесса. оптимизация.

Высокая скорость передачи данных составляет 100% первого прохода в случае штрих-кодов.

Возможность одновременного считывания нескольких носителей данных RFID за один рабочий этап (массовый захват), что ускоряет процессы.

Всё ли так хорошо?

Использование RFID вызвало серьезные споры, и некоторые защитники конфиденциальности потребителей инициировали бойкот продукции. Эксперты по защите прав потребителей Кэтрин Альбрехт и Лиз Макинтайр, два выдающихся критика, назвали две основные проблемы конфиденциальности в отношении RFID, которые заключаются в следующем:

Поскольку владелец предмета может не знать о наличии метки RFID, а метку можно прочитать на расстоянии без ведома человека, конфиденциальные данные могут быть получены без согласия.

Если отмеченный товар оплачивается кредитной картой или в сочетании с использованием карты лояльности, то можно будет косвенно установить личность покупателя, прочитав глобальный уникальный идентификатор этого товара, содержащийся в теге RFID. Это возможно, если человек, наблюдающий, также имел доступ к данным карты лояльности и кредитной карты, а человек с оборудованием знает, где будет покупатель.

Цели безопасности

При обсуждении свойств безопасности различных конструкций RFID полезно сформулировать четкие цели безопасности.

Метки (в дальнейшем «теги») не должны ставить под угрозу конфиденциальность их владельцев.

Информация не должна передаваться неавторизованным читателям и не должна дать возможность создания долгосрочных ассоциаций отслеживания между тегами и их владельцами.

Чтобы предотвратить отслеживание, владельцы должны иметь возможность обнаруживать и отключать любые теги, которые они несут.

Общедоступные выходные данные тегов должны быть случайными или легко изменяемыми, чтобы избежать долгосрочных ассоциаций между тегами и держателями.

Содержимое частного тега должно быть защищено контролем доступа и, если предполагается, что каналы опроса небезопасны, шифрованием.

И теги, и читатели должны доверять друг другу. Спуфинг любой из сторон должен быть практически невозможным.

Помимо обеспечения механизма контроля доступа, взаимная аутентификация между тегами и считывателями также обеспечивает определенную степень доверия. Атаки с перехватом сеанса и повторным воспроизведением также вызывают беспокойство. Индукция отказа или прерывание питания не должны нарушать протоколы или открывать окна для попыток взлома. И теги, и считыватели должны быть устойчивы к повторному воспроизведению или атакам типа «злоумышленник в середине».

Способы обезопасить использование технологии RFID

Помня об этих целях безопасности, рассмотрим свойства безопасности пассивных заводских тегов, доступных только для чтения. Каждый тег содержит уникальный идентификатор. Хотя нет ничего более «беспорядочного», чем оптический штрих-код, автоматический мониторинг RF-меток возможен. Этот базовый паттерн явно нарушает цель конфиденциальности, поскольку отслеживание владельцев тегов и чтение содержимого тегов возможно, если тег правильно представлен в поле запроса читателя. Ни метки, ни считыватели не аутентифицируются — следовательно, не существует и понятия доверия.

Предположим, что для устранения этих недостатков мы применяем политику удаления уникальных серийных номеров в точках продажи. Бирки, хранимые потребителями, по-прежнему будут содержать информацию о коде продукта, но не уникальные идентификационные номера. К сожалению, отслеживание все еще возможно путем связывания «совокупностей» определенных типов тегов с идентификаторами держателя. Например, уникальная склонность к обуви Gucci с RFID-меткой, часам Rolex и сигарам Cohiba может выдать вашу анонимность. Более того, этот паттерн по-прежнему не предлагает механизма доверия.

Обеспечение заявленных целей безопасности требует реализации контроля доступа и аутентификации. Криптография с открытым ключом предлагает решение. В каждый тег могут быть встроены определенный (тип) открытый ключ считывателя и уникальный закрытый ключ. Во время опроса метки и считыватели могут взаимно аутентифицировать друг друга с помощью этих ключей, используя хорошо понятные протоколы. Чтобы предотвратить подслушивание в зоне опроса, теги могут шифровать свое содержимое, используя случайный одноразовый номер, чтобы предотвратить отслеживание. К сожалению, поддержка надежной криптографии с открытым ключом выходит за рамки ресурсов недорогих (0,05–0,10 долл. США) тегов, хотя существуют решения для более дорогих тегов.

Симметричная аутентификация сообщений требует, чтобы каждый тег имел уникальный ключ для считывателя или чтобы ключ был совместно использован пакетом тегов. Для поддержки уникального ключа для каждого тега необходимы сложные накладные расходы на управление ключами. Если ключи должны быть общими, теги должны быть устойчивы к физическим атакам, описанным в; в противном случае компрометация одного эффективного тега ставит под угрозу всю партию. Внедрение защищенной памяти на недорогой бирке с числом логических вентилей, исчисляемым сотнями, является сложной задачей, особенно в свете сложности защиты памяти на смарт-картах с относительно большим количеством ресурсов. Даже поддержка надежного симметричного шифрования является проблемой в краткосрочной перспективе.

Рассматривая краткосрочные ограничения на ресурсы недорогих тегов, мы обсуждаем простую схему безопасности RFID, основанную на односторонней хэш-функции. На практике будет достаточно аппаратно-оптимизированной криптографической хеш-функции, если предположить, что она может быть реализована с затратой значительно меньших ресурсами, чем симметричное шифрование. В этой схеме каждый тег с поддержкой хеширования содержит часть памяти, зарезервированную для «мета-идентификатора», и работает либо в разблокированном, либо в заблокированном состоянии. В разблокированном состоянии все функции и память метки доступны для всех в зоне опроса.

Чтобы заблокировать тег, владелец вычисляет хеш-значение случайного ключа и отправляет его в тег как значение блокировки, то есть lock = hash (key). В свою очередь, тег сохраняет значение блокировки в области памяти мета-идентификатора и переходит в заблокированное состояние. Пока тег заблокирован, он отвечает на все запросы текущим значением мета-идентификатора и ограничивает все остальные функции. Чтобы разблокировать тег, владелец отправляет тегу исходное значение ключа. Затем тег хеширует это значение и сравнивает его с блокировкой, хранящейся под мета-идентификатором. Если значения совпадают, тег разблокируется.

Каждый тег всегда отвечает на запросы в той или иной форме и, таким образом, всегда раскрывает свое существование. Теги будут оснащены физическим механизмом самоуничтожения и будут разблокированы только во время связи с авторизованным читателем. В случае потери питания или прерывания передачи теги вернутся в заблокированное состояние по умолчанию. Доверенный канал может быть установлен для функций управления, таких как управление ключами, отключение тегов или даже запись тегов, требуя физического контакта между устройством управления и тегом. Требование физического контакта для критически важных функций помогает защититься от саботажа беспроводной сети или атак типа «отказ в обслуживании».

Механизм блокировки на основе хеша решает большинство наших проблем с конфиденциальностью. Контроль доступа к содержимому тегов ограничен держателями ключей.

Хотя этот вариант проекта частично удовлетворяет некоторым желаемым свойствам безопасности, более безопасные реализации требуют нескольких разработок. Одним из ключевых направлений исследований является дальнейшее развитие и внедрение недорогих криптографических примитивов. К ним относятся хэш-функции, генераторы случайных чисел, а также криптографические функции с симметричным и открытым ключом. Недорогое аппаратное обеспечение должно минимизировать площадь схемы и энергопотребление без отрицательного влияния на время вычислений. Безопасность RFID может выиграть как от улучшений существующих систем, так и от новых разработок. Более дорогие устройства RFID уже предлагают симметричное шифрование и алгоритмы с открытым ключом. Адаптация этих алгоритмов для недорогих пассивных устройств RFID должна стать реальностью в считанные годы.

Протоколы, использующие эти криптографические примитивы, должны быть устойчивыми к прерываниям питания и возникновению неисправностей. По сравнению со смарт-картами, RFID-метки обладают большей уязвимостью к этим типам атак. Протоколы должны учитывать нарушение беспроводных каналов или попытки перехвата связи. Сами теги должны плавно восстанавливаться после потери питания или прерывания связи без ущерба для безопасности. Постоянное совершенствование технологий неуклонно стирает границы между устройствами RFID, смарт-картами и повсеместными компьютерами. Исследования, направленные на повышение безопасности устройств RFID, помогут проложить путь к универсальной, безопасной повсеместно распространенной вычислительной системе. Все разработки, связанные с RFID-метками и другими встроенными системами, могут способствовать созданию надежной и безопасной инфраструктуры, предлагающей множество интересных потенциальных приложений.

Работа с Arduino и RFID MFRC522

Технология RFID (Радиочастотная идентификация) позволяет при помощи радиосигнала быстро и безопасно передавать данные между специальными “считывателями” и “метками” – карточками, брелоками, браслетами и т.д. на небольшом расстоянии.
Одно из широко известных развитий технологии – NFC, при помощи которого можно оплачивать покупки или подключать устройства бесконтактно. Нам же доступны менее сложные, но не менее полезные и интересные применения, о которых будет сказано ниже.

Применение

Комплект RFID модуль + метки может быть использован:

  • Как часть самодельных охранных систем
  • При создании простых электронных замков (метка является ключом)
  • В системах контроля доступа (однократный, многократный пропуск)
  • В качестве электронного “кошелька” внутри собственного предприятия
  • В роли интерактивного предмета в квестах и т.д.

Железо

RFID работает в нескольких частотных диапазонах, в свою очередь RFID модули и метки можно поделить на низкочастотные “LF” (125 кгц) и высокочастотные “HF” (13,56 MHz), существуют так же и ультравысокочастотные “UHF”, но они нас не интересуют.

Наиболее распространенные RFID Arduino-модули основаны на микросхеме MFRC522, работающей с HF метками 13,56 МГц. Поиск модулей и библиотек производится по этому же имени.

Существует два типа модулей MFRC522, с которыми вы скорее всего столкнетесь:

Отвечая на главный вопрос – не смотря на значительную разницу в размере, ощутимой разницы в работе модулей нет, можно брать любой. В комплекте к модулю как правило уже идет несколько меток.

Библиотеки

Для работы с модулем MFRC522 понадобится библиотека https://github.com/miguelbalboa/rfid. Библиотека тяжелая, индусская и имеет немало проблем, но достойных альтернатив просто нет – несколько других “облегченных” библиотек значительно уступают в функциональности и удобстве использования.

Подключение

Модуль MFRC522 подключается по аппаратному интерфейсу SPI, выбранная библиотека предоставляет следующую таблицу подключения к Arduino:

  • Контакты модуля RST и SDA (SS) указываются в скетче – можно использовать любые.
  • У Leonardo подключение производится к 6-ти контактному ICSP разъему программатора.

Пример подключения модуля к Arduino Nano:

О RFID метках

Прежде всего самая сложная для понимания, но и самая важная часть – работа с RFID метками. В комплекте с модулем идут пара меток MIFARE Classic 1K, как понятно из названия – на 1 килобайт (на самом деле меньше, но об этом позже).

Чтобы изучить организацию памяти такой метки, можно воспользоваться примером из библиотеки, открыв Примеры > MFRC522 > DumpInfo. Однако для вашего удобства я подготовил вот такую карту:

Обратите внимание – память организована в виде 16-ти секторов, по 4 блока каждый. Итого – 64 блока по 16 Байт, как раз набегает 1 Килобайт. Деление по секторам носит скорее условный характер, так как адресация в памяти будет производиться по блокам.

Все сектора кроме нулевого имеют одинаковое строение – 3 блока данных + 1 блок безопасности, так называемый sector trailer. Каждый из этих блоков может быть прочитан и перезаписан (при соблюдении условий), исключение составляет нулевой блок (сектор 0).

Нулевой блок хранит в себе уникальный ID “UID”, тип метки и прочую информацию, записанную заводом-изготовителем. Нулевой сектор не может быть перезаписан, если речь идет о “классических” метках, к которым относятся комплектные с модулем. Таким образом UID позволяет отличить две с виду идентичные метки. UID как правило состоит из 4х байт, свободно считываемых из метки. Важно: китайский рынок может предложить вам “перезаписываемые” метки, UID в которых можно менять, путем перезаписи нулевого блока. Если в вашей системе используется только UID – учтите возможность очень простого копирования UID в метки-болванки (в том числе злоумышленниками).

Блоком безопасности является каждый 4й блок, каждый блок безопасности отвечает за свой сектор (предыдущие 3 блока данных) – он хранит 2 ключа доступа по 6 байт (ключи A и B), а также специальные “Access bits” (Биты доступа), грубо говоря настройки доступа. Ключи A и B могут быть использованы для аутентификации и последующего доступа к блокам данных в пределах сектора. То есть да, для того чтобы получить доступ к любому из блоков внутри сектора необходимо “разблокировать” этот сектор, при помощи одного из ключей.

Поэтому будьте уверены, если производитель позаботился о смене секретных ключей в своих RFID метках – скопировать или как-нибудь изменить содержимое штатными средствами вы уже не сможете, а ведь так хотелось? Идем дальше.

Биты доступа позволяют настроить условия доступа и возможности работы каждого блока в отдельности (каждого блока данных + блока безопасности). Наилучшим инструментом в работе с метками MIFARE Classic 1K является вот этот онлайн-калькулятор http://calc.gmss.ru/Mifare1k/. Если хотите разобраться чуть глубже – обязательно полистайте и опробуйте.

Я же хочу сэкономить ваше время, поэтому сразу уточню, что наиболее удачным решением в большинстве ситуаций будет оставить блоки данных в состоянии transport configuration, то есть по умолчанию.

blank

Однако есть возможность настроить блоки на некоторые интересные сценарии, например защитить от записи (конфигурация 1-0-1 или 0-1-0). Или же сделать так, что прочитать блок можно при помощи как ключа A, так и ключа B, а вот для записи обязательно понадобится ключ B (конфигурация 1-0-0), в таком случае можно ограничить права некоторого оборудования и сделать систему безопаснее. И да, конфигурация 1-1-1 превращает блок в кирпич (обратимо).

В примерах ниже мы будем использовать конфигурацию блоков данных по умолчанию (0-0-0) и следующие принципы:

  • Создаем ключ B, значение которого знаем только мы, длина ключа – 6 Байт.
  • Ключ A будет полностью аналогичен ключу B, однако он не будет использоваться.
  • Биты доступа для блоков безопасности будем использовать в конфигурации 0-1-1

blank

Таким образом для всех операций с меткой применяется только ключ B, который невозможно считать из метки (впрочем, как и ключ A), даже если сектор предварительно разблокирован. Если хотите намертво зашить ключи A и B в блок безопасности – подойдет конфигурация 1-0-1, поменять будет уже невозможно. Ну а последняя 1-1-1 конфигурация блока безопасности заблокирует еще и настройки доступа к блокам данных!

В итоге 3 байта настроек доступа приняли следующие значения: 0x7F 0x07 0x88, байт USER может быть любой.

blank

Начало работы

Работу с RFID модулем удобнее всего производить в конце главного цикла программы, сейчас поймете почему. Для отслеживания поднесенной метки библиотека предлагает использовать пару методов с замысловатыми названиями:

Если поднесенная метка успешно считана – программа идет дальше, в противном случае происходит возврат в начало главного цикла, а весь блок кода связанный с RFID пропускается.

В итоге наш скетч имеет следующую структуру:

Теперь давайте идти по порядку, осваивая основные методы для работы с RFID.

Чтение UID

Самое простое, что можно сделать с RFID меткой – прочитать UID, в некоторых системах уже этого функционала вполне достаточно, например – в простых электронных замках. Как уже сказано ранее, некоторые метки позволяют сменить UID, в свою очередь запретить считать UID из ваших меток не получится – учтите это при разработке.

Так или иначе пример чтения UID и вывод в порт приведен ниже:

Чтение блока

Если чтением UID ваш интерес не ограничился – давайте узнаем, как читать блок данных из метки. Прежде чем что-либо читать или писать, необходимо аутентифицировать (разблокировать) сектор, в котором находится интересующий нас блок.

В примерах ниже будем работать с блоком под номером 6 (сектор 1), за первый сектор и соответственно блоки 4, 5 и 6 отвечает блок безопасности под номером 7. То есть запомнили – блок данных 6, блок безопасности 7.

Аутентификацию сектора производит метод PCD_Authenticate() , по умолчанию все манипуляции с меткой возможны при помощи ключа A, а сам процесс аутентификации выглядит следующим образом:

Обратите внимание на …KEY_A в первом аргументе и цифру 7 вторым аргументом – это и есть номер блока безопасности. Отслеживать статус не обязательно, но крайне желательно.

После успешной аутентификации можно свободно манипулировать разблокированным сектором, в нашем случае будем читать содержимое методом MIFARE_Read() . Читать нужно в байтовый массив, размером 18 (!) байт, чтение происходит из блока 6 (первый аргумент) и выглядит так:

Важно: Не смотря на то, что блоки имеют размер 16 байт, буферный массив создается на 18 байт, а количество байт на чтение передается именно в виде указателя на переменную. В противном случае чтение закончится ошибкой, примите это как факт.

В случае успешного чтения, выведем содержимое блока 6 в монитор порта, все как обычно:

А завершать работу с меткой нужно при помощи еще двух замысловатых методов:

В итоге полный скетч для чтения блока 6 из новой метки со стандартными ключами выглядит так:

После поднесения метки в мониторе порта должны отобразиться 16 байт – содержимое прочитанного блока.

Запись блока

При записи все 16 байт записываются в блок единовременно, для чего должен быть заранее подготовлен байтовый массив на 16 Байт, например такой:

Как в случае и с чтением, сектор в котором находится нужный блок 6 нужно предварительно аутентифицировать, об этом уже сказано выше, так что переходим непосредственно к записи. Запись производится методом MIFARE_Write() , в отличии от MIFARE_Read() тут все несколько проще – указываем записываемый блок, массив и число 16 (количество байт на запись):

Итоговый скетч записи массива в блок 6 выглядит так:

После поднесения метки в мониторе порта должно отобразиться сообщение “Write OK“.

К слову ничто не мешает нам объеденить запись и чтение в одном скетче:

Смена ключей безопасности и настройка блоков

Если вы хотите не только уметь читать и писать данные в метки, но и защить хранящуюся там информацию от стороннего вмешательства – необходимо сменить ключи доступа как минимум от тех секторов, в которых вы собираетесь хранить данные, однако в идеале установить новые ключи для всех секторов, чтобы усложнить задачу потенциальным взломащикам.

Для того, чтобы изменить ключи доступа к сектору, необходимо перезаписать блок безопасности, ответственный за данный сектор. В наших примерах фигурировал блок данных под номером 6 и соответственно блок безопасности под номером 7. Задача по смене ключей безопасности сводится к следующим шагам:

  1. Создать байтовый массив на 16 ячеек, включающий:
    • Ключ A
    • Байты настроек доступа
    • Ключ B
  2. Провести аутентификацию выбранного сектора, пока что используя стандартный ключ 0xFFFFFFFFFFFF
  3. Произвести запись подготовленного массива в блок безопасности, в точности так же, как в случае с обычным блоком.

После этого ключи безопасности будут изменены, а мы сможем безопасно хранить данные в одном или нескольких блоках выбранного сектора! Сейчас покажу по шагам.

  1. Для создания образа блока безопасности (содержимого массива) придется вернуться вверх по тексту и вспомнить, что при выбранных нами настройках сектора, байты доступа получили значения 0x7F 0x07 0x88. Осталось придумать ключи доступа, имеющие длину 6 байт. Я буду использовать ключ 0xABABABABABAB, данный ключ не является безопасным и подходит исключительно для демонстрации! Так же напоминаю, что ключи A и B будут идентичны, однако использоваться будет только ключ B.

blank

    1 После того, как мы определились с настройками сектора (“Access Bits“) и ключами безопасности – создаем нужный байтовый массив:

Итоговый скетч записи новых ключей и настроек доступа:

Не забываем сменить “наполнение” ключа в void setup()<> :

Так же напоминаю, что отныне для сектора 1 (блоков 4…7) мы используем только ключ B, соответственно и команда аутентификации отныне выглядит чуть иначе:

Работа с защищенным сектором

Теперь, после того как мы сменили ключи безопасности от сектора 1, в качестве примера будем выводить количество поднесений метки к считывателю в последовательный порт. Количество поднесений хранится в нулевом байте защищенного блока 6 и увеличивается при каждом поднесении:

Читать:
Телевизор cameron 3707 как прозвонить плату

Количество поднесений ограничено 255, потому что используется лишь 1 Байт, но для примера это и не важно.

Инкремент и декремент

Наболее продвинутые могут обратить внимание на то, что пример выше не имеет смысла, поскольку метки уже имеют функционал инкремента и декремента, позволяющего использовать защищенный блок в качестве электронного кошелька.

Для реализации данного функционала библиотека имеет методы MIFARE_Increment() и MIFARE_Decrement() , однако независимо от установленных байтов доступа данный функционал не показал работоспособность на десятке меток и нескольких модулях. Возможно всему виной поддельные чипы MFRC522, установленные в модули. В любом случае перечисленные методы возвращают ошибку при поднесении метки, а потому и пример для работы не привожу.

Особенности и костыли

  • Периодическая перезагрузка и повторная инициализация. В главный цикл программы добавляется таймер на millis() с периодом 500…3000 мс, внутри которого производится принудительный сброс и инициализация модуля. Данный код располагается в начале главного цикла программы. Данный костыль является наиболее эффективным в борьбе с зависанием модуля.
  • Принудительная установка усиления и перезагрузка антенны. Полезность сомнительная, однако по некоторым заявлениям библиотека не всегда корректно настраивает антенну после инициализации модуля. Решается добавлением соответствующих строк помимо инициализации модуля в функции void setup()<> :
  • Повторное чтение или второй шанс. В примерах выше мы использовали следующую конструкцию для отслеживания поднесенной метки:

Фокус заключается в добавлении еще одной попытке чтения метки, в случае неудачи. Таким образом наша конструкция принимает следующий вид:

Наиболее эффективным и важным является первый костыль, располагайте его перед работой с модулем, желательно в начале цикла void loop()<> , но ни в коем случае не в прерывании таймера. Однако несмотря на то, что приведенные выше хитрости действительно работают и многократно повышают стабильность работы RFID модуля – в случае с электронными замками и прочими системами контроля доступа рекомендуется иметь резервные способы входа, помимо RFID.

RFID. Часть 1. Ридер.

Изучать любую технологию удобнее, когда у тебя есть фирменное оборудование, а не самодельный хлам. Ибо, когда ты не до конца понимаешь, как и что должно работать очень сложно отлаживать самоделки. А готовое работающее устройство очень помогает в освоении новой технологии.

Хммм… к чему это я.
Orcinus Orca, отправляя мне пару карточек EM-Marine, положил в посылку сломаный, по его мнению, ридер… Ага, как-же, «сломаный»! 🙂
Ридер оказался живее всех живых *, и теперь у меня целый «RFID Starter’s kit»: считыватель и две карточки (свой-чужой).

* Вообще, есть такая тенденция. Мне приносят какой-нибудь девайс со словами "%device% не работает, вот, может тебе на запчасти пригодится..". Перед тем, как разобрать девайс на запчасти (или выкинуть нах, ибо хлам) я пытаюсь его включить. И, о чудо! В подавляющем большинстве случаев он включается. И даже более того — работает! 🙂

На радостях от того, что ридер работает, первый пост решил написать про него. Из полезной инфы тут можно найти описание протокола wiegand и пример на МикроПаскале по работе с ним. И еще кучу флуда про ридеры вообще и EM-02 в частности.

Первое знакомство.

В коробке лежали две карточки и ридер EM-02.
Ридер оказался тяжелее, чем казалось на первый взгляд. Вскоре выяснилось — почему: внутри все было залито эпоксидкой.
Все видели букашку, застывшую в янтаре? Вот и он выглядел примерно так:


Крупнее.

Сзади торчал огрызок восьмижильного кабеля.
Из скудной документации на ридер я выяснил распиновку:

Тут всплывает не то, что-бы недостаток, но отсутствие удобной фичи. Незнаю, есть-ли она у других ридеров, но если нет, то её стоило-бы придумать :). Это выход +5В с преобразователя. Дело в том, что ридер питается от 12В и в нем стоит преобразователь на 5В (некое подобие 7805, а может и она). И было-бы круто сделать выход с этого преобразователя для питания, к примеру, простенького контроллера. Чтобы не плодить стабилизаторы. В конце-концов, даже на FT232 такая штука есть :).

* Кстати, из правила «красный-питание, черный-земля», оказывается, есть исключения. К примеру, недавно разбирал ps\2 клавиатуру — в ней на питание шли желтый и коричневый, а для обмена данными — красный и черный. Вот так.

После включения ридер непрерывно «фонит» в окружающую среду, пытаясь обнаружить карточку (к слову, дальнось у него около 10 см). Как только он прочитает её код — моргает зеленым светодиодом и коротко пикает. В этот момент по протоколу Wiegand выдается код карточки. Причем на моем ридере Wiegand может работать в двух форматах — 26 и 40 бит. Wiegand-40 не содержит данных о четности, поэтому проще в обращении, чем wiegand-26.

По ходу дела выясняется еще один недостаток этого ридера — отсутствие режима энергосбережения. То-есть ему нельзя сказать «заткнись, и не трать электричество». У других ридеров такой режим есть. Хотя, можно просто отрубать питание ридеру, когда требуется экономить энергию.
И тут-же, недостаток №3: ридер нельзя отучить от пищания и мигания светодиодом при поднесении карточки. Т.е. если мы, например, хотим сделать незаментый замок, который должен молчать при поднесении чужой карточки, то ридер придется покалечить 🙂

Помимо недостатков у ридера есть удобнейшая фича — порт 1-wire. Он полностью прикидывается таблеткой iButton (aka TouchMemory, aka DS1990A). Пока карточка находится в зоне считывания, он отвечает на сигнал RESET и выдает код карточки по команде 0x33 (READ ROM).

Надо отметить, что на всех интерфейсах есть нужная обвязка. Подтяжка 4.7k на 1-wire и по 10к на D1 и D0 для Wiegand.

На мой взгляд, использовать wiegand удобнее, чем 1-wire. Через Виганд ридер сам выдаст код, как только карточка войдет в зону считывания, а 1-wire нужно постоянно опрашивать. С другой стороны, при помощи 1-wire можно следить за тем, чтобы карточка находилась около ридера.

Тест-драйв.

Еще до того, как я начал разбираться с протоколами, провел «тест на дальность». Смотрел, с какоко расстояния (приблизительно) считыватель чует карточку. При этом я мешал сигналу разнобразными препядствиями. Вот, что из этого получилось:
(Условия теста: Питание = 12.5V, источников ЭМ помех по близости нету, крышка ридера снята)
Без препядствий — 9 см.*
Между ридером и карточкой лежит книжка (толщиной примерно 3см) — тоже около 9см.
Между ридером и карточкой стальная крышка от коробочки (размером как сам ридер) — вообще не ловит карточку. Даже вплотную.
Та-же байда, но уже позади ридера (как-будто ридер закреплен на металлической поверхности) — 5-7 см.
Всякие мелкие железные предметы, которые не могут полностью накрыть ридер (взял, что под руку попадется — ножницы) — 9 — 10 см.
Провод 220 Вольт, от розетки к БП ридера (между ридером и картой) — тоже никак не повлиял на дальность: 9-10 см.

* Если спозиционировать катрочку точно над ридером — можно добиться дальности аж в 15 см!
При разработке какого-нибудь замка на бесконтактных картах или другой подобной приблуды, может возникнуть желание спрятать ридер от посторонних глаз. Например, в дверь или стену. Вот для таких случаев я и провел свой тест на дальность. Из него можно сделать один вывод: железкой ридер не накрывать! Все остальное можно, в пределах разумного 🙂

Йа таблетко!

После проверки на дальность я пристал к ридеру по 1-wire. Для этого использовал свой отладчик/сниффер. Кстати, наличие в доме подобного устройства очень мотивирует совершать эксперименты и другие глупые вещи 🙂 Ведь не нужно каждый раз писать программу, чтобы пообщаться с новым девайсом: весь функционал для работы с i2c и 1-wire уже реализован, осталось его только заюзать.
Заработало все с первого раза. Ридер выдал мне код карточки:

Собственно, перед вами копипаста отчета отладчика. «RESET + PRESENSE» значит, что мы дернули линию (RESET), на что ридер ответил тем-же (PRESENSE). Дальше мы передали команду на чтение (0x33) и прочитали 8 байт: Family code, 48 бит кода, и CRC. Так-как считыватель полностью косит под таблетку iButton, family code у него тоже «таблеточный» и CRC считается так-же.

Кроме команды 0x33, ридер живо реагирует на команду 0x0F (тоже самое, что и 0x33 — READ ROM). Еще хотел посмотреть как он дружит с процедурой Search ROM, но передумал ввиду того, что сам эту процедуру не очень понимаю. Да и не нужна она 🙂

Простой протокол со странным названием. *

Наигравшись с 1-wire, решил заюзать Wiegand. Во первых, потому, что он есть, а во-вторых не у каждого ридера может быть выход на 1-wire. А wiegand это стандарт для ридеров, со времен магнитных карт.
Хорошее описание протокола можно стащить отсюда. Далее следует вольный пересказ сего документа.

Протокол прост, как каменный топор. Две линии: D1 и D0. Активный уровень — низкий. Данные передаются кототкими импульсами (20-200 мкс). Паузы между импульсами примерно 2мс. Импульс на линии D0 значит, что передался 0. Импульс на D1 — передалась единичка.

Завершение передачи детектится по таймауту. Обычно это 250-500 мс. Т.е. если пол секунды не было ни одного импульса — считаем, что все приняли.

Временные характеристики протокола довольно сильно варьируются в зависимости от того, что ударило в голову изготовителю ридера.
Так-же, возможно, на некоторых ридерах не будет интегрированого обвеса (pull-up резисторы) для интерфейсов.

Вот так передача данных выглядит на схеме, выдраной из документации на Wiegand (которая еще более скудна, чем документация на ридер):

Все, пересказ кончился. Быстро, да? 🙂

* Название протокола Wiegand (произносится «Виганд») видимо произошло от «Карты Виганда» (Wiegand Card). Это пластиковая карта, в которую в хаотичном порядке впресованы кусочки магнитного материала. Они создают уникальный код карты. Работа такой карты основана на эффекте Виганда (Wiegand effect), который был открыт американским инженером Джоном Вигандом. Вот такие плюшки. Семь «вигандов» на три предложения 🙂

Разведка боем.

Для тех, у кого завалялся подобный ридер, я заготовил немного материалов для размышления и изучения.
Во-первых это программа на МикроПаскале, которая принимает данные от считывателя по протоколу Wiegand и выдает в комп по UART.
Формат на выходе таков:
0x38 — просто сигнал о том, что дальше пойдут данные.
Количество данных, принятых от ридера (в битах).
Массив из 6 байт — код карточки. Это данные с ридера в сыром виде. Т.е. биты четности присутствуют. Старший бит кода (тот, который ридер выдал первым) соответствует старшему биту последнего байта массива.

Исходник состоит из 2х файлов. В первом (weigand_tst *) сам код программы, а во втором (weigand_unit) — процедуры для работы с wiegand.
Точнее, процедура там одна: wd_interrupt. В программе она вызывается из обработчика PCINT, когда изменяется уровень на линии D0 или D1 (это не названия пинов МК, а линии wiegand). В принципе, если МК нечем заняться, можно вызывать эту функцию по таймеру.
Еще нужно организовать тайм-аут. Для этого нужен таймер (не важно-программный или аппаратный), с периодом = 0.5 сек. Или около того.
У меня в программе используется TIMER\COUNTER 1 с предделителем = 1024. (надо заметить, что частота МК в моем случае = 18 МГц).
В процедуре wd_interrupt таймер сбрасывается:

А при его переполнении можно считать, что данные готовы к употреблению. У меня в прерывании TIMER1_OVF устанавливается флаг, по которому программа в основном цикле узнаёт, что пора отправлять данные в комп.
Это во-первых. А во-вторых была программка на делфи, которая принимала данные и выводила на экран код карточки, протокол (Wiegand-26 или 40) и т.д. «Была» потому-что я её случайно вынес 🙁 Но и терминалки хватает.

* Да, weigand. Это я дико ошибся, когда обзывал проект. А переименовать обратно его как-то лениво 🙂

Продолжение следует.

Правда, я еще не знаю, про что будет вторая часть.
Сейчас потихоньку собираю свой ридер. Если ничего ужасного не произойдет, второй пост будет про постройку ридера своими руками.
А может, какое-нибудь устройство на базе этого считывателя.
Потом попробую сделать эмулятор карточки.
В общем, изучение RFID будет интересным 🙂

Что такое RFID? Как это работает? Взаимодействие RFID модуля RC522 с Arduino

Давно прошли те времена, когда люди стояли и ждали в длинных кассовых очередях в продуктовом магазине. Но теперь, благодаря технологии радиочастотной идентификации (RFID, Radio Frequency IDentification), с помощью решений на базе RFID вы можете заполнить корзину и выйти прямо за дверь. Вам больше не придется ждать, пока кассир пробьет каждый товар в вашей корзине по отдельности. Вместо этого RFID метки, прикрепленные к предметам, будут связываться с RFID считывателем, который будет обнаруживать каждый товар в корзине и пробивать его практически мгновенно.

Что такое RFID? Как это работает? Взаимодействие RFID модуля RC522 с Arduino Что такое RFID? Как это работает? Взаимодействие RFID модуля RC522 с Arduino

Для большинства наших проектов на Arduino отличным выбором будет RFID модуль чтения/записи RF522. Он обладает низким энергопотреблением, низкой стоимостью, он довольно прочный, прост для взаимодействия и безумно популярен среди любителей.

Что такое технология RFID и как она работает?

RFID или система радиочастотной идентификации состоит из двух основных компонентов: транспондера или метки, прикрепленной к идентифицируемому объекту, и приемопередатчика, также известного как интеррогатор (interrogator) или считыватель.

Рисунок 1 Как работает технология RFID Рисунок 1 – Как работает технология RFID

Считыватель состоит из радиочастотного модуля и антенны, которая генерирует высокочастотное электромагнитное поле. Метка, напротив, обычно является пассивным устройством, то есть она не содержит батареи. Вместо этого она содержит микрочип, который хранит и обрабатывает информацию, и антенну для приема и передачи сигнала.

Для считывания информации, закодированной в метке, она размещается в непосредственной близости от считывателя (она не обязательно должна находиться в пределах прямой видимости от считывателя). Считыватель генерирует электромагнитное поле, которое заставляет электроны проходить через антенну метки и обеспечивать чип питанием.

Рисунок 2 – Как работает технология RFID

Обеспеченная питанием микросхема внутри метки затем отвечает отправкой своей сохраненной информации обратно считывателю в виде другого радиосигнала. Это называется обратным рассеянием (backscatter). Обратное рассеяние или изменение электромагнитной/радиочастотной волны обнаруживается и интерпретируется считывателем, который затем отправляет данные на компьютер или микроконтроллер.

Обзор аппаратного обеспечения — Модуль чтения / записи RF522 RFID

RFID модуль RC522 на основе микросхемы MFRC522 от NXP – это один из самых недорогих вариантов RFID, который вы можете найти в интернете менее чем за четыре доллара. Обычно он поставляется с картой RFID метки и брелоком с объемом памяти 1 КБ. И что лучше всего, он может записать метку, чтобы вы могли хранить в ней свое секретное сообщение.

Рисунок 3 Модуль RFID считывателя RC522 с меткой-картой и меткой-ключом Рисунок 3 – Модуль RFID считывателя RC522 с меткой-картой и меткой-ключом

Модуль считывателя RFID RC522 предназначен для создания электромагнитного поля на частоте 13,56 МГц, которое он использует для связи с метками RFID (стандартные метки ISO 14443A). Считыватель может взаимодействовать с микроконтроллером через 4-контактный последовательный периферийный интерфейс (SPI) с максимальной скоростью передачи данных 10 Мбит/с. Он также поддерживает связь по протоколам I2C и UART.

У модуля имеется вывод прерывания. Это удобно потому, что вместо того, чтобы постоянно опрашивать RFID модуль «есть ли карта в поле зрения?», модуль сам предупредит нас, когда метка окажется рядом.

Рабочее напряжение модуля составляет от 2,5 до 3,3 В, но хорошая новость заключается в том, что логические выводы допускают напряжение 5 вольт, поэтому мы можем легко подключить его к Arduino или любому микроконтроллеру с 5-вольтовой логикой без использования какого-либо преобразователя логических уровней.

Характеристики RFID модуля RC522

Частотный диапазон 13,56 МГц, ISM диапазон
Интерфейс SPI / I2C / UART
Рабочее напряжение питания от 2,5 В до 3,3 В
Максимальный рабочий ток 13-26 мА
Минимальный ток (отключение питания) 10 мкА
Логические входы допускают 5 В
Расстояние считывания 5 см

Распиновка RFID модуля RC522

Модуль RC522 имеет всего 8 контактов, соединяющих его с внешним миром.

Рисунок 4 Распиновка RFID модуля считывателя RC522 Рисунок 4 – Распиновка RFID модуля считывателя RC522

VCC обеспечивает питание для модуля. Напряжение питания может быть в диапазоне от 2,5 до 3,3 вольт. Вы можете подключить его к выходу 3.3V вашей платы Arduino. Помните, что подключение его к выводу 5V, скорее всего, выведет модуль из строя!

RST – вход для сброса и отключения питания. Когда на этот вывод подается низкий логический уровень, запускается жесткое отключение питания. Оно отключает всех внутренних потребителей тока, включая генератор, и входные выводы отключаются от внешних цепей. Во время нарастающего фронта на этом выводе модуль сбрасывается.

GND вывод земли, должен быть подключен к выводу GND на Arduino.

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

Вывод MISO / SCL / Tx действует либо как Master-In-Slave-Out (вход ведущего – выход ведомого) при включенном интерфейсе SPI, либо как последовательный тактовый сигнал при включенном интерфейсе I2C, либо как выход последовательных данных при включенном интерфейсе UART.

MOSI (Master Out Slave In) – вход SPI для модуля RC522.

SCK (Serial Clock) принимает тактовые импульсы, предоставляемые мастером на шине SPI, то есть Arduino.

Вывод SS / SDA / Rx действует либо как вход, когда включен интерфейс SPI, либо как линия последовательных данных, когда включен интерфейс I2C, либо как вход последовательных данных, когда включен интерфейс UART. Этот вывод обычно помечается заключением в квадрат, чтобы его можно было использовать в качестве опорной точки для идентификации других выводов.

Подключение RFID модуля RC522 к Arduino UNO

Теперь, когда мы знаем всё о модуле, мы можем подключить его к нашей плате Arduino!

Для начала подключите вывод VCC на модуле к выводу 3,3V на Arduino, а вывод GND — к земле Arduino. Вывод RST может быть подключен к любому цифровому выводу на Arduino. В нашем случае он подключен к цифровому выводу 5. Вывод IRQ не подключен, так как библиотека Arduino, которую мы собираемся использовать, не поддерживает его.

Теперь у нас остаются выводы, которые используются для связи по SPI. Поскольку модуль RC522 требует передачи больших данных, то наилучшая производительность будет обеспечена при использовании аппаратного модуля SPI в микроконтроллере. Использование выводов аппаратного SPI модуля намного быстрее, чем «дергание битов» в коде при взаимодействии через другой набор выводов.

Обратите внимание, что у плат Arduino выводы SPI различаются. Для плат Arduino, таких как UNO/Nano V3.0, это цифровые выводы 13 (SCK), 12 (MISO), 11 (MOSI) и 10 (SS).

Если у вас Arduino Mega, выводы отличаются! Вы должны использовать цифровые выводы 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS). В таблице ниже приведен список выводов для связи по SPI для разных плат Arduino.

Список выводов для связи по SPI для разных плат Arduino

MOSI MISO SCK CS
Arduino Uno 11 12 13 10
Arduino Nano 11 12 13 10
Arduino Mega 51 50 52 53

В случае если вы используете плату Arduino, отличную от приведенных выше, рекомендуется проверить официальную документацию Arduino, прежде чем продолжить.

Рисунок 5 Подключение модуля RFIDсчитывателя RC522 к Arduino UNO Рисунок 5 – Подключение модуля RFIDсчитывателя RC522 к Arduino UNO

Как только вы всё подключите, вы готовы к работе!

Код Arduino. Считывание RFID метки

Связь с RFID модулем RC522 – это сложная работа, но, к счастью для нас, есть библиотека MFRC522, которая упрощает чтение и запись в RFID меток. Спасибо Мигелю Бальбоа. Сначала скачайте библиотеку, посетив репозиторий GitHub, или просто нажмите на кнопку ниже, чтобы скачать архив:

Чтобы установить библиотеку, откройте Arduino IDE, перейдите в Скетч → Подключить библиотеку → Добавить .ZIP библиотеку и выберите только что загруженный файл rfid-master.zip .

После установки библиотеки откройте меню Файл → Примеры → MFRC522 → DumpInfo .

Рисунок 6 Скетч DumpInfo библиотеки MFRC522 Рисунок 6 – Скетч DumpInfo библиотеки MFRC522

Этот скетч не будет записывать какие-либо данные в метку. Он просто сообщает вам, удалось ли ему прочитать метку, и отображает некоторую информацию о ней. Это может быть очень полезно, прежде чем опробовать любую новую метку!

Перейдите к началу скетча и убедитесь, что RST_PIN инициализирован правильно, в нашем случае мы используем цифровой вывод 5, поэтому измените его на 5!

Рисунок 7 Изменение вывода RST в примере скетча Рисунок 7 – Изменение вывода RST в примере скетча

Хорошо, теперь загрузите скетч в Arduino и откройте монитор последовательного порта. Как только вы приблизите метку к модулю, вы, вероятно, получите что-то вроде следующего. Не двигайте метку, пока не отобразится вся информация.

Рисунок 8 Вывод скетча DumpInfo Рисунок 8 – Вывод скетча DumpInfo

Он отображает всю полезную информацию о метке, включая уникальный идентификатор (UID) метки, объем памяти и содержание всей памяти в 1 КБ.

Распределение памяти MIFARE Classic 1K

Память метки 1 КБ организована в 16 секторов (от 0 до 15). Каждый сектор дополнительно делится на 4 блока (блоки 0–3). Каждый блок может хранить 16 байтов данных (от 0 до 15).

Это говорит нам, что у нас точно

16 секторов x 4 блока x 16 байтов данных = 1024 байта = 1 КБ памяти

Весь 1 килобайт памяти с секторами, блоками и данными показан ниже.

Рисунок 9 Вывод скетча DumpInfo. Структура памяти Рисунок 9 – Вывод скетча DumpInfo. Структура памяти Рисунок 10 Трехмерное представление структуры памяти MIFARE Classic 1K Рисунок 10 – Трехмерное представление структуры памяти MIFARE Classic 1K

Блок 3 каждого сектора называется Sector Trailer и содержит информацию, называемую Access Bits (биты доступа), для предоставления доступа на чтение и запись к остальным блокам в секторе. Это означает, что в каждом секторе на самом деле для хранения данных доступны только 3 нижних блока (блоки 0, 1 и 2), а это означает, что в 64 байтовом секторе у нас есть только 48 байтов, доступных для нашего собственного использования.

Блок 0 сектора 0 также известен как Manufacturer Block / Manufacturer Data содержит данные производителя микросхемы и уникальный идентификатор (UID). Блок производителя выделен ниже красным цветом.

Рисунок 11 Вывод скетча DumpInfo. Блок производителя Рисунок 11 – Вывод скетча DumpInfo. Блок производителя

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

Код Arduino. Запись в RFID метку

Учитывая, что вы успешно прочитали RFID метку, пора перейти к следующему эксперименту. В следующем скетче будет показана простая демонстрация записи пользовательских данных в RFID метку. Протестируйте скетч, прежде чем мы начнем его подробный разбор.

Вывод в мониторе последовательного порта будет выглядеть следующим образом.

Рисунок 12 Вывод скетча записи RFID метки с помощью RC522 Рисунок 12 – Вывод скетча записи RFID метки с помощью RC522

Объяснение кода:

Скетч начинается с включения библиотек MFRC522 и SPI, определения выводов Arduino, к которым подключен RC522, и создания объекта считывателя MFRC522.

Далее нам нужно определить блок, в котором мы собираемся хранить наши данные. Здесь выбран сектор 0, блок 2. Помните, никогда не выбирайте блок 3 в любом секторе. Запись в блок Sector Trailer может сделать блок непригодным для использования.

Далее мы определяем массив из 16 байтов с именем blockcontent[16] , который содержит сообщение, которое мы хотим записать в блок. Вы можете удалить любой блок, написав в него нули.

Далее нам нужно определить массив из 18 байтов с именем readbackblock[18] . Он может быть использован для чтения контента обратно. Подождите . 18 байт? Разве не должно быть 16 байтов? Ответ — нет. Метод MIFARE_Read в библиотеке MFRC522 для хранения 16 байтов блока требует буфер размером не менее 18 байтов.

В функции setup() мы инициализируем последовательную связь с ПК, библиотеку SPI и объект MFRC522. Нам также необходимо подготовить ключ безопасности для функций чтения и записи. Здесь все шесть байтов ключа установлены в 0xFF . Поскольку карты в наборе новые, и их ключи никогда не менялись, они равны 0xFF . Если бы у нас была карта, которая была запрограммирована кем-то другим, нам нужно было бы знать ключ, чтобы получить к ней доступ. Затем этот ключ необходимо будет хранить в переменной key .

В функции loop() мы сначала сканируем, есть ли поблизости карта, если да, эта карта выбирается для записи и чтения.

Записать блок теперь очень просто, нам просто нужно вызвать пользовательскую функцию writeBlock() , которая принимает два параметра: номер блока, в который мы хотим записать данные, и сами данные.

Чтобы проверить, была ли операция записи успешной, нам нужно прочитать содержимое блока обратно. Это можно сделать с помощью пользовательской функции readBlock() , которая снова принимает два параметра: один — номер блока, а другой — массив для хранения содержимого блока. Вы можете использовать функцию PICC_DumpToSerial() , если хотите увидеть весь 1 килобайт памяти с записанным в нее блоком.

Наконец, мы печатаем содержимое массива readbackblock с помощью цикла for и отображаем его в мониторе последовательного порта.

Проект на Arduino

RFID система контроля доступа для дверного замка

Давайте создадим небольшой проект на Arduino, чтобы продемонстрировать, как простой модуль RFID считывателя RC522 можно использовать для создания RFID системы контроля доступа для дверного замка. Наша программа будет сканировать уникальный идентификатор каждой RFID метки, когда она достаточно близко, чтобы запитываться от считывателя RC522. Если UID метки соответствует предопределенному значению ( MasterTag ), которое хранится в памяти Arduino, доступ будет предоставлен. И если сканируем любую неизвестную метку, доступ будет запрещен. Круто! Так ведь?

Так выглядит результат.

Рисунок 13 – Демонстрация работы RFID системы контроля доступа для дверного замка

Конечно, этот проект можно привязать к открытию дверей, включению реле, включению светодиода или к чему-то еще.

Если вы не знакомы с символьными LCD дисплеями размером 16×2, то взгляните на эту статью.

Прежде чем мы перейдем к загрузке кода и сканированию меток, давайте посмотрим на принципиальную схему проекта.

Рисунок 14 RFID система контроля доступа для дверного замка. Подключение RFID считывателя RC522 и LCD дисплея к Arduino Рисунок 14 – RFID система контроля доступа для дверного замка. Подключение RFID считывателя RC522 и LCD дисплея к Arduino

Всё! Теперь попробуйте приведенный ниже скетч в работе.

Программа довольно проста. Сначала мы включаем необходимые библиотеки, определяем выводы Arduino, создаем объекты LCD и MFRC522 и определяем главную метку.

В функции setup() мы инициализируем интерфейс SPI, объект MFRC522 и LCD дисплей. После этого мы печатаем на LCD дисплее приветственное сообщение.

В функции loop() мы ждем, пока не будет отсканирована новая метка. Как только это будет сделано, мы сравним неизвестную метку с мастер-меткой, определенной в функции setup() . Всё! Если ID метки совпадает с ID мастера, доступ предоставляется, в противном случае в доступе будет отказано.

Ключевым моментом в проекте является пользовательская функция getID() . Как только она просканирует новую карту, внутри цикла for она преобразует 4 байта UID в строки и объединяет их для создания одной строки.

Похожие публикации