Домофонный мультиключ и всё про имитацию «таблеток»
Да, это жутко избитая тема. Универсальный домофонный ключ «таблетку» делал наверное каждый второй, кто начинал изучать микроконтроллеры. В Интернете очень много и статей на эту тему, и готовых решений. Однако, интерес к этому угасать не перестаёт даже с массовым переходом на RFID. Это не удивительно, ведь многим хочется собрать такое устройство, которое выполняет не только весьма интересную задачу, но ещё и всегда с собой. К тому же оно не такое уж сложное в изготовлении.
В этом посте мне хотелось бы собрать в одном месте всю необходимую информацию для тех, кто хочет изготовить такой ключ. Сейчас я постараюсь рассказать о том, какими бывают контактные домофонные ключи, как они работают, как их имитировать, какие при этом бывают подводные камни, а также рассказать о своей реализации такого устройства и о том, как можно собрать аналогичное самому.
Внимание! Этот ключ не позволяет нелегально проникать куда-либо. Это устройство лишь для того, чтобы носить один ключ вместо нескольких.
Хотя ничто не мешает вам записать в него универсальные коды открытия домофонов.
Типы домофонных ключей «таблеток»
На самом деле подобные ключи в корпусе MicroCAN бывают разных типов, хотя внешне и выглядят почти одинаково. Объединяет их только то, что ключ имеет два контакта — земля и данные, при этом используется паразитное питание, т.е. ключ питается непосредственно от линии данных. Для открытия двери используется серийный номер, который даётся на заводе. То есть это не ключ программируется на открытие домофона, а в память домофона заносится список ключей, которые могут его открывать. Рассмотрим их подробнее.
iButton
Самый популярный тип домофонных ключей — это iButton, а именно DS1990A от компании Dallas, работает по протоколу 1-Wire. Протокол весьма хитрый, подразумевает двустороннее взаимодействие — на ключ можно отправлять различные команды, на которые он по-разному реагирует. Серийный номер имеет размер в шесть байт, что даёт 2 8*6 = 281474976710656 различных комбинаций и подразумевает, что все выпущенные ключи должны быть уникальны. Если вам повезло, и у вас оригинальный iButton, то этот номер в шестнадцатеричном виде должен быть выгравирован на нём лазером:
То есть теоретически чужой такой ключ можно подделать, если просто записать куда-то или сфотографировать эти цифы!
Для взаимодействия с iButton достаточно подключить его к микроконтроллеру и подтянуть линию данных к питанию (2.8-5 вольт) через резистор:
Скорее всего для многих это всё уже старо как мир, но всё-таки расскажу кратко принцип работы 1-Wire. Обмен данными происходит за счёт поочерёдного прижимания линии к земле, информация при этом кодируется длительностью таких сигналов. Происходит это примерно так:
Далее всё зависит от посланной команды. Обычно это 33h — «READ ROM«, чтение серийного номера, после которого мастер читает 64 бита (1 байт — тип устройства, 6 байт — сам номер, 1 байт — CRC). Чтение каждого бита инициализируется мастером, для этого он посылает импульс в 1-15 микросекунд. Если после этого линия прижата к земле со стороны ключа на 60-120 микросекунд, то прочитан ноль, иначе — единица.
Как видите, прочитать ключ достаточно легко. Имитировать ключ гораздо сложнее, тем более многие домофоны используют разные хитрости. Вот основные подводные камни:
Про SEARCH ROM (F0h) — это команда поиска всех 1-Wire устройств на шине. Дело в том, что теоретически можно подключить параллельно много ключей и получить список всех серийных номеров. В реальности для iButton такое не используется, ведь к домофону всегда прикладывается один ключ. Однако, некоторые домофоны посылают эту команду, ожидая найти один единственный серийный номер. Алгоритм весьма интересный. Каждое из устройств на шине одновременно посылает бит своего серийного номера, при чём два раза (т.е. мастер должен прочитать два бита). Сначала обычным образом, а затем инвертированным. Что же получается в итоге? Если у устройства в серийном номере стоит единица, то посылается «10». Если ноль, то «01». И всё отлично, пока у всех устройств эти биты совпадают. А если нет… Выше я написал, что при чтении наличие длинного сигнала — это 0, а отсутствие — это 1, т.е. 0 является доминантным. Таким образом, при возникновении конфликтов читаются два нуля. После получения «10», «01» или «00» мастер должен послать в линию только что прочитанный бит. В случае с «00» он таким образом выбирает, с какой группой устройств работать далее. В результате после N итераций получается бинарное дерево из N серийных номеров.
Ответить на такую команду получается несколько сложнее, чем на обычный READ ROM. Нужно посылать каждый бит дважды — обычный и инвертированный, а затем проверять — совпадает ли с ним полученный от мастера ответ, и если не совпадает, то игнорировать дальнейшие команды.
Cyfral
Ключ «Цифрал DC-2000А» — это отечественная разработка. Взаимодействовать с ними гораздо проще, т.к. они весьма глупые — не принимают никакие команды. Достаточно просто подать на ключ питание, и он сразу начнёт бесконечно посылать код, изменяя своё сопротивление. Если дать ему 5 вольт, подключив через резистор в 1 кОм, то на осциллографе можно увидеть примерно такую картину:
Ключ меняет своё сопротивление примерно между 800 Ом и 400 Ом, если я не ошибаюсь, а следовательно и потребление тока. Можно сказать, что сигнал аналоговый, а это всё немного усложняет с аппаратной точки зрения. Хотя иногда может и упростить. Например, ключ можно прочитать, просто подключив его к микрофонному входу компьютера и записав аудиофайл.
И да, домофон после этого можно открыть самым обычным MP3 плеером. Но нас же интересуют более цивилизованные методы, верно?
Кодирование немного странное. Ключ циклически посылает девять нибблов (четыре бита), меняя своё сопротивление. Если оно сохраняется низким около 50 микросекунд, то это логический ноль, а если 100 микросекунд — это единица. Но данные кодируется не логическими нулями и единицами, а положением единиц среди нулей! То есть ключ при посылке кода может выдать только одну из четырёх комбинаций: «1000», «0100», «0010» и «0001». Однако, используется ещё и комбинация «0111» как стартовая последовательность. В итоге данные от ключа могут выглядеть как-то так: «0111 1000 0100 0010 0001 1000 0100 0010 0001 », где «0111» указывает на начало. Никакой контрольной суммы нет — код просто читается несколько раз для уверенности.
Итого восемь последовательностей, в которых возможны четыре комбинации. Не сложно посчитать, что это даёт нам 65536 вариантов ключей. Не так уж и много, они явно часто повторяются. Теоретически если в подъезде 50 квартир, каждой из которых выдано три ключа, можно подобрать один из них перебрав всего 436 комбинаций. Но я таким не занимался.
Как же лучше читать ключи от Cyfral? Как я уже говорил, уровни аналоговые. Варианта два: аналого-цифровой преобразователь и компаратор. Последний мне кажется надёжнее. Всё отлично работает, если к одному из входов компаратора подключить линию данных подтянутую к Vdd резистором в 650 Ом, а ко второму — ровно половину Vdd, для чего можно использовать делитель напряжения из двух одинаковых резисторов. После этого результат вывода компаратора можно с уверенностью воспринимать как высокое и низкое сопротивление ключа.
Как же имитировать такой ключ? С первого взгляда кажется, что тоже нужно менять сопротивление, но результаты показали, что домофонам не нужна такая точность — можно смело замыкать линию на землю вместо низкого сопротивления и полностью отпускать её, когда нужно высокое.
Метаком
Ещё одна отечественная разработка — домофоны Метаком и ключи К1233КТ2. Как и Cyfral он просто бесконечно посылает код, меняя своё сопротивление/потребляемый ток. К счастью в Интернете доступна официальная документация:
Это всё, что нужно знать для работы с этим ключом. Он посылает четыре байта данных, но в каждом из них один бит уходит на проверку чётности. Итого выходит 28 полезных бит, а 2 28 = 268435456 комбинаций.
Увы, я так и не смог найти ни один такой ключ, чтобы поэкспериментировать с ним. Однако, в Интернете легко найти универсальный код, который открывает 99% домофонов Метаком. Один из них как раз в соседнем от меня подъезде. Я написал программу, посылающую этот код, основываясь только на технической документации. Соседний подъезд открылся с первой попытки. Похоже, что этому домофону тоже не так уж важно точное сопротивление. На этом я оставил Метаком в покое и решил, что чтение их ключей не так уж и нужно.
Универсальные коды ключей
На самом деле универсальные ключи от домофонов — это скорее миф. Разработчики почти никогда не делают для себя какой-то специальный код для всех дверей, исключение составляют только Vizit.
Но есть легенда, которая гласит, что после чтения кода ключа многие домофоны сверяют его со всеми кодами, которые записаны в ячейках памяти. Однако, в ячейках, где ещё ничего не было записано, лежат FFки или нули. Таким образом домофон можно открыть, послав ключ только из нулей или только из FFок.
Звучит как полнейший бред. Каким надо быть программистом, чтобы допустить такой баг? Но… это действительно часто работает. Да, в свежих прошивках это обычно исправлено, но многие домофоны стоят без изменений годами. Невероятно, но факт.
Любые другие коды ключей выдаваемые за универсальные — это обычно всего лишь служебные ключи для сотрудников почты, ЖКО или самой домофонной компании, и они работают только в отдельных населённых пунктах.
Создание мультиключа
Перейдём уже к практике! Да, я пытался совместить в одном устройстве и имитацию ключей, и их считывание (кроме Метаком), и синхронизацию с компьютером по USB. Вот схема того, что получилось (кликабельно):
Компоненты и их предназначение:
Печатная плата (кликабельно):
Это было ещё время до покупки 3D принтера, когда я проектировал устройства под корпуса, а не корпуса под устройства. Ко мне в руки попал очень приятный экземпляр в виде брелка и с кнопкой. Просто идеально, оставалось только проделать отверстия под USB и светодиоды. Увы, я до сих пор не могу найти в продаже точно такой же корпус. В итоге получилось как-то так:
Батарейки под платой. Кстати, мне их хватило на год, пока я случайно не полез купаться, забыв вытащить ключи.
Управление производится всего одной кнопкой. При её первом нажатии устройство включается. Кратковременным нажатием кнопки производится выбор ключа, номер которого отображается светодиодами. Когда нужный ключ выбран, достаточно приложить контакты к считывателю домофона.
Длительное нажатие на кнопку переводит устройство в режим считывания ключей, при этом мигает средний светодиод. В этот момент нужно приложить ключ к контактам считывателя ключей (именно для этого у меня снизу вкручен винтик). Если считывание прошло успешно, отобразится номер, под которым ключ занесён в память.
При подключении по USB устройство видится как виртуальный COM-порт. Для простоты работы был написан клиент под Windows:
Он позволяет считывать ключи из устройства, при этом автоматически заносит их в базу данных. Само собой, ключи можно и записывать.
Описание электронных ключей iButton (Dallas Touch memory)
Электронный ключ iButton рассчитан на ношение в течение 10 лет и гарантированно сохраняет прочность корпуса при 1 миллионе контактов со считывателем. Его компактная форма в виде толстой монеты обеспечивает самовыравнивание в ответном контактном разъёме считывателя, что гарантирует простоту использования.
Ключ iButton можно закрепить практически на любой поверхности, идеально подходят печатные платы, пластиковые карточки, идентификационные брелоки и брелоки для ключей.
По выполняемым функциям ключи iButton подразделяются следующим образом:
Электронные ключи iButton широко используются в различных системах, требующих идентификации владельца или пользователя:
Помимо охранных систем, электронный ключ iButton может служить для идентификации пользователя в системах электронных расчётов, требующих наличия кредитных карт или цифровой подписи пользователя.
Для обеспечения идентификации при работе с компьютером достаточно одного прикосновения электронного ключа к контактному устройству считывателя, чтобы пользовательский идентификационный код считался из памяти ключа iButton.
Устройство электронных ключей iButton (ключей Dallas Touch Memory)
В 2002 году проведена сертификация корпуса MicroCan. Все приборы в этом корпусе имеют санитарно-эпидемиологическое заключение и соответствуют государственным санитарно-эпидемиологическим нормативам и правилам РФ, зарегистрированы в Государственном реестре средств измерений под № 23169-02 и допущены к применению в РФ.
Описание протокола 1-Wire электронных ключей iButton (ключей Dallas Touch Memory)
Протокол интерфейса 1-Wire обеспечивает возможность работы с множеством ключей iButton, подключённых параллельно к линии данных 1-Wire. Команды интерфейса позволяют определить ID всех ключей, подключённых в данный момент к линии и затем работать с конкретным прибором, переведя остальные в режим ожидания.
Для подключения ключей iButton к персональному компьютеру, а также для считывания с них информации, используются специальные адаптеры, преобразующие сигналы стандартных портов компьютера (RS232, LPT и USB) в сигналы 1-Wire.
Протокол iButton. Разбираемся с 1-wire в Arduino
Помимо управления кнопкой, и ввода данных с клавиатура, неплохо было бы добавить электронные идентификаторы, которые упрощают процедуру входа. Один из самых популярных методов – touch memory или iButton. Как уж только не называют его у нас – таблетка, магнитный ключ, брелок и т.д. Изначально, конечно планировался, как тип контактной памяти (внутри, по сути микросхема ПЗУ), но его можно эмулировать, и работать с бесконтактными картами, клавиатурами и т.д.
Попробуем разобраться во всём этом разнообразии. Семейство iButton насчитывает много разных микросхем производства Dallas Semiconductors, вида DS19xx. Чаще всего используется простая DS1990A, которая упакована внутри ключа. Очень много заблуждений ходит в народе об этих ключах. Нет, они не размагничиваются, там нечему размагничиваться, и магнита никакого там нет, но статики могут и испугаться. Код туда не прописывается, он уже идёт с завода, кроме конечно перезаписываемых ключей “болванок” семейства RW. Универсальных ключей тоже нет, если конечно устройство считывания не программировал глупый инженер, как было с домофонами МЕТАКОМ, которые открывались ключом с кодом FF. В целом, можно найти много информации об этом интересном семействе ключей, но давайте рассмотрим, как они работают. Сам считыватель, это просто два контакта, в виде чашки, куда и прислоняется наш ключ.
Для этого возьмём arduino, и соберём небольшой скетч для чтения. Потом подключим логический анализатор и разберёмся, как он передаёт код в устройство. Работает он по простому протоколу передачи данных 1-wire, т.е. для передачи информации нужен всего 1 провод и земля. Подключим библиотеку 1-wire
Наверное можно задуматься, а как эту штука получает питание? Да всё просто, оно паразитное. Маленький конденсатор накапливает достаточное количество энергии, чтобы потом быстро передать код. В момент передачи и получения информации, высокий уровень данных также подзаряжает его. Справедливости ради, есть модели микросхем, типа DS1992 до DS1996, которые питаются от внутреннего литиевого источника 3В, но также могут получать энергию от 1-wire, если батарея близка к разряду. Сообщим программе, что мы будем использовать для считывания 10 пин ардуино.
Посылки мы будем принимать тайм-слотами по 1 биту. Так как вся посылка, которую нам передаст формат iButton равна 64 битам, значит нам нужно создать массив на 8 байтовых значений.
Теперь воспользуемся командами библиотеки 1-wire. Мы сканируем линию, следующей командой, чтобы понять, есть на линии устройство 1-wire или нет
Мы видим, что мы проверяем некий сброс линии, а что же это такое? Reset это импульс низкого уровня, длительность которого составляет 480мкс, после которого следует импульс высокого уровня, тоже длительностью 480мкс. Всё это необходимо, чтобы зафиксировать, есть устройство на линии или нет. В спокойном режиме, череда этих импульсов выглядит так
Во время высокого уровня, когда Arduino делает запрос на наличие устройства на линии, мы ожидаем увидеть ответ, в виде низкого уровня от устройства iButton, которое называется в этом протоколе presence ( Присутствие). Если в этот момент мы поднесли чип к контактной чашке, то изменения будут выглядеть так.
Как только iButton заметил высокий уровень на линии данных, он генерирует импульс низкого уровня presence. Надо сделать небольшое отступление, что на 1-wire шину можно подключить несколько устройств, но в простом случае, у нас их два – Arduino и DS1990A, первый из которым является Master устройством, а сам iButton – Slave. Приведённые выше скриншоты сделаны с логического анализатора, для разнообразия приведу фото с документации, где можно увидеть аналогичную картину. tPDL – это и есть время импульса presence
После того, как мы инициализировали устройство, можно сделать ему запрос. Для этого мы генерируем тайм слот записи. Так выглядит запись логической 1
А так выглядит запись логического 0
Можем здесь увидеть, что длительность тайм-слота составляет 60мкс, но обычно устройство делает анализ в районе 30мкс, что попадает в окно выборки сигнала (от 15 до 60мкс). Первые 15 мкс – это время открытия транзистора, чтобы притянуть линию данных на низкий уровень.
Итак, после того, как мы обнаружили устройство на линии, самое время что-нибудь запросить у этого устройства. Если у нас на линии всего одно Slave устройство, то запросить его код мы можем простой командой Read ROM [33h]. Выше мы посмотрели на графиках, как отправлять тайм-слоты с высоким и низким уровнем, поэтому с помощью arduino Отправим код 33h на устройство
Теперь снова прогоним всё логическим анализатором, и посмотрим, что же произошло, после идентификации устройства iButton. После того, как прошёл высокий уровень reset, Master устройство, в лице Ардуино отправило команду запроса 0x33 в HEX, что в двоичном коде выглядит так. В данном случае временные интервалы задаёт Arduino, опуская линию в 0, перед каждый тайм-слотом. Затем либо оставляет её в низком уровне, либо поднимает до высокого, что соответствует 1. После сообщения кода, линия остаётся в высоком уровне, до запроса ответа от iButton.
Затем нам необходимо прочитать ответ от устройства iButton. Для этого также воспользуемся командами библиотеки 1-wire в arduino. В этом цикле, в течении 8 раз мы получаем байт информации командой *.read(); и записываем его в массив address[].
Далее в диаграммах, мы разберёмся, как происходит получение ответа, а пока для теста я буду использовать считыватель Matrix 2. Он работает с картами формата Em-Marine, но на выходе у него эмуляция стандарта DS1990, что нам и нужно. Подключим его к Arduino на 10 ногу.
Полученное значение нужно куда-то вывести. Для этого отправим в терминал массив address, который мы получили во время считывания контроллера. Здесь мы без переноса строки, записываем с пробелом каждый считанный байт из массива address[]. Для удобства выводим его в терминал, в шестнадцатеричном коде, добавляя в команду Serial.write окончание HEX
Прочитаем карту, значение будет выведено в терминал
Ещё раз проверим, как выглядит полный обмен данных с DS1990. Сначала мы проверили линию reset, потом запросили данные сообщением 0x33, ну а затем получили ответ.
Для наглядности опять же, картинка документации, всё сходится
Рассмотрим более внимательно ответную посылку с кодом карты. Как и написано выше, начало тайм-слотов приёма инициирует Master устройство, подтягивая уровень к земле. Дальше iButton начинает пересылать код. Т.е. перед каждым тайм-слотом (1 бит информации), Master притягивает линию данных к земле, а iButton, либо оставляет её, что соответствует 0, или поднимает до уровня логической 1. Перед началом получения 64 битной ответной посылки, мы немного удерживаем линию в высоком уровне, чтобы пополнить заряд энергии нашего iButton устройства. Делаем это командой delay(1); перед процедурой считывания.
Как мы и разобрали выше, тайм слот каждого передаваемого бита немного больше, чем 60 микросекунд. Также хорошо различимы 0 и 1. Попробуем преобразовать код карты, который мы получили в терминале, в последовательность 0 и 1. Получим следующую строку
Посмотрим из документации, как должна выглядеть ответная посылка
Теперь для наглядности разобьём 0 и 1 на байты, и графически поделим их. Сначала мы видим код семейства, равный 01, затем уникальный номер из 6 байт, а затем проверочную сумму CRC.
Это делается, чтобы, из первых 7 байт информации, Master устройство могло быстро посчитать CRC, и сравнить с последним принятым байтом. Если величины совпали, значит чип прочитан верно. Про CRC коды можно написать огромную статью, для них бывают разные полиномы, но так как, у нас 8 битная архитектура, то здесь используется CRC8 Dallas. Сама формула расчёта CRC представляет собой полином вида CRC = x 8 + x 5 + x 4 + 1, с применением операций Исключающее ИЛИ.
Возьмём ещё раз наши значения в виде 7, а не 8 байт
И попытаемся посчитать CRC на онлайн калькуляторе
Как видим – значение совпало с тем, что передала нам карта в 8 байте. Вводить проверку CRC в коде или нет – личное дело каждого. Конечно, она тратит время микроконтроллера на подсчёт, но и есть большой бонус в виде контроля целостности данных. Код считывания карты по которому мы сегодня работали,доступен по ссылке
Нахлобучиваем домофонные ключи iButton с помощью Flipper Zero
Flipper Zero — проект карманного мультитула для хакеров в формфакторе тамагочи, который мы разрабатываем. Предыдущие посты [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14]
iButton — это общее название для формата электронного ключа в форм-факторе металлической “таблетки”. Еще его называют Dallas Touch Memory. Часто его ошибочно называют “магнитным” ключом, но это неправильно, ничего магнитного в нем нет. Внутри iButton полноценный микрочип, работающий по цифровому протоколу.
В статье разберем формат ключей iButton от физического устройства до протоколов, а также трюки, которые можно с ним делать при помощи Flipper Zero.
Что такое iButton
Название iButton — это продукт фирмы Dallas Semiconductor, в 1991 году выпустившей на рынок ключ под торговой маркой Touch Memory, потом замененной на iButton.
Схематическое устройство ключа iButton: в центре корпуса контакт плюс, потом пластиковая изоляция, и внешняя часть корпуса это минус
Обычно под словом iButton принято понимать именно физический формфактор ключа и считывателя — круглая таблетка с двумя контактами. Существуют разные вариации оправ самой таблетки. Кроме привычного пластикового держателя с отверстием бывают варианты в виде колец, кулонов и т.д.
Внутреннее устройство iButton: внутри металлической оболочки находится микрочип
Считыватель
При поднесении ключа к считывателю, контакты соприкасаются, и на ключ подается питание. Далее осуществляется передача ID ключа. Иногда ключ не считывается сразу, потому что внешние контуры ключа и считывателя не соприкоснулись. В этом случае нужно упереть ключ в одну из стенок считывателя.
Касание контактов iButton ключа с домофонным считывателем
В формфакторе «таблетки» iButton бывают не только простые ключи с ID, но и климатические датчики, устройства для хранения криптографических ключей со своей батарейкой, часами и прочими наворотами. Эти устройства выглядят так же как ключи, но ими не являются.
Как устроен iButton во Flipper Zero
Разработка контактной площадки iButton во Flipper Zero — это огромная боль. Дело в том, что не существует готовых контактных площадок для одновременного чтения и эмуляции. Если бы мы просто взяли существующие модули, из флиппера бы торчала огромная металлическая кнопка, и рядом такая же огромная площадка для считывания. Это бы многократно увеличило размер устройства.
Нам пришлось изобретать собственную конструкцию контактной площадки с нуля, которую можно было бы реализовать на печатной плате так, чтобы итоговый размер устройства не увеличился. Было решено использовать 3 подпружиненных пого-пина. В итоге было протестировано около 20 разных конструкций.

Прототипы конструкций контактной площадки iButton во Flipper Zero, которые мы печатали на 3D-принтере в процессе разработки
Самая большая сложность конструкции контактной площадки в эмуляции, когда флиппер сам выступает ключом и его нужно прикладывать к домофону. Каждый производитель изобретает собственную конструкцию считывателя, из-за этого постоянно находятся домофоны в которых конструкция не работает: пины просто не дотягиваются либо до центрального контакта Data+, либо до бокового контакта GND.
Левая часть контактной площадки используется для считывания и записи ключей, правая для эмуляции. Центральный пин GND общий для обоих режимов.
Финальная конструкция получилась компромиссной: 100% ключей считывается успешно, примерно 80% считывателей успешно работают с эмуляцией. В оставшихся 20% считывателей приходится корячиться, чтобы контакт достал до нужных стенок. Для этих редких случаев можно использовать внешние контакты GPIO, на которые выведены контакты ibutton: подключиться макетными проводами и ткнуть их в считыватель.
Режим считывателя
В режиме считывателя флиппер ожидает поднесения ключа, при этом готов прожевать сразу три типа ключей: Dallas, Cyfral, Metakom. Флиппер сам определит тип ключа при чтении. Название протокола ключа отобразится на экране над ID номером.
Чтение ключа ibutton формата Dallas. Прочитанный ключ сохраняется на SD-карту.
Для считывания ключа необходимо зайти в меню iButton —> Read и приложить читаемый ключ к контактной площадке. Считанный ключ можно сразу эмулировать, записать на болванку, либо сохранить на SD-карту. Хоть контактная площадка находится на задней стороне от экрана, можно быстро наловчиться читать ключи не разворачивая флиппер, просто на ощупь.
В режиме чтения iButton используются два правых контакта Flipper Zero
Режим эмуляции iButton
В режиме эмуляции ключа, Флиппер сам выступает ключом и программно эмулирует iButton из памяти. ID ключа для эмуляции во Flipper Zero можно добавить двумя способами:
В режиме эмуляции Флиппер передает конкретный ID и эмулирует только один, заранее заданный, протокол ключа, так что его можно подносить только к конкретному домофону, который знает этот ключ. Перебирать сразу несколько ключей в этом режиме нельзя, так как нельзя однозначно убедиться, прочитал ли домофон наш ключ, и нельзя знать задержку в домофоне, между ошибкой чтения. Поэтому для дома, офиса, дачи, подвала нужно будет каждый раз выбирать конкретный ключ из меню.
В режиме эмуляции ключа iButton Флиппер нужно подносить к домофону как ключ. При этом нужно убедиться, что оба контакта коснулись контактной площадки считывателя.
iButton через внешний GPIO
Контакт iButton на нижней крышке также выведен на гребенку GPIO. Это можно использовать для подключения к нестандартным считывателям, ключам, любым устройствам работающим по протоколу 1-Wire вроде датчиков. Мы используем эти контакты для анализа сигналов через осциллограф. При этом, этот контакт не совсем честный GPIO, потому что имеет подтяжку к 5V.

Контакты iButton соединены с гребенкой GPIO. Порт iButton работает в режиме open-drain и подтянут к напряжению 5 В через резистор 1 кОм.
Протокол 1-Wire

В протоколе 1-Wire всегда есть главное устройство Master и ведомые Slave
Ключи Dallas обмениваются данными по протоколу 1-wire. Всего один контакт на передачу данных(!!) в обе стороны, от мастера к слейву и наоборот. Протокол 1-wire работает по модели Master-Slave. В этой топологии устройство Master всегда инициирует общение, а Slave следует его указаниям.
При контакте ключа (Slave) с домофоном (Master) чип внутри ключа включается, получив питание от домофона и происходит инициализация ключа, после чего домофон запрашивает ID ключа. Далее мы разберем подробно этот процесс.
Флиппер умеет работать в режимах Master и Slave. В режиме чтения ключа Флиппер выступает в роли считывателя, то есть работает как Master. А в режиме эмуляции ключа, флиппер прикидывается ключом, то есть работает в режиме Slave.

При чтении ключа Флиппер выступает мастером, а при эмуляции с домофоном работает как slave
Формат данных в ключе Dallas
Домофон считывает из iButton 8 байт (64 бита) информации, чтобы решить, открывать дверь или нет.
Структура данных этих 8 байт следующая:
Код семейства у ключей Dallas всегда 0x01. Если у вас этот код отличается, то скорее всего, это не ключ от домофона.
Серийный номер в некоторых случаях выгравирован на ключе, но может:
На картинке выше показан неочевидный пример гравировки ID на оригинальном ключе iButton. В нем читать байты нужно справа налево, контрольная сумма написана слева, а family code справа.
Ошибки чтения
При некорректном чтении ключа Flipper Zero сообщает об ошибках. Возможные ошибки:
Ввод ID вручную
Если ID ключа известен, его можно ввести во Флиппер вручную. Это удобно когда самого физического ключа нет, например можно передать нужные байты просто в чате или скинув другу фото. На видео показан пример создания нового ключа Cyfral из 2 байт. Новый сгенерированный ключ сохраняется на SD-карту.
Создание нового ключа с помощью ручного ввода айдишника
При создании ключа нужно выбрать его тип: Dallas, Cyfral или Metakom. От этого будет зависеть длина ID и протокол, используемый при эмуляции. После ввода ID Флиппер предложит ввести имя нового ключа, либо использовать сгенерированное.
Запись ключей 1-Wire Dallas
Существуют ключи Dallas, которые можно записать и которые нельзя. Популярные перезаписываемые iButton болванки: RW1990, TM2004, TM01C. Процесс записи имеет свои нюансы, разберем их.
Запись болванки может требовать повышенного напряжения — например, для записи менее популярной RW2000 требуется напряжение 8 В (правда это Cyfral, но смысл понятен).
Некоторые болванки требуют финализиации — после финализации ключ больше не может быть перезаписан. Этим пользуются некоторые домофоны, пробуя перезаписать ключ перед считыванием, чтобы избежать поддельных ключей. Обычно для финализации используют импульс напряжения и специальную команду, которая может отличаться для разных ключей.
Существуют болванки, которые могут подходить ко всем типам ключей: Dallas/Cyfral/Metakom. Флиппер умеет записывать основные популярные болванки.
Запись ключа Dallas на болванку RW1990 с помощью Flipper Zero
Чтобы записать ключ на болванку, нужно выбрать желаемый ключ из меню iButton —> Saved —> Имя_ключа и выбрать пункт Write. Далее прислонить перезаписываемый ключ к контактной площадке. После записи на болванку, флиппер проверяет корректность записи и показывает сообщение об успешной записи ID.
Русские народные ключи Cyfral, Metakom
Протоколы Metakom и Cyfral — отечественные разработки, распространенные только в СНГ. В отличие от ключей Dallas, они работают не по напряжению, а по току. Это менее распространенные и более дорогие ключи. Они очень чувствительны к параметрам ключа (частота, сила тока, амплитуда сигнала и пр.), из-за чего изготовление дубликатов бывает капризным процессом.
Cyfral и Metakom не принимают никакие команды. При подаче питания на ключ, он сразу начинает бесконечно посылать ID за счет изменения сопротивления. Таким образом, логические уровни определяются сопротивлением ключа. По документации ключей условно принимается, что информационные слова кода выдаются начиная с младшего бита.
Cyfral
Логические уровни в Cyfral, так же как и в Dallas имеют временные ограничения: если сопротивление остается низким около 50 мкс — это логический “0”, если 100 мкс — это логическая “1”.
Формат передаваемых данных специфичен.
Cyfral циклично отправляет 9 нибблов (1 ниббл = 4 бита): 1 стартовый и 8 ID. Ниббл может иметь всего 4 значения для ID и одно значение для стартового слова. Все остальные записи — некошерные.
В итоге ID записывается в 2 байта (Всего 8 нибблов ID. 4 ниббла = 16 состояний = 1 байт информации).
Бывает, что домофоны Cyfral занимаются проверкой ключа, подавая некорректные данные.
У Cyfral нет никаких контрольных сумм. Хочешь убедиться в целостности ID — прочитай ключ еще раз, а хочешь пять. Так как сигнал аналоговый, то чтение сигнала требует наличия АЦП или компаратора. Проще всего использовать компаратор, выход которого является низким или высоким уровнем напряжения.
С эмулированием ключа на практике проблем не возникает. Замыкания на землю (отсутствия сопротивления) вполне достаточно, чтобы ключ выдал логический «0».
Metakom
Ключ Metakom посылает 4 байта, где каждый байт заканчивается битом четности.
Metakom имеет 3 примитива передачи:
Структура посылки выглядит так:
Смотрим на 1-Wire через осциллограф
Захват сигнала осциллографом в момент чтения ключа Dallas
Линия передачи устроена по принципу «монтажного И» и может иметь одно из двух состояний: логический “0” и логическая “1”.
Устройства (ключи и домофон) имеют внутренние транзисторы, которые в нужное время подтягивают линию к нулю. Вся линия передачи переходит в состояние логического “0”, если любое из устройств перевело ее в нуль, т.е. если домофон перетянул линию в нуль — ключ об этом узнает, и наоборот.
С помощью перетяжек напряжения и удержания уровней 1-wire имеет 4 примитива для работы на шине:
Чтение ключа на Flipper Zero устроено так: командой поиска проверяется наличие ключа, а затем происходит чтение ID. Это сделано, чтобы избежать случайных совпадений с другими ключами Cyfral/Metakom, тайминги которых могут случайно совпасть с требуемыми.
На осциллограмме виден длинный сигнал из 2 команд, где каждая состоит из:
Разберем более детально каждый из пунктов.

Reset sequence — инициализация команды. Состоит из Импульса Сброса и Импульса Присутствия. Импульс Сброса — уровень опускает Master. Импульс Присутствия — уровень опускает Slave.
Инициализация (reset sequence) состоит из двух импульсов:
Некоторые домофоны не подают импульс сброса, так как отсутствие контакта между ключом и домофоном и есть сигнал сброса.

Команда чтения ID с ответом. Тайм-слот бита информации состоит из 2 участков: синхронизации и значения бита. В КОМАНДАХ за уровни напряжения на обоих участках отвечает Master. В ОТВЕТЕ на команду чтения за синхронизацию отвечает Master, за значение бита отвечает Slave.
После инициализации команды происходит обмен информацией:
Важно, что все сигналы имеют конкретные временные ограничения, которые обязательно должны быть соблюдены! Бывает, что производители домофонов упарываются, и соблюдают какие-то свои временные задержки.
Еще у iButton есть режим Overdrive, в котором временные задержки сокращены, из-за чего передача информации происходит быстрее. Есть вероятность, что в дикой природе существуют домофоны, работающие в этом режиме… Но на практике они не встречались.
Стандартные команды 1-wire ключей Dallas
Для iButton характерны команды размером 1 байт (8 бит).
Зачастую домофон использует команды поиска и чтения ID (Search ROM и Read ROM).
Некоторые производители домофонов — люди оригинальные, поэтому придумывают разные последовательности команд, чтобы проверить, а действительно ли к домофону прикладывают ключ, а не эмулятор. Поэтому ознакомимся с существующими командами.
Стандартные команды iButton для Regular режима следующие:
Бонус про домофонные ключи
Почему старые домофоны это плохо?
Некоторые старинные домофоны с ключами Dallas имеют в памяти базу ID ключей, заполненную не полностью. Незаполненные поля имеют некоторое значение, иногда соответствующее всем нулям (0x00) или всем единицам (0xFF). Для проверки домофона на дремучесть создаются два ключа: один со всеми нулями, другой со всеми единицами.
Эти ключи содержат неправильный код семейства (не 0x01) и неправильный CRC (вообще не контрольная сумма). — Да, бывают и такие исключения.
Как почтальоны разносят по подъездам рекламу?
Никак, почтальоны разносят письма 🙂 Но очевидно, что в почтовом отделении нет огромной связки с ключами для каждого подъезда. Часто используют универсальные ключи, они же “вездеходы”, подходящие на группу домофонов, например для всего района. Этот ключ может быть один на город, один на группу домов, может быть дефолтным для какой-то модели, а может и вовсе отсутствовать.
Что такое мастер ключ?
Обычно это ключ, который сам не открывает дверь, а позволяет добавлять в память новые ключи. Он записан в отдельную область памяти домофона. Такой ключ может одновременно для одних домофонов быть мастер-ключом, а для других обычным. Это всего лишь циферки, которые записаны в одну или другую область памяти домофона.
Играясь заблокировали домофон?
Такой вариант возможен, когда в домофоне есть “блокирующий ключ”. Он блокирует домофон для всех остальных ключей, пока не снимут блокировку с помощью мастер-ключа.
Какие болванки нам известны
В ходе работы с iButton мы зафиксировали некоторые известные нам “болванки” ключей. Вот они, на здоровье!























