Разбираемся со считыванием и записью магнитных домофонных ключей

Приветствую всех!
Мы уже давно привыкли, что самыми распространёнными типами домофонных ключей являются Touch Memory (iButton) и EM-Marine. Набирают популярность Mifare и различные проприетарные решения в формате Touch Memory. Но, конечно, так было далеко не всегда.

7yjl6muswkrc9fm8t4dl9imkrds.jpeg

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

Суть такова


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

p_2e9ua0fj4hl95cmykzb0f9cdy.png

Вот, например, Eltis ЦП100КМ (насчёт модели не уверен) с оптическими ключами. Помимо них такой принцип использовался в устройствах компании Метаком. Принцип действия, думаю, понятен.

Немного оффтопика

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

nusaq6m3z2vn1o-i9gjl-w5swlq.png

Домофон «Вика-Д3» с резистивным ключом. Внутри ключа находился резисторный делитель, соответственно, домофон просто измерял напряжение. Недостатки такого метода очевидны: даже простое загрязнение контактов приведёт к глюкам или полной невозможности открыть дверь.

arnyeebkzms2podi-2kygss9sai.png

Идея с такими ключами тоже неожиданно взлетела (видимо, из-за дешевизны) и получила распространение в немалом числе моделей. Были даже ключи в формате Touch Memory с резисторами внутри.
Ну что же, время перейти к главному предмету сегодняшнего обзора — к домофонам с магнитным ключом. Мне всегда было интересно, как это работает, какой объём данных вмещает ключ, как он считывается… И вот у меня появилась возможность рассмотреть данный артефакт поподробнее.

Немного об истории домофонов в Челябинске


Возможно, жители некоторых регионов в жизни не видели домофонов с такими ключами. И, признаться, на это есть причины. Подавляющее большинство таких устройств выпускалось челябинской компанией «Факториал». Несмотря на то, что они ставили своё оборудование в немалом числе других городов, подавляющее большинство аппаратов эксплуатировались именно у нас на Урале. Будучи основанной в далёком 1998 году, компания существует и поныне, продолжая выпускать свои панели вызова, правда, на этот раз уже с ключами Mifare. Тем не менее, новые «магнитные» экземпляры до сих пор продаются, видимо, для замены отслуживших своё собратьев. С другой стороны, достаточно популярных в Москве и Питере Eltis, Raikmann, Laskomex в Челябинске вообще нет.
Помимо «Факториала» другими двумя типичными представителями челябинских домофонов являются различные вариации Cyfral CCD-2094 и Метаком МК-20. Устройства достаточно старые (большая их часть не менялась с самого момента установки в начале нулевых), но до сих пор успешно выполняют свою главную функцию — защищать подъезд от попадания туда бомжей, закладчиков, «внеплановых проверок счётчиков», псевдо-газовщиков, мошенников-впаривателей и прочих мутных личностей. Разумеется, ранее указанными моделями список не ограничивается, но других в сравнении с ранее представленными на порядок меньше.
Посмотрим на типичных их представителей.

mxhpezrkx4xhn9ejud-87u3cppw.jpeg

Cyfral CCD-2094 с ключом Touch Memory.

z8utwr8kzqu2mw-ytuq0ijq4p5q.jpeg

Он же, но с ключом EM-Marine. Вместо контактов для Touch Memory просто пластмассовая затычка, за которой расположена антенна.

c8uo5zonzczvc_f5lkrqf7atqpy.jpeg

Метаком МК-20.

7gpx6r9y_oit_wk16ywdpn1pcfy.jpeg

А вот и «Факториал». Аналогичная панелька показана на КДПВ.

flj2szr9ekiq3oicbnfevbahwl0.jpeg

Более старая версия этого блока.

zersnuiqcfy28yughcoxgoah1pm.jpeg

«Факториал» с ключом Touch Memory.

lxaxvx4hfy7ug7wigt77br8e_ok.jpeg

«Факториал» с ключом Mifare.
… Внутри тоже RFID чип от Texas Instruments. При этом при каждом открывании двери данные в ключе перезаписываются, таким образом невозможно увеличить количество ключей. Копия будет работать, но после первого открывания перестанет работать оригинал, так как данные в ключе меняются. Этим хитрым апгрейдом факториал разом сделал бизнес копирования домофонных ключей невозможным.
(из блога spiritus_sancti)

yinzlhgr5wwzt3x7z_mt83dwdoi.jpeg

Последние несколько лет (в рамках системы «Безопасный город» и тому подобных госпроектов) старые домофоны активно меняются на устройства от Beward, в простонародье «домофон Интерсвязь», «домофон Дом.ру» или просто «умный домофон». Конкретно этот — от «Интерсвязи», на дисплее бегущая строка в виде адреса дома и названия этого провайдера. Иногда это приводит к забавным результатам…

ynozpewfdrjvdlgu3mxgg-m7rs0.jpeg

«Факториал» тоже не отстаёт.

Обзор оборудования


Так получилось, что мне достались две панели вызова: Cyfral CCD 2094/tc и Факториал. Первая интересна своим годом выпуска (один из первых CCD 2094), вторая — магнитным ключом.

bqwhv5bugrugwgpdqukxe7cgon4.jpeg

Рассмотрим первый экземпляр. В качестве ключа используется обычный Touch Memory. Стандартные для домофона цифровые кнопки, вызов и сброс. Индикатор семисегментный, на пять разрядов. На самом деле их шесть, на один разряд не используется и скрыт с глаз долой металлом корпуса, окошко прорезано только для пяти. Под названием модели красуется гордое «MICROPROCESSOR CONTROL», словно там стоит не простенький микроконтроллер, а аж какой-нибудь MC68000. Интересно, на чём ещё вообще может работать такое устройство? На реле или пневмонике что ли? Не на дискретной логике же…

-gasosnpj-feix5tutrsgbcnz0u.jpeg

Обратная сторона. Когда-то тут была крышка, но до меня она не дожила. Плата достаточно простая, выполнена на базе микроконтроллера семейства 8051 (судя по всему, это AT89S52). Чуть ниже EEPROMка, куда записываются ключи и параметры. Рядом с ней два контакта, обозначенные как »1» и »2». Их замыкание позволяет ввести домофон в тестовый режим, что может понадобиться для сброса настроек.

На отдельной платке с микроконтроллером AT90S1200 реализован считыватель ключей Touch Memory. Виден припаянный к ней варистор, призванный защищать электронику домофона от статики и вандалов с электрошокером.

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

Кнопки самые обычные тактовые (хотя правильно называть их тактильными). Предусмотрена защита от продавливания: при слишком сильном нажатии кнопка упирается в крепёжную пластину и дальше на шток не воздействует.

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

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

z3hdawwyyerqevdaeuawjrmwqoq.jpeg

Перейдём к «Факториалу». Эту панельку я показывал чуть ранее, и вот точно такая же попала ко мне в состоянии практически новой. Она очень поздняя, сделана тогда, когда вовсю выпускались таковые с ключами Mifare. Дизайн сильно отличается, впрочем, для рядового пользователя разницы никакой. Вместо контактов Touch Memory щель для ключа, над кнопками расположены три светодиода подсветки. Панель сделана из всё того же благородного металла силумина.

3f0-hjuloiftk-dz7xxthmwgmz4.jpeg

Обратная сторона. Электроника закрыта крышкой из листовой стали. В ней сделаны несколько прорезей: для кнопки входа в сервисный режим, для регулятора громкости, для считывателя ключа, ещё парочка для каких-то технологических разъёмов.
Снизу выходит жгут проводов, среди них два коричневых — питание (~15 В), два зелёных — электромагнит, далее жёлтый — кнопка выхода, синий — земля, белый — линия (LN), красный — управление коммутатором (LU). Увы, нормальной документации на «Факториалы» толком и нет. Скорее всего, связано это с тем, что ставят такие панельки представители данной компании, а не сторонние фирмы.

_8trxv3gywhhmtcd8mr49edym2k.jpeg

Снимем крышку. Отчётливо видны плата, динамик, считыватель ключей. На плате конденсаторы, диодный мостик, линейный стабилизатор LM7805. Рядом с ним мощный транзистор, управляющий электромагнитом двери. Видно пустующее посадочное место под EEPROMку, судя по всему, в этой модификации данные пишутся в память МК.

bjiougkz2pyg4u9_khtlfj6a73m.jpeg

Кстати, вот на такой винт был посажен один из углов крышки… мда уж, весело.

owffm4jpreyycx747bxysuqxt34.jpeg

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

ehvc_q3hzs6a_fejeildpooa_dq.jpeg

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

vuho5kvyjbxmtijxgxfnruq43sc.jpeg

Снимем плату считывателя ключей. Тут всё крайне простенько. Ключ считывается тремя датчиками Холла. Красный светодиод подсвечивает щель для вставки. В качестве датчиков используются SS495A. В отличие от магнитных карт, таймаута на прокатывание ключа нет, так что можно вставлять его хоть по миллиметру в минуту, прочитан он всё равно будет.

e3yywododx0ug7l9gc13twr47f0.jpeg

Обратная сторона. Кроме резистора и конденсатора тут ничего нет…

Про программирование этих панелей
Для входа в режим программирования необходимо нажать и удерживать любую цифровую кнопку, пока на дисплее не загорится PrL. После этого экран погаснет, и нужно будет набрать пароль (как и в линуксовой консоли, вводимые цифры на экране не отображаются). По умолчанию это 123456, но в вашем домофоне он наверняка заменён. Также можно нажать и удерживать в течение секунды кнопку на плате, для которой специально сделано отверстие в крышке.

_mtvxhtx4ofhstgk4m5ac1xrfxs.jpeg

Если с паролем вы не прогадали, на дисплее загорится ПР. Далее необходимо выбрать нужную нам функцию (подменю) и нажать «Вызов». По сути интерес представляют следующие функции:

  • Включение и отключение абонентов. Если абонент отключён, при попытке его вызова на дисплее загорится PAY. Для возвращения его к жизни в режиме программирования набираем »12», затем «Вызов», затем номер квартиры, затем »1», затем «Вызов».
  • Программирование ключей. В режиме программирования нажимаем »8», затем «Вызов», вводим номер ячейки и вставляем ключ.
  • Номер первой квартиры и их общее число в подъезде. Эти параметры необходимы для корректной работы коммутатора. Вводятся в подменю 1 и 2.
  • Узнать текущий пароль. Подменю 0.
  • Открыть дверь. Нажать »4», затем «Вызов».

180180


odp4lpmddqus0b2xqynj9w-zqeo.png

На просторах обнаружилась вот такая картинка. Увы, ни один из кодов к моей панели не подошёл. Единственный работоспособный вариант — удерживать любую цифровую клавишу несколько секунд, ввести пароль режима программирования, жмякнуть »4», затем «Вызов». Но по регламенту «Факториала» код при установке панели всегда меняют, а за время, которое вам понадобится для подбора комбинации шести цифр (если на каждую комбинацию уходит около десяти секунд), дверь успеет открыться не один раз, так что при незнании мастер-пароля можно считать эти коды бесполезными.

Связь


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

xlamtfyowsqd6mbiaabuhj0vkgi.jpeg

Вот так вот выглядит коммутатор, по принципу работы чем-то напоминающий АТС. Ничего примечательного в нём нет: просто белая коробочка, к которой идут проводки. Два тонких серых — питание (~15 В), синий — земля, красный — управление, белый — линия, назначение зелёного, жёлтого и коричневого мне неизвестно.

0mby9vbdk7qswluhdo44zbzaa-a.jpeg

Схема его достаточно простая, всего лишь несколько счётчиков и немного микросхем дискретной логики. От него отходит два шлейфа, один на старший разряд номера квартиры, второй — на младший. Таким образом, по шестнадцати проводам можно подключить шестьдесят четыре квартиры. Работает он тоже очень просто — при совершении звонка домофон отправляет нужное число импульсов на управляющий вход (LU), а коммутатор подключает нужную пару проводов к линии (LN). Некоторые модели оснащены выводом переноса, что позволяет подключить ещё один такой блок, если ёмкости этого не хватает, где-то же используется ещё один провод LU от домофона. Хотя каждый производитель домофонов традиционно выпускает свой вариант такого блока (равно как и трубки), большая часть из них совместима между собой, так как все они работают по одинаковому принципу.

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

koectga2dxrpo8aziumkfv7a5jw.jpeg

Трубка. В моём случае Цифрал КМ-2НО. По сути ничем от других аналоговых «коммутаторных» трубок не отличается. Всё те же кнопка открытия двери и выключатель, всё тот же ничем не примечательный дизайн.

mqcihj7qyctagcxe-4pl8xqhytg.jpeg

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

n3hmxs15jmpfptaxpb0l2a8_oia.jpeg

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

qybx6oqtcttwwi9fnmdtkkzlxhi.jpeg

Обратная сторона платы.
Сама трубка не так уж и сильно отличается от обычного телефона, если не считать отсутствия номеронабирателя и звонка (роль которого выполняет постоянно подключённый к линии динамик). Кнопка открывания двери просто отключает голосовую часть, что позволяет домофону отследить этот момент по резкому падению тока в линии. Выключатель реализован по-разному: где-то он подключает в цепь динамика добавочное сопротивление, заставляя его звонить очень тихо, где-то просто отсоединяет всю трубку (а блок вызова определяет это по обрыву линии и не производит соединение).
Для проверки блока вызова трубку можно подключить и без коммутатора: плюс в LN, минус на землю.

Ключи


1eamcnznyp_m08-ihononjv6hps.jpeg

А вот и сами магнитные ключи. Ключ представляет собой пластину из некого пластика, в который при производстве замешан порошок ферромагнетика. Размеры такие: ширина — семнадцать миллиметров, длина — пятьдесят девять миллиметров, толщина — два миллиметра.
Сам ключ содержит восемнадцать магнитных точек (три ряда по шесть в каждом), каждая из которых может быть намагничена положительно или отрицательно (или не быть намагничена вообще. Но на практике промежуточное состояние не используется). Помнится, товарищ spiritus_sancti выкладывал когда-то в историях своего Instagram фотографию такого ключа с приложенной пластиной для визуализации магнитного поля, где отчётливо были видны эти точки. Увы, нигде больше это фото не засветилось. Ближайшая к ручке тройка точек на «Факториале» не используется. При этом центральный ряд используется не для кодирования информации, а для контроля вставки ключа. На всех ключах он содержит последовательность »±+-+», то есть готовность к считыванию следующей пары бит можно определять сменой сигнала на среднем датчике. Таким образом, для кодирования ключа используются десять бит, то есть всего существует 1024 различных варианта. Разумеется, в ситуации, когда в городе такие домофоны ставили целыми кварталами, коллизии неизбежны (иногда даже в пределах микрорайона): в годы моего обладания таким ключом помню, как однажды открыл им подъезд в соседнем районе (просто увидел такой же домофон и «по приколу» решил попробовать вставить ключ, который неожиданно подошёл).

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

Собираем считыватель сами


Разумеется, хочется попробовать воссоздать что-то подобное.

rmt2k7megvpuqot4ehp_mfuuvkm.jpeg

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

zsmuecicavd8f5msptr2ba8ak1u.jpeg

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

Ну что же, время собирать свой вариант. Для сборки самого простого считывателя нам понадобится три биполярных датчика Холла (например, всё те же широко распространённые SS495A), три двухцветных светодиода, шесть резисторов, самый дешёвый китайский клон Arduino Nano. Да, знаю, что адурино — не всегда хорошо, но в данном случае — самый лёгкий вариант. Схема настолько проста, что не вижу смысла её выкладывать, чуть позже подробно её опишу.

788c83okvdogszjyelcbspjeujc.png

Почти все датчики имеют одинаковую распиновку: со стороны скошенной части первый вывод — плюс, второй — минус, третий — сигнал. Три датчика подключаются к трём аналоговым входам Arduino. Обратите внимание, что униполярные датчики (типа того же SS41F) не подойдут.

srub81ztqxx49mpc7x0m8uer7yc.jpeg

Для начала проверим, можно ли вообще считывать ключи при помощи Arduino и датчика Холла. Припаиваем к датчику проводки, подключаем (плюс — 5 В, минус — земля, выход — A0), заливаем AnalogReadSerial из стандартных примеров. Вообще, для биполярного датчика необходимо соответствующее двухполярное питание, однако в нашем случае им можно пренебречь. Просто вместо Uпит., нуля и -Uпит. у нас на выходе будет Uпит., ½ Uпит. и ноль. Берём мощный магнит и проверяем правильность подключения: при поднесении одного полюса показания должны упасть до нуля, другого — до высшего уровня. При отсутствии рядом магнита они должны держаться на уровне пятисот.

Теперь берём ключ и прикладываем его к датчику. Мда, какой-то слабенький размах получается, всего десять-двадцать единиц в обе стороны. Теперь понятно, откуда такие жёсткие требования к питанию «Факториала». Но оно даже работает, положительные и отрицательные точки на ключе датчик видит. А раз так, попробуем собрать свой считыватель.

Внезапно появилось желание сделать получше, так что схему собрал на монтажной (вообще-то она макетная, но знали бы вы, сколько девайсов отправилось «в продакшн» в таком исполнении…) плате.

icibmjmf-ectvtvoqpgbylwxkqg.jpeg

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

#define S1_P_LED 4
#define S2_P_LED 5
#define S3_P_LED 6
#define S1_N_LED 7
#define S2_N_LED 8
#define S3_N_LED 9
#define SENSOR_THRESHOLD 10

int sensor1Zero, sensor2Zero, sensor3Zero;

void setInitialValues() {
  sensor1Zero = analogRead(A0);
  sensor2Zero = analogRead(A1);
  sensor3Zero = analogRead(A2);
}

void setup() {
  setInitialValues();
  digitalWrite(4, HIGH);
  digitalWrite(7, HIGH);
  for (int i = 4; i <= 9; i++) pinMode(i, OUTPUT);
  Serial.begin(115200);
  Serial.println("Magnetic doorphone key reader");
  Serial.println("Press any key to get the dump or put the tag on the sensors to read the polarity");
}

void getSensorValues(int8_t * firstSensor, int8_t * secondSensor, int8_t * thirdSensor) {
  if (analogRead(A0) < sensor1Zero - SENSOR_THRESHOLD) {
    digitalWrite(S1_P_LED, LOW);
    digitalWrite(S1_N_LED, HIGH);
    *firstSensor = -1;
  }
  else if (analogRead(A0) > sensor1Zero + SENSOR_THRESHOLD) {
    digitalWrite(S1_P_LED, HIGH);
    digitalWrite(S1_N_LED, LOW);
    *firstSensor = 1;
  }
  else {
    digitalWrite(S1_P_LED, HIGH);
    digitalWrite(S1_N_LED, HIGH);
    *firstSensor = 0;
  }

  if (analogRead(A1) < sensor2Zero - SENSOR_THRESHOLD) {
    digitalWrite(S2_P_LED, LOW);
    digitalWrite(S2_N_LED, HIGH);
    *secondSensor = -1;
  }
  else if (analogRead(A1) > sensor2Zero + SENSOR_THRESHOLD) {
    digitalWrite(S2_P_LED, HIGH);
    digitalWrite(S2_N_LED, LOW);
    *secondSensor = 1;
  }
  else {
    digitalWrite(S2_P_LED, HIGH);
    digitalWrite(S2_N_LED, HIGH);
    *secondSensor = 0;
  }

  if (analogRead(A2) < sensor3Zero - SENSOR_THRESHOLD) {
    digitalWrite(S3_P_LED, LOW);
    digitalWrite(S3_N_LED, HIGH);
    *thirdSensor = -1;
  }
  else if (analogRead(A2) > sensor3Zero + SENSOR_THRESHOLD) {
    digitalWrite(S3_P_LED, HIGH);
    digitalWrite(S3_N_LED, LOW);
    *thirdSensor = 1;
  }
  else {
    digitalWrite(S3_P_LED, HIGH);
    digitalWrite(S3_N_LED, HIGH);
    *thirdSensor = 0;
  }
}

void processKey() {
  Serial.println("Waiting for key...");
  int8_t n1, n2, n3;
  int8_t point1, point2, point3;
  for (int i = 0; i < 5; i++) {
    while (1) {
      getSensorValues(&n1, &n2, &n3);
      if ((n1 != 0) && (n2 != 0) && (n3 != 0)) {
        point1 = n1;
        point2 = n2;
        point3 = n3;
        break;
      }
    }
    if (point1 == 1) Serial.print('+');
    else Serial.print('-');
    if (point2 == 1) Serial.print('+');
    else Serial.print('-');
    if (point3 == 1) Serial.print('+');
    else Serial.print('-');
    Serial.println();
    while (1) {
      getSensorValues(&n1, &n2, &n3);
      if ((n2 != point2) && (n2 != 0)) break;
    }
  }
  Serial.println("Press any key to read another tag");
}

void loop() {
  int8_t n1, n2, n3;
  getSensorValues(&n1, &n2, &n3);
  if (Serial.available()) {
    Serial.read();
    processKey();
  }
}


Принцип работы программы достаточно простой. К трём аналоговым входам МК подключены три датчика Холла (аналогично тому, как это делалось в первом опыте). При запуске считываются их значения в момент, когда магнитного поля рядом нет. Вообще, было бы неплохо добавить тут какой-нибудь медианный фильтр, но оно нормально работает и без него. Далее в цикле вызывается функция опроса трёх датчиков. В ней считывается значение каждого из них, после чего определяется полярность, которая попутно отображается на светодиодах: четвёртый, пятый и шестой выводы — красные светодиоды, седьмой, восьмой и девятый — зелёные. При обнаружении положительно намагниченной точки загорается красный, отрицательно — зелёный. При отсутствии намагничивания горит оранжевый (включены оба кристалла в двухцветном светодиоде). Значение SENSOR_THRESHOLD в начале программы обозначает, на какое число единиц может отклониться значение с АЦП, чтобы оно перестало считаться отсутствием магнитного поля.

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

g_iragnumknkj4rtcclj_yds5g4.jpeg

Настройка девайса достаточно простая: заливаем прошивку, берём какой-нибудь ключ и три раза пытаемся его считывать. Если получается отсебятина, подкручиваем SENSOR_THRESHOLD и пробуем снова.

lkihg9_lr8ifgc3zer6lcf0fj5c.png

У меня уверенного чтения удалось добиться при таковом значении, равном десяти. Если на всей площади ключа ничего не видно, значит, у вас либо не те датчики, либо ключ-болванка без записи.

Программатор


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

u4mfeh__qo79xtnswymbilvnk2u.png

Вот для примера один из самых распространённых «копировщиков». Принцип до невозможности простой: датчики Холла считывают магнитные точки, а затем этот паттерн набивается на заготовку при помощи штифта с неодимовыми магнитами на концах.

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

1kfceffefcwq4ahil8xai-po2po.jpeg

У меня есть вот такой программатор, судя по всему, ровесник самой компании «Факториал». Экземпляр явно кустарного производства запросто способен оказаться героем какой-нибудь темы «Что это такое?». В самом деле: тяжёлый металлический корпус без каких-либо обозначений, две неоновые лампочки, тумблер и какая-то кнопка уже заставляют задуматься над предназначением. А непонятный шаблон слева вообще способен поставить в ступор обывателя.

nj4jecdglekutfbubtiighjfzw4.jpeg

Собственно, область для прикладывания ключа. Хорошо виден металлический штырёк, соединённый с сердечником электромагнита внутри. Именно он и производит намагничивание точки на ключе. Приклеенный шаблон облегчает позиционирование ключа для записи последовательно всех точек сразу. Размер шаблона такой: длина — тридцать миллиметров, ширина соответствует ширине ключа.

rkg_sg1r-ddidrkcinqi-jvlizu.jpeg

Примерно так это выглядит в процессе намагничивания.

e9kggsf4aoprbwrvlq0gi25jhps.jpeg

ry3wrv_c32hyd8ntmvzxhwaqumo.jpeg

А вот и все элементы управления. Девайс имеет световую (горящая в момент записи лампочка) и звуковую (характерное «уууу» работающего электромагнита) индикацию работы. Тумблером необходимо выбрать необходимую полярность намагничивания, далее коротким нажатием кнопки производится «прожиг». Разумеется, помимо программирования ключей девайс также отлично справляется и с намагничиванием мелких металлических деталей. Но тут важно не переусердствовать: если слишком долго держать кнопку, электромагнит может перегреться и сдохнуть.

amke5_g3mwdyb5z-p23yelfxqom.jpeg

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

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

Коды ключей


zeajmvswjbco6-lh3epb9x2t5cc.jpeg

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

9 7 5 3 1
+ - + - +
8 6 4 2 0

lgda_fhzc8wd9ftmltmgii95lre.jpeg

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

iep_objalfwr3v-u51bsiwx5opg.jpeg

А вот и приближённое к реальному расположение магнитных точек на ключе.
При этом, как несложно догадаться,»+» символизирует единицу, а »-» — ноль. То есть, например, паттерн ключа кодом 208 будет выглядеть так:

- + - - -
+ - + - +
- + + - -


Таким образом, максимально возможный код ключа — 1023, который выглядит так:

+ + + + +
+ - + - +
+ + + + +


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

X X X X X
+ - + - +
X X X X X


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

#include 
#include 

using namespace std;

int main()
{
    int keyCode = 0;
    cout << "Enter the code" << endl;
    cin >> keyCode;
    cout << "Key pattern:" << endl;
    for(int i = 9; i >= 1; i -= 2) {
        if(keyCode & (1 << i)) cout << '+';
        else cout << '-';
        cout << ' ';
    }
    cout << endl << "+ - + - +" << endl;
     for(int i = 8; i >= 0; i -= 2) {
        if(keyCode & (1 << i)) cout << '+';
        else cout << '-';
        cout << ' ';
    }
    return 0;
}


Размагничивание


ov1js-vfgzitfwyez6rkxycmlu0.jpeg

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

oafdgkhsvz7jv3x8us8featvu6u.jpeg

Это значит, лишить себя возможности попасть в подъезд можно чем угодно: ношением связки ключей в клатче с магнитным замком, наличием у себя брелочка, содержащего в себе магнит, или просто поднесением ключей к источнику магнитного поля. Не забываем и о том, что данные не имеют ни коррекции ошибок, ни контрольной суммы: достаточно протухнуть даже одному биту, и дверь уже не открыть. В посте про магнитные карты я упоминал, что некая Mottura делала ключи с неодимовыми магнитами, ну так вот, наличие такого у вас на связке — практически гарантированный epic fail.
iButton, EM-Marine, Mifare лишены данного недостатка и к магнитным полям невосприимчивы. Конечно, их всё же можно убить статикой (хотя тут тоже надо постараться) или, например, поднесением к деактиватору противокражных меток, что стоят практически везде, где торгуют более-менее дорогим товаром, но всё же такие ситуации бывают намного реже.

Легенда об FF


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

Ни на одной из имеющихся у меня панелей баг не проявляется, количество ключей везде прописывается. Возможно, это когда-то работало на более старых версиях прошивки. У «Факториала» всё ещё интереснее: в пустых ячейках прописан код 2047, однако ключа с таким кодом попросту не существует.

На каких устройствах такой баг есть, мне неведомо (впрочем, есть сведения, что такая уязвимость имелась на некоторых панелях вызова «Метаком», которые на прикладывание болванки реагировали как на мастер-ключ). Упомянутые в начале статьи домофоны с оптическим ключом (по некоторым данным) открывались просто вставленной в слот бумажкой, подозреваю, что тут была та же уязвимость. Знающие о таком косяке монтажники специально забивали всю оставшуюся память мастер-ключами.

Вот как-то так


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

В наши дни подобные артефакты постепенно уходят в историю. Даже в родном Челябинске остаётся всё меньше подъездов, где остались такие панельки. Взамен ненадёжных магнитных клю

© Habrahabr.ru