Как я подружил Hikvision с обычной DECT-трубкой через Asterisk — двусторонний звук и открытие калитки
Всем привет. Хочу поделиться своим опытом, как я подружил вызывную панель 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;
8 ГБ RAM;
Proxmox VE;
Asterisk запущен отдельно в LXC 100;
версия Asterisk 22.10.1;
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
VDP-H3212W: 10010110001
А сама панель использует не только обычный SIP-порт 5060, но ещё и собственный private SIP proxy на 5065.
Штатный вызов выглядел примерно так:
DS-KV6113
192.168.1.76:5060
|
v
Hikvision Private SIP
192.168.1.76:5065
|
v
VDP-H3212W
192.168.1.192:5060
То есть внутри это действительно SIP, но со своей логикой, XML-сообщениями, Digest-аутентификацией и довольно нетипичным поведением.
Именно по PCAP стало понятно, что правильнее не пытаться насильно превращать саму панель в обычный SIP-телефон, а встроиться в родную архитектуру Hikvision.
Следующая находка оказалась ключевой: Asterisk можно зарегистрировать как indoor extension у штатного видеодомофона.
Как Asterisk стал indoor extension Hikvision
У VDP-H3212W есть возможность зарегистрировать дополнительное внутреннее устройство.
В моём случае Asterisk зарегистрирован как:
10000000005
То есть итоговая логика получилась такая:
DS-KV6113
|
v
VDP-H3212W
|
+--> indoor extension 10000000005
|
v
Asterisk
|
v
Keenetic / DECT 101
Для регистрации пришлось использовать отдельный Python-скрипт, потому что обычного SIP REGISTER оказалось недостаточно: Hikvision ждёт дополнительный XML-блок с данными устройства.
Пример XML:
<regXML>
<version>V2.0.0</version>
<regDevName>Asterisk</regDevName>
<regDevSerial>Q12345678</regDevSerial>
<regDevMacAddr>00:0c:29:12:12:12</regDevMacAddr>
</regXML>
После Digest-аутентификации регистрация проходит нормально:
REGISTER
401 Unauthorized
REGISTER + Authorization
200 OK
После этого VDP начинает отправлять вызов на Asterisk.
На Asterisk входящий вызов попадает в отдельный context и дальше уходит на DECT 101.
Пример dialplan:
[hikvision-indoor-in]
exten => 10000000005,1,NoOp(Hikvision indoor call)
same => n,Progress()
same => n,Set(CALLERID(num)=105)
same => n,Set(CALLERID(name)=Gate)
same => n,Dial(PJSIP/101,40)
same => n,Hangup()
На этом этапе трубка уже начала звонить.
Но дальше началась самая неприятная часть — звук.
Почему сначала был односторонний звук
Hikvision в моём случае упорно использовал для аудио порт:
UDP 9654
В SDP панели было:
m=audio 9654 RTP/AVP 0 8 101
То есть PCMU, PCMA и DTMF.
Проблема в том, что Asterisk по умолчанию выбирает для RTP случайный порт из своего диапазона.
Например:
10516
14112
17510
Но Hikvision при этом всё равно отправлял аудио на:
192.168.1.95:9654
Получалось так:
101 -> Asterisk -> панель
работает,
а:
панель -> Asterisk -> 101
не работает.
То есть я слышу не то направление, которое нужно, либо звук вообще получается односторонним.
Первый фикс
На endpoint Hikvision я зафиксировал RTP-диапазон:
rtp_port_start=9654
rtp_port_end=9656
После этого Asterisk начал реально слушать порт 9654, и звук с панели появился.
Но тут проявилась вторая проблема.
У меня было включено:
rtp_symmetric=yes
Asterisk увидел входящий RTP и решил отправлять ответный звук на адрес источника медиапакетов.
В итоге голос с трубки уходил не на саму панель 192.168.1.76, а на VDP 192.168.1.192.
Хотя в SDP было явно указано:
c=IN IP4 192.168.1.76
m=audio 9654
Финальный фикс
Рабочая комбинация получилась такой:
rtp_port_start=9654
rtp_port_end=9656
rtp_symmetric=no
direct_media=no
После этого Asterisk:
принимает аудио панели на 9654;
не переучивает адрес назначения;
отправляет обратный RTP туда, куда указано в SDP, то есть на саму панель 192.168.1.76:9654.
И наконец получился нормальный двусторонний разговор.
Что получилось в итоге
Сейчас схема работает полностью так, как я изначально хотел.
При нажатии кнопки на калитке:
штатный VDP-H3212W продолжает звонить как раньше;
одновременно звонит обычная DECT-трубка 101;
вызов можно принять на трубке;
звук работает в обе стороны;
разговор держится стабильно;
клавишей # на DECT-трубке открывается замок калитки.
То есть обычная беспроводная трубка фактически стала полноценной аудиотрубкой домофона, при этом штатная Hikvision-система не была сломана и продолжает работать в своём родном режиме.
Почему Home Assistant я не использовал для самого разговора
Home Assistant у меня тоже установлен и Hikvision с ним интегрирован.
Он отлично подходит для автоматизаций: можно ловить нажатие кнопки, отправлять уведомления, включать свет, показывать камеру, делать объявление через Алису и так далее.
Но для самого разговора HA здесь не нужен.
Через HA я мог сделать только такую логику:
Нажали кнопку
|
v
Home Assistant
|
v
Asterisk
|
v
DECT 101
Трубка бы звонила, но родной аудиопоток Hikvision туда не попадал бы.
Поэтому сам разговор реализован на уровне SIP/RTP, а Home Assistant оставлен для будущей автоматизации.
Почему вообще выбрал Asterisk
У меня два дома на одном участке, находятся примерно в 15 метрах друг от друга.
Поэтому дальше хочется сделать уже нормальную домашнюю телефонию:
Дом 1
|
+--> DECT 101
Дом 2
|
+--> свой внутренний номер
Калитка
|
+--> нужные трубки
+--> видеодомофон
+--> уведомления
Плюс хочется связать всё это с Home Assistant, Frigate, камерой у калитки, Алисой и телевизором.
И вот здесь Asterisk оказался гораздо интереснее любой закрытой аппаратной мини-АТС: всю логику можно менять программно.
Что бы я посоветовал тем, кто захочет повторить
Самый полезный вывод из всей этой истории — не пытаться угадывать, как Hikvision работает внутри.
Сначала лучше снять PCAP штатного рабочего вызова и посмотреть:
INVITE
SDP
RTP
MESSAGE
Digest
реальные номера устройств
реальные IP и порты
У меня именно анализ пакетов показал, куда Hikvision на самом деле отправляет звук и почему стандартные настройки Asterisk не работали.
Особенно важными оказались:
rtp_port_start=9654
rtp_port_end=9656
rtp_symmetric=no
direct_media=no
Без первого фикса Asterisk слушал не тот RTP-порт.
Без второго — отправлял голос не на панель, а на VDP.
Что дальше
Следующий этап — подключить второй дом и уже нормально развести внутреннюю нумерацию.
После этого хочу добавить:
звонок с калитки
|
+--> VDP
+--> DECT
+--> Home Assistant
+--> уведомление на телефон
+--> Алиса
+--> камера на ТВ
Пока главное уже сделано — родной Hikvision работает, DECT работает, двусторонний звук есть, замок открывается с трубки.
Если кому-то будет интересно, могу отдельным постом выложить уже полностью готовые конфиги Asterisk, регистрацию indoor extension и примеры SIP/RTP-логов.
Может, кому-то с таким же Hikvision это сэкономит пару вечеров с Wireshark :)


