Мне понравилась идея 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
Протокол 1-wire

Протокол 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в

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

Этой схемы уже достаточно, чтобы читать и эмулировать ключи протокола OneWire
Этой схемы уже достаточно, чтобы читать и эмулировать ключи протокола OneWire

Само чтение происходит всего в одну строчку кода:

#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

И вот готов третий тестовый образец на отладочной плате NodeMCU (esp8266)
И вот готов третий тестовый образец на отладочной плате NodeMCU (esp8266)

Эта железка уже умела читать, писать и эмулировать ключи dallas, а также хранить их в памяти. Также я, естественно, забил в быстрый доступ десять универсальных и часто используемых ключей :)
Но получилось не очень компактно :(

Следующий вариант был собран на wemosMini v4, это уже более компактная плата на базе esp8266. Существенно меньше девайс не стал, т.к. экран все равно остался довольно большим.

Зато появился аккумулятор с платой зарядки и стильный фиолетовый корпус!

Следующим этапом был переход на более маленький oled 1106_128x64. Для него не надо выводить отдельные контакты, т.к. он подключается в стандартный i2c разъем на wemosMini v4 по проводу. И вот с ним удалось добиться хоть какой-то компактности.

Бонусом оказалось, что GPIO2 на vemosMini, как и на nodeMCU, уже подтянуты через резистор к 3.3v. Поэтому схема устройства ещё сильнее упростилась. Правда, не на всех платах хватает этой подтяжки, иногда надо добавить резистор 1кОм на 3.3v.

Схема устройства на vemosMini, сверху кнопки управления. Экран подключен по проводу
Схема устройства на vemosMini, сверху кнопки управления. Экран подключен по проводу

Спустя некоторое время появился и корпус. Кривой, конечно, но пока и такой пойдет.

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

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

Модель устройства на печатной плате
Модель устройства на печатной плате

Что уже получилось

Следующим этапом были ключи Cyfral и Metacom.
Спойлер! С метакомом все получилось, можно читать, перекодировать и писать на болванки ds1990, писать на специализированные болванки и даже эмулировать оригинальный ключ! С Cyfral все похуже, можно читать и писать на спец. болванки, но эмулированный ключ домофон так и не воспринимает. Также получилось прочитать, записать и эмулировать EM-Marine. Но про все это в следующих статьях.

Комментарии (47)


  1. ednersky
    18.04.2024 06:26

    нужно ещё ключи от авто начать эмулировать и цены не будет такому устройству


    1. Komrus
      18.04.2024 06:26
      +4

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


      1. EnvalidGamer Автор
        18.04.2024 06:26
        +1

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


        1. FelixTheMagnificent
          18.04.2024 06:26
          +3

          Я открывал свою Honda Civic c помощью RTL-SDR и rpiTx.
          Многие заводские сигнализации с rolling key подвержены replay attack, что дало мне возможность записать 6 последовательных нажатий кнопок ключа, и вот это шестое "нажатие" принимается машиной, как родное.


    1. NutsUnderline
      18.04.2024 06:26
      +1

      Правительству Канады уже объясняли что флипперы не могут такое делать


      1. tr4
        18.04.2024 06:26
        +3

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


        1. NutsUnderline
          18.04.2024 06:26

          Не совсем, все таки https://habr.com/ru/news/801611/ Там только прием сигнала элементарным детекторным приемником, который, кстати, надо еще точно настроить на нужную частоту. Передатчик еще нужен, правда устройство его может быть ненамного сложнее. Все это работает с простейшей модуляцией OOK, типа морзянки. Флиппер конечно все это может, и делает, и даже несколько посерьезнее протоколы осиливает. Но вот если использовать двунаправленый канал, и секретный алгоритм вопрос-ответ то все становиться далеко не так просто.

          Собственно мой месседж @ednersky был касательно того что для авто этот вопрос сложнее технически и вызывает вопросы в правовом поле.


  1. Woffko
    18.04.2024 06:26

    а от чего не взять esp8266/esp32 плату с экраном и джостиком?


    1. EnvalidGamer Автор
      18.04.2024 06:26
      +2

      Достаточно компактная плата со встроенным экраном не нашлась :(
      Думаем такое на базе esp32 попробовать. И может быть экран 128x32.

      .


      1. NutsUnderline
        18.04.2024 06:26
        +1

        LILGO делает несколько моделей платок с дисплейчиками


        1. Moog_Prodigy
          18.04.2024 06:26

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


          1. NutsUnderline
            18.04.2024 06:26

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


      1. MDiMaI666
        18.04.2024 06:26
        +6

        Вариантов много на самом деле


      1. bu906
        18.04.2024 06:26
        +1

        Как вариант можно отказаться от дисплея и поднять простейший HTTP-cервер + wifi. И управлять по прямому wifi подключению со смартфона.


      1. fio
        18.04.2024 06:26
        +1

        С этими ESP32 Super mini есть засада. Некоторые экземпляры нормально прошиваются в Arduino IDE, а другие - ни в какую. Ошибка загрузки.

        Пока не разобрался от чего это зависит и как бороться. Беглый поиск решения не дал.

        И качество радиосвязи WiFi хуже, чем у больших плат


        1. anoldman25
          18.04.2024 06:26
          +2

          Как я понял, это дефект самой платы. Вот мой опыт: я купил две такие esp32-c3-super-mini платки. И не смог загрузить программу. Результатом расследование стало то, что программа загрузки зависает на очистке памяти. Затем я купил пару еще у другого продавца. Они заработали с полоборота. Для меня симптом такой, если в первый раз подключаешь плату к USB-C кабелю и на ней мигает LED, то карта хорошая. Если нет, то нет. У меня по крайней мере счет где-то 6-2 в мою пользу 8)


          1. fio
            18.04.2024 06:26
            +1

            Вот и у меня такая же картина - покупка превратилась в лотерею.

            Для некоторых плат помогает, если сначала задать кнопку Boot (около разъема usb), а потом подключить к компьютеру. Тогда чип не выполняет код, а ждёт загрузку


            1. anoldman25
              18.04.2024 06:26

              Я не помню как на оригинальных ESP32-WROOM, а на новых я где-то прочитал, что загрузка осуществляется таким образом: 1. подключается к току 2. нажимаем на BOOT. 3. Нажимаем на RESET и сразу отпускаем. 4 отпускаем BOOT.

              Тогда платка переходит в режим прошивки. Так у меня работают (по крайней мере) esp32-c3 и esp32-s2.

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

              Кстати, для нажатия на кнопки я использую китайские палочки для еды! Деревянные. Очень удобно.

              YMMV


  1. fivlabor
    18.04.2024 06:26
    +2

    железка уже умела читать, писать и эмулировать

    На мой взгляд, нужна функция обмена с другими экземплярами устройства. Скидывать файлом через usb/uart/wifi/ble на ноут/мобилу и потом на другой экземпляр. В каждой строке файла, например, "описание-адрес, кодировка, код". И потом ходить обмениваться с другими пользователями и собирать "ключ от всех дверей района"


    1. EnvalidGamer Автор
      18.04.2024 06:26

      Кстати так и планируем сделать :)

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


  1. Javian
    18.04.2024 06:26
    +1

    Сейчас это всё более неактуально - в новых домофонах ключи Mifare Mf3.


  1. Vetalnsk
    18.04.2024 06:26
    +5

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


  1. Katrovsky
    18.04.2024 06:26
    +3

    Почему-то в рамках проекта от одарённых людей «Multy» как «мульти» выглядит не ошибкой, а авторским штрихом. Если этот проект пойдёт в народ, сохраните, пожалуйста. :)


  1. CyberKot
    18.04.2024 06:26
    +4

    Совсем недавно один за одним перестали срабатывать Цифраловские ключи, которым уже под 20 лет. Те самые которые выглядят как iButton, но внутри микросхема. Местные ключники зарядили ценник на "ключ для старого Цифрала" - 250р.

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

    В итоге за 250р я купил 10 болванок и вопрос с ключами для себя и родственников закрыл с запасом.


    1. EnvalidGamer Автор
      18.04.2024 06:26

      А какой домофон был? Cyfral ccd-2094, или более старый по типу ccd-20.

      На старые уже встроенную перекодировку получилось реализовать. На болванки ds1990 пишется сразу перекодированный номер.

      Но ccd-2094 пока не побеждён :(


      1. CyberKot
        18.04.2024 06:26

        CCD20


    1. MaFrance351
      18.04.2024 06:26

      Если не секрет, что за цифрал у вас? Уж не 2094/tc ли?


      1. CyberKot
        18.04.2024 06:26

        CCD20.

        А ccd-2094 - как раз у автора статьи


        1. MaFrance351
          18.04.2024 06:26

          Просто при упоминании старого цифрала сразу подумал о нём.


          1. MaFrance351
            18.04.2024 06:26

            Был ещё такой аппарат как 2094М:

            Но к обычным 2094 отношения не имеет.


  1. MaFrance351
    18.04.2024 06:26
    +1

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

    Связано это с таймингами битов. Домофон очень придирчив к ним.

    Ещё интересно посмотреть, как поведёт себя девайс на домофонах Vizit, Eltis и некоторых метакомах. В этих панелях стоит фильтр, не позволяющий открывать при помощи эмуляторов и перезаписываемых ключей. Почему-то про этот факт очень мало кто рассказывает, а он есть. Принцип основан на анализе всё тех же таймингов, а также посылке команд, которые заготовка принимает, а оригинальный ключ DS1990A игнорирует. И в тех городах, где повсюду визиты (Пермь, например) это актуально.

    Ещё добавлю про популярные стандарты ключей (про которые в Москве или Питере и слыхом не слыхивали, но есть города, где они едва ли не самый популярный вариант. Всякую редкую экзотику типа магнитных, оптических, резистивных, ферритовых, секрето-стражевских и других ключей не учитываем):

    • ТК. Применяется на домофонах Техком, вроде бы добрая половина Подмосковья на них сидит. Работает на частоте 13,56 МГц, но намного более тупой, по принципу больше похож на EM-Marine.

    • ISO 15693. Второй из популярных стандартов, работающий на 13,56 МГц, с Mifare несовместим. Применяется в домофонах Факториал и Уфанет, они там, к слову, с динамическим кодом. Про этот тип ключей я даже писал пост.

    • Mifare Ultralight. Из известных мне домофонов стоят на всё том же визите. Привязываются к панели и без помощи специальных устройств по типу SMKey не клонируются. Да, домофонщики наконец-то очнулись, и в новых моделях весь старый хлам типа iButton наконец-то отправили в историю.


    1. EnvalidGamer Автор
      18.04.2024 06:26

      Спасибо за информацию!

      А метаком выходит к таймингам не так придирчив?

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


    1. EnvalidGamer Автор
      18.04.2024 06:26

      Визиты, метакомы и старые цифралы открывались банальной эмуляцией универсальных dallas ключей (наверное просто старые домофоны попадаются). Eltis вроде не встречался, надо будет ещё по городу с этой штукой погулять :) Вообще планируем отдать в МЭС на тестирование.

      Mifare Ultralight вроде даже телефоном же можно скопировать...


      1. MaFrance351
        18.04.2024 06:26
        +2

        У цифрала интересная история. Были такие панели, CCD 2094/tc:

        Прошивка и часть схемотехники (но не вся) у них была позаимствована у Элтис ЦП100. Универсальные ключи к ним не подходили.

        Но потом они ударились в модернизацию и выпустили CCD 2094.1:

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

        В более поздних прошивках (CCD-20, CCD 2094.1 новых версий, CCD 2094.3) её наконец-то прибили.

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


  1. nikolz
    18.04.2024 06:26

    Можно сделать ключ на модуле с BLE (цена 2$)+ CR2032. Данные пересылать на смартфон. Батарейки хватит лет на десять.


    1. MaFrance351
      18.04.2024 06:26

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


  1. Leonidgaz
    18.04.2024 06:26
    +2

    Специально зарегистрировался на Хабре, чтобы следить за твоими успехами! Раньше было уже подобное устройство, megakey называлось. Мне по работе часто приходится попадать в подъезды, а этот самый megakey перестали выпускать(стоил он в районе 5 тысяч), теперь начали выпускать ikey, но он стоит 15000, и работает в связке с телефоном через Bluetooth. Надеюсь приобрету когда-нибудь у вас готовое устройство за нормальный прайс


    1. EnvalidGamer Автор
      18.04.2024 06:26

      Да, недавно на megakey наткнулся. Только он умел только эмулировать, но не умел читать, писать и все остальное..

      Надеюсь когда нибудь продам готовое устройство, естественно за вменяемый ценник)


    1. MaFrance351
      18.04.2024 06:26

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


    1. egribanov
      18.04.2024 06:26
      +1

      Что же за работа такая у вас? Мусорить рекламными буклетами в почтовых ящиках?


  1. voldemar_d
    18.04.2024 06:26
    +2

    Оказывается, у atmega328p всего 2кб оперативной (если точнее SRAM) памяти, а буфер для работы с oled 128х64, который мы решили использовать, занимает смело половину.

    Не агитирую за Arduino, хочу лишь заметить, что у вас на экран выводится только текст, а для этого буфер в памяти не нужен. Есть библиотека SSD1306Ascii, которая без буфера текст на такие экраны выводит. Шрифты хранятся в программной флеш-памяти, поэтому RAM практически не задействуется. Также можно напрямую и прочие (не только текст) данные в экран писать, без промежуточного буфера.


  1. HuRN
    18.04.2024 06:26

    lab401 погуглите


  1. mrAsh4r
    18.04.2024 06:26
    +1

    Смотря на громоздкость сие чуда, мне кажется лучше заменить способ управления платой и убрать дисплей. Вместо использовать кнопку и пару светодиодов (3 светодиода хватит чтобы выбрать 15 ключей). Т.е нажимая на кнопку будет меняться ключ и номер ключа на светодиодах (двоичные числа 0 0 1 = 1й ключ, 0 1 1 = 3й ключ, где 0 и 1 светодиод не горит и горит). А отладочную информацию и настройку устройства повесить на веб морду, у вас же это esp8266 как никак с wifi модулем, тем самым будет более информативная информация на смартфоне.

    Желаю вам успехов!


    1. riky
      18.04.2024 06:26

      3 светодиода это 7 ключей.


  1. zbot
    18.04.2024 06:26

    У меня к ТС один вопрос - корпуса для устройств отпечатанные столь похабно это какой-то DIY стиль или просто делалось на от...сь?


    1. EnvalidGamer Автор
      18.04.2024 06:26

      Печатались просто что-бы были, и защищали электронику.

      Всё силы и время брошены на прошивку и схему устройства. Нормальный корпус будет разрабатываться потом.


  1. riky
    18.04.2024 06:26

    А нельзя ли чтобы при открытии двери эмулятор скидывал по очереди все ключи? Можно было бы избавиться от дисплея и энкодера