Протокол платы замков UPUS-SKB27
Протокол снят эмпирически 2026-08-31 и перепроверен на живом 2026-09-01: все 27 каналов, контрольная сумма сошлась на 28 кадрах из 28. Документа от производителя не существует — в открытом доступе его нет, а вендорское приложение, которое им пользовалось, было стёрто до того, как проект начался.
Здесь — рабочая выжимка. Полная запись с историей поиска живёт в репозитории прошивки
(docs/LOCK-PROTOCOL.md), готовая реализация — в packages/lock-protocol.
Четыре запрета — два из них про необратимую поломку железа.
Кадры 9A и 9B сжигают катушку соленоида за десятки секунд, и плата об этом не сообщит.
Линия
| Значение | |
|---|---|
| Порт | /dev/ttyS0 (узел fdd50000.serial, владелец system:system) |
| Скорость | 9600, 8N1, без управления потоком |
| Физика | RS485, полудуплекс, задний клеммник корпуса |
| Адрес платы | 0x02 — ⚠️ не 1, вопреки DIP-переключателю. Найден развёрткой адресов |
| Каналов | 27, нумерация 1:1 с шелкографией CH01…CH27 |
| Контрольная сумма | XOR всех байтов, кроме последнего |
Соседние порты, чтобы не перепутать: ttyS1 — это Bluetooth-UART, ttyS3 свободен, но
сигнала платы замков там нет, /dev/ttyS2 в системе отсутствует вовсе.
Константы линии живут в packages/lock-protocol/src/protocols.ts: LOCK_PORT, LOCK_BAUD,
LOCK_ADDRESS, LOCK_CHANNELS.
Открыть ячейку
8A <адрес> <канал> 11 <XOR> XOR = 0x8A ^ адрес ^ канал ^ 0x11
CH01 → 8A 02 01 11 98
Плата подтверждает приём эхом того же кадра. Эхо приходит только на кадр со сошедшейся суммой — с испорченной плата молчит вовсе. Значит это разбор, а не закольцовывание линии:
| Послано | Ответ |
|---|---|
| открытие канала 3, сумма верная | эхо кадра |
| открытие канала 3, сумма неверная | тишина |
| чтение всех, сумма верная | кадр состояния |
| чтение всех, сумма неверная | тишина |
| произвольный мусор | тишина |
Эхо говорит «команда принята и проверена». Физический результат знает только датчик: опросить состояние примерно через полсекунды после коман ды (импульс длится 357 мс). Код, который считает подтверждение доказательством открытия, будет ошибаться в поле — и именно там, где ошибку заметит клиент.
Импульс
Длительность задаёт сама плата, команда её не несёт: три измерения по звуку дали 357 / 358 / 357 мс. Это жёсткая константа прошивки платы, удлинить её нашей командой невозможно.
Отсюда правило, зашитое в LOCK_REOPEN_MIN_MS = 500: повторное открытие того же канала
не слать чаще, чем раз в полсекунды, иначе команда придётся на ещё не завершившийся
импульс. Соблюдает его LockBus, а не вызывающий код.
Команды «закрыть» не существует
И существовать не может. Защёлка пружинная, fail-secure: плата даёт импульс, язычок убирается, дальше дверцу закрывает человек рукой и язычок защёлкивается сам.
Следствие для кода: «закрыто» — это показание датчика, а не результат команды. Поля
close в пресете протокола оставлены только на случай моторизованных замков другого вендора.
Прочитать состояние
80 <адрес> <канал> 33 <XOR> XOR = 0x80 ^ адрес ^ канал ^ 0x33
Ответ бывает двух видов:
поканальный (5 байт): 80 <адрес> <канал> <состояние> <XOR>
общий, канал 0 (7 байт): 80 <