Всем привет. Хочу поделиться своим опытом, как я подружил вызывную панель Hikvision со штатным видеодомофоном, Asterisk и обычной DECT-трубкой через Keenetic.
Изначально задача казалась простой: при нажатии кнопки на калитке должен продолжать звонить штатный видеодомофон, но одновременно хотелось, чтобы звонила и обычная домашняя трубка. Причём не просто звонила, а чтобы через неё можно было нормально разговаривать с посетителем в обе стороны и клавишей # открывать замок.
В итоге всё заработало именно так, как хотелось. Но по пути пришлось разбираться с Private SIP Hikvision, нестандартной регистрацией indoor extension, анализировать PCAP и отдельно ловить проблему с RTP-портами.
Что у меня за оборудование
вызывная панель Hikvision DS-KV6113-PE1(C) — 192.168.1.76;
штатный видеодомофон HiWatch VDP-H3212W — 192.168.1.192.
роутер Keenetic / Netcraze Ultra NC-1812;
DECT-модуль и обычные беспроводные трубки;
основная трубка первого дома — внутренний номер 101.
мини-ПК CHUWI HeroBox на Intel N100;
Asterisk запущен отдельно в LXC 100;
IP Asterisk — 192.168.1.95.
Сам сервер у меня используется не только для телефонии. На нём отдельно живут Home Assistant и Frigate, поэтому я изначально не хотел ставить Asterisk прямо на Proxmox-хост.
Логика простая: каждый сервис в своём контейнере или VM. Если я что-то сломаю, экспериментируя с телефонией, Home Assistant, видеонаблюдение и сам Proxmox продолжают работать.
Почему я не стал переводить панель в обычный SIP
Самый очевидный вариант — включить на панели Standard SIP и зарегистрировать её напрямую в Asterisk.
Но мне хотелось не заменить штатную систему Hikvision, а дополнить её.
штатный вызов на VDP-H3212W;
всю внутреннюю логику Hikvision.
И параллельно добавить обычную DECT-трубку.
Поэтому Standard SIP на панели я оставил выключенным.
Именно это решение потом и привело к более интересному варианту — подключить Asterisk не как SIP-сервер для панели, а как дополнительную indoor extension Hikvision.
Почему пришлось лезть в PCAP
На этом этапе стало понятно, что обычным SIP здесь всё не ограничивается.
Панель продолжала прекрасно звонить на штатный VDP-H3212W, но Asterisk этот вызов не видел. Через Home Assistant можно было поймать событие нажатия кнопки и отдельно заставить Asterisk позвонить на 101, но это был просто дополнительный звонок — без нативного аудио с панели.
Такой вариант меня не устраивал.
Поэтому я снял сетевой захват штатного рабочего вызова прямо на Hikvision и начал смотреть, что реально происходит между устройствами.
И тут выяснилось, что у Hikvision внутри своя довольно интересная схема.
Реальные внутренние SIP-номера у меня оказались такие:
Вызывная панель: 10010100000
А сама панель использует не только обычный SIP-порт 5060, но ещё и собственный private SIP proxy на 5065.
Штатный вызов выглядел примерно так:
То есть внутри это действительно SIP, но со своей логикой, XML-сообщениями, Digest-аутентификацией и довольно нетипичным поведением.
Именно по PCAP стало понятно, что правильнее не пытаться насильно превращать саму панель в обычный SIP-телефон, а встроиться в родную архитектуру Hikvision.
Следующая находка оказалась ключевой: Asterisk можно зарегистрировать как indoor extension у штатного видеодомофона.
Как Asterisk стал indoor extension Hikvision
У VDP-H3212W есть возможность зарегистрировать дополнительное внутреннее устройство.
В моём случае Asterisk зарегистрирован как:
То есть итоговая логика получилась такая:
+--> indoor extension 10000000005
Для регистрации пришлось использовать отдельный Python-скрипт, потому что обычного SIP REGISTER оказалось недостаточно: Hikvision ждёт дополнительный XML-блок с данными устройства.
<version>V2.0.0</version>
<regDevName>Asterisk</regDevName>
<regDevSerial>Q12345678</regDevSerial>
<regDevMacAddr>00:0c:29:12:12:12</regDevMacAddr>
После Digest-аутентификации регистрация проходит нормально:
После этого VDP начинает отправлять вызов на Asterisk.
На Asterisk входящий вызов попадает в отдельный context и дальше уходит на DECT 101.
exten => 10000000005,1,NoOp(Hikvision indoor call)
same => n,Set(CALLERID(num)=105)
same => n,Set(CALLERID(name)=Gate)
same => n,Dial(PJSIP/101,40)
На этом этапе трубка уже начала звонить.
Но дальше началась самая неприятная часть — звук.
Почему сначала был односторонний звук
Hikvision в моём случае упорно использовал для аудио порт:
m=audio 9654 RTP/AVP 0 8 101
То есть PCMU, PCMA и DTMF.
Проблема в том, что Asterisk по умолчанию выбирает для RTP случайный порт из своего диапазона.
Но Hikvision при этом всё равно отправлял аудио на:
101 -> Asterisk -> панель
панель -> Asterisk -> 101
То есть я слышу не то направление, которое нужно, либо звук вообще получается односторонним.
На endpoint Hikvision я зафиксировал RTP-диапазон:
После этого Asterisk начал реально слушать порт 9654, и звук с панели появился.
Но тут проявилась вторая проблема.
Asterisk увидел входящий RTP и решил отправлять ответный звук на адрес источника медиапакетов.
В итоге голос с трубки уходил не на саму панель 192.168.1.76, а на VDP 192.168.1.192.
Хотя в SDP было явно указано:
Рабочая комбинация получилась такой:
принимает аудио панели на 9654;
не переучивает адрес назначения;
отправляет обратный RTP туда, куда указано в SDP, то есть на саму панель 192.168.1.76:9654.
И наконец получился нормальный двусторонний разговор.
Сейчас схема работает полностью так, как я изначально хотел.
При нажатии кнопки на калитке:
штатный VDP-H3212W продолжает звонить как раньше;
одновременно звонит обычная DECT-трубка 101;
вызов можно принять на трубке;
звук работает в обе стороны;
разговор держится стабильно;
клавишей # на DECT-трубке открывается замок калитки.
То есть обычная беспроводная трубка фактически стала полноценной аудиотрубкой домофона, при этом штатная Hikvision-система не была сломана и продолжает работать в своём родном режиме.
Почему Home Assistant я не использовал для самого разговора
Home Assistant у меня тоже установлен и Hikvision с ним интегрирован.
Он отлично подходит для автоматизаций: можно ловить нажатие кнопки, отправлять уведомления, включать свет, показывать камеру, делать объявление через Алису и так далее.
Но для самого разговора HA здесь не нужен.
Через HA я мог сделать только такую логику:
Трубка бы звонила, но родной аудиопоток Hikvision туда не попадал бы.
Поэтому сам разговор реализован на уровне SIP/RTP, а Home Assistant оставлен для будущей автоматизации.
Почему вообще выбрал Asterisk
У меня два дома на одном участке, находятся примерно в 15 метрах друг от друга.
Поэтому дальше хочется сделать уже нормальную домашнюю телефонию:
+--> свой внутренний номер
Плюс хочется связать всё это с Home Assistant, Frigate, камерой у калитки, Алисой и телевизором.
И вот здесь Asterisk оказался гораздо интереснее любой закрытой аппаратной мини-АТС: всю логику можно менять программно.
Что бы я посоветовал тем, кто захочет повторить
Самый полезный вывод из всей этой истории — не пытаться угадывать, как Hikvision работает внутри.
Сначала лучше снять PCAP штатного рабочего вызова и посмотреть:
реальные номера устройств
У меня именно анализ пакетов показал, куда Hikvision на самом деле отправляет звук и почему стандартные настройки Asterisk не работали.
Особенно важными оказались:
Без первого фикса Asterisk слушал не тот RTP-порт.
Без второго — отправлял голос не на панель, а на VDP.
Следующий этап — подключить второй дом и уже нормально развести внутреннюю нумерацию.
После этого хочу добавить:
+--> уведомление на телефон
Пока главное уже сделано — родной Hikvision работает, DECT работает, двусторонний звук есть, замок открывается с трубки.
Если кому-то будет интересно, могу отдельным постом выложить уже полностью готовые конфиги Asterisk, регистрацию indoor extension и примеры SIP/RTP-логов.
Может, кому-то с таким же Hikvision это сэкономит пару вечеров с Wireshark :)