Через неопределенное время после переезда на новую квартиру мое внимание привлек терминал видеодомофона, грустно висевший непосредственно у входной двери. Ничего особенного, не молодой терминал испанской компании Fermax, модель CityMax ADS 2447 с гордой надписью High Resolution Flat Monitor, толщиной миллиметров семьдесят и со странным изогнутым белым экраном.
Экран на поверку оказался плоской электронно-лучевой трубкой 4''(10 см) DDY-D0100, похожие использовались в портативных телевизорах Sony Watchman
SONY 03JM Monochrome Watchman CRT
Давайте разберем терминал и ознакомимся с его внутренним миром.
Справа расположен экран и кнопка включения камеры. Внизу органы управления терминалом: кнопка включения, регуляторы яркости и контраста.
На плате в левой части терминала, под телефонной трубкой, можно обнаружить микроконтроллер PIC16F627 с наклейкой "98541 (part number?) v3.0 (версия прошивки?)". Микроконтроллер обладает 1024 x 14 words Flash, 224 x 8 bit RAM и 128 x 8 bit EEPROM. Он установлен на панельку, и мы можем без проблем снять его и попытаться считать на программаторе.
PIC16F627
Как и ожидалось, мы получаем CONFIGURATION WORD 0x0337, где биты 13-10 (CP1:CP0) это фюзы защиты кода в областях 1K/2K flash памяти.
Код прошивки мы прочитать не можем, но можем считать EEPROM и видим, что используется только один первый байт для хранения адреса терминала.
У терминала есть функция Auto-Start, при нажатии кнопки камеры около 2 секунд он посылает команду центральной панели включить камеру. Давайте подключим осциллограф и посмотрим, что именно отсылает терминал.
Как оказалось это обычная последовательная передача данных со скоростью 1200 bps (8) data bits, odd parity, one (1) stop bit, но с уровнем сигнала около 18-20 вольт.
Давайте соорудим сниффер, но для этого нам придется привести уровни сигнала к 3.3 или 5 вольт. Возьмем то, что есть под рукой: стабилитрон (диод Zener) на 5 вольт, резистор 10Ком и Arduino Nano, и покдлючим в соответствии со следующей рекомендацией.
Vout будет подключен к pin 8 Arduino (это будет сигнал RX нашего последовательного порта). Стандартная библиотека SoftwareSerial не поддерживает odd parity, поэтому воспользуемся библиотекой AltSoftSerial и создадим простенький скетч.
Arduino sketch
#include <AltSoftSerial.h>
// Arduino UNO/Nano RX pin D8
AltSoftSerial fermaxSerial;
void setup() {
// Init USB serial
Serial.begin(115200);
Serial.println("fermaxSerial: Start");
// Init Fermax Serial
fermaxSerial.begin(1200, SERIAL_8O1);
}
void loop() {
char buffer[3];
unsigned long currentMicros = micros();
if (fermaxSerial.available()) {
// Get the first byte
unsigned char reponse = fermaxSerial.read();
sprintf (buffer, "%02X", reponse);
Serial.print(buffer);
// Start timer 10000 microsec
currentMicros = micros();
while(micros() - currentMicros < 10000)
{
if (fermaxSerial.available()) {
// Get the second byte
unsigned char reponse = fermaxSerial.read();
sprintf (buffer, "%02X", reponse);
Serial.print(buffer);
break;
}
}
Serial.print("\r\n");
}
}
Общение между терминалом и центральной панелью происходит двумя байтами, где:
первый байт - это функция.
второй байт - это адрес терминала. 0xF0 (240) специальный адрес, используется функцией OK/ACK.
Список функций, которые я смог собрать сниффером:
Код функции (hex) |
Направление передачи относительно терминала |
Кодовое название функции и ее краткое описание |
0x59 |
Получено |
OK/ACK - подтверждение от центральной панели |
0xA9 |
Получено |
Ring - звонок от центральной панели |
0xAF |
Отправлено |
Open audio channel - начало разговора |
0x53 |
Отправлено |
Auto-Start - включить камеру |
0x2B |
Отправлено |
Open door - открыть дверь |
Примеры лога сниффера
Аuto-Start
08.05.2024 21:06:49.570 5304 >> Auto-Start ID:05
08.05.2024 21:07:23.084 59F0 << OK ID:F0
В апартаментах с адресом терминала номер 5 нажали на кнопку камеры.
Ring and Open door 1
08.05.2024 18:57:58.715 59F0 << OK ID:F0
08.05.2024 18:57:59.069 A90C << Ring ID:0C
08.05.2024 18:58:05.004 2B0C >> Open door ID:0C
08.05.2024 18:58:11.206 59F0 << OK ID:F0
Кто-то позвонил в апартаменты с адресом терминала номер 12 и через 6 секунд открыли дверь.
Ring and Open door 2
08.05.2024 16:31:57.505 A901 << Ring ID:01
08.05.2024 16:32:17.457 2B01 >> Open door ID:01
08.05.2024 16:32:17.493 2B01 >> Open door ID:01
08.05.2024 16:32:17.524 2B01 >> Open door ID:01
08.05.2024 16:32:20.789 AF01 >> Open channel ID:01
08.05.2024 16:32:20.809 59F0 << OK ID:F0
Кто-то позвонил в апартаменты с адресом терминала номер 1 и через 20 секунд кто-то нажал кнопку открыть дверь 3 раза.
Как заявляет компания Fermax они серьезно относятся к безопасности коммуникаций, и мы не должны получить доступ к видео или аудио сигналу, если звонок поступил в чужие апартаменты. Но по крайней мере сниффером мы можем собирать логи, и он поможет выявлять проблемы с коммуникацией и по возможности поможет устранить неполадки.
Как мы видим запустить, Doom на самом терминале не получится, но у него есть композитный вход для видео, так что мы сможем использовать его как монитор. А у меня как раз пролёживает без дела Raspberry Pi 1 model B на котором присутствует композитный видео выход на RCA разъеме. Давайте установим на него Doom и активируем поддержку композитного видео как показано тут. Добавим в файл /boot/config.txt эту конфигурацию:
sdtv_mode=2
# hdmi_force_hotplug=1
display_auto_detect=1
dtoverlay=vc4-kms-v3d,cma-384,composite=1
Установим и запустим Doom как описано тут:
sudo apt update && sudo apt upgrade && sudo apt install chocolate-doom libgl1-mesa-dri xinit x11-xserver-utils -y
mkdir ~/doom-wad/ && cd ~/doom-wad/
wget https://files.pimylifeup.com/doom/shareware_doom_iwad.zip && unzip shareware_doom_iwad.zip && rm shareware_doom_iwad.zip
chocolate-doom -iwad ~/doom-wad/DOOM1.WAD
Чтобы включить экран терминала мы будем использовать функцию Auto-Start, нажав и удержав кнопку камеры в течение пары секунд. Это позволит нам насладится игрой в течении 30 секунд, потом процедуру придется повторить снова, и снова...
Наигравшись и смахнув слезы умиления с уставших от электронно-лучевой трубки глаз, возрадуемся, что прогресс шагнул с тех пор так далеко. Было бы неплохо вывести звук, например на трубку домофона, ... но мы заигрались.
Так вот, висит терминал себе на стене, функцию свою исправно выполняет, включается и выключается с забавными сопутствующими ЭЛТ артефактами. Но, чтобы открыть дверь, приходится буквально подходить к нему ногами и нажимать пальцем на кнопку, как в те, уже ушедшие времена позапрошлого десятилетия.
Уважаемый читатель наверное начинает догадываться, что зародилась необратимая мысль тем или иным способом автоматизировать этот трудоемкий процесс.
Гугл тут как тут, предлагает вариант "Northcliff Home Automation Door Intercom Monitor". Вариант бесспорно интересный, для похожего терминала на более старой технологии (4+N). Предстоит доработка самого терминала, необходимы: Raspberry Pi, USB карта виде захвата. А само решение будет выглядеть так
или так
Ээээ, пожалуй, нет, ... погуглим еще немного.