Перейти к публикации
iT4iT.CLUB

Таблица лидеров


Популярные публикации

Отображаются публикации с наибольшей репутацией на 08.02.2016 во всех областях

  1. 1 балл
    В продолжение темы будем пробовать подружить Arduino + RFID ридер MFRC522 c Ethernet и MySQL базой данных, в которой будут храниться наши ключи. Автором идеи является svchekalin. Это первый вариант реализации СКУД на Arduino с использование БД, уверен, что в дальнейшем получится значительно улучшить работу программы. Первым делом необходимо озаботиться созданием самой базы для ключей. Подразумевается, что раз Вас интересует вопрос хранения ключей не в EEPROM, а во внешней СУБД, то Вы имеете представление о MySQL, работе с ней и сам сервер базы данных у Вас имеется. Я не буду описывать тут процесс его установки и настройки т.к. эта тема не для этого раздела. Создадим базу данных с именем "test" и добавим в ней таблицу с именем rc522 со следующей схемой: CREATE TABLE IF NOT EXISTS `rc522` ( `uid` bigint(12) NOT NULL, `type` enum('0','1','2') NOT NULL DEFAULT '2', `description` varchar(250) DEFAULT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; uid - содержит id ключа type - тип ключа. Может быть один из трех вариантов: 0 - ключ в базе, но деактивирован, 1 - мастер ключ, 2 - обычный ключ description - поле не используется в работе замка. Подразумевается, что в дальнейшем будет использоваться некая web форма для работы с ключами, и данное поле будет содержать некое описание, например ФИО владельца ключа. Первый ключ необходимо добавить самостоятельно. Код ключа можно узнать из консоли при попытки открыть замок. iT4iT CLUB (C) 2015 https://it4it.club Connected to server version 5.5.47-0+deb7u1 KEY: 3177510 access dany Disconnected. Чтобы добавить ключ 3177510 в базу и сделать его мастером необходимо выполнить SQL запрос: INSERT INTO `rc522` (`uid`, `type`) VALUES (3177510, '1'); База и таблица созданы, мастер ключ добавлен, переходим к монтажу электронной части. Я использовал Arduino UNO c Ethernet Shield на чипе W5100 (если Вы хотите подвязать ENC28J60, сразу советую отказаться от этой идеи). Сам шилд и библиотека Ethernet.h используют заранее определенные контакты SPI шины, это: 13 - SCK 12 - MISO 11 - MOSI 10 - SS В тоже время RFID сканер MFRC522 тоже использует SPI шину, и чтобы он чувствовал себя не ущемленным в правах, необходимо его пины SS и RST перенести: 13 - SCK 12 - MISO 11 - MOSI 9 - SS 8 - RST Все это дело будет выглядеть следующим образом. Переходим к скетчу. Для его работы понадобятся следующие дополнительные библиотеки: RFID-RC522 (NRF) Bounce2 (избавляет от дребезга контактов при нажатии кнопок) MySQL Connector (реализует работу с базой данных) Сам скетч Сразу хочу уточнить некоторые моменты. В программе Вам необходимо указать имя пользователя и пароль к MySQL серверу. Пользователь должен обладать достаточными правами для доступа к созданной в начале статьи базе. Также не забудьте указать IP адрес самого сервера в Вашей локальной сети. IPAddress server(10, 10, 10, 254); // IP адрес MySQL сервера char user[] = "login"; // MySQL username char password[] = "password"; // MySQL password Если Вы решили изменить имя базы или таблицы на какие-нибудь другие, то необходимо отредактировать константы, содержащие SQL запросы. const char QUERY_S[] = "SELECT type FROM test.rc522 WHERE uid = %s;"; const char QUERY_I[] = "INSERT INTO test.rc522 (uid) VALUES ('%s');"; Как видите, имя базы и таблицы указаны через разделитель точку ".", и в данном примере база имеет имя test а таблица rc522, что соответствует записи test.rc522 Алгоритм работы схож с предыдущими вариантами замка, за исключением того, что EEPROM в данной версии не используется. Соответственно и мастер ключ самостоятельно не создается, именно поэтому мы добавили его в базу руками. Связь с базой и последующая обработка ответа происходит с некоторой задержкой, это связано с производительностью контроллера, особенностями работы библиотеки, самой программы и т.д и т.п. В моем случае, время с момента начала считывания метки до реакции на неё занимало до 3 сек. Плюс ко всему, из-за определенных обстоятельств, MySQL сервер пришлось поднимать на Raspberry PI, а это далеко не лучший вариант для СУБД. В данный момент на одну аутентификацию метки требуется создать одно подключение и один запрос, это тоже увеличивает время реакции. Можно устанавливать соединение с базой при подачи питания на Arduino и просто клепать запросы. Такой вариант уменьшит время реакции в два раза, НО есть ложка дегтя в этой бочке. Если по каким либо причинам связь с сервером будет прервана (а оно так и будет, т.к. 100% гарантию дает только страховой полис), то контроллер зависнет при попытке выполнить заброс к БД. Проснуться он сможет только с помощью сторожевого таймера. В общем, этот момент еще будет проработан в следующих версиях замка. Думаю, что с нормальной СУБД время реакции уменьшится до 2 сек. Для входа в режим программирования необходимо, после того как замок разблокируется, удерживать мастер ключ еще 5 секунд у RFID сканера. Произойдет звуковой сигнал, а замок откроется, и будет находиться в таком состоянии пока Вы не выйдите из режима программирования (повторно удерживаем мастер ключ у сканера до звукового сигнала). В режиме программирования, как и в предыдущих версиях замка, все новые ключи будут записаны в MySQL. Все действия по-прежнему сопровождаются отчетами в Serial мониторе. Вот пример с попытками добавить существующий ключ в базу и добавлением нового ключа. IP: 10.10.10.97 # <- IP адрес полученный от DHCP сервера iT4iT CLUB (C) 2015 https://it4it.club Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 26214177213 # <- ID текущего ключа у RC522 сканера access allow # <- Доступ разрешен (ключ в базе с меткой 1 - мастер) Disconnected. # <- Отключаемся от сервера * closed lock # <- Замок автоматически закрылся, НО КЛЮЧ ВСЕ ЕЩЕ У СКАНЕРА! MASTER PROGRAMMING MODE ON # <- После 5сек. Вход в режим программирования. Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 204641111 # <- ID текущего ключа у RC522 сканера error: key elrady exists in eeprom # <- ID ключа уже прописан на сервере <!> Disconnected. # <- Отключаемся от сервера Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 3177510 # <- ID текущего ключа у RC522 сканера add key in MySQL # <- ID ключа не найден в СУБД. Arduino завписывает новый ключ в базу. Disconnected. # <- Отключаемся от сервера Connected to server version 5.5.47-0+deb7u1 # <- ID текущего ключа у RC522 сканера KEY: 26214177213 # <- ID ключа найден в СУБД (ключ в базе с меткой 1 - мастер) Disconnected. # <- Отключаемся от сервера MASTER PROGRAMMING MODE OFF # <- Выходим из режима программирования PS: На данный момент это полностью рабочий вариант и отличная отправная точка для будущих изменений.
×
×
  • Создать...