Панель:
• шесть страниц с маршрутизацией по хэшу: Обзор, Last Heard, Хотспоты,
Группы, Доступ, Настройки;
• журнал приходит живым потоком (SSE) вместо опроса раз в две секунды;
• Last Heard: кто, куда, когда, сколько, через какой хотспот;
• в таблице хотспотов — ВСЁ, что устройство сообщает в RPTC.
Контроль доступа (два независимых уровня, их легко перепутать):
• хотспот пускается по паролю — у каждого может быть свой, плюс режим
«только из списка» и отключение конкретного устройства;
• абонент (поле src, владелец рации) допускается белым/чёрным списком с
поддержкой диапазонов. Встроено в штатный хук guard ядра.
Два бага по дороге:
• поля RPTC читались как colorcode/latitude/longitude, а разборщик отдаёт
color_code/lat/lon — половина таблицы молча пустовала;
• столбец «описание» на деле содержит СТРАНУ: именно туда Pi-Star кладёт
country. Переименован.
tests/test_access.py 20/20, tests/test_panel.py 31/31 (включая наполнение
Last Heard настоящим рукопожатием и голосовым вызовом по UDP).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XvX94Vwy7vXWEuiFm1g9Av
Мастер считает время по monotonic, панель по time.time(). В зеркале состояния
last_seen не обновлялся вовсе, поэтому «простой» рос вместе со временем в сети:
хотспот, живой 44 минуты, показывался как молчащий 44 минуты. Оператор решил бы,
что связь отвалилась.
Заодно счётчик принятых кадров: был вечный ноль, теперь считается в маршрутизаторе.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XvX94Vwy7vXWEuiFm1g9Av
Ядро протокола форкнуто из dmrhubv2 (~1300 строк из 31700): analyzer, server,
parrot, dmr_voice, bptc. Отрезаны портал, БД, мосты, алерты, динамические
подписки. Своё: конфиг, состояние, маршрутизатор, панель, установщик.
Ноль зависимостей — на Debian 13 действует PEP 668, pip в систему запрещён.
Две правки под Pi-Star, которых в исходном коде не было:
• peer_id переписывается на получателя (байты 11-14) через хук encode_for —
так делают HBlink3/HBlink4 и BrandMeister, а DMRGateway на Pi-Star стоит
между MMDVMHost и сетью;
• приватный вызов при неизвестном абоненте уходит всем, а не в никуда
(взято из HBlink4: user cache with broadcast fallback).
docs/PROTOCOL.md фиксирует, что тест-вектор auth-хеша в спецификации 2015 года
ОШИБОЧЕН (посчитан от ASCII-строки соли вместо четырёх байт). Правка кода по
нему сломала бы вход всем хотспотам.
tests/test_e2e.py: 15 проверок настоящими UDP-кадрами MMDVMHost. Все проходят.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XvX94Vwy7vXWEuiFm1g9Av