Медиасервер предназначен для прокcирования речевой и видео-информации по протоколу RTP, организации конференций, записи разговоров, воспроизведения медиафайлов и различных комбинаций этих режимов.

Управление ресурсами медиасервера осуществляется с помощью механизма control channel (RFC 6230 Media Control Channel FrameworkRFC 6231 IVR Control PackageRFC 6505 Mixer Control Package).

Описание медиасервера

Функционал, выполняемый на медиасервере

  1. После инсталляции медиасервер запускается с начальными установками, заданными на этапе инсталляции.
  2. Во время запуска на медиасервере стартует процесс, который определяет список доступных в системе сетевых интерфейсов. На основании этого списка формируется список UA для регистрации на SIP-сервере.
  3. По известному списку UA осуществляется регистрация этих UA на SIP-сервере. Сообщения SIP REGISTER отправляются для каждого UA по служебному VLAN-X.
  4. Периодический контроль доступности интерфейсов. При изменении списка доступных интерфейсов отправляется команда на регистрацию UA для нового интерфейса, либо на отмену регистрации если интерфейс выключен или исчез. Необходимо производить попытки повторной регистрации через длительный интервал для UA, у которых регистрация не было подтверждена со стороны SIP-сервера.
  5. На служебном интерфейсе медиасервер открывает слушающий порт 5700, по которому с ECSS-10 приходит запрос на определение контрольного канала (control_channel) управления медиа по протоколу mediactrl.

Данные, необходимые для работы медиасервера

  1. Адрес для привязки SIP: адрес VLAN-X SIP INTERNAL — служебного VLAN (сетевого интерфейса) для SIP сигнализации. После выбора интерфейса из списка доступных при инсталляции считается привязанный к нему адрес.
  2. Логин и пароль для прохождения авторизации и аутентификации на SIP-сервере (ECSS-10). Запрашиваются при инсталляции, по умолчанию msr:mediaserver.
  3. Имя сервера MSR. Оно будет использоваться при формировании SIP URI медиасервера, которое будет регистрироваться на SIP-сервере. Запрашиваются при инсталляции, по умолчанию предлагаем имя хоста на котором установим MSR.
  4. Период перерегистрации. В инсталляционном пакете можно изменить значение периода по умолчанию (либо вручную изменить конфигурационный файл).
  5. Адрес SIP-сервера. Регистрация будет отправлена на каждый список доменных имен, IP-адресов. Если доменное имя будет сохраняться в несколько адресов — регистрация пойдет на каждый.

Алгоритм формирования параметров UA для регистрации на ECSS-10

  1. Для каждого сетевого интерфейса формируется свой отдельный SIP UA.
  2. Один из сетевых интерфейсов отмечается как служебный (на этапе конфигурирования). Через него передается SIP-трафик. UA для этого интерфейса единственный, у которого связка сигнализации и медиа делается на одном и том же сетевом интерфейсе. UA остальных интерфейсов используют транспорт служебного интерфейса для SIP, а привязка приемника/передатчика медиатрафика осуществляется к анонсируемого SIP UA сетевому интерфейсу.
  3. Информация об анонсируемом сетевом интерфейсе передается в REGISTER через поле From. Параметры сетевого интерфейса передаются через следующие поля:
    1. P-Eltex-MSR-Iface-Name;
    2. P-Eltex-MSR-Iface-Addr;
    3. P-Eltex-MSR-Acc-Id;
    4. P-Eltex-MSR-CC-Addr (только в служебном);
    5. P-Eltex-MSR-CC-Port (только в служебном);
    6. P-Eltex-MSR-Name.
  4. Cc-status, Cc-id & Cc-address(Control channel status, Control channel id & Control channel address) формируются только для служебного интерфейса;
  5. URI UA формируется по следующему формату: {interface-name};{msr-contact-id}@{MSR-name}, где:
  6. IFace (анонсируемый интерфейс) имеет вид: interface-name(MEDIA-IP-Address), где:

Функционал ECSS-10

  1. Для регистрации медиасерверов выделяется отдельный служебный регистратор, который расположен на ядре системы (Core). Регистратор работает в служебном VLAN-X (отдельный порт, выделенный интерфейс).
  2. Сигнальный трафик от медиасерверов обрабатывается SIP-сервером, который встроен с ядром (Core) и обрабатывается в служебном VLAN-X.
  3. Функционал регистратора:
    1. получение запросов на регистрацию от служебных абонентов медиасерверов;
    2. аутентификация UA, отправившего запрос на регистрацию (по локальной таблице абонентов);
    3. авторизация UA, отправившего запрос на регистрацию (по локальной таблице ограничений);
    4. установка и поддержка заданных настроек периода истечения регистрации;
    5. информирование SIP-сервера о появлении новых регистраций, об отмене регистрации UA (по инициативе UA), об отказе продления регистрации со стороны UA, об отмене регистрации по инициативе SIP-сервера (по команде системы управления);
    6. прием корректных запросов на регистрацию (корректный RURI и аутентификация). Обслуживание трафика на зарегистрированном ресурсе начинается если он полностью сконфигурирован и не заблокирован административно;
    7. передача нотификации в подсистему установления контрольного канала (control_channel) после прохождения успешной регистрации нового медиасервера (служебного UA — msr-root). В нотификации указывается SIP URI служебного UA медиасервера.
    8. передача нотификации в подсистему установления контрольного канала (control_channel) при потере регистрации служебного UA (msr-root) медиасервера, либо при принудительном отказе в регистрации.
  4. Функционал SIP-сервера:
    1. установка SIP-сессий с выбранным аккаунтом;
    2. поддержка установленных SIP-сессий (механизм reINVITE);
    3. нотификация о фактах развала SIP-сессии по инициативе MSR (либо при потере связи с MSR).
  5. Функционал управления контрольными каналами:
    1. установка и поддержка контрольных каналов по одному до каждого медиасервера;
    2. сворачивание контрольного канала в случае отказа в регистрации медиасревера;
    3. передача mediactrl-сообщений в нужный контрольный канал, который выбирается по идентификатору канала (равен служебному SIP URI медиасервера).

Настройка медиасервера

Для настройки медиасервера выполните следующие шаги:

1. Установка медиасервера

Установка программного медиасервера производится из репозитория ECSS-10, пакет ecss-media-server.

Для установки в консоли ОС Linux необходимо выполнить команду:

sudo apt update
sudo apt install ecss-media-server

В ходе установки необходимо будет ответить на ряд вопросов для формирования, основных параметров, конфигурационного XML-файла. Описание параметров приведено на странице Настройка конфигурационного файла MSR.

2. Настройка конфигурационных файлов MSR

config.xml

Конфигурационный 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 не скажется негативно на его работе.
Например, отсутствие секции codec будет означать, что все кодеки отключены и смысл работы медиасервера исчезает, а применение значения по умолчанию transport/bind-addr и вовсе сделает медиасервер неработоспособным.

Значение "по умолчанию" - это значение, используемое при отсутствии параметра в конфигурационном файле и/или предустановленные в 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.

Медиа сервер, используя данные из секции transport bind-addr направляет регистрацию на ядро, используя секцию accounts.

Ядро в реальном времени контролирует доступность медиа сервера с помощью механизма zmq коннекции, для этого настраивается секция pbyte mcc bind-addr.

Секция accounts не настраивается в config.xml, это опасно при обновлении, сейчас по умолчанию она вынесена в /etc/ecss/ecss-media-server/conf.d/default.xml

<?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>



Пример конфигурационного файла:

<?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>


где:

Есть два основных варианта сообщения SIP REGISTER ядру SSW со стороны MSR:
1) master-регистрация - с IP, указанного в параметре pbyte/bind-addr
2) обычные регистрации - с других сетевых интерфейсов/IP

Тег 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>
    <!-- <dynamic msr_name="msr.name"
            realm="sip:127.0.0.1:5000"
            dtmf_mode="rfc+inband+info"
            auth_name="user"
            auth_password="password" /> -->
</accounts>
  • Не используйте плавающие (keepalive) адреса для медиасервера.
  • Не используйте 0.0.0.0 в качестве listen-ip.
  • Если вы настроили свой MSR через дефолтный config.xml, то при последующем обновлении или настройке с помощью dpkg-reconfigure он будет полностью перезатерт и сброшен в дефолт. Поэтому свой MSR лучше настраивать в отдельном файле, например в /etc/ecss/ecss-media-server/conf.d/01-ecss-conf.xml.

Переопределять настройки конфигурационных файлов можно в каталогах:

  1. /etc/ecss/ecss-media-server/conf.d для файла config.xml;
  2. /etc/ecss/ecss-media-server/conf-without-video.d — для файла config-without-video.xml;
  3. В общем случае — /etc/ecss/ecss-media-server/conf-<имя_запускаемого_экземпляра_msr>.d — для файла config-<имя_запускаемого_экземпляра_msr>..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 влияют несколько параметров:

Нужно разграничить потоки 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 отменяет её.

default.xml

Конфигурационный XML-файл после установки медиасервера находится по пути /etc/ecss/ecss-media-server/conf.d/default.xml.

Параметры в конфигурационном файле сгруппированы в секции (теги XML) таким образом:

config
|--- accounts
    |--- dynamic
        |--- via
             |--- iface

После инсталляции пакетов в фале будет указан  ip-add 127.0.0.1 , и только для одного хоста.

<?xml version="1.0"?>
<config>
      <accounts>
            <dynamic msr_name="msr.ecss1" realm="sip:127.0.0.1:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
      </accounts>
</config>

Требуется указать в конфигурации для обоих хостов, реальные 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>

где:

3. Запуск медиасервера

Запуск медиасервера в виде сервиса (по умолчанию)

Для работы сервис использует конфигурацию из файлов:

/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

Запуск более одного медиасервера на одном хосте через systemd-сервис

В состав 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).

Включение и запуск множества экземпляров сервиса ecss-media-server@

В 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!

4. Настройка ECSS-10 для работы с медиасервером

Наиболее важным пунктом является добавление медиаресурсов

Настройка параметров Registrar-сервера

Проверка контрольной коннекции

Добавление медиаресурсов

Настройка таймеров контрольной коннекции


Видео-заставка/обои вызова на парковке/ожидании

По умолчанию в качестве источника видео при парковке медиа на 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

Система с отдельным медиасервером для селекторной связи на одном хосте

Преимущества

Все вызовы на селектор/с селектора будут парковаться на отдельный медиасервер (медиасервер селекторных совещаний). Если вызов нельзя запарковать на медиасервер, то он будет отклонен.

Условия

Система настроена для работы по примеру Системы с одним сервером.

Настройки

Потребуется сайты для абонентов и для медиасерверов.

Для абонентов требуются сайты:

  1. local для абонентов. По умолчанию, все абонентов имеют site равный local;
  2. tc для селекторной связи.

Для медиа-серверов требуются site:

  1. video — для медиасервера с поддержкой видео;
  2. without-video — для медиасервера без поддержки видео.

Декларируем перечисленные выше сайты через расширенный 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-startport-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 абонентов до 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.

Задание таких расстояний преследовало следующие поведения:

  1. Вызовы с абонента на абонента должны парковаться на медиасервер, поддерживающий видео: задаем расстояние между абонентом с site равным local (default-значение для абонента) и медиасервером с поддержкой видео с site, равным video в 5;
  2. В случае, если медиасервер с поддержкой видео стал недоступен, вызов с абонент на абонента должен парковаться/перепарковываться на любой другой доступный медиа-сервер. В данном случае, это медиа-сервис без поддержки видео => задаем расстояние между абонентом с site равным local и медиа-сервером без поддержкой видео с site равным without-video в 6. Данное значение должно быть больше расстояния между site локального абонента и site медиа-сервера с поддержкой видео. Если его выставить в 5, то между этими двумя медиасерверами, медиасервер будет выбран равновероятно (в зависимости от его загруженности и коэффициента производительности);
  3. Вызов с абонента на конференцию должен парковаться на медиасервер без поддержки видео: задаем расстояние между телеконференцией с site, равным tc и медиа-сервером без поддержки видео с site, равным without-video в 3. Данное значение должно быть наименьшим среди всех остальных расстояний до других медиасерверов, т.к. выбирается медиасервер до которого расстояние наименьшее.
  4. В случае, если медиасервер без поддержки видео стал недоступен, вызов с абонента на конференцию должен парковаться/перепарковываться на любой другой доступный медиасервер. В данном случае это медиа-сервис с поддержкой видео. Выставляем расстояние между site конференцию и site медиасервера в 10.

Выставляем 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 │
└─────────────┴───────────────────────────┴──────────┴───────────────┘

Настройка выделенного MSR для группы абонентов

Периодически на системе бывает так, что определенная группа абонентов Softswitch территориально удалена от сервером ECSS-10, и/или ограничена по ширине канала связи (выделенная локация). В этом случае с целью оптимизации трафика для разговора абонентов такой группы между собой есть смысл парковать их медиа на отдельно стоящий MSR, который будет расположен на той же локации что и абоненты. При этом, если абонент данной локации разговаривает с абонентом "центра", то использоваться должен основной MSR. В данном разделе описывается пошаговая инструкция по настройке данной схемы.

Пример:

Есть Softswitch, стоящий в Москве, им пользуются vip-клиенты, локальные пользователи, а также существует возможность собирать телеконференции. Для каждого из этих типов пользователей имеется отдельный MSR. По умолчанию в системе создан site local, в котором по умолчанию создаются все абоненты ECSS-10.

ПользователиMSR
VIPMSR.1
LOCALMSR.2
TCMSR.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.