О чудный мир Fermax (часть 1, ADS Citymax monitor)

Через неопределенное время после переезда на новую квартиру мое внимание привлек терминал видеодомофона, грустно висевший непосредственно у входной двери. Ничего особенного, не молодой терминал испанской компании Fermax, модель CityMax ADS 2447 с гордой надписью High Resolution Flat Monitor, толщиной миллиметров семьдесят и со странным изогнутым белым экраном.

CityMax ADS 2447

CityMax ADS 2447

Экран на поверку оказался плоской электронно-лучевой трубкой 4''(10 см) DDY-D0100, похожие использовались в портативных телевизорах Sony Watchman

SONY 03JM Monochrome Watchman CRT

SONY 03JM Monochrome Watchman CRT front

SONY 03JM Monochrome Watchman CRT front

SONY 03JM Monochrome Watchman CRT side

SONY 03JM Monochrome Watchman CRT side

Давайте разберем терминал и ознакомимся с его внутренним миром.

0b0b63e0cd798402fce3149ca86c1b4a.png

Справа расположен экран и кнопка включения камеры. Внизу органы управления терминалом: кнопка включения, регуляторы яркости и контраста.

c7c97b25069017acaa9a6930fc8ca8b3.png

На плате в левой части терминала, под телефонной трубкой, можно обнаружить микроконтроллер PIC16F627 с наклейкой »98541 (part number?) v3.0 (версия прошивки?)». Микроконтроллер обладает 1024×14 words Flash, 224×8 bit RAM и 128×8 bit EEPROM. Он установлен на панельку, и мы можем без проблем снять его и попытаться считать на программаторе.

PIC16F627

a1a51e8c9d967f9c7dc1a03837caca5e.png

Как и ожидалось, мы получаем CONFIGURATION WORD 0×0337, где биты 13–10 (CP1: CP0) это фюзы защиты кода в областях 1K/2K flash памяти.

0x337 биты 13-10 (CP1:CP0)

0×337 биты 13–10 (CP1: CP0)

00 00 означает

00 00 означает »0000h-07FFh code protected» и »0000h-03FFh code protected» соответственно

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

У терминала есть функция Auto-Start, при нажатии кнопки камеры около 2 секунд он посылает команду центральной панели включить камеру. Давайте подключим осциллограф и посмотрим, что именно отсылает терминал.

86bbb1d43c71b261e96d691d05f3ce1f.png

Как оказалось это обычная последовательная передача данных со скоростью 1200 bps (8) data bits, odd parity, one (1) stop bit, но с уровнем сигнала около 18–20 вольт.

Давайте соорудим сниффер, но для этого нам придется привести уровни сигнала к 3.3 или 5 вольт. Возьмем то, что есть под рукой: диод Zener на 5 вольт, резистор 10Ком и Arduino Nano, и покдлючим в соответствии со следующей рекомендацией.

a028e2146628934cd073a01cb5d26e8c.png

Vout будет подключен к pin 8 Arduino (это будет сигнал RX нашего последовательного порта). Стандартная библиотека SoftwareSerial не поддерживает odd parity, поэтому воспользуемся библиотекой AltSoftSerial и создадим простенький скетч.

Arduino sketch

#include 

// 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)

Направление передачи относительно терминала

Кодовое название функции и ее краткое описание

0×59

Получено

OK/ACK — подтверждение от центральной панели

0xA9

Получено

Ring — звонок от центральной панели

0xAF

Отправлено

Open audio channel — начало разговора

0×53

Отправлено

Auto-Start — включить камеру

0×2B

Отправлено

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 секунд, потом процедуру придется повторить снова, и снова…

Doom на видеодомофоне

Doom на видеодомофоне

Наигравшись и смахнув слезы умиления с уставших от электронно-лучевой трубки глаз, возрадуемся, что прогресс шагнул с тех пор так далеко. Было бы неплохо вывести звук, например на трубку домофона, …, но мы заигрались.

Так вот, висит терминал себе на стене, функцию свою исправно выполняет, включается и выключается с забавными сопутствующими ЭЛТ артефактами. Но, чтобы открыть дверь, приходится буквально подходить к нему ногами и нажимать пальцем на кнопку, как в те, уже ушедшие времена позапрошлого десятилетия.

Уважаемый читатель наверное начинает догадываться, что зародилась необратимая мысль тем или иным способом автоматизировать этот трудоемкий процесс.
Гугл тут как тут, предлагает вариант «Northcliff Home Automation Door Intercom Monitor». Вариант бесспорно интересный, для похожего терминала на более старой технологии (4+N). Предстоит доработка самого терминала, необходимы: Raspberry Pi, USB карта виде захвата. А само решение будет выглядеть так

0880ccb01e11dc71e2c97f50d6f027fb.png

или так

94e1dd8d3e1579df4e8169ec5f37f87a.png

Ээээ, пожалуй, нет, … погуглим еще немного.

Продолжение следует.

© Habrahabr.ru