Медиасервер предназначен для прокcирования речевой и видео-информации по протоколу RTP, организации конференций, записи разговоров, воспроизведения медиафайлов и различных комбинаций этих режимов.
Управление ресурсами медиасервера осуществляется с помощью механизма control channel (RFC 6230 Media Control Channel Framework, RFC 6231 IVR Control Package, RFC 6505 Mixer Control Package).
Для настройки медиасервера выполните следующие шаги:
Установка программного медиасервера производится из репозитория ECSS-10, пакет ecss-media-server.
Для установки в консоли ОС Linux необходимо выполнить команду:
sudo apt update sudo apt install ecss-media-server |
В ходе установки необходимо будет ответить на ряд вопросов для формирования, основных параметров, конфигурационного XML-файла. Описание параметров приведено на странице Настройка конфигурационного файла MSR.
Конфигурационный XML-файл после установки медиасервера находится по пути /etc/ecss/ecss-media-server/config.xml.
Параметры в конфигурационном файле сгруппированы в секции (теги XML) таким образом:
config
|--- general
|--- transport
|--- turn-server
|--- media
|--- codec
|--- ivr
|--- accounts
|--- pbyte
|--- conf_dir
|--- rtp
Внутри каждой секции (тега XML) параметры тоже могут группироваться во вложенные теги и указываются как XML-атрибуты (name="value").
Для каждого параметра имеется значение по умолчанию, поэтому формально ни одна секция не является обязательной для указания в конфигурационном файле, но разумеется, это не значит, что отсутствие какой-то секции при конфигурировании MSR не скажется негативно на его работе. |
Значение "по умолчанию" - это значение, используемое при отсутствии параметра в конфигурационном файле и/или предустановленные в deb.
Многие значения уже присутствуют в базовом config.xml, содержащимся внутри deb-пакета ecss-media-server (*deb-config).
Он помещается по стандартному пути (/etc/ecss/ecss-media-server/config.xml). Если настройка присутствует в базовом файле конфигурации и её значение отличается от значения по умолчанию, оно приводится ниже в описании настроек с пометкой *base-config.
Также при установке / переустановке или запуске dpkg-reconfigure значения параметров могут меняться. Во время выполнения скриптов установки запрашиваются значения нескольких (не всех) параметров на изменение. При этом их текущие значения предварительно считываются из config.xml файла, либо берутся из deb-шаблона и отображаются в полях ввода скрипта установки как дефолтные. Вне зависимости от того, изменил пользователь настройки в полях ввода или нет, введённые (применённые) значения вносятся снова в config.xml. Если настройка анализируется/проверяется deb-скриптом, в её описании есть пометка *deb-config.
|
Пример конфигурационного файла:
<?xml version="1.0" encoding="utf-8"?>
<config date="14:39:00 10.03.2023">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" calls-delta="100" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" enable-ice-transport="no" ice-update="no" aggressive-ice="yes" stun-server="" suspicious-mode="no"/>
<transport bind-addr="192.168.1.40" port="5040" transport="udp+tcp"/>
<!-- By default configured public TURN-server -->
<turn-server use-turn="no" host="numb.viagenie.ca" user="webrtc@live.com" password="muazkh"/>
<media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" vid-enc-threads="2" vid-dec-threads="2" video-conf-layout="evenly" keyframe-interval="1000" vid-decode-delay="100" silent-codec-switch="yes" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="640" video-enc-height="360" finalsilence="1000" rtcp-stat-dump="yes"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="0" speex="0" l16="0" g7221="0" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<!-- <dynamic msr_name="msr.name"
realm="sip:127.0.0.1:5000"
dtmf_mode="rfc+inband+info"
auth_name="user"
auth_password="password" /> -->
</accounts>
<pbyte>
<mcc bind-addr="192.168.1.40" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
<rtp>
<auto addr-v4=""/>
</rtp>
</config>
|
где:
general — общие настройки медиасервера:
<general |
max-in-group — максимальное количество абонентов в группе в рамках конференции (по умолчанию: "512" *base-config). Если услуга "Конференц-связь" используется с большим количеством участников, то необходимо увеличить значение данного параметра. Максимальное значение 4000; Поскольку участниками объекта конференция (логически) могут быть не только вызываемые абоненты, но и другие конференции (проключение между конференциями), а также объекты диалогов (для воспроизведения сигналов/аудиозаписей и для записи разговоров в аудио-файлы), нужно учитывать, что при указании, например, max-in-group="100" и попытке создать конференцию из 100 участников, некоторые участники (несколько последних подключаемых) не смогут в неё попасть. Лучше указывать значение заведомо больше необходимого в этом параметре;
ipv6-support="yes/no" — включить поддержку IPv6. (значения "yes"/"no", по умолчанию "no");
transport — настройки транспорта:
<transport bind-addr="192.168.1.40" port="5040" transport="udp+tcp"/> |
| Данный параметр необходимо настроить в соответствии с сетевыми настройками хоста. Нужно заменить внутренний 127.0.0.1 на внешний; |
turn-server — настройки TURN-сервера;
<turn-server use-turn="no" host="numb.viagenie.ca" user="webrtc@live.com" password="muazkh"/> |
media — параметры медиа:
<media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" vid-enc-threads="2" vid-dec-threads="2" video-conf-layout="evenly" keyframe-interval="1000" vid-decode-delay="100" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="640" video-enc-height="360" finalsilence="1000" rtcp-stat-dump="yes"/> |
mixer-clock-rate — частота, используемая внутренним микшером медиасервера (по умолчанию: "8000" *deb-config). Интервал возможных значений: [0; 48000] при значении <= 0 выставляется 8000. при значении > 48000 выставляется 48000 и выдаётся предупреждение в лог;
|
cng-level – 0 — (значение по умолчанию -64 dBm). По умолчанию указывается "0" в целях сохранения обратной совместимости. Диапазон применимых значений 3–127 (где значение 3 означает максимальный шум, а 127 — полную тишину).
cng-level в файле конфигурации: |
rtp-timeout, если последний полученный RTP-пакет был с comfort noise (по умолчанию: "3");vid-enc-threads — количество потоков кодера (encoder) (по умолчанию: "2");
vid-dec-threads — количество потоков декодера (по умолчанию: "2" *base-config);
|
Есть два основных варианта сообщения SIP REGISTER ядру SSW со стороны MSR: Тег dynamic может содержать вложенный тег via с вложенным списком тегов iface (максимум - 20). Каждый тег iface имеет обязательные атрибуты name (имя интерфейса) и ip (IP-адрес интерфейса), если значение хотя бы одного из них пустая строка, то тег пропускается (игнорируется). Также тег via может содержать необязательный атрибут dynamic-ifaces, означающий использование динамических интерфейсов при значении "yes" (оно же значение по умолчанию). Использование тега via позволяет подменить в заголовке Via сообщения SIP REGISTER (от MSR - ядру) указанный IP-адрес. Благодаря этому можно избежать многих ошибок/конфликтов регистраций, в т.ч. при работе через VLAN. Алгоритм обработки информации для тегов со вложенностью accounts/dynamic/via и атрибута dynamic-ifaces приведён в блок-схеме ниже:
|
<accounts> |
auth_password — пароль для авторизации (по умолчанию: *deb-config: "password");
via — В случае использования для сигнальной сети нескольких vlan-ов , необходимо скорректировать конфигурационный файл /etc/ecss/ecss-media-server/conf.d/default.xml описав параметр "via":
via — задается список интерфейсов, которые могут быть отправлены в сообщении "SIP REGISTER" поле "Via":
|
|
В теге auto и в теге manual из атрибутов addr-v4 и addr-v6 (содержат публичные IP на замену) должен быть задан хотя бы один. В каждом теге manual атрибут name обязателен.
В одном конфигурационном файле могут быть применены оба режима - и auto, и manual, но приоритет имеют строки manual. И если ни одна строка manual не сработала (интерфейс отсутствует или адрес не резолвится), то тогда обрабатывается тег auto.
auto — автоматический режим. Определяет общий IP для всех sdp, например : <auto addr-v4="192.168.1.2" addr-v6="::1"/>
eth0" addr-v4="192.168.1.3" addr-v6="::1">ядро SSW MSR | | |--------CONREQ--------->| | | |<-------CONRESP---------| | | |----TRANSFER:SYNC------>| | | |<---TRANSFER:SYNC-------| | | |---TRANSFER:CONTROL---->| | XML-body: command | | | |<--TRANSFER:CONTROL-----| | XML-body: event or | | response | | | ~ .... ~ | | < stop exchange by PBYTE > | | | t1 | | | |--------CONUPD--------->| | t2 | |<------CONUPDACK--------| | | |
<pbyte>
<mcc bind-addr="192.168.1.40" port="5700"/>
</pbyte> |
Параметр содержит путь до папки с дополнительными файлами конфигурации MSR. Настройки из этих файлов будут переопределять настройки из основного файла конфигурации (/etc/ecss/ecss-media-server/config.xml).
Содержащиеся по пути path файлы конфигурации считываются в алфавитном порядке, после считывания основного config.xml.
Формат этих файлов аналогичен формату основного файла конфигурации, поэтому при считывании каждого из них, если встречаются параметры с уже заданными значениями (коллизия), то значения этих параметров обновляются.
|
Переопределять настройки конфигурационных файлов можно в каталогах:
Подробнее о запуске нескольких экземпляров см. ниже, в разделе "Запуск медиасервера".
Для этого создаются конфигурационные файлы, которые читаются в алфавитном порядке, например:
<!-- 01-ecss-conf.xml -->
<?xml version="1.0" encoding="utf-8"?>
<config>
<general log-level="4" />
<accounts>
<dynamic msr_name="some name" realm="sip:x.x.x.x:zzzz"
dtmf_mode="rfc+inband+info" auth_name="user1" auth_password="password123"/>
</accounts>
</config>
<!-- 02-ecss-conf.xml -->
<?xml version="1.0" encoding="utf-8"?>
<config>
<rtp>
<auto name="1.1.1.1"/>
</rtp>
</config> |
В результате должен переопределиться уровень логирования и добавиться аккаунт, а также включена опция подмены IP в sdp.
На медиасервером выбор адреса для работы с потоками RTP влияют несколько параметров:
Нужно разграничить потоки RTP, используемые медиа-портами медиасервера (стрим-порты, URL-плеер-порты и т.д.) и потоки RTP для вызовов (IP:port этих потоков указывается MSR-ом в SDP).
IP-адрес RTP-потоков для медиа-портов берётся из параметра media/bind-addr, а если он не указан - из параметра transport/bind-addr.
Выбор медиасервером IP-адреса для RTP в SDP при вызове от ядра происходит так:
1) Через объект net_config MSR получает список сетевых интерфейсов системы и сопоставленных с ними подсетей, с информацией, активны или нет эти сетевые интерфейсы.
2) Если в полученном списке есть интерфейс для IP, указанного в transport/bind-addr, то он используется в мастер-регистрации. Если такой интерфейс не найден, выдаётся сообщение об ошибке в лог и MSR завершает работу.
4) Запускаются мастер-регистрации для каждого из динамических аккаунтов - их параметры перечислены в тегах dynamic внутри секции accounts. В свойствах каждого аккаунта для RTP указывается IP-адрес, указанный в transport/bind-addr.
5) Для прочих сетевых интерфейсов из списка, хранимого net_config, запускается обычная (не-мастер) регистрация (если она не отменена при обработке тега via), и для RTP используется адрес сопоставленной с интерфейсом подсети.
6) Секция rtp с указанием интерфейсов и подмены адресов для RTP прямо в SDP - это уже устаревший механизм, применявшийся раньше, когда использовались статические аккаунты. Если она применяется, то MSR подменит в SDP IP-адрес для RTP на указанные в этой секции (вместо адреса подсети, сопоставленной с указанными сетевыми интерфейсами) - эта подмена происходит после работы логики регистраций и для указанных в секции rtp адресов RTP отменяет её.
Конфигурационный XML-файл после установки медиасервера находится по пути /etc/ecss/ecss-media-server/conf.d/default.xml.
Параметры в конфигурационном файле сгруппированы в секции (теги XML) таким образом:
config
|--- accounts
|--- dynamic
|--- via
|--- iface
После инсталляции пакетов в фале будет указан ip-add 127.0.0.1 , и только для одного хоста.
Требуется указать в конфигурации для обоих хостов, реальные IP-add. |
Необходимо привести содержимое файла к виду указанному снизу (в примере ecss1 имеет IP-add 192.168.1.40/ ecss2 - 192.168.1.50, параметр "via / iface name" при необходимости):
Внутри каждой секции (тега XML) параметры тоже могут группироваться во вложенные теги и указываются как XML-атрибуты (name="value").
Пример конфигурационного файла:
<?xml version="1.0"?>
<config>
<accounts>
<dynamic msr_name="msr.ecss1" realm="sip:192.168.1.40:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password">
<via dynamic-ifaces="no">
<iface name="bond1.75" ip="192.168.1.27"/>
<iface name="bond1.20" ip="192.168.1.28"/>
<iface name="bond1.35" ip="192.168.1.29"/>
<iface name="bond1.36" ip="192.168.1.30"/>
</via>
</dynamic>
<dynamic msr_name="msr.ecss1" realm="sip:192.168.1.50:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password">
<via dynamic-ifaces="no">
<iface name="bond1.75" ip="192.168.1.27"/>
<iface name="bond1.20" ip="192.168.1.28"/>
<iface name="bond1.35" ip="192.168.1.29"/>
<iface name="bond1.36" ip="192.168.1.30"/>
</via>
</dynamic>
</accounts>
</config> |
где:
accounts — параметры регистрации MSR на ядре SSW. Секция может содержать один или несколько (формально до 1000) тегов dynamic с параметрами динамического аккаунта - атрибутами:
Есть два основных варианта сообщения SIP REGISTER ядру SSW со стороны MSR: Тег dynamic может содержать вложенный тег via с вложенным списком тегов iface (максимум - 20). Каждый тег iface имеет обязательные атрибуты name (имя интерфейса) и ip (IP-адрес интерфейса), если значение хотя бы одного из них пустая строка, то тег пропускается (игнорируется). Также тег via может содержать необязательный атрибут dynamic-ifaces, означающий использование динамических интерфейсов при значении "yes" (оно же значение по умолчанию). Использование тега via позволяет подменить в заголовке Via сообщения SIP REGISTER (от MSR - ядру) указанный IP-адрес. Благодаря этому можно избежать многих ошибок/конфликтов регистраций, в т.ч. при работе через VLAN. Алгоритм обработки информации для тегов со вложенностью accounts/dynamic/via и атрибута dynamic-ifaces приведён в блок-схеме ниже:
|
auth_password — пароль для авторизации (по умолчанию: *deb-config: "password");
via — В случае использования для сигнальной сети нескольких vlan-ов , необходимо скорректировать конфигурационный файл /etc/ecss/ecss-media-server/conf.d/default.xml описав параметр "via":
Для работы сервис использует конфигурацию из файлов:
/etc/ecss/ecss-media-server/config.xml |
/etc/ecss/ecss-media-server/conf.d/default.xml |
Подробнее о настройках — в разделе "Настройка конфигурационного файла MSR".
| При изменении конфигурации необходимо обязательно перезапустить сервис ecss-media-server. |
Запуск сервиса:
sudo systemctl start ecss-media-server.service |
Остановка сервиса:
sudo systemctl stop ecss-media-server.service |
Перезапуск сервиса:
sudo systemctl restart ecss-media-server.service |
Описание опций команды ecss-media-server [options].
[options] — опция команды ecss-media-server, принимает значения:
Пример:
ecss-media-server --config=/home/ssw/config.xml |
В состав deb пакета ecss-media-server был добавлен сервис 'ecss-media-server@', который позволяет запускать множество экземпляров медиасервера.
Также для медиасервера был добавлен предсконфигурированный файл конфигурации (с выключенной поддержкой видео) с именем config-without-video.xml.
После установки deb пакета располагается по пути: /etc/ecss/ecss-media-server. Хотя данный файл предсконфигурирован, но для каждого конкретного случая его нужно донастраивать/перенастраивать:
Для каждого нового экземпляра медиасервера, который будет развернут на хосте, требуется использовать свой файл конфигурации медиасервера.
| Отдельно нужно обратить внимание на секцию media: параметры port-start и port-range не должны пересекаться с параметрами уже запущенных msr-ов, иначе в ходе работы на одном из msr-ов могут возникнуть ошибки, ввиду того что данные порты уже будут заняты. Также стоит обратить внимание на секцию mcc, параметр port не должен пересекаться с параметрами уже запущенных msr-ов по той же причине. Параметр log-path должен быть уникальным для каждого MSR. Если путь, указанный в log-path, еще не существует, оператор SSW должен прописать его вручную (пользователь для директории с логами должен быть ssw:ssw). |
В systemd есть возможность запускать множество экземпляров сервиса, но предварительно данные экземпляры нужно включить.
Включение:
sudo systemctl enable ecss-media-server@<имя_запускаемого_экземпляра>
Запуск:
sudo systemctl start ecss-media-server@<имя_запускаемого_экземпляра>
В данном случае этому медиасерверу будет соответствовать файл конфигурации с именем config-<имя_запускамого_экземпляра>.xml, располагаемый по пути /etc/ecss/ecss-media-server/.
Например, включенному и запущенному экземпляру msr-а с именем without-video:
sudo systemctl enable ecss-media-server@without-video Created symlink /etc/systemd/system/multi-user.target.wants/ecss-media-server@without-video.service → /lib/systemd/system/ecss-media-server@.service. sudo systemctl start ecss-media-server@without-video |
будет соответствовать файл конфигурации с именем config-without-video.xml расположенный по пути /etc/ecss/ecss-media-server/.Для каждого экземпляра медиасервера должен быть сконфигурирован свой файл конфигурации медиасервера.
Убедиться, что экземпляр ecss-media-server@without-video запустился можно следующей командой:
ecss1@ssw 05:04:58 ~$ sudo systemctl status ecss-media-server@without-video
● ecss-media-server@without-video.service - daemon ecss-media-server-without/video of ecss-10
Loaded: loaded (/etc/systemd/system/ecss-media-server@.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-12-07 08:07:58 +07; 4s ago
Main PID: 12144 (ecss-media-serv)
Tasks: 19 (limit: 4915)
CGroup: /ecss.slice/ecss-media-server@without-video.service
└─12144 /usr/bin/ecss-media-server --config=/etc/ecss/ecss-media-server/config-without-video.xml --noinput
дек 07 08:07:58 ssw systemd[1]: Started daemon ecss-media-server-without/video of ecss-10.
дек 07 08:07:59 ssw ecss-media-server[8867]: WARNING: no real random source present! |
Наиболее важным пунктом является добавление медиаресурсов |
По умолчанию в качестве источника видео при парковке медиа на msr используется статическая картинка. В конфигурационном файле медиасервера этот параметр настраивается в секции media:
dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" |
Для создания собственной статической или видео-заставки можно использовать утилиты ffmpeg и gstreamer.
Пакеты имеются в репозитории Ubuntu:
sudo aptitude update sudo aptitude install ffmpeg sudo aptitude install gstreamer0.10-tools gstreamer0.10-plugins-base gstreamer0.10-plugins-good sudo add-apt-repository ppa:mc3man/gstffmpeg-keep sudo aptitude update sudo aptitude install gstreamer0.10-ffmpeg |
Статическая картинка
Изображение должно быть в формате YUV420 (цветовая модель сырого кадра видео) и иметь расширение *.yuv. Размер до 1280×720, но лучше использовать меньшие размеры, например 352×288 или 704×576.
Пример конвертации:
bsk@bsk:~$ ffmpeg -i input.png -f rawvideo -pix_fmt yuv420p output.yuv
ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, png_pipe, from 'input.png':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: png, rgb24(pc), 816x460 [SAR 3779:3779 DAR 204:115], 25 tbr, 25 tbn, 25 tbc
Output #0, rawvideo, to 'output.yuv':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 816x460 [SAR 1:1 DAR 204:115], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc56.60.100 rawvideo
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> rawvideo (native))
Press [q] to stop, [?] for help
frame= 1 fps=0.0 q=-0.0 Lsize= 550kB time=00:00:00.04 bitrate=112608.0kbits/s
video:550kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000% |
Видео-заставка
Видеофайл также должен быть в "сыром" YUV420 формате и иметь расширение .video.
Пример конвертации:
bsk@bsk:~$ gst-launch-0.10 -v filesrc location=./input_video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! \ > video/x-raw-yuv,width=1280,height=720,format='(fourcc)'I420 ! \ > videoscale method=3 ! video/x-raw-yuv,width=720,height=480,format='(fourcc)'I420 ! \ > videorate max-rate=15 ! filesink location=./output.video Установка конвейера в состояние PAUSED... Подготовка конвейера (PREROLL)... /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:sink: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)3.1, profile=(string)high, codec_data=(buffer)0164001fffe1001f6764001fac2ca4014016ec054808080a000003000200000300793b42c5a24001000568eb735250, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:src: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:src: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:sink: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:src: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)15/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:sink: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)15/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 Конвейер подготовлен (PREROLLED)... Установка конвейера в состояние PLAYING... New clock: GstSystemClock Получен маркер EOS («конец потока») от элемента «pipeline0». Execution ended after 11407407262 ns. Установка конвейера в состояние PAUSED... Установка конвейера в состояние READY... /GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:src: caps = NULL /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstQTDemux:demux.GstPad:audio_00: caps = NULL /GstPipeline:pipeline0/GstQTDemux:demux.GstPad:video_00: caps = NULL Установка конвейера в состояние NULL... Освобождение конвейера... |
Готовые видеозаставки находятся в /var/lib/ecss/ecss-media-server.
Условия
Медиасервер установлен на том же сервере, что и SSW.
Используется один интерфейс — bond1.2, адрес 192.168.2.21.
Настройки
Конфигурационный файл для таких условий нужно привести к виду (нужно прописать адрес 192.168.2.21 вместо 127.0.0.1):
<?xml version="1.0" encoding="utf-8"?>
<config date="05:00:58 28.01.2021">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" suspicious-mode="no"/>
<transport bind-addr="192.168.2.21" port="5040" transport="udp+tcp"/>
<media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720" finalsilence="1000" rtcp-stat-dump="yes"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="0" speex="0" l16="0" g7221="0" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<dynamic msr_name="msr_1" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.21" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
<rtp>
<auto addr-v4=""/>
</rtp>
</config>
|
В настройках ECSS-10 нужно указать адрес для приема регистраций (в целях безопасности, т.к. по умолчанию соединения принимаются на всех адресах — 0.0.0.0):
/system/media/registrar/set private core1@ecss1 listen-ip 192.168.2.21 Private parameter listen-ip set to 192.168.2.21 at node core1@ecss1. |
Далее следует задекларировать медиаресурсы на интерфейсе bond1.2:
/system/media/resource/declare core1@ecss1 iface msr_1 bond1.2 default local true |
Медиасервер в целях резервирования медиаресурсов должен быть установлен на каждом сервере, на котором установлено ECSS-10.
Условия
Сервер 1. Интерфейс — eth0, адрес 192.168.2.21
Сервер 2. Интерфейс — eth0, адрес 192.168.2.22
| Не используйте плавающие (keepalive) адреса для медиасервера. |
Настройки
На первом сервере в конфигурационном файле /etc/ecss/ecss-media-server/config.xml в качестве адреса transport bind-addr и mcc bind-addr нужно указать адрес этого же сервера, т.е. 192.168.2.21. В секции аккаунтов должны быть прописаны динамические аккаунты для первого сервера и для второго.
<?xml version="1.0" encoding="utf-8"?>
<config date="05:00:58 28.01.2021">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" suspicious-mode="no"/>
<transport bind-addr="192.168.2.21" port="5040" transport="udp+tcp"/>
<media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720" finalsilence="1000" rtcp-stat-dump="yes"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="0" speex="0" l16="0" g7221="0" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<dynamic msr_name="msr_1" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
<dynamic msr_name="msr_1" realm="sip:192.168.2.22:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.21" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
<rtp>
<auto addr-v4=""/>
</rtp>
</config>
|
На втором сервере адрес transport bind-addr и mcc bind-addr нужно указать 192.168.2.22. В секции аккаунтов задать имя MSR отличное от того, которое было задано для первого сервера, т.к. фактически настраивается отдельный второй медиасервер.
Конфигурационный файл для второго сервера должен иметь вид:
<?xml version="1.0" encoding="utf-8"?>
<config date="05:00:58 28.01.2021">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" suspicious-mode="no"/>
<transport bind-addr="192.168.2.22" port="5040" transport="udp+tcp"/>
<media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720" finalsilence="1000" rtcp-stat-dump="yes"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="0" speex="0" l16="0" g7221="0" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<dynamic msr_name="msr_2" realm="sip:192.168.2.22:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
<dynamic msr_name="msr_2" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.22" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
<rtp>
<auto addr-v4=""/>
</rtp>
</config> |
В настройках ECSS-10 нужно указать адрес для приема регистраций (в целях безопасности, т.к. по умолчанию соединения принимаются на всех адресах — 0.0.0.0). Для каждого сервера — свой:
/system/media/registrar/set private core1@ecss1 listen-ip 192.168.2.21 Private parameter listen-ip set to 192.168.1.1 at node core1@ecss1. /system/media/registrar/set private core1@ecss2 listen-ip 192.168.2.22 Private parameter listen-ip set to 192.168.1.2 at node core1@ecss2. |
Далее следует задекларировать медиаресурсы каждого медиасервера на каждой ноде каждого ядра. Т.е. первый медиасервер задекларировать на обоих серверах и второй медиасервер также задекларировать на обоих серверах.
Для этого выполняются следующие команды:
/system/media/resource/declare core1@ecss1 iface msr_1 bond1.2 default local true /system/media/resource/declare core1@ecss1 iface msr_2 bond1.2 default local true /system/media/resource/declare core1@ecss2 iface msr_1 bond1.2 default local true /system/media/resource/declare core1@ecss2 iface msr_2 bond1.2 default local true |
В результате должно появиться четыре записи ресурсов:
/system/media/resource/list active Active media resource selected list specific: ┌─────────────┬───────┬───────────┬───────────┬──────┬────────┬───────────┬───────────┬───────────────────┬─────────┬──────────────┬────────┬─────────┬───────┬───────────────┬────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼───────────┼───────────┼──────┼────────┼───────────┼───────────┼───────────────────┼─────────┼──────────────┼────────┼─────────┼───────┼───────────────┼────────────┼─────────┤ │ core1@ecss1 │ msr_1 │ 3.14.16.0 │ 1.0 │ 0 │ 22abcd │ connected │ 07:16:24 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true │ default │ local │ bond1.2@msr_1 │ registered │ 50 │ │ │ msr_2 │ 3.14.16.0 │ 1.0 │ 0 │ c5b9d8 │ connected │ 07:16:26 │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true │ default │ local │ bond1.2@msr_2 │ registered │ 48 │ │ core1@ecss2 │ msr_1 │ 3.14.16.0 │ 1.0 │ 0 │ 22abcd │ connected │ 07:18:57 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true │ default │ local │ bond1.2@msr_1 │ registered │ 76 │ │ │ msr_2 │ 3.14.16.0 │ 1.0 │ 0 │ c5b9d8 │ connected │ 07:18:18 │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true │ default │ local │ bond1.2@msr_2 │ registered │ 57 │ └─────────────┴───────┴───────────┴───────────┴──────┴────────┴───────────┴───────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘ |
При остановке или перезапуске медиасервера, он предварительно завершает все активные sip-сессии до ядер, отправляя BYE c полем Reason со значением SIP;cause=480;text="System Shutdown".
Каждое ядро, принимая данный BYE, понимает, что медиасервер остановили/перезапустили и инициирует процедуру перепарковки данного вызова на другой медиасервер.
Пример сообщения BYE:
BYE sip:core@192.168.23.3:5000 SIP/2.0 Via: SIP/2.0/UDP 127.0.0.1:5040;rport;branch=z9hG4bKPjtPrQHcWDEo-bflsWmwrMTCj.3PnfioVH Max-Forwards: 70 From: <sip:enp3s0@127.0.0.1>;tag=xxUS3tNZtP3VUn4z1Eld9Y.tVh-vg57B To: <sip:core@ecss10>;tag=asRx2P Call-ID: g2gEZAALdGVzdC5kb21haW5tAAAAEGYwNzkxM2I4NmMyNzZmMjFtAAAAEGYwNzkxM2JhMmM5ODhjMjhhAQ== CSeq: 23023 BYE User-Agent: Eltex media-server 3.10.0.5 Reason: SIP;cause=480;text="System Shutdown" Content-Length: 0 |
Условия
Система настроена для работы по примеру Системы с одним сервером.
Необходимо добавить интерфейс bond1.3 для обслуживания медиасервером.
Настройки
Декларируем медиаресурсы для нового интерфейса:
/system/media/resource/declare core1@ecss1 by_iface msr_1 bond1.3 default local true |
Преимущества
Все вызовы на селектор/с селектора будут парковаться на отдельный медиасервер (медиасервер селекторных совещаний). Если вызов нельзя запарковать на медиасервер, то он будет отклонен.
Условия
Система настроена для работы по примеру Системы с одним сервером.
Настройки
Потребуется сайты для абонентов и для медиасерверов.
Для абонентов требуются сайты:
Для медиа-серверов требуются site:
Декларируем перечисленные выше сайты через расширенный web или Cocon:
system/media/site/declare <site>
, в итоге имеет матрицу сайтов:
/system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ site │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ │ │ │ tc │ 2 │ │ 0 │ │ │ │ video │ 3 │ │ │ 0 │ │ │ without-video │ 4 │ │ │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ The site of row is correspond to site of iface(domain/<domain>/iface). The site of column is correspond to site of contact(system/media/resource/list). Legend: r - the distance is present only when there is another subscriber with a distance not equal to the value r(relation) to a given msr. empty distance - infinity distance between sites. |
После этого настраиваем расстояния между сайтами расширенный web или Cocon:
system/media/site/distance <from site> <to site> <distance>
, чтобы матрица расстояний выглядела следующим образом:
/system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ site │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ 5 │ 6 │ │ tc │ 2 │ │ 0 │ 10 │ 3 │ │ video │ 3 │ 5 │ 10 │ 0 │ │ │ without-video │ 4 │ 6 │ 3 │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ The site of row is correspond to site of iface(domain/<domain>/iface). The site of column is correspond to site of contact(system/media/resource/list). Legend: r - the distance is present only when there is another subscriber with a distance not equal to the value r(relation) to a given msr. empty distance - infinity distance between sites. |
Выставляем site в tc для системного интерфейса system:teleconference:
/domain/test.domain/iface/user-set * * system:teleconference site tc Property 'site' successfully changed to 'tc' for interfaces: system:teleconference |
Настраиваем конфигурационный файл для медиасервера селекторной связи:
/etc/ecss/ecss-media-server/config-without-video.xml |
Выставляем параметры port-start, port-range и port в секции mcc, таким образом, чтобы они не пересекались с параметрами уже запущенных медиасерверов.
Включаем медиасервер селекторных совещаний:
sudo systemctl enable ecss-media-server@without-video |
Запускаем медиасервер селекторных совещаний:
sudo systemctl start ecss-media-server@without-video |
Декларируем контакты медиа-сервера с видео с site равным video, пример:
/system/media/resource/declare * iface paul enp0s8 default video true Declared media resources ┌─────────────┬─────────────┬────────┬─────────┬───────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼─────────────┼────────┼─────────┼───────┤ │ core1@IBM │ enp0s8@paul │ true │ default │ video │ │ core2@IBM │ enp0s8@paul │ true │ default │ video │ │ core1@ecss1 │ enp0s8@paul │ true │ default │ video │ │ core1@ecss2 │ enp0s8@paul │ true │ default │ video │ │ core1@PAUL │ enp0s8@paul │ true │ default │ video │ │ core2@PAUL │ enp0s8@paul │ true │ default │ video │ └─────────────┴─────────────┴────────┴─────────┴───────┘ |
Декларируем контакты медиасервера без видео с site равным without-video, пример:
/system/media/resource/declare * iface paul.without-video enp0s8 default without-video true Declared media resources ┌─────────────┬───────────────────────────┬────────┬─────────┬───────────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼───────────────────────────┼────────┼─────────┼───────────────┤ │ core1@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ └─────────────┴───────────────────────────┴────────┴─────────┴───────────────┘ |
Если контакты уже были задекларированы, для контактов медиасервера с видео выставляем site в video, пример:
/system/media/resource/set * enp0s8@paul site video Media resource: ┌─────────────┬─────────────┬──────────┬───────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼─────────────┼──────────┼───────┤ │ core2@PAUL │ enp0s8@paul │ site │ video │ │ core1@PAUL │ enp0s8@paul │ site │ video │ │ core1@ecss2 │ enp0s8@paul │ site │ video │ │ core1@ecss1 │ enp0s8@paul │ site │ video │ │ core2@IBM │ enp0s8@paul │ site │ video │ │ core1@IBM │ enp0s8@paul │ site │ video │ └─────────────┴─────────────┴──────────┴───────┘ |
а для контактов медиа-сервера без видео выставляем site в without-video, пример:
/system/media/resource/set * enp0s8@paul.without-video site without-video Media resource: ┌─────────────┬───────────────────────────┬──────────┬───────────────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼───────────────────────────┼──────────┼───────────────┤ │ core2@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ site │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ site │ without-video │ │ core1@IBM │ enp0s8@paul.without-video │ site │ without-video │ └─────────────┴───────────────────────────┴──────────┴───────────────┘ |
Существует возможность перепарковывать селекторную связь на конкретный медиасервер с использованием только примитива site.
При парковке вызова выбирается медиасервер, до которого существует наименьшее расстояние от паркуемых абонентов (расстояние от site абонентов до site медиасерверов). Если находятся 2 и более одинаковых минимальных расстояний до медиасервером, то медиасервер выбирается равновероятно (на основании его загруженности и коэффициента производительности).
Преимущества
Настройка
В примере рассматривается система с использованием 3 MSR. Количество MSR можно увеличить в зависимости от требований к системе.
Для абонентов требуются site:
Декларируем перечисленные выше site командой:
system/media/site/declare <site>
Ожидаемая матрица после декларации сайтов:
/system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ site │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ │ │ │ tc │ 2 │ │ 0 │ │ │ │ video │ 3 │ │ │ 0 │ │ │ without-video │ 4 │ │ │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ The site of row is correspond to site of iface(domain/<domain>/iface). The site of column is correspond to site of contact(system/media/resource/list). Legend: r - the distance is present only when there is another subscriber with a distance not equal to the value r(relation) to a given msr. empty distance - infinity distance between sites. |
После этого настраиваем расстояния между сайтами командой:
system/media/site/distance <from site> <to site> <distance>
Ожидаемый результат настройки сайтов для данного примера:
/system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ site │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ 5 │ 6 │ │ tc │ 2 │ │ 0 │ 10 │ 3 │ │ video │ 3 │ 5 │ 10 │ 0 │ │ │ without-video │ 4 │ 6 │ 3 │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ The site of row is correspond to site of iface(domain/<domain>/iface). The site of column is correspond to site of contact(system/media/resource/list). Legend: r - the distance is present only when there is another subscriber with a distance not equal to the value r(relation) to a given msr. empty distance - infinity distance between sites. |
Задание таких расстояний преследовало следующие поведения:
Выставляем site в tc для системного интерфейса system:teleconference:
/domain/test.domain/iface/user-set * * system:teleconference site tc Property 'site' successfully changed to 'tc' for interfaces: system:teleconference |
Декларируем контакты медиасервера с видео с site равным video:
/system/media/resource/declare * iface paul enp0s8 default video true Declared media resources ┌─────────────┬─────────────┬────────┬─────────┬───────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼─────────────┼────────┼─────────┼───────┤ │ core1@IBM │ enp0s8@paul │ true │ default │ video │ │ core2@IBM │ enp0s8@paul │ true │ default │ video │ │ core1@ecss1 │ enp0s8@paul │ true │ default │ video │ │ core1@ecss2 │ enp0s8@paul │ true │ default │ video │ │ core1@PAUL │ enp0s8@paul │ true │ default │ video │ │ core2@PAUL │ enp0s8@paul │ true │ default │ video │ └─────────────┴─────────────┴────────┴─────────┴───────┘ |
Декларируем контакты медиасервера без видео с site, равным without-video:
/system/media/resource/declare * iface paul.without-video enp0s8 default without-video true Declared media resources ┌─────────────┬───────────────────────────┬────────┬─────────┬───────────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼───────────────────────────┼────────┼─────────┼───────────────┤ │ core1@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ └─────────────┴───────────────────────────┴────────┴─────────┴───────────────┘ |
Если контакты уже были задекларированы, для контактов медиасервера с видео выставляем site в video:
/system/media/resource/set * enp0s8@paul site video Media resource: ┌─────────────┬─────────────┬──────────┬───────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼─────────────┼──────────┼───────┤ │ core2@PAUL │ enp0s8@paul │ site │ video │ │ core1@PAUL │ enp0s8@paul │ site │ video │ │ core1@ecss2 │ enp0s8@paul │ site │ video │ │ core1@ecss1 │ enp0s8@paul │ site │ video │ │ core2@IBM │ enp0s8@paul │ site │ video │ │ core1@IBM │ enp0s8@paul │ site │ video │ └─────────────┴─────────────┴──────────┴───────┘ |
Для контактов медиасервера без видео выставляем site в without-video:
/system/media/resource/set * enp0s8@paul.without-video site without-video Media resource: ┌─────────────┬───────────────────────────┬──────────┬───────────────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼───────────────────────────┼──────────┼───────────────┤ │ core2@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ site │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ site │ without-video │ │ core1@IBM │ enp0s8@paul.without-video │ site │ without-video │ └─────────────┴───────────────────────────┴──────────┴───────────────┘ |
Периодически на системе бывает так, что определенная группа абонентов Softswitch территориально удалена от сервером ECSS-10, и/или ограничена по ширине канала связи (выделенная локация). В этом случае с целью оптимизации трафика для разговора абонентов такой группы между собой есть смысл парковать их медиа на отдельно стоящий MSR, который будет расположен на той же локации что и абоненты. При этом, если абонент данной локации разговаривает с абонентом "центра", то использоваться должен основной MSR. В данном разделе описывается пошаговая инструкция по настройке данной схемы.
Пример:
Есть Softswitch, стоящий в Москве, им пользуются vip-клиенты, локальные пользователи, а также существует возможность собирать телеконференции. Для каждого из этих типов пользователей имеется отдельный MSR. По умолчанию в системе создан site local, в котором по умолчанию создаются все абоненты ECSS-10.
| Пользователи | MSR |
|---|---|
| VIP | MSR.1 |
| LOCAL | MSR.2 |
| TC | MSR.3 |
Создание site-ов
Нужно создать site для абонента VIP и TC.
По умолчанию список site следующий:
/system/media/site/list List of all sites: local |
Создаем site для абонента VIP:
/system/media/site/declare vip Site: vip Created successfully. |
Создаем site для абонентов TC:
/system/media/site/declare tc Site: tc Created successfully. |
После изменений список site следующий:
/system/media/site/list List of all sites: local vip tc |
Настройка матрицы связности между site
После создания site матрица связности между site будет следующей:
/system/media/site/matrix ┌───────────┬───┬───┬───┬───┐ │ site │ # │ 1 │ 2 │ 3 │ ├───────────┼───┼───┼───┼───┤ │ vip │ 1 │ 0 │ │ │ │ local │ 2 │ │ 0 │ │ │ tc │ 3 │ │ │ 0 │ └───────────┴───┴───┴───┴───┘ The site of row is correspond to site of iface(domain/<domain>/iface). The site of column is correspond to site of contact(system/media/resource/list). Legend: r - the distance is present only when there is another subscriber with a distance not equal to the value r(relation) to a given msr. empty distance - infinity distance between sites. |
К MSR1 должен быть привязан site vip, к MSR2 local, к MSR3 tc.
Выставляем расстояние между абонентами VIP и медиасервером MSR.1, который также использует сайт VIP:
/system/media/site/distance vip vip 10 Distance between vip and vip changed to: 10. |
Выставляем расстояние между абонентами VIP и медиасервером MSR.2, который использует сайт LOCAL:
/system/media/site/distance vip local 20 Distance between vip and local changed to: 20. |
Выставляем расстояние между абонентами VIP и медиасервером MSR.3, который использует сайт TC:
/system/media/site/distance vip tc 50 Distance between vip and tc changed to: 50. |
Выставляем расстояние между абонентами LOCAL и медиасервером MSR.1, который использует сайт VIP:
/system/media/site/distance local vip r Distance between local and vip changed to: r. |
Выставляем расстояние между абонентами LOCAL и медиасервером MSR.2, который использует сайт LOCAL:
/system/media/site/distance local local 10 Distance between local and local changed to: 10. |
Выставляем расстояние между абонентами LOCAL и медиасервером MSR.3, который использует сайт ТС:
/system/media/site/distance local tc 50 Distance between local and tc changed to: 50. |
Выставляем расстояние между TC и медиасервером MSR.3, который использует сайт ТС:
/system/media/site/distance tc tc 0 Distance between local and tc changed to: 0. |
После изменений матрица связности следующая:
/system/media/site/matrix ┌───────┬───┬───┬────┬────┐ │ site │ # │ 1 │ 2 │ 3 │ ├───────┼───┼───┼────┼────┤ │ vip │ 1 │ 0 │ 20 │ 50 │ │ local │ 2 │ r │ 10 │ 50 │ │ tc │ 3 │ │ │ 0 │ └───────┴───┴───┴────┴────┘ |
Декларация ресурсом медиа-серверов
Пусть на ядре зарегистрированы 3 медиасервера: MSR.1, MSR.2, MSR.3.
/system/media/resource/list all All media resource selected list specific: ┌─────────────┬───────┬─────────────┬───────────┬──────┬────────┬───────────┬───────────┬──────────────────────┬─────────────┬─────────────────┬────────┬─────────┬───────┬───────────────────┬──────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼─────────────┼───────────┼──────┼────────┼───────────┼───────────┼──────────────────────┼─────────────┼─────────────────┼────────┼─────────┼───────┼───────────────────┼──────────────┼─────────┤ │ core1@ecss1 │ MSR.1 │ 3.14.15.243 │ 1.0 │ 0 │ 0b131b │ connected │ 01:28:59 │ 127.0.0.1:5700 │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.1 │ registered │ 119 │ │ │ │ │ │ │ │ │ │ │ eno4 │ 192.168.116.179 │ false │ │ │ eno4@MSR.1 │ registered │ 119 │ │ │ MSR.2 │ 3.14.15.243 │ 1.0 │ 0 │ 7a7740 │ connected │ 01:26:08 │ 10.24.40.53:5700 │ enp2s0 │ 192.168.116.181 │ false │ │ │ enp2s0@MSR.2 │ registered │ 170 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.2 │ registered │ 170 │ │ │ MSR.3 │ 3.14.15.243 │ 1.0 │ 0 │ f01fb6 │ connected │ 00:20:06 │ 192.168.116.131:5700 │ bond1 │ 192.168.116.131 │ false │ │ │ bond1@MSR.3 │ registered │ 173 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.3 │ registered │ 174 │ └─────────────┴───────┴─────────────┴───────────┴──────┴────────┴───────────┴───────────┴──────────────────────┴─────────────┴─────────────────┴────────┴─────────┴───────┴───────────────────┴──────────────┴─────────┘ |
Декларируем ресурс медиасервера MSR.1 c site vip:
/system/media/resource/declare * iface MSR.1 eno4 default vip true Declared media resources ┌─────────────┬────────────┬────────┬─────────┬─────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼────────────┼────────┼─────────┼─────────┤ │ core1@IBM │ eno4@MSR.1 │ true │ default │ vip │ │ core2@IBM │ eno4@MSR.1 │ true │ default │ vip │ └─────────────┴────────────┴────────┴─────────┴─────────┘ |
Декларируем ресурс медиасервера MSR.2 c site local:
/system/media/resource/declare * iface MSR.2 enp2s0 default local true Declared media resources ┌─────────────┬──────────────┬────────┬─────────┬─────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼──────────────┼────────┼─────────┼─────────┤ │ core1@IBM │ enp2s0@MSR.2 │ true │ default │ local │ │ core2@IBM │ enp2s0@MSR.2 │ true │ default │ local │ └─────────────┴──────────────┴────────┴─────────┴─────────┘ |
Декларируем ресурс медиасервера MSR.3 c site tc:
/system/media/resource/declare * iface MSR.3 bond1 default tc true Declared media resources ┌─────────────┬──────────────┬────────┬─────────┬─────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼──────────────┼────────┼─────────┼─────────┤ │ core1@IBM │ bond1@MSR.3 │ true │ default │ tc │ │ core2@IBM │ bond1@MSR.3 │ true │ default │ tc │ └─────────────┴──────────────┴────────┴─────────┴─────────┘ |
После изменений список ресурсов следующий:
/system/media/resource/list all All media resource selected list specific: ┌─────────────┬───────┬─────────────┬───────────┬──────┬────────┬───────────┬───────────┬──────────────────────┬─────────────┬─────────────────┬────────┬─────────┬───────┬───────────────────┬──────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼─────────────┼───────────┼──────┼────────┼───────────┼───────────┼──────────────────────┼─────────────┼─────────────────┼────────┼─────────┼───────┼───────────────────┼──────────────┼─────────┤ │ core1@ecss1 │ MSR.1 │ 3.14.15.243 │ 1.0 │ 0 │ 0b131b │ connected │ 01:28:59 │ 127.0.0.1:5700 │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.1 │ registered │ 119 │ │ │ │ │ │ │ │ │ │ │ eno4 │ 192.168.116.179 │ true │default │vip │ eno4@MSR.1 │ registered │ 119 │ │ │ MSR.2 │ 3.14.15.243 │ 1.0 │ 0 │ 7a7740 │ connected │ 01:26:08 │ 10.24.40.53:5700 │ enp2s0 │ 192.168.116.181 │ true │default │local │ enp2s0@MSR.2 │ registered │ 170 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.2 │ registered │ 170 │ │ │ MSR.3 │ 3.14.15.243 │ 1.0 │ 0 │ f01fb6 │ connected │ 00:20:06 │ 192.168.116.131:5700 │ bond1 │ 192.168.116.131 │ true │default │tc │ bond1@MSR.3 │ registered │ 173 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.3 │ registered │ 174 │ └─────────────┴───────┴─────────────┴───────────┴──────┴────────┴───────────┴───────────┴──────────────────────┴─────────────┴─────────────────┴────────┴─────────┴───────┴───────────────────┴──────────────┴─────────┘ |
Выставление site-ов на абонентах
По умолчанию на абоненте site выставлен в local. Для того, чтобы абонента сделать абонентом VIP, нужно на абоненте выставить site в vip:
/domain/test.domain/iface/user-set * * 103@test.domain site vip Property 'site' successfully changed to 'vip' for interfaces: 103@test.domain |
Принцип распределения вызов
При выставлении на интерфейсе system:teleconference сайта tc, все конференции будут собираться через MSR.3. В случае его падения конференции собираться не будут.
Звонки между VIP абонентами будут проходить через MSR.1, в случае его падения через MSR.2, если же и MSR.2 будет иметь неисправности, то вызовы пойдут через MSR.3.
Локальные абоненты будут задействовать MSR.2, в случае его падения MSR.3.
Звонки между VIP и локальными абонентами будут осуществляться через MSR.1 и MSR.2.