Мне понравилась идея Flipper Zero в хранении и эмуляции электронных ключей. Это довольно удобно, можно избавится от половины моей связки со всеми ключами, плюс те ключи, которые я обычно даже не ношу, будут под рукой, в том числе универсальные. Но не понравились его габариты. К тому же, весь остальной функционал хоть мне и интересен, для этой задачи излишен, а за него тоже надо платить. В этот момент появилась идея и, что самое главное, желание самостоятельно реализовать такую штуку.
Я работаю в центре поддержки одаренных школьников, поэтому сначала дал эту тему одному своему самому продвинутому ученику в качестве проекта. Но потом сам погрузился в этот проект :D
Конечная идея была в эмуляции ключей стандартов TouchMemory, Em-Marine и Mifare classic в одном устройстве. Хочется, чтобы это устройство было максимально компактным, в идеале вообще помещалось на связку ключей.
Давайте для начала расскажу, что это за стандарты такие.
Распространенные стандарты ключей
Em-Marine и Mifare classic – это бесконтактные ключи, которые работают по беспроводным протоколам на частоте 125кГц для Em-Marine и 13.56 для mifare classic.
Em-Marine – это старые, довольно глупые ключи, которые хранят только свой id, и в основном используются на турникетах и домофонах (если их ещё не заменили на Mifare classic).
Mifare classic работает на частотах nfc, и, соответственно, его без проблем можно прочитать современным телефоном, скопировать (к сожалению с ограничениями), и даже иногда эмулировать (далеко не на всех устройствах, часто только с root правами и т.д.).
Не буду сильно вдаваться в этот стандарт, до работы с ним мы ещё не добрались.
TouchMemory – класс электронных устройств, имеющих однопроводный протокол обмена информацией (1-Wire, но не всегда) и помещённых в стандартный металлический корпус (обычно имеющий вид таблетки).
Это те самые ключи-таблетки, которые вы прислоняете к домофону, чтобы зайти.
Про ключи TouchMemory
В основном стандарт представлен в виде ключей dallas и русских-народных Cyfral и Metacom.
Соответственно, с этих ключей мы и решили начать, т.к. они показались нам самыми простыми. Проектировать это устройство решили на всеми любимой arduino, и кодить естественно в её среде.
Для начала решили разобраться с dallas, все-таки это самые распространённые ключи. И обычно поддерживаются любым домофоном, даже cyfral и metacom. Эти ключи работают на протоколе 1-wire, сам ключ является умным, умеет принимать и обрабатывать несколько стандартных команд, и хранит только свой уникальный ID из 8 байт.
Протокол 1-wire работает по модели Master-Slave. В этой топологии устройство Master всегда инициирует общение, а Slave следует его указаниям. При контакте ключа (Slave) с домофоном (Master), ключ получает питание, чип внутри ключа включается, происходит инициализация ключа, после чего домофон запрашивает ID ключа.
Домофон считывает из iButton 8 байт (64 бита) информации, чтобы решить, открывать дверь или нет. Первый байт это family code. У ds1990 это всегда 01, по нему можно понять, что это за ключ (например, у cyfral и metacom мы сюда будем писать уже их коды 10 и 20, в статьях про них объясню, почему так). Далее 6 байт самого ключа и последний байт – контрольная сумма. Иногда код ключа записывают в перевернутом виде, как на схеме:
Подключаем Arduino
Для работы с этим протоколом для ардуины есть шикарная библиотека OneWire, которая позволяет работать ардуино как Master устройство, и на ней написаны прошивки практически всех дубликаторов ключей на ардуино. Проблема в том, что эта библиотека не умеет работать как slave устройство, и, соответственно, написать эмуляцию на ней не получится.
Но для начала было бы неплохо хотя бы прочитать какой-нибудь ключ...
Чтобы обеспечить ключ питанием, достаточно притянуть центральный контакт на 5в через резистор и боковой на gnd. Обычно советуют использовать 2.2кОм, но, как показала практика, можно использовать любой от 500ом до 5кОм, и даже напряжения достаточно 3.3в
Чтобы общаться с ключом по этому протоколу, нужно ещё соединить центральный контакт с каким-нибудь цифровым портом. Далее открываем пример и загружаем.
Само чтение происходит всего в одну строчку кода:
#include <OneWire.h>
#define iButtonPort 2
byte addr[8];
OneWire ibutton(iButtonPort);
void setup() {
Serial.begin(115200);
}
void loop() {
readKey();
}
void readKey() {
if (ibutton.search(addr)) { // Если устройство подключено - считываем
for (int i = 7; i > -1; i--) { // Запускаем цикл печати данных из массива
Serial.print(addr[i], HEX); // Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" ");
}
Serial.println(); // В конце цикла переводим строку
ibutton.reset_search(); // Сбрасываем устройство
}
}
Давайте вернемся к эмуляции
Поиски библиотеки для эмуляции были долгими, первой нашлась статья на RoboCraft: Arduino/CraftDuino и эмулятор iButton с недописанным кодом, и следом библиотека OneWireSlave, которая до сих пор не может эмулировать ds1990 :(
Было желание на все плюнуть и написать свою библиотеку, но моя лень и упорство вывели меня на библиотеку OneWireHub, которая основана как раз на OneWireSlave :D. Вот она заработала отлично.
В этой библиотеке есть пример эмуляции, но для кучи устройств в одном скетче. Я, пожалуй, приведу в пример скетч только с эмуляцией ключа.
#include "OneWireHub.h"
#include "DS2401.h" // Serial Number
#define iButtonPort 2
auto hub = OneWireHub(iButtonPort);
byte Key[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F }; //универсальный ключ
auto ds1990A = DS2401(Key[0], Key[1], Key[2], Key[3], Key[4], Key[5], Key[6]); //crc считается автоматически
void setup() {
hub.attach(ds1990A); // всегда онлайн
}
void loop() {
hub.poll(); // необходимо периодически вызывать следующую функцию
}
Как видите, ничего сложного. Но на этом этапе уже появились проблемы с нехваткой ресурсов ардуины. Оказывается, у atmega328p всего 2кб оперативной (если точнее SRAM) памяти, а буфер для работы с oled 128х64, который мы решили использовать, занимает смело половину.
В принципе, можно было бы оптимизировать прошивку, повозиться с дисплеем, но для работы с Mifare Classic (хотя до него еще и далеко) памяти уже бы точно не хватило, да и хотелось писать код попроще. Поэтому было решено перейти на более производительный контроллер.
Переходим на ESP8266
И тут выбор встал между stm32f103 (или чем-то подобным) и esp8266. По сути, stm больше подходит к этому проекту, в ней и портов побольше, и полезные аппаратные фишки есть, но stm32 все еще плохо совместима с arduino кодом, поэтому выбор пока остановился на esp8266.
В esp8266 уже 82 кБ SRAM памяти и до 160Мгц частота ядра, что даже больше, чем у stm32f103. Поэтому можно ни в чем себе не отказывать, хоть картины рисовать :D
Эта железка уже умела читать, писать и эмулировать ключи dallas, а также хранить их в памяти. Также я, естественно, забил в быстрый доступ десять универсальных и часто используемых ключей :)
Но получилось не очень компактно :(
Следующий вариант был собран на wemosMini v4, это уже более компактная плата на базе esp8266. Существенно меньше девайс не стал, т.к. экран все равно остался довольно большим.
Зато появился аккумулятор с платой зарядки и стильный фиолетовый корпус!
Следующим этапом был переход на более маленький oled 1106_128x64. Для него не надо выводить отдельные контакты, т.к. он подключается в стандартный i2c разъем на wemosMini v4 по проводу. И вот с ним удалось добиться хоть какой-то компактности.
Бонусом оказалось, что GPIO2 на vemosMini, как и на nodeMCU, уже подтянуты через резистор к 3.3v. Поэтому схема устройства ещё сильнее упростилась. Правда, не на всех платах хватает этой подтяжки, иногда надо добавить резистор 1кОм на 3.3v.
Спустя некоторое время появился и корпус. Кривой, конечно, но пока и такой пойдет.
Да, забыл упомянуть про контактную площадку. Мы перебрали кучу вариантов и остановились на форме, которая позволяет удобно читать ключ и имеет надежный и удобный контакт с домофоном. В будущем она, скорее всего, будет изменена, но на данный момент это наиболее удобный вариант.
Для достижения максимальной компактности, естественно, надо собирать эту штуку на печатной плате, но схема устройства пока всё время меняется, и печатка перерисовывается. Думаю, после победы над контактными ключами попробуем собрать небольшую партию устройств на печатных платах.
Что уже получилось
Следующим этапом были ключи Cyfral и Metacom.
Спойлер! С метакомом все получилось, можно читать, перекодировать и писать на болванки ds1990, писать на специализированные болванки и даже эмулировать оригинальный ключ! С Cyfral все похуже, можно читать и писать на спец. болванки, но эмулированный ключ домофон так и не воспринимает. Также получилось прочитать, записать и эмулировать EM-Marine. Но про все это в следующих статьях.
Комментарии (47)
Woffko
18.04.2024 06:26а от чего не взять esp8266/esp32 плату с экраном и джостиком?
EnvalidGamer Автор
18.04.2024 06:26+2Достаточно компактная плата со встроенным экраном не нашлась :(
Думаем такое на базе esp32 попробовать. И может быть экран 128x32..
NutsUnderline
18.04.2024 06:26+1LILGO делает несколько моделей платок с дисплейчиками
Moog_Prodigy
18.04.2024 06:26Ну у них и цена, мое почтение. За эту цену можно собрать девайс с экраном от лопаты или вообще планшет приспособить.
NutsUnderline
18.04.2024 06:26Это не проблема если руки прямые, и профит не очевиден. Тут экран меньше и вообще компактное, для такой задачи это плюс. Большой экран если - так это проще смартфон/планшет уже имеющийся подключить по wifi/bluettooth и не носить лишнюю лопату с собой, людям в коментах такое нравиться. И вообще говорят, что хватит трех светодиодов.
bu906
18.04.2024 06:26+1Как вариант можно отказаться от дисплея и поднять простейший HTTP-cервер + wifi. И управлять по прямому wifi подключению со смартфона.
fio
18.04.2024 06:26+1С этими ESP32 Super mini есть засада. Некоторые экземпляры нормально прошиваются в Arduino IDE, а другие - ни в какую. Ошибка загрузки.
Пока не разобрался от чего это зависит и как бороться. Беглый поиск решения не дал.
И качество радиосвязи WiFi хуже, чем у больших плат
anoldman25
18.04.2024 06:26+2Как я понял, это дефект самой платы. Вот мой опыт: я купил две такие esp32-c3-super-mini платки. И не смог загрузить программу. Результатом расследование стало то, что программа загрузки зависает на очистке памяти. Затем я купил пару еще у другого продавца. Они заработали с полоборота. Для меня симптом такой, если в первый раз подключаешь плату к USB-C кабелю и на ней мигает LED, то карта хорошая. Если нет, то нет. У меня по крайней мере счет где-то 6-2 в мою пользу 8)
fio
18.04.2024 06:26+1Вот и у меня такая же картина - покупка превратилась в лотерею.
Для некоторых плат помогает, если сначала задать кнопку Boot (около разъема usb), а потом подключить к компьютеру. Тогда чип не выполняет код, а ждёт загрузку
anoldman25
18.04.2024 06:26Я не помню как на оригинальных ESP32-WROOM, а на новых я где-то прочитал, что загрузка осуществляется таким образом: 1. подключается к току 2. нажимаем на BOOT. 3. Нажимаем на RESET и сразу отпускаем. 4 отпускаем BOOT.
Тогда платка переходит в режим прошивки. Так у меня работают (по крайней мере) esp32-c3 и esp32-s2.
Вообще-то это выглядит логично, таким образом платка загружается в режиме первоначальной загрузки (BOOT).
Кстати, для нажатия на кнопки я использую китайские палочки для еды! Деревянные. Очень удобно.
YMMV
fivlabor
18.04.2024 06:26+2железка уже умела читать, писать и эмулировать
На мой взгляд, нужна функция обмена с другими экземплярами устройства. Скидывать файлом через usb/uart/wifi/ble на ноут/мобилу и потом на другой экземпляр. В каждой строке файла, например, "описание-адрес, кодировка, код". И потом ходить обмениваться с другими пользователями и собирать "ключ от всех дверей района"
EnvalidGamer Автор
18.04.2024 06:26Кстати так и планируем сделать :)
Пока можно читать ключи по одному с одного устройства на другое.
Vetalnsk
18.04.2024 06:26+5Используя ESP, можно прикрутить автоматический выбор ключа на основании геолокации по видимым сетям.
Katrovsky
18.04.2024 06:26+3Почему-то в рамках проекта от одарённых людей «Multy» как «мульти» выглядит не ошибкой, а авторским штрихом. Если этот проект пойдёт в народ, сохраните, пожалуйста. :)
CyberKot
18.04.2024 06:26+4Совсем недавно один за одним перестали срабатывать Цифраловские ключи, которым уже под 20 лет. Те самые которые выглядят как iButton, но внутри микросхема. Местные ключники зарядили ценник на "ключ для старого Цифрала" - 250р.
В общем и целом оказалось: эти ключи прекрасно читаются ардуиной, домофон принимает далласовские ключи, цифраловский ключ можно эмулировать в болванку RW1990. Немного пришлось сломать голову и считать байты и полубайты в уме, половину отбрасывая... Из препятствий - оказалось что не все болванки RW1990 принимаются домофоном. Ключи с озона с чёрной ручкой - прекрасно работают, а с красной - домофон принимать отказывается.
В итоге за 250р я купил 10 болванок и вопрос с ключами для себя и родственников закрыл с запасом.
EnvalidGamer Автор
18.04.2024 06:26А какой домофон был? Cyfral ccd-2094, или более старый по типу ccd-20.
На старые уже встроенную перекодировку получилось реализовать. На болванки ds1990 пишется сразу перекодированный номер.
Но ccd-2094 пока не побеждён :(
MaFrance351
18.04.2024 06:26Если не секрет, что за цифрал у вас? Уж не 2094/tc ли?
CyberKot
18.04.2024 06:26CCD20.
А ccd-2094 - как раз у автора статьи
MaFrance351
18.04.2024 06:26+1С Cyfral все похуже, можно читать и писать на спец. болванки, но эмулированный ключ домофон так и не воспринимает.
Связано это с таймингами битов. Домофон очень придирчив к ним.
Ещё интересно посмотреть, как поведёт себя девайс на домофонах Vizit, Eltis и некоторых метакомах. В этих панелях стоит фильтр, не позволяющий открывать при помощи эмуляторов и перезаписываемых ключей. Почему-то про этот факт очень мало кто рассказывает, а он есть. Принцип основан на анализе всё тех же таймингов, а также посылке команд, которые заготовка принимает, а оригинальный ключ DS1990A игнорирует. И в тех городах, где повсюду визиты (Пермь, например) это актуально.
Ещё добавлю про популярные стандарты ключей (про которые в Москве или Питере и слыхом не слыхивали, но есть города, где они едва ли не самый популярный вариант. Всякую редкую экзотику типа магнитных, оптических, резистивных, ферритовых, секрето-стражевских и других ключей не учитываем):
ТК. Применяется на домофонах Техком, вроде бы добрая половина Подмосковья на них сидит. Работает на частоте 13,56 МГц, но намного более тупой, по принципу больше похож на EM-Marine.
ISO 15693. Второй из популярных стандартов, работающий на 13,56 МГц, с Mifare несовместим. Применяется в домофонах Факториал и Уфанет, они там, к слову, с динамическим кодом. Про этот тип ключей я даже писал пост.
Mifare Ultralight. Из известных мне домофонов стоят на всё том же визите. Привязываются к панели и без помощи специальных устройств по типу SMKey не клонируются. Да, домофонщики наконец-то очнулись, и в новых моделях весь старый хлам типа iButton наконец-то отправили в историю.
EnvalidGamer Автор
18.04.2024 06:26Спасибо за информацию!
А метаком выходит к таймингам не так придирчив?
Попробую поставить тайминги точно как на ключе, но они похоже от напряжения немного плавают.
EnvalidGamer Автор
18.04.2024 06:26Визиты, метакомы и старые цифралы открывались банальной эмуляцией универсальных dallas ключей (наверное просто старые домофоны попадаются). Eltis вроде не встречался, надо будет ещё по городу с этой штукой погулять :) Вообще планируем отдать в МЭС на тестирование.
Mifare Ultralight вроде даже телефоном же можно скопировать...
MaFrance351
18.04.2024 06:26+2У цифрала интересная история. Были такие панели, CCD 2094/tc:
Прошивка и часть схемотехники (но не вся) у них была позаимствована у Элтис ЦП100. Универсальные ключи к ним не подходили.
Но потом они ударились в модернизацию и выпустили CCD 2094.1:
Там добавили пару ненужных функций в режиме программирования, а также появилась уязвимость в виде FF-ключа.
В более поздних прошивках (CCD-20, CCD 2094.1 новых версий, CCD 2094.3) её наконец-то прибили.
Вообще, хочу написать отдельный пост про то, как появились домофоны. Слишком уж много всякого бреда встречается на этот счёт в интернете.
nikolz
18.04.2024 06:26Можно сделать ключ на модуле с BLE (цена 2$)+ CR2032. Данные пересылать на смартфон. Батарейки хватит лет на десять.
MaFrance351
18.04.2024 06:26Одно время хотел на этом принципе сделать эмулятор динамического ключа. Чтобы данные синхронизировать между всеми девайсами, иначе бы при первом же открытии ключ помер. Но что-то так и не задалось.
Leonidgaz
18.04.2024 06:26+2Специально зарегистрировался на Хабре, чтобы следить за твоими успехами! Раньше было уже подобное устройство, megakey называлось. Мне по работе часто приходится попадать в подъезды, а этот самый megakey перестали выпускать(стоил он в районе 5 тысяч), теперь начали выпускать ikey, но он стоит 15000, и работает в связке с телефоном через Bluetooth. Надеюсь приобрету когда-нибудь у вас готовое устройство за нормальный прайс
EnvalidGamer Автор
18.04.2024 06:26Да, недавно на megakey наткнулся. Только он умел только эмулировать, но не умел читать, писать и все остальное..
Надеюсь когда нибудь продам готовое устройство, естественно за вменяемый ценник)
MaFrance351
18.04.2024 06:26В среде домофонщиков довольно известные штуки. Megakey хороший был девайс, если не считать пары огрехов, жаль, что перестали их выпускать.
egribanov
18.04.2024 06:26+1Что же за работа такая у вас? Мусорить рекламными буклетами в почтовых ящиках?
voldemar_d
18.04.2024 06:26+2Оказывается, у atmega328p всего 2кб оперативной (если точнее SRAM) памяти, а буфер для работы с oled 128х64, который мы решили использовать, занимает смело половину.
Не агитирую за Arduino, хочу лишь заметить, что у вас на экран выводится только текст, а для этого буфер в памяти не нужен. Есть библиотека SSD1306Ascii, которая без буфера текст на такие экраны выводит. Шрифты хранятся в программной флеш-памяти, поэтому RAM практически не задействуется. Также можно напрямую и прочие (не только текст) данные в экран писать, без промежуточного буфера.
mrAsh4r
18.04.2024 06:26+1Смотря на громоздкость сие чуда, мне кажется лучше заменить способ управления платой и убрать дисплей. Вместо использовать кнопку и пару светодиодов (3 светодиода хватит чтобы выбрать 15 ключей). Т.е нажимая на кнопку будет меняться ключ и номер ключа на светодиодах (двоичные числа 0 0 1 = 1й ключ, 0 1 1 = 3й ключ, где 0 и 1 светодиод не горит и горит). А отладочную информацию и настройку устройства повесить на веб морду, у вас же это esp8266 как никак с wifi модулем, тем самым будет более информативная информация на смартфоне.
Желаю вам успехов!
zbot
18.04.2024 06:26У меня к ТС один вопрос - корпуса для устройств отпечатанные столь похабно это какой-то DIY стиль или просто делалось на от...сь?
EnvalidGamer Автор
18.04.2024 06:26Печатались просто что-бы были, и защищали электронику.
Всё силы и время брошены на прошивку и схему устройства. Нормальный корпус будет разрабатываться потом.
riky
18.04.2024 06:26А нельзя ли чтобы при открытии двери эмулятор скидывал по очереди все ключи? Можно было бы избавиться от дисплея и энкодера
ednersky
нужно ещё ключи от авто начать эмулировать и цены не будет такому устройству
Komrus
Для беспроводных автоключей, насколько понимаю, протоколы обмена - не публичны. Каждый автопроизводитель дрожит над собственным креативом...
EnvalidGamer Автор
Если это не современная сигнализация, можно попробовать, с флиппера теслы же открывают). Но это скорее будет запись и повторение сигнала. Вообще есть идея внедрить модуль 433мгц для подобного.
FelixTheMagnificent
Я открывал свою Honda Civic c помощью RTL-SDR и rpiTx.
Многие заводские сигнализации с rolling key подвержены replay attack, что дало мне возможность записать 6 последовательных нажатий кнопок ключа, и вот это шестое "нажатие" принимается машиной, как родное.
NutsUnderline
Правительству Канады уже объясняли что флипперы не могут такое делать
tr4
вроде не так. объяснили что такое можно сделать и без флиппера, с помощью ноутбука со звуковой картой и куска провода.
NutsUnderline
Не совсем, все таки https://habr.com/ru/news/801611/ Там только прием сигнала элементарным детекторным приемником, который, кстати, надо еще точно настроить на нужную частоту. Передатчик еще нужен, правда устройство его может быть ненамного сложнее. Все это работает с простейшей модуляцией OOK, типа морзянки. Флиппер конечно все это может, и делает, и даже несколько посерьезнее протоколы осиливает. Но вот если использовать двунаправленый канал, и секретный алгоритм вопрос-ответ то все становиться далеко не так просто.
Собственно мой месседж @ednersky был касательно того что для авто этот вопрос сложнее технически и вызывает вопросы в правовом поле.