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

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

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

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

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

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

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

Например:

sudo apt purge ecss-media-server

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

sudo apt update
sudo apt install ecss-media-server

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

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

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

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

<?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" 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" 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:192.168.1.40:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" />
       <via dynamic-ifaces="no">
          <iface name="eth0" ip="192.168.1.27"/>
          <iface name="eth2" ip="192.168.1.28"/>
          <iface name="eth3" ip="192.168.1.29"/>
          <iface name="eth4" ip="192.168.1.30"/>
       </via>
  </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>
XML

где

  • general — общие настройки медиасервера:
    • log-level — уровень логов. Чем больше значение, тем больше информации в логах (по умолчанию: "3");
    • log-rotate — ротация логов (по умолчанию: "no");
    • log-path — путь до директории с логами;
    • log-name — имя файла логов;
    • spool-dir-size — размер каталога /var/spool/ecss/ecss-media-server, предназначенного для хранения временных файлов факсов. При превышении указанного значения старые файлы удаляются (по умолчанию — 100M). Подробнее ниже, в разделе "Тонкая настройка системы";
    • max-calls — максимальное количество одновременно обслуживаемых медиасервером вызовов (по умолчанию: "8192");
    • max-in-group — максимальное количество абонентов в группе в рамках конференции (по умолчанию: "512"). Если услуга "Конференц-связь" используется с большим количеством участников, то необходимо увеличить значение данного параметра. Максимальное значение 4000;

    • load-delta — определяет относительное изменение (сравнение текущей загрузки с предыдущей) загрузки msr (от 1 до 100), при которой формируется нотификации о текущей загрузке msr (не чаще 1 раза в секунду). Коэффициент загрузки отправляется в каждое ядро посредством SIP PUBLISH с Event eltex-load-sensor, в Body находится текущая загрузка msr (по умолчанию — 10);
    • load-sensor — включение механизма информирования ядра о загрузке msr(по умолчанию — media;
    • use-srtp — использование srtp (значения: "disabled" — srtp не используется, "optional" — будет возможность звонить как с rtp, так и с srtp, "mandatory" будет использоваться только srtp (rtp-звонки приниматься не будут);
    • suspicious-mode — MSR будет завершаться при потере соединения по Control channel;
    • ipv6-support="yes/no" — включить поддержку IPv6. По умолчанию — "no";

    • enable-ice-transport="yes/no" — позволяет  использовать SRTP/DTLS при WebRTC-вызове, даже если SRTP отключен через опцию "use-srtp";
    • ice-update="yes/no" — включение SIP UPDATE для конечного согласования ICE-кандидатов;
    • aggressive-ice="yes/no" — включение агрессивной номинации ICE;
    • stun-server — адрес или имя STUN-сервера. По умолчанию пустой.
  • turn-server — настройки TURN-сервера;
    • use-turn="yes/no" — использовать или нет TURN;
    • host — имя или адрес сервера по умолчанию numb.viagenie.ca;
    • user — имя пользователя, по умолчанию webrtc@live.com";
    • password — пароль пользователя по умолчанию "muazkh".
  • transport — настройки транспорта:
    • bind-addr — IP-адрес, который будет использовать медиасервер для SIP-сигнализации (по умолчанию: "127.0.0.1"). Данный параметр необходимо настроить в соответствии с сетевыми настройками хоста. При использовании WebRTC-клиентов нужно заменить внутренний 127.0.0.1 на внешний;
    • port — номер порта для SIP (по умолчанию: "5040"). Если на хосте, где установлен медиасервер, порт 5040 уже занят, то значение данного параметра необходимо изменить;
    • transport — тип транспорта (по умолчанию: "udp+tcp"), принимает значения: "udp", "tcp", "udp+tcp". Данный параметр не требует изменений.
  • media — параметры медиа:
    • imageattr-x — разрешение видео по горизонтали;
    • imageattr-y — разрешение видео по вертикали;
    • imageattr-q — предпочтение видео разрешения;
    • mixer-clock-rate — частота, используемая внутренним микшером медиасервера (по умолчанию: "8000").

      • При установке ECSS-10 версии 3.14 данный параметр по умолчанию имеет значение 8000. Это сделано для поддержки HD-кодеков, а также уверенного распознавания речи в таких сервисах как IVR, транскрибирование, ASR.
      • Выставление mixer-clock-rate = 48000 приводит к увеличению нагрузки на CPU, увеличение сетевого трафика и объема записанных файлов разговоров.
      • При штатном обновлении этот параметр сам собой не изменится. Данный параметр настраивается в соответствии с аппаратными возможностями сети (например, для поддержки работы G.722 в режиме HD параметр устанавливается в соответствии с частотой дискретизации данного кодека "16000"). Диапазон значений — 8000-48000. Если будет задано значение > 48000, то будет установлено в 48000. В syslog будет предупреждение об этом).
    • use-vad — включить Voice Activity Detection (по умолчанию: "no"). Данный параметр не требует изменений;
    • udp-src-check — при включенной опции ("yes") ECSS-10 будет посылать медиа-трафик на тот IP:Port с которого приходит вызов по транспорту. Используется для вызовов, приходящих из за NAT (по умолчанию: "no");
    • cng-level – 0 — (значение по умолчанию -64 dBm). По умолчанию указывается "0" в целях сохранения обратной совместимости. Диапазон применимых значений 3–127 (где значение 3 означает максимальный шум, а 127 — полную тишину).

      cng-level в файле конфигурации:

      1) Если не указан параметр MSR cng-level, то генерация CN отключена. Если указано cng-level="0"(значение по умолчанию) либо указано некорректное значение →  вне интервала [3; 127], то применяется дефолтное 64, означающее -64 dBov. Иначе используется значение уровня шума из параметра MSR cng-level.

      Обратите внимание, что в RTP пакетах с CN передаётся значение уровня шума Lov(dBov) без знака минус, причём в диапазоне [3; 127] (G.100.1, максимальный уровень всегда -3.01 dBov). Поскольку есть инверсия знака, то значение 3 означает максимальный шум, а 127 — полную тишину.
      Уровень CN (по умолчанию) соответствует уровню шума в Λ = -64 dBm., такой шум является приемлемым для comfort noise. Вот расчёт:
      Если за основу брать порог чувствительности (обычный) человеческого уха (на частоте 1 кГц) как 10^-12 Вт = -90 dBm (L1), а допустимый шум принять 26 децибел L(dB) = 26 dB, то т.к. L(dB) = L2 - L1, получаем оценку искомого уровня Λ(dBm):
      L2 = 26 dBm + (-90 dB) = -64 dBm.

      2) Принятое значение уровня Lov(dBov) применяется как значение CN (с обратным знаком), причём:
      Lov(dBov) = Λ(dBm) - 5 dB Λ(dBm) для всех кодеков, кроме PCMU, PCMA и G.722 — для них, в значении CN, применяются иные понижающие коэффициенты:
      A-law: Lov(dBov) = ΛA (dBm0) - 6.15 dB
      μ-law: Lov(dBov) = Λμ (dBm0) - 6.18 dB
      G.722: Lov(dBov) = ΛG.722 (dBm0) - 12.01 dB

      Пример:
      указано cng-level="70", тогда для различных кодеков расчёт передаваемого CN таков:
      A-law: Lov(dBov) = -70 dBm - 6.15 dBm= -76.15 dBm, CN = 76
      μ-law: Lov(dBov) = -70 dBm - 6.18 dBm= -76.18 dBm, CN = 76
      G.722: Lov(dBov) = -70 dBm - 12.01 dBm= -82.01 dBm, CN = 82
      для прочих кодеков CN = -75dBm, CN = 75

    • jb-size — максимальная задержка в мс, которая будет вноситься для поддержания непрерывного потока media. По умолчанию — 60;
    • echo-cancel-algo — алгоритм, используемый для эхокомпенсации. Реализованы алгоритмы:
      • simple — простой алгоритм эхозаграждения, наименее предпочтительный;
      • speex — алгоритм, реализованный в кодеке speex, немного искажает звук; 
      • webrtc — алгоритм, реализованный в webrtc, используется по умолчанию;
      • webrtc3 — алгоритм WebRTC AEC3. При использовании кодека OPUS эхоподавитель работает с 32 kb/s и 48 kb/s аудио.
    • echo-cancel-aggr — параметр определяет агрессивность эхокомпенсации. (low — низкая; mid — средняя; high — максимальная (по умолчанию));
    • echo-cancel-tail — длина буфера эхокомпенсатора в миллисекундах;
    • rtcp-timeout — если в течение этого периода времени не приходит RTCP медиасерверу, то можно считать, что клиент неактивен (по умолчанию: "0" — не используется). При использовании функции контроля, контроль включается только после приема от встречной стороны одного RTCP-пакета;
    • rtcp-stat-dump — вывод RTCP-статистики в логи (по умолчанию: "yes" — используется). Работает только при уровне логов выше 2;
    • rtp-timeout — таймаут RTP-трафика, аналогично предыдущему параметру (по умолчанию: "0" — не используется);
    • cn-multiplier — множитель к rtp-timeout, если последний полученный RTP-пакет был с comfort noise (по умолчанию: "3");
    • port-start — начало диапазона портов, которые будут использоваться для RTP-потоков (по умолчанию: "12000");
    • port-range — размер диапазона (по умолчанию: "2048");
    • tias-in-sdp — включение/отключение передачи атрибута b=TIAS/AS в offer SDP (по умолчанию: "no");
    • thread-cnt — количество рабочих потоков для обработки медиаданных (поdtmf-to-total-energy, по умолчанию: "2"). Параметр по-прежнему определяет количество потоков старого конференц-бриджа, который больше не занимается микшированием видео.;
    • silence-threshold — пороговый уровень тишины для Voicemail в дБ (по умолчанию: "-30" дБ);
    • dummy-video-src — путь к файлу видеозаставки (формат YUV420), которая отображается при отсутствии видеопотока (по умолчанию /usr/share/ecss-media-server/video/dummy_video.yuv);
    • video-enc-width и video-enc-height — параметры задают исходящее разрешение видеопотока. Все кадры, поступающие на энкодер, с шириной или высотой больше данных будут конвертированы в данный размер. По умолчанию устанавливаются в 640×360.
    • video-dscp — значение DCSP для видео (по умолчанию — 0);
    • video-conf-layout — режим задаётся параметром video-conf-layout и может принимать 2 значения:
      • evenly — cтандартный режим, при котором все источники видео будут помещены в сетку с одинаковым разрешением. При этом могут остаться "пустые" места без видео.
      • adaptive — адаптивный режим для использования всей сетки. Данный режим может выделять нескольких участников, увеличивая их разрешение.
    • other-dscp — значение DCSP для остальных типов медиа (по умолчанию — 0);
    • dtmf-hits-to-begin — (один hit равен 12,75 с) — количество детекций подряд одного и того же сигнала, который распознается в DTMF (по умолчанию — 2; возможные значения: 1..10);
    • dtmf-misses-to-end — (один miss равен 12,75 с) — количество детекций подряд НЕ DTMF-сигнала следом за указанным количеством hit-ов, которые распознали DTMF-сигнал (по умолчанию — 2; возможные значения: 1..10);
    • dtmf-flash-disable — отключить отправку flash dtmf;
    • keyframe-interval — интервал времени между отправкой ключевых видеокадров в миллисекундах;
    • vid-decode-delay — минимальная задержка видеопотока в миллисекундах перед началом его декодирования;
    • vid-enc-threads — количество потоков кодера;

    • vid-dec-threads — количество потоков декодера;

    • finalsilence — как только на протяжении finalsilence секунд будет продетектирована тишина — завершается запись разговора;
  • codec — приоритеты кодеков (1 — максимальный, 255 — минимальный, 0 — кодек отключен). Поддерживаемые кодеки:
    • pcma
    • pcmu
    • ilbc
    • gsm 
    • g722
    • g722.1
    • g729
    • speex
    • l16
    • h264
    • h263-1998
    • t38
    • tel-event-pt
  • accounts — все аккаунты для регистрации медиасервера. Может содержать до 32 элементов acc;
  • dynamic — отдельный аккаунт с параметрами:
    • msr_name — имя MSR, отображаемое на ECSS;
    • realm — сервер регистрации в формате sip:domain. Указывается адрес SIP-сервера для регистрации медиасервера;
    • dtmf_mode — режим детектирования DTMF ("rfc", "inband", "info"). Данный параметр необходимо настроить в соответствии с настройками отправки DTMF на абонентском устройстве.
    • auth_name — имя пользователя, используемое для авторизации;
    • auth_password — пароль для авторизации.

  • via — задается список интерфейсов, которые могут быть отправлены в сообщении "SIP REGISTER" поле "Via":
    • dynamic-ifaces — значение = "yes" или "no";
      если dynamic-ifaces="no":
      - при мастер-регистрации всё как раньше
      - в ином случае регистрация проходит ТОЛЬКО если интерфейс перечислен в списке via в конфиге
      если dynamic-ifaces="yes" или атрибут не указан, то остаётся поведение, реализованное ранее.
    • iface name — имя интерфейса;
    • ip — ip адрес интерфейса.
      - если указанный в конфиге в разделе via ip-адрес не существует, он не обрабатывается (пропускается)
      - если указан верный ip, то он прикрепляется для регистрации в заголовок Via
      - при отсутствии интерфейса в конфиге в via при мастер-регистрации указывается bind-address из конфига, при при не-мастер регистрации поведение прежнее.
  • rtp — режим подмены IP в sdp.
    • auto  — автоматический режим. Определяет общий IP для всех sdp, например : <auto addr-v4="192.168.1.2" addr-v6="::1"/>

    • manual — ручной режим. Задаются пары интерфейс-IP, например: <manual name="bond1.2" addr-v4="192.168.1.2" addr-v6="::1">
  • pbyte — настройка соединений pbyte;
    • mcc — настройка управляющего соединения media control channel;
    • bind-addr — IP-адрес, на котором будет ожидаться подключение;
    • port — порт для входящих подключений, (по умолчанию: 5700).
  • conf_dir path — путь до папки, в которой будут содержаться конфигурации MSR. Данные конфигурации будут переопределять конфигурацию config.xml.
  • Не используйте плавающие (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>
CODE

В результате должен переопределиться уровень логирования и добавиться аккаунт, а также включена опция подмены IP в sdp.

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

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

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

/etc/ecss/ecss-media-server/config.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, принимает значения:

  • --help — вывод помощи;
  • --dbg — вывод логов на экран;
  • --version — вывод информации о версии;
  • --daemon — запуск процесса в фоновом режиме, все пути должны быть абсолютными;
  • --noiput — не пытаться читать какие-либо входные данные;
  • --config=file — настройка пути к конфигурационному XML-файлу;
  • --analyze=script — синтаксический и семантический анализ IVR-скрипта.

Пример:

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. Хотя данный файл предсконфигурирован, но для каждого конкретного случая его нужно донастраивать/перенастраивать:

  • секция transport
    • параметры bind-addr и port
  • секция accounts -> секция dynamic
    • параметры msr_name и realm
  • секция pbyte -> секция mcc
    • параметры bind-addr и port.
Отдельно нужно обратить внимание на секцию media: параметры port-start и port-range не должны пересекаться с параметрами уже запущенных msr-ов, иначе в ходе работы на одном из msr-ов могут возникнуть ошибки, ввиду того что данные порты уже будут заняты. Также стоит обратить внимание на секцию mcc, параметр port не должен пересекаться с параметрами уже запущенных msr-ов по той же причине.

Конфигурационные файлы

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

Отдельно нужно обратить внимание на секцию 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 для работы с медиасервером

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

 Нажмите здесь для раскрытия...

В данном разделе описываются команды для управления настройками контрольной коннекции от ECSS-10 до MSR.

Таблица 1 - Описание параметров control channel коннекции:

ПараметрЗначение по умолчаниюОписание
ecss_zmq_transport"m1" => m1.msr.ecss:5700|trueСписок коннекций от ECSS-10 до MSR
status

Команда просмотра текущего состояния контрольных коннекций между ECSS-10 и MSR.

Путь команды:

/system/zmq/status

Синтаксис:

status [<ConnectionId>]

Параметры:

<ConnectionId> - идентификатор контрольной коннекции, состояние которой необходимо просмотреть.

Пример:

ecss_zmq_transport connection status:
┌─────────────┬───────────┬─────────┬────────┐
│Connection ID│   Node    │ Status  │IsActive│
├─────────────┼───────────┼─────────┼────────┤
│c5b9d8       │core1@ecss1│connected│true    │
│             │core1@ecss2│connected│true    │
│22abcd       │core1@ecss1│connected│true    │
│             │core1@ecss2│connected│true    │
└─────────────┴───────────┴─────────┴────────┘

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

 Нажмите здесь для раскрытия...

В данном разделе описываются команды по настройки транспортных таймеров контрольной коннекции.

Таблица 1 - Описание таймеров контрольной коннекции

ПараметрЗначение по умолчаниюОписаниеВозможные значения
mediactrl_keepalive_timeout10Keepalive тайм-аут контрольной коннекции (в секундах)5 - 100
mediactrl_transaction_timeout2Тайм-аут ожидания ответа на транзакцию mediactrl (в секундах)1 - 20
msr_ban_end_timeout1000Тайм-аут, во время которого выбор msr запрещен (в миллисекундах)
-
clean

Команда для восстановление настроек тайм-аутов контрольной коннекции между ECSS-10 и MSR в значения по умолчанию.

Путь команды:

/system/mediactrl/clean [--force]

Синтаксис:

clean [<FIELD>]

Параметры:

<FIELD> - название параметра, значение которого нужно установить по умолчанию. Опциональный параметр. Если параметр не указывать, то все значения будут установлены по умолчанию. Список параметров приведен в таблице 1.

--force - выполнить команду без запроса подтверждения.

Пример:

admin@mycelium1@ecss1:/$ system/mediactrl/clean mediactrl_keepalive_timeout
Property "mediactrl_keepalive_timeout" values successfully restored
info

Команда просмотра текущих настроек тайм-аутов контрольной коннекции.

Путь команды:

/system/mediactrl/info

Синтаксис:

info [<FIELD>]

Параметры:

<FIELD> - название параметра, опциональный параметр, список приведен в таблице 1.

Пример:

admin@mycelium1@ecss1:/$ system/mediactrl/info
┌─────────────────────────────┬─────┐
│          Property           │Value│
├─────────────────────────────┼─────┤
│mediactrl_keepalive_timeout  │10   │
│mediactrl_transaction_timeout│20   │
│msr_ban_end_timeout          │1000 │
└─────────────────────────────┴─────┘
set

Команда для изменения тайм-аутов контрольной коннекций.

Путь команды:

/system/mediactrl/set

Синтаксис:

set <FIELD> <VALUE>

Параметры:

<FIELD> - имя настраиваемого параметра, список приведен в таблице 1.

Пример:

admin@mycelium1@ecss1:/$ system/mediactrl/set mediactrl_keepalive_timeout 5
Property "mediactrl_keepalive_timeout" successfully changed from: 
10
   to
5.

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

 Нажмите здесь для раскрытия...

Registrar-сервер предназначен для регистрации динамических аккаунтов медиасервера.

clean

Команда для восстановления настроек по умолчанию.

Путь команды:

/system/media/registrar/clean

Синтаксис:

clean (private <CORE> | common) <FIELD>

Параметры:

<CORE> - нода ядра, для которой восстанавливаются значения, доступно только для индивидуальных параметров (private);

<FIELD> - название параметра, значение которого нужно установить по умолчанию. Для восстановления всех значений используется параметр all.

Пример:

Установить значения по умолчанию для всех общих настроек (common):

admin@mycelium1@ecss1:/$ system/media/registrar/clean common all            
All common parameters is clean.

info

Команда просмотра текущих настроек Registrar-сервера.

Путь команды:

/system/media/registrar/info

Пример:

admin@mycelium1@ecss1:/$ system/media/registrar/info         
 Common parameters:
┌───────────────────────────┬───────┐
│         Parameter         │ Value │
├───────────────────────────┼───────┤
│ registration-timeout, sec │    90 │
└───────────────────────────┴───────┘
 Private parameters:
┌─────────────┬────────┬───────────┬──────────────┬─────────────┐
│    Node     │ Status │ Is-active │  Listen-ip   │ Listen-port │
├─────────────┼────────┼───────────┼──────────────┼─────────────┤
│ core1@ecss1 │ active │ true      │ 192.168.2.21 │        5000 │
│ core1@ecss2 │ active │ true      │ 192.168.2.22 │        5000 │
└─────────────┴────────┴───────────┴──────────────┴─────────────┘

set

Команда для изменения общих и индивидуальных параметров.

Путь команды:

/system/media/registrar/set

Синтаксис настройки общих параметров:

set common <FIELD> <VALUE>

Параметры:

<FIELD> - имя настраиваемого параметра;

<VALUE> - значение настраиваемого параметра

Где
  • common - тип выставляемого параметра;
  • <common parameter> - общий параметр медиарегистратора для всех нод: registration-timeout;
  • private - тип выставляемого параметра;
  • <node name> - имя ноды на которой находится медиарегистратор;
  • <private parameter> - параметр медиарегистратора, который выставляется на <node name>: is-active, listen-interface & listen-port.

Cписок параметров доступных для настройки:

  • is-active - позволяет включить или выключить регистратор (false - деактивирует регистратор, регистратор перестает принимать SIP трафик);
  • listen-interface - имя интерфейса, который использует регистратор;
  • listen-port - порт, на котором регистратор принимает запросы на регистрацию (по умолчанию 5000);
  • registration-timeout - таймер перерегистрации, диапазон значений от 60 до 86400.

В общих параметрах доступна настройка времени регистрации, по умолчанию установлено 60 секунд.

Пример:
Установить время регистрации 60 секунд:

admin@mycelium1@ecss1:/$ system/media/registrar/set common registration-timeout 60
Common parameter registration-timeout set to 60.

Синтаксис настройки индивидуальных параметров:

system/media/registrar/set private <CORE> <FIELD> <VALUE>

Параметры:

<CORE> - нода ядра, для которой настраивается Registrar-сервер;

<FIELD> - имя настраиваемого параметра;

<VALUE> - значение настраиваемого параметра.

Настраиваемые параметры:

  • is-active - активен ли Registrar-сервер, принимает значения true | false;
  • listen-ip - ip-адрес, на котором Registrar-сервер будет принимать соединения (по умолчанию 0.0.0.0);
  • listen-port - сетевой порт, на котором Registrar-сервер будет принимать соединения (по умолчанию 5000).

Пример:

Установить порт 5001 для приема соединений от медиасервера:

admin@mycelium1@ecss1:/$ system/media/registrar/set private core1@ecss1 listen-port 5001
Private parameter listen-port set to 5001 at node core1@ecss1.

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

 Нажмите здесь для раскрытия...

Медиаресурс - это описание параметров медиасервера, необходимых для работы с ним.

declare

Команда для объявления подключения медиасервера к ECSS-10.

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

Команда для создания конфигурации медиасервера:

Путь команды:

/system/media/resource/declare

Синтаксис:

declare <node> by_contact <contact> <zone> <site> <is active>

или

declare <node> by_iface <msr> <acc_id> <iface> <zone> <site> <is active>

Параметры:

<node> - имя ноды core;
<contact> - contact uri декларируемого медиаресурса;
<zone> - логическая зона обслуживания MSR;
<site> - идентификатор сети обслуживания MSR;
<is active> - состояние активности медиаресурса, значения true/false;
<msr> - имя MSR;
<acc_id> - номер идентификатор ресурса;
<iface> - название интерфейса.

Пример:

admin@mycelium1@ecss1:/$ system/media/resource/declare * contact bond1.476:SIP11@msr_1 default local true
  Declared media resources
┌─────────────┬───────────────────────┬────────┬─────────┬───────┐
│    Node     │        Contact        │ Active │   Zone  │  Site │
├─────────────┼───────────────────────┼────────┼─────────┼───────┤
│ core1@ecss1 │ bond1.476:SIP11@msr_1 │ true   │ default │ local │
│ core1@ecss2 │ bond1.476:SIP11@msr_1 │ true   │ default │ local │
└─────────────┴───────────────────────┴────────┴─────────┴───────┘
info

Команда для просмотра информации о состоянии подключения конкретного медиаресурса.

Путь команды:

/system/media/resource/info

Синтаксис:

info <node>  <contact> 

Параметры:

<contact> - contact uri декларируемого медиаресурса;

<node> - имя ноды.

Пример:

admin@mycelium1@ecss1:/$ system/media/resource/info core1@ecss1 bond1.2@msr_1         
  Media resource specific for node core1@ecss1:
┌─┬─────────────────┬───────────────────────┐
│F│    Parameter    │         Value         │
├─┼─────────────────┼───────────────────────┤
│r│ Contact         │ bond1.2@msr_1         │
│r│ Status          │ unregistered          │
│r│ Cc-status       │ not connected         │
│r│ Cc-status uptime│ 00:05:06              │
│r│ Cc-id           │ 22abcd                │
│r│ Address         │ 192.168.2.21:5700     │
│r│ Register time   │ 2021/03/07 21:59:24   │
│r│ Expired         │ expired               │
│r│ Iface           │ bond1.2(192.168.2.21) │
│ │ Active          │ true                  │
│ │ Zone            │ default               │
│ │ Site            │ local                 │
│r│ MSR version     │ 3.14.7.24             │
│r│ MSR load        │ 0                     │
│r│ MSR perf coef   │ 1.0                   │
└─┴─────────────────┴───────────────────────┘

Legend:
Column F - means Flag, values r - flag for readonly parameter
list

Команда для просмотра списка медиаресурсов в системе ECSS-10.

Путь команды:

/system/media/resource/list

Синтаксис:

list [active | all | register]

Параметры:

  • active - отображать только активные медиаресурсы (по умолчанию);
  • register - отображать только зарегистрированные медиаресурсы;
  • short - отобразить минимальную информацию;
  • all - отображать все задекларированные медиаресурсы.

По умолчанию команда выдает список зарегистрированных медиасерверов

Пример:

admin@mycelium1@ecss1:/$ 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.7.24 │       1.0 │    0 │ 22abcd │ connected │ 00:01:13  │ 192.168.2.21:5700 │ bond1.2       │ 192.168.2.21 │ true   │ default │ local │ bond1.2@msr_1       │ registered   │      77 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:SIP61 │ 192.168.2.61 │ false  │         │       │ bond1.2:SIP61@msr_1 │ registered   │      77 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:TC    │ 192.168.2.63 │ false  │         │       │ bond1.2:TC@msr_1    │ registered   │      77 │
│             │       │           │           │      │        │           │           │                   │ bond1.3:MYSQL │ 192.168.1.71 │ false  │         │       │ bond1.3:MYSQL@msr_1 │ registered   │      77 │
│             │       │           │           │      │        │           │           │                   │ bond1.3       │ 192.168.1.21 │ false  │         │       │ bond1.3@msr_1       │ registered   │      77 │
│             │       │           │           │      │        │           │           │                   │ bond1.476     │ 10.16.33.21  │ false  │         │       │ bond1.476@msr_1     │ registered   │      77 │
│             │       │           │           │      │        │           │           │                   │ lo            │ 127.0.0.1    │ false  │         │       │ lo@msr_1            │ registered   │      77 │
│             │ msr_2 │ 3.14.7.24 │       1.0 │    0 │ c5b9d8 │ connected │ 00:01:15  │ 192.168.2.22:5700 │ bond1.2       │ 192.168.2.22 │ true   │ default │ local │ bond1.2@msr_2       │ registered   │      75 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:SIP62 │ 192.168.2.62 │ false  │         │       │ bond1.2:SIP62@msr_2 │ registered   │      75 │
│             │       │           │           │      │        │           │           │                   │ bond1.3       │ 192.168.1.22 │ false  │         │       │ bond1.3@msr_2       │ registered   │      75 │
│             │       │           │           │      │        │           │           │                   │ bond1.476     │ 10.16.33.22  │ false  │         │       │ bond1.476@msr_2     │ registered   │      75 │
│             │       │           │           │      │        │           │           │                   │ lo            │ 127.0.0.1    │ false  │         │       │ lo@msr_2            │ registered   │      75 │
│ core1@ecss2 │ msr_1 │ 3.14.7.24 │       1.0 │    0 │ 22abcd │ connected │ 00:03:45  │ 192.168.2.21:5700 │ bond1.2       │ 192.168.2.21 │ true   │ default │ local │ bond1.2@msr_1       │ registered   │      44 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:SIP61 │ 192.168.2.61 │ false  │         │       │ bond1.2:SIP61@msr_1 │ registered   │      44 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:TC    │ 192.168.2.63 │ false  │         │       │ bond1.2:TC@msr_1    │ registered   │      44 │
│             │       │           │           │      │        │           │           │                   │ bond1.3:MYSQL │ 192.168.1.71 │ false  │         │       │ bond1.3:MYSQL@msr_1 │ registered   │      44 │
│             │       │           │           │      │        │           │           │                   │ bond1.3       │ 192.168.1.21 │ false  │         │       │ bond1.3@msr_1       │ registered   │      44 │
│             │       │           │           │      │        │           │           │                   │ bond1.476     │ 10.16.33.21  │ false  │         │       │ bond1.476@msr_1     │ registered   │      44 │
│             │       │           │           │      │        │           │           │                   │ lo            │ 127.0.0.1    │ false  │         │       │ lo@msr_1            │ registered   │      44 │
│             │ msr_2 │ 3.14.7.24 │       1.0 │    0 │ c5b9d8 │ connected │ 00:03:06  │ 192.168.2.22:5700 │ bond1.2       │ 192.168.2.22 │ true   │ default │ local │ bond1.2@msr_2       │ registered   │      82 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:SIP61 │ 192.168.2.61 │ false  │         │       │ bond1.2:SIP61@msr_2 │ unregistered │ expired │
│             │       │           │           │      │        │           │           │                   │ bond1.2:SIP62 │ 192.168.2.62 │ false  │         │       │ bond1.2:SIP62@msr_2 │ registered   │      82 │
│             │       │           │           │      │        │           │           │                   │ bond1.2:TC    │ 192.168.2.63 │ false  │         │       │ bond1.2:TC@msr_2    │ unregistered │ expired │
│             │       │           │           │      │        │           │           │                   │ bond1.3       │ 192.168.1.22 │ false  │         │       │ bond1.3@msr_2       │ registered   │      82 │
│             │       │           │           │      │        │           │           │                   │ bond1.476     │ 10.16.33.22  │ false  │         │       │ bond1.476@msr_2     │ registered   │      83 │
│             │       │           │           │      │        │           │           │                   │ lo            │ 127.0.0.1    │ false  │         │       │ lo@msr_2            │ registered   │      82 │
└─────────────┴───────┴───────────┴───────────┴──────┴────────┴───────────┴───────────┴───────────────────┴───────────────┴──────────────┴────────┴─────────┴───────┴─────────────────────┴──────────────┴─────────┘
purge

Команда для удаления старых, не активных подключений медиаресурсов к ECSS-10.

Путь команды:

/system/media/resource/purge

Синтаксис:

purge <node>

Параметры:

<node> - имя ноды.

Пример:

admin@mycelium1@ecss1:/$ system/media/resource/purge core1@ecss1              
Purged contact list at node core1@ecss1:
 lo@msr_2
 lo@msr_1
 bond1.476@msr_2
 bond1.476@msr_1
 bond1.3@msr_2
 bond1.3@msr_1
 bond1.3:MYSQL@msr_1
 bond1.2:TC@msr_2
 bond1.2:TC@msr_1
 bond1.2:SIP62@msr_2
 bond1.2:SIP62@msr_1
 bond1.2:SIP61@msr_2
 bond1.2:SIP61@msr_1
remove

Команда для удаления информации о настройках медиаресурса, добавленных ранее в ECSS-10.

Путь команды:

/system/media/resource/remove

Синтаксис:

remove <node> contact <contact> | msr <msr>

Параметры:

<node> - имя ноды;
<contact> - contact uri декларируемого медиаресурса;
<msr> - имя MSR.

Пример:

admin@mycelium1@ecss1:/$ system/media/resource/remove * contact bond1.476:SIP11@msr_1
Media resource with contact(bond1.476:SIP11@msr_1) deleted at nodes:
   core1@ecss2
   core1@ecss1
set

Команда для изменения настроек медиаресурсов.

Путь команды:

/system/media/resource/set

Синтаксис:

set <node|*> <contact> <active|zone|site> <value>

Параметры:

<node|*> - имя ноды;
<contact> - contact uri декларируемого медиаресурса;
<active|zone|site> - активация | зона | сайт;
<value> - значение параметра.

Пример:

admin@mycelium1@ecss1:/$ system/media/resource/set core1@ecss1 bond1.2@msr_1 active true              
  Media resource:
┌─────────────┬───────────────┬──────────┬───────┐
│    Node     │    Contact    │ Property │ Value │
├─────────────┼───────────────┼──────────┼───────┤
│ core1@ecss1 │ bond1.2@msr_1 │ active   │ true  │
└─────────────┴───────────────┴──────────┴───────┘
status

Команда для просмотра текущего состояния зарегистрированных медиаресурсов.

Путь команды:

/system/media/resource/status

Синтаксис:

status

Параметры:

Команда не имеет параметров.

Выводимая информация:

  • Node - имя ядра;
  • MSR - имя MSR;
  • MSR version - версия MSR;
  • MSR perf coef - коэффициент производительности;
  • MSR load calls(level) - текущие загрузка и количество активных вызовов;
  • Cc status(uptime) - статус контрольной коннекции;
  • Iface name:addr - сетевой интерфейс и адрес MSR;
  • Active - активен или нет данный медиаресурс;
  • Status - статус регистрации;
  • Expired - время до окончания регистрации.

Пример:

admin@mycelium1@ecss1:/$ system/media/resource/status       
  Status of active media resource list:
┌─────────────┬───────┬────────────┬───────────┬──────────────┬────────────────────────┬──────────────────────┬────────┬────────────┬─────────┐
│    Node     │  MSR  │    MSR     │    MSR    │   MSR load   │           Cc           │        Iface         │ Active │   Status   │ Expired │
│             │       │  version   │ perf coef │ calls(level) │     status(uptime)     │      name:addr       │        │            │         │
├─────────────┼───────┼────────────┼───────────┼──────────────┼────────────────────────┼──────────────────────┼────────┼────────────┼─────────┤
│ core1@ecss1 │ msr_1 │ 3.14.0.156 │       2.0 │    - (0%)    │ connected (1 12:54:23) │ bond1.2:192.168.2.21 │ true   │ registered │      49 │
│             │ msr_2 │ 3.14.0.156 │       1.0 │    - (0%)    │ connected (12:54:17)   │ bond1.2:192.168.2.22 │ true   │ registered │      48 │
│ core1@ecss2 │ msr_1 │ 3.14.0.156 │       2.0 │    - (0%)    │ connected (00:49:08)   │ bond1.2:192.168.2.21 │ true   │ registered │      80 │
│             │ msr_2 │ 3.14.0.156 │       1.0 │    - (0%)    │ connected (00:49:09)   │ bond1.2:192.168.2.22 │ true   │ registered │      80 │
└─────────────┴───────┴────────────┴───────────┴──────────────┴────────────────────────┴──────────────────────┴────────┴────────────┴─────────┘

Конфигурирование распределенного медиасервера

Описание

Распределенность медиасервера обеспечивает следующие возможности:

  • Масштабирование количества медиаканалов за счет использования нескольких медиасерверов;
  • Обмен медиатрафиком между абонентами, представленными в разных сетях-зонах;
  • Региональное тяготение — минимизация межсетевого трафика медиаданных и снижение латентности за счет близкого расположения ресурса медиасервера к источникам/потребителям медиатрафика;
  • Специализация медиаресурсов на медиасерверах (медиасервера могут отличаться своими возможностями).

Для функционирования схемы система ECSS-10 должна обладать информацией о доступных ей медиасерверах и их возможностях. Механизм медиасерверов, используемых для обнаружения, должен быть динамическим, автоматически подстраиваться к изменениям параметров сети, реагировать на появление/исчезновение медиасервера/ECSS-10.

Используемая схема обнаружения и информирования о статусе/возможностях медиасерверов основана на стандартной SIP-регистрации (метод SIP REGISTER). В данном сообщении в ядро ECSS-10 передается вся необходимая служебная информация.

Согласно типовой схемы, подключения к ECSS-10 осуществляется в разных VLAN. Задача ECSS-10 обеспечить коммутацию медиапотоков между абонентами этих VLAN. Для коммутации медиапотоков между абонентами одного VLAN терминация трафика на медиаресурсе ECSS-10 (медиасервере) не является обязательной. Для абонентов разных VLAN необходимо:

  1. Терминировать медиатрафик из разных VLAN в медиасервере;
  2. Обеспечить "перекладку" медиапакетов из одного VLAN в другой.

На рисунке 1 указаны требования к функционалу медиасервера по формированию точки приема медиатрафика во всех VLAN, которые заведены на него.

Рисунок 1 — Требования к функционалу медиасервера

Типовой случай распределенного медиасервера будет выглядеть следующим образом:

Рисунок 2 — Типовой случай распределенного медиасервера

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

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

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

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

Алгоритм формирования параметров 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}, где:
    • interface-name — имя анонсируемого интерфейса;
    • msr-contact-id — идентификатор dynamic контакта на MSR;
    • MSR-name - имя медиасервера (имя хоста или указанное при инсталляции имя).
  6. IFace (анонсируемый интерфейс) имеет вид: interface-name(MEDIA-IP-Address), где:
    • interface-name — имя анонсируемого интерфейса;
    • MEDIA-IP-Address — IP-адрес анонсируемого интерфейса к которому привязывается медиаресурс.

Функционал 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 медиасервера).

Географическая распределенность

ECSS-10 должен корректно выбирать медиасервер. Под корректностью подразумевается уровень его загруженности (равномерное использование доступных ресурсов), а также учет его территориального расположения (распределение с учетом географии пользователей). Уровень загрузки ресурсов вычисляется на основании данных о параметрах медиасервера (сообщение уровня загрузки CPU в каждом сообщении от MSR к SIP-серверу).

Территориальную принадлежность ECSS-10 определяет самостоятельно путем тегирования аккаунтов UA медиасервера. Служебным UA для медиасервера ставится в соответствие имя сайта (site) — географическая зона, которую может обслуживать данный контакт медиасервера. Пользовательским окончаниям и транкам также задается географическая областью путем установки параметра site. Для проключения медиа-потока ECSS-10 использует медиасервер с сайтом минимально удаленным от целевого.
Сетка взаимопритяжений/дистанций (матрица связности) сайтов задается в конфигурации ECSS-10.

Выбор медиаресурса

  1. Выбор осуществляется среди зарегистрированных и активированных медиаресурсов.
  2. При выборе подходящего медиаресурса учитывается Zone (NID) и site.
  3. Сначала список доступных медиаресурсов фильтруется на основании параметра Zone (NID), затем выбирается ресурс с максимальным тяготением к site ресурса (минимальное "расстояние").
  4. При выборе медиаресурса для терминирующей стороны предпочтение отдается выделению точки "приземления" медиатрафика на том же медиасервере, который использовался для "приземления" медиатрафика вызывающей стороны. Если использование медиасервера вызывающей стороны невозможно (в силу отличных Zone (NID) вызывающего или вызываемого абонента), то медиаресурс терминирующей стороны выбирается по тому же алгоритму, что и для вызывающей стороны (с учетом Zone (NID) и site терминирующей стороны).

Матрица связности

Матрица связности показывает расстояние между сайтами в условных единицах. Чем меньше расстояние, тем сайты ближе. Близость сайтов задает предпочтения по использованию медиаресурсов сайта для обслуживания вызова.

Пример
Вызов инициируется абонентом site1. Для обслуживания вызова система по матрице связности ищет медиаресурсы с минимальным расстоянием от сайта инициатора вызова.
Значения, показывающие "расстояние" между сайтами, являются условными и фактически задают стоимость использования медиаресурса выбранного сайта для обслуживания вызова от абонента.
Расстояние до медиаресурсов сайта, к которому относится абонент по умолчанию, принимается равным 0, но может быть изменено. Это сделано для того чтобы можно было на время вывести MSR из работы, например, для обновления. 
Если установлено расстояние между сайтами 0 — это означает, что медиаресурсы сайтов равноправны.
Если абонентам одного сайта необходимо запретить использовать медиаресурса другого сайта, то нужно установить расстояние между этими сайтами равное бесконечности — infinity.

Алгоритм определения ресурсов

Алгоритм, который использует ядро для поиска подходящего MSR, эквивалентен следующему:

  1. Для заданного UA пользователя (далее просто UA), который будет парковаться на MSR, определяются связанные с ним параметры Zone, site, и опционально msr_id (если информация о нем присутствует);
  2. Для ядра, на котором обслуживается текущий call-процесс, выполняется поиск зарегистрированных (поле Status = registered), административно разрешенных (поле Active = true), c зоной (Zone) UA контактов MSR;
  3. Из найденных контактов выбираются те, которые соответствуют известному msr_id (если он все таки задан, в противном случае подходят все контакты предыдущего шага);
  4. Далее выбранные контакты ранжируются по расстоянию между site UA и site самого контакта в соответствии с матрицей связанности:

    admin@[restfs1@IBM]:/$ system/media/site/matrix 
    ┌───────────┬───┬────┬────┬────┬───┐
    │ Site-name │ # │ 1  │ 2  │ 3  │ 4 │
    ├───────────┼───┼────┼────┼────┼───┤
    │ local     │ 1 │  0 │ 10 │ 20 │   │
    │ site_102  │ 2 │ 10 │    │    │   │
    │ site_103  │ 3 │ 20 │    │    │   │
    │ site_104  │ 4 │    │    │    │ 0 │
    └───────────┴───┴────┴────┴────┴───┘
    
    Legend:
     empty distance - infinity distance between sites.
    
    [exec at: 02.08.2017 12:19:55, exec time: 19ms, nodes: core2@IBM]

    Выбираются контакты с наименьшим расстоянием;

  5. Контакты, полученные на предыдущем шаге, сортируем с удалением дубликатов по имени msr (поле msr_name). Получаем контакты с уникальными msr-ами. Контакты содержат информацию о загруженности msr-а и коэффициенте производительности msr-а;
  6. На основе контактов, полученных на предыдущем шаге, строится интервальная таблица загруженности msr с учетом коэффициента производительности:
    1. Верхняя граница таблицы (table_upper_bound) выставляется в 0, помещаем все контакты в очередь;
    2. Если очередь не пуста, то забираем контакт из очереди:
      • Для контакта выставляем нижнюю границу(con_bottom_bound) по формуле:

        con_bottom_bound = table_upper_bound
      • Для контакта формируем верхнюю границу(con_upper_bound) по формуле:

        (100 - con_msr_load) * con_msr_performance_coefficient
      • Выставляем верхнюю границу таблицы(table_upper_bound) по формуле:

        table_upper_bound = table_upper_bound + con_upper_bound
      • Кладем контакт в список;
      • Переход к пункту 6.2;
    3. Если контактов в списке нет, то такое плечо UA релизится с соответствующим cause (msr не найден);
    4. Генерируем случайное число от 0 до table_upper_bound;
    5. В списке находим контакт, в границы которого попадает сгенерированное число. Найденный контакт используется для парковки данного UA на MSR.

Пример с 5 шага:

Шаг 5:
  Есть контакты con_1@msr_1, con_2@msr_1, con_1@msr_2, con_1@msr_3.
Шаг 6:
  Есть контакты con_1@msr_1, con_1@msr_2, con_1@msr_3.
  msr_1 загружен на 55%, коэф. производительности 1.0.
  msr_2 загружен на 40%, коэф. производительности 0.9.
  msr_3 загружен на 60%, коэф. производительности 1.2.

Шаг 6.1
  table_upper_bound = 0,
  queue = [con_1@msr_1, con_1@msr_2, con_1@msr3]

Шаг 6.2
  take from queue = con_1@msr_1

Шаг 6.2.1
  con_bottom_bound = 0

Шаг 6.2.2
  con_upper_bound = (100 - 55) * 1.0 = 45

Шаг 6.2.3
  table_upper_bound = 0 + 45 = 45

Шаг 6.2.4
   put to list = con_1@msr_1(0-45)

Шаг 6.3
   переход на шаг 4.2

Шаг 6.2
  take from queue = con_1@msr_2

Шаг 6.2.1
  con_bottom_bound = 45

Шаг 6.2.2
  con_upper_bound = (100 - 40) * 0.9 = 56

Шаг 6.2.3
  table_upper_bound = 45 + 56 = 101

Шаг 6.2.4
   put to list = con_1@msr_2(45-101)

Шаг 6.2
  take from queue = con_1@msr_3

Шаг 6.3
   переход на шаг 6.2

Шаг 6.2.1
  con_bottom_bound = 101

Шаг 6.2.2
  con_upper_bound = (100 - 60) * 1.2 = 48

Шаг 6.2.3
  table_upper_bound = 101 + 48 = 149

Шаг 6.2.4
   put to list = con_1@msr_3(101-149)

Шаг 6.4
   list = [con_1@msr_1(0-45), con_1@msr_2(45-101), con_1@msr_3(101-149)]
   generate 58

Шаг 6.5
   found con_1@msr_2(45-101)

Найден контакт con_1@msr_2 (msr c именем msr_2).

Пример настройки и парковки вызова

MSR регистрируют контакты со следующими параметрами:

namezonesitemsr_id
msr1_eth0rtkr_kalininsky1
msr1_eth1mtsr_kalininsky1
msr2_eth0rtkr_sovetsky2
msr2_eth1mtsr_sovetsky2
msr3_eth0rtkr_kirovsky3
msr3_eth1mtsr_kirovsky3

Имеющаяся следующую матрицу связности:

Site-named123456
r_kalininsky10




r_sovetsky2
0



r_kirovsky3

0


okrujnaya41320

molodeji5312
0
titova6221

0

Абонент UA1 хочет установить разговор с абонентом UA2, при этом они имеют следующие параметры:

UAzonesite
ua1rtkokrujnaya
ua2mtsmolodeji

Сначала паркуется плечо UA1.
Из списка активных контактов MSR выбираем все, которые принадлежат зоне rtk:

namezonesitemsr_id
msr1_eth0rtkr_kalininsky1
msr2_eth0rtkr_sovetsky2
msr3_eth0rtkr_kirovsky3

Список контактов остается прежним.
Вычисляем расстояние между ua site: okrujnaya и сайтом каждого из контактов. Имеем:

distancenamezonesitemsr_id
1msr1_eth0rtkr_kalininsky1
2msr3_eth0rtkr_kirovsky3
3msr2_eth0rtkr_sovetsky2

Контакты ранжированы в порядке увеличения дистанции. Берем первый из них и используем его для парковки UA1:
name: msr1_eth0, msr_id:1

Парковка второго плеча: ua2.
Он принадлежит другой зоне, поэтому список контактов после выбора по зоне будет выглядеть так:

namezonesitemsr_id
msr1_eth1mtsr_kalininsky1
msr2_eth1mtsr_sovetsky2
msr3_eth1mtsr_kirovsky3

На предыдущем шаге у нас определен msr_id=1.

С учетом msr_id получаем новый список контактов:

namezonesitemsr_id
msr1_eth1mtsr_kalininsky1

Далее вычисляем расстояние между ua2 site: molodeju и r_kalininsky.

distancenamezonesitemsr_id
1msr1_eth1mtsr_kalininsky1

В текущем примере используется довольно простая схема с MSR, поэтому для представленных условий у нас остался лишь один контакт.
Его и используем для парковки ua2.

Так как оба плеча сумели запарковаться на MSR, абоненты смогут обмениваться rtp-трафиком.

Данный пример довольно простой и не иллюстрирует все способы применения заложенных возможностей и функций.
Однако базовые принципы показаны верно и их дальнейшая модификация позволит выстраивать весьма сложные схемы с территориальным тяготением голосового трафика.

Управление географическими зонами обслуживания медиасервера

declare

Команда предназначена для создания новой географической зоны (нового сайта), которую будет обслуживать медиасервер.

Имя сайта в системе должно быть уникальным. Если будет попытка создания сайта с уже используемым именем, команда вернет ошибку.

Путь команды:

/system/media/site/declare

Синтаксис:

declare <site name>

Параметры:

<site name> - имя сайта.

Пример:

admin@mycelium1@ecss1:/$ system/media/site/declare remote_side    
Site: remote_side.
 Created successfully.
distance

Команда предназначена для установки "расстояния" между сайтами.

По умолчанию, когда создаются сайты связность между ними задается как бесконечность (infinity).

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

Путь команды:

/system/media/site/distance

Синтаксис:

distance <site name> <site name> <distance>

Параметры:

<site name> - географическая зона;
<distance> - положение сайтов относительно друг друга.

Пример:

admin@mycelium1@ecss1:/$ system/media/site/distance local remote_side 64           
Distance between local and remote_side changed to: 64.
list

Команда возвращает список географических зон (сайтов), обслуживаемых медиасерверами.

По умолчанию в системе существует неудаляемый сайт "local"

Путь команды:

/system/media/site/list

Синтаксис:

list

Параметры:

Команда не содержит аргументов.

Пример:

List of all sites:
 local
 remote
 remote_side
matrix

Команда позволяет просмотреть матрицу географических зон (сайтов), которые обслуживает медиасервер.

Для просмотра всей матрицы выполняем команду без параметров. При этом будет отображены все сайты если их число не превышает 20, если их число больше, то отображаются первые 20 (сортировка по алфавиту).

Путь команды:

/system/media/site/matrix

Синтаксис:

matrix [<site name> [<site name>]]

Параметры:

<site name> - имя сайта.

Пример:

admin@mycelium1@ecss1:/$ system/media/site/matrix local remote_side remote              
┌─────────────┬───┬───┬───┬────┐
│    site     │ # │ 1 │ 2 │ 3  │
├─────────────┼───┼───┼───┼────┤
│ local       │ 1 │ 0 │ r │ 64 │
│ remote      │ 2 │ r │ 0 │  r │
│ remote_side │ 3 │ r │ r │  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.
remove

Команда позволяет удалить сайт, обслуживаемый медиасервером, и всю информацию о нем.

Путь команды:

/system/media/site/remove

Синтаксис:

remove <site name>

Параметры:

<site name> - имя сайта.

Пример:

admin@mycelium1@ecss1:/$ system/media/site/remove remote_side  
Site: remote_side.
 Removed successfully.

Коэффициент производительности

Для каждого медиасервера в системе можно установить нужный коэффициент производительности. При распределении медиатрафика этот коэффициент будет учитываться, и нагрузка между разными медиасерверами будет делиться пропорционально данным значениям.  Коэффициент (любое положительное целое или дробное число) устанавливается командой system/media/msr/set.

Примеры:

Установить для msr_1 коэффициент производительности 2:

admin@mycelium1@ecss1:/$ system/media/msr/set --performance_coefficient 2 --msr_name msr_1        
Success: Property has been set for msr_1.

[exec at: 09.03.2021 15:18:24, exec time: 87ms, nodes: core1@ecss1 v.3.14.8.16]

Просмотр:

admin@mycelium1@ecss1:/$ system/media/msr/info --ccid  
Default:
┌─────────────────────────────────┬─────┬────────────────────────────────────────────┐
│            Property             │Value│                Description                 │
├─────────────────────────────────┼─────┼────────────────────────────────────────────┤
│is_subscribe_to_call_count       │true │Is subscribe to call count on msr?          │
│'media/chatroom'                 │audio│Media of the chatroom                       │
│'media/conference'               │audio│Media of the network conference             │
│'media/meetme'                   │audio│Media of the meet me conference             │
│'media/teleconference'           │audio│Media of the teleconference                 │
│performance_coefficient          │1.0  │Msr performance coefficient                 │
│subscribe_to_call_count_expires  │30   │Expires of subscribe to call count on msr, s│
│zmq_connection_response_timeout  │500  │Connection response timeout, ms             │
│zmq_connection_update_ack_timeout│500  │Connection update ack timeout, ms           │
│zmq_connection_update_timeout    │1000 │Connection update timeout, ms               │
│zmq_reconnect_timeout            │1000 │Reconnect timeout, ms                       │
└─────────────────────────────────┴─────┴────────────────────────────────────────────┘
MSR:
┌─────┬──────────────────────────┬─────┐
│ MSR │         Property         │Value│
├─────┼──────────────────────────┼─────┤
│msr_1│is_subscribe_to_call_count│true │
│     │performance_coefficient   │2.0  │
│msr_2│is_subscribe_to_call_count│true │
│     │performance_coefficient   │1.0  │
└─────┴──────────────────────────┴─────┘
CCID:
┌──────┬─────────┐
│ CCID │   MSR   │
├──────┼─────────┤
│0b131b│msr.ecss1│
│22abcd│msr_1    │
│c5b9d8│msr_2    │
└──────┴─────────┘

[exec at: 09.03.2021 15:18:57, exec time: 8ms, nodes: core1@ecss1 v.3.14.8.16]

Также данные значения можно увидеть при выводе списка медиаресурсов:

admin@mycelium1@ecss1:/$ 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.7.24 │       2.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.7.24 │       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.7.24 │       2.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.7.24 │       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 │
└─────────────┴───────┴───────────┴───────────┴──────┴────────┴───────────┴───────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘

[exec at: 09.03.2021 15:19:27, exec time: 18ms, nodes: core1@ecss2 v.3.14.8.16]

Уровень загрузки медиасервера

Механизм информирования ядра о степени загруженности MSR реализован через подписки. Команды по управлению такими подписками приведены справочнике команд CLI — /system/media/msr/subscription/.

Также в конфигурационном файле msr предусмотрены настройки, отображенные по следующей ссылке.

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

По умолчанию в качестве источника видео при парковке медиа на msr используется статическая картинка. В конфигурационном файле медиасервера этот параметр настраивается в секции media:

dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv"
CODE

Для создания собственной статической или видео-заставки можно использовать утилиты 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="127.0.0.1" 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" 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>

XML

В настройках ECSS-10 нужно указать адрес для приема регистраций (в целях безопасности, т.к. по умолчанию соединения принимаются на всех адресах — 0.0.0.0):

support@[mycelium1@ecss1]:/$ 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:

support@[mycelium1@ecss1]:/$ 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="127.0.0.1" 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" 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>
XML

На втором сервере адрес 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="127.0.0.1" 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" 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.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
    <dynamic msr_name="msr_2" 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.22" port="5700"/>
  </pbyte>
  <conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
  <rtp>
    <auto addr-v4=""/>
  </rtp>
</config>
XML

В настройках ECSS-100 нужно указать адрес для приема регистраций (в целях безопасности, т.к. по умолчанию соединения принимаются на всех адресах — 0.0.0.0). Для каждого сервера — свой:

support@[mycelium1@ecss1]:/$ 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.
support@[mycelium1@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

В результате должно появиться четыре записи ресурсов:

admin@mycelium1@ecss1:/$ 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.7.24 │       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.7.24 │       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.7.24 │       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.7.24 │       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 │
└─────────────┴───────┴───────────┴───────────┴──────┴────────┴───────────┴───────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘

[exec at: 09.03.2021 15:19:27, exec time: 18ms, nodes: core1@ecss2 v.3.14.8.16]

Механизм перепарковки вызовов при остановке/перезапуске медиасервера

При остановке или перезапуске медиасервера, он предварительно завершает все активные 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>

, в итоге имеет матрицу сайтов:

admin@[md1@IBM]:/$ system/media/site/matrix       
┌───────────────┬───┬───┬────┬────┬───┐
│   Site-name   │ # │ 1 │ 2  │ 3  │ 4 │
├───────────────┼───┼───┼────┼────┼───┤
│ local         │ 1 │ 0 │    │    │   │
│ tc            │ 2 │   │  0 │    │   │
│ video         │ 3 │   │    │  0 │   │
│ without-video │ 4 │   │    │    │ 0 │
└───────────────┴───┴───┴────┴────┴───┘

Legend:
 empty distance — infinity distance between sites.

[exec at: 06.03.2019 13:10:34, exec time: 13ms, nodes: core1@IBM]

После этого настраиваем расстояния между сайтами расширенный web или Cocon:

system/media/site/distance <from site> <to site> <distance>

, чтобы матрица расстояний выглядела следующим образом:

admin@[md1@IBM]:/$ system/media/site/matrix 
┌───────────────┬───┬───┬────┬────┬───┐
│   Site-name   │ # │ 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 │
└───────────────┴───┴───┴────┴────┴───┘

Legend:
 empty distance - infinity distance between sites.

[exec at: 06.03.2019 13:12:16, exec time: 25ms, nodes: core1@IBM]

Выставляем site в tc для системного интерфейса system:teleconference:

admin@[md1@IBM]:/$ domain/test.domain/iface/user-set * * system:teleconference site tc
Property 'site' successfully changed to 'tc' for interfaces:
system:teleconference

[exec at: 06.03.2019 13:18:17, exec time: 25ms, nodes: ds1@IBM]

Настраиваем конфигурационный файл для медиасервера селекторной связи:

/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, пример:

admin@[md1@IBM]:/$ 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 │
└─────────────┴─────────────┴────────┴─────────┴───────┘

[exec at: 06.03.2019 13:22:08, exec time: 150ms, nodes: core1@IBM]

Декларируем контакты медиасервера без видео с site равным without-video, пример:

admin@[md1@IBM]:/$ 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 │
└─────────────┴───────────────────────────┴────────┴─────────┴───────────────┘

[exec at: 06.03.2019 13:22:35, exec time: 119ms, nodes: core1@IBM]

Если контакты уже были задекларированы, для контактов медиасервера с видео выставляем site в video, пример:

admin@[md1@IBM]:/$ 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 │
└─────────────┴─────────────┴──────────┴───────┘

[exec at: 06.03.2019 13:28:05, exec time: 35ms, nodes: core1@IBM]

а для контактов медиа-сервера без видео выставляем  site  в without-video, пример:

admin@[md1@IBM]:/$ 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 │
└─────────────┴───────────────────────────┴──────────┴───────────────┘

[exec at: 06.03.2019 13:28:24, exec time: 34ms, nodes: core1@IBM]

Система с использованием site (территориального тяготения)

Существует возможность перепарковывать селекторную связь на конкретный медиасервер с использованием только примитива site.
При парковке вызова выбирается медиасервер, до которого существует наименьшее расстояние от паркуемых абонентов (расстояние от site абонентов до site медиасерверов). Если находятся 2 и более одинаковых минимальных расстояний до медиасервером, то медиасервер выбирается равновероятно (на основании его загруженности и коэффициента производительности).

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

  • не нужно поднимать интерфейс медиасервера для zone without-video;
  • если упадет медиасервер с site without-video, то вызовы перепаркуются на доступный медиасервер (до которого есть расстояние в матрице расстояний между site). В случае zone, вызовы не будут перепаркованы, а будут зарелижены, т.к. больше не будет медиасервера, который бы одновременно находился в zone default и zone without-video.

Настройка

В примере рассматривается система с использованием 3 MSR. Количество MSR можно увеличить в зависимости от требований к системе.

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

  • local для абонентов. По умолчанию, все абонентов имеют site равный local;
  • tc для селекторной связи.
  • Для медиасерверов требуются site:
  • video — для медиасервера с поддержкой видео;
  • without-video — для медиасервера без поддержки видео.

Декларируем перечисленные выше site командой:

system/media/site/declare <site>

Ожидаемая матрица после декларации сайтов:

admin@[md1@IBM]:/$ system/media/site/matrix       
┌───────────────┬───┬───┬────┬────┬───┐
│   Site-name   │ # │ 1 │ 2  │ 3  │ 4 │
├───────────────┼───┼───┼────┼────┼───┤
│ local         │ 1 │ 0 │    │    │   │
│ tc            │ 2 │   │  0 │    │   │
│ video         │ 3 │   │    │  0 │   │
│ without-video │ 4 │   │    │    │ 0 │
└───────────────┴───┴───┴────┴────┴───┘

Legend:
 empty distance - infinity distance between sites.

[exec at: 06.03.2019 13:10:34, exec time: 13ms, nodes: core1@IBM]

После этого настраиваем расстояния между сайтами командой:

system/media/site/distance <from site> <to site> <distance>

Ожидаемый результат настройки сайтов для данного примера:

admin@[md1@IBM]:/$ system/media/site/matrix 
┌───────────────┬───┬───┬────┬────┬───┐
│   Site-name   │ # │ 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 │
└───────────────┴───┴───┴────┴────┴───┘

Legend:
 empty distance - infinity distance between sites.

[exec at: 06.03.2019 13:12:16, exec time: 25ms, nodes: core1@IBM]

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

  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:

admin@[md1@IBM]:/$ domain/test.domain/iface/user-set * * system:teleconference site tc
Property 'site' successfully changed to 'tc' for interfaces:
system:teleconference

[exec at: 06.03.2019 13:18:17, exec time: 25ms, nodes: ds1@IBM]

Декларируем контакты медиасервера с видео с site равным video:

admin@[md1@IBM]:/$ 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 │
└─────────────┴─────────────┴────────┴─────────┴───────┘

[exec at: 06.03.2019 13:22:08, exec time: 150ms, nodes: core1@IBM]

Декларируем контакты медиасервера без видео с site, равным without-video:

admin@[md1@IBM]:/$ 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 │
└─────────────┴───────────────────────────┴────────┴─────────┴───────────────┘

[exec at: 06.03.2019 13:22:35, exec time: 119ms, nodes: core1@IBM]

Если контакты уже были задекларированы, для контактов медиасервера с видео выставляем site в video:

admin@[md1@IBM]:/$ 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 │
└─────────────┴─────────────┴──────────┴───────┘

[exec at: 06.03.2019 13:28:05, exec time: 35ms, nodes: core1@IBM]

Для контактов медиасервера без видео выставляем site в without-video:

admin@[md1@IBM]:/$ 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 │
└─────────────┴───────────────────────────┴──────────┴───────────────┘

[exec at: 06.03.2019 13:28:24, exec time: 34ms, nodes: core1@IBM]

Настройка выделенного 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 следующий:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/list         
List of all sites:
 local

Создаем site для абонента VIP:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/declare vip     
Site: vip
 Created successfully.

Создаем site для абонентов TC:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/declare tc    
Site: tc
 Created successfully.

После изменений список site следующий:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/list          
List of all sites:
 local
 vip
 tc

Настройка матрицы связности между site

После создания site матрица связности между site будет следующей:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/matrix       
┌───────────┬───┬───┬───┬───┐
│ Site-name │ # │ 1 │ 2 │ 3 │ 
├───────────┼───┼───┼───┼───┤
│ vip       │ 1 │ 0 │   │   │
│ local     │ 2 │   │ 0 │   │
│ tc        │ 3 │   │   │ 0 │
└───────────┴───┴───┴───┴───┘

Legend:
 empty distance - infinity distance between sites.

К MSR1 должен быть привязан site vip, к MSR2 local, к MSR3 tc.

Выставляем расстояние между  абонентами VIP и медиасервером MSR.1, который также использует сайт VIP:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance vip vip 10
Distance between vip and vip changed to: 10.

Выставляем расстояние между  абонентами VIP и медиасервером MSR.2, который использует сайт LOCAL:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance vip local 20
Distance between vip and local changed to: 20.

Выставляем расстояние между абонентами VIP и медиасервером MSR.3, который использует сайт TC:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance vip tc 50
Distance between vip and tc changed to: 50.

Выставляем расстояние между абонентами LOCAL и медиасервером MSR.1, который использует сайт VIP:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance local vip r
Distance between local and vip changed to: r.

Выставляем расстояние между абонентами LOCAL и медиасервером MSR.2, который использует сайт LOCAL:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance local local 10
Distance between local and local changed to: 10.

Выставляем расстояние между абонентами LOCAL и медиасервером MSR.3, который использует сайт ТС:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance local tc 50
Distance between local and tc changed to: 50.

Выставляем расстояние между TC и медиасервером MSR.3, который использует сайт ТС:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance tc tc 0
Distance between local and tc changed to: 0.

После изменений матрица связности следующая:

admin@[mycelium1@PAUL#ECSS-D 000001]:/$ 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.

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ 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.5.5 │       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.5.5 │       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.5.5 │       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:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ 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:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ 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:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ 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      │
└─────────────┴──────────────┴────────┴─────────┴─────────┘

После изменений список ресурсов следующий:

admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ 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.5.5 │       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.5.5 │       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.5.5 │       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:

admin@[mycelium1@PAUL#ECSS-D 000001]:/$ 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.

Примеры настройки multicast-вещания

В данном разделе приведены примеры того, как можно организовать multicast-вещание со стороннего http-сервера на локальный multicast-адрес:

Вещание в кодеке PCMA:
gst-launch-1.0 souphttpsrc location=http://us4.internet-radio.com:8258 ! decodebin ! audioconvert ! audioresample ! alawenc !  rtppcmapay min-ptime=20000000 max-ptime=20000000 ! udpsink host=224.224.224.1 port=5004 auto-multicast=true sync=false
Вещание в кодеке G722:
gst-launch-1.0 souphttpsrc location=http://us4.internet-radio.com:8258 ! decodebin ! audioconvert ! audioresample ! avenc_g722 !  rtpg722pay min-ptime=20000000 max-ptime=20000000 ! udpsink host=224.224.224.1 port=5004 auto-multicast=true sync=false