Немного о конференциях

от автора

image
Не так давно, мы отказались от использования Skype, как средства корпоративной связи, в пользу Telegram. Однако, Skype имел на борту одну очень полезную штуку — аудио/видео конференции. Как уже упоминалось в предыдущих статьях, за связь у нас отвечает Asterisk, но пока он работал в минимальной конфигурации (не считая создания задач в redmine о пропущенных вызовах) и мы решили прикрутить возможность конференц связи.

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

И так, собрать конференцию в Asterisk — проще простого! Достаточно вызвать AppConfBridge:

context conference {   100 => ConfBridge(sb); } 

Описывать confbridge.conf и все возможные параметры мы не будем, все это можно посмотреть, например тут voip.rus.net/tiki-index.php?page=Asterisk+ConfBridge

Для того, чтобы просто пообщаться голосом с коллегами, этого вполне достаточно.
А теперь добавим в конференцию админа, и возможность приглашать клиентов.
1) Перманентные админы (Руководство всегда хочет быть во главе)
Используем для этого базу данных AstDB.

database put conference 51 1 

Где 51 — внутренний номер одного из сотрудников.
И теперь вызов нашей конференции будет выглядеть так

context conference {   100 => {     Set(STATUS_ADMIN=${DB(conference/${CALLERID(num)})});     switch (${STATUS_ADMIN}) {     case 1:       Set(CONFBRIDGE(bridge,template)=sb_profile)        Set(CONFBRIDGE(user,template)=sb_admin)        Set(CONFBRIDGE(menu,template)=admin_menu)        break;     default:       Set(CONFBRIDGE(bridge,template)=sb_profile)        Set(CONFBRIDGE(user,template)=sb_user)        Set(CONFBRIDGE(menu,template)=user_menu)        break;     };     Confbridge(sb);   }; } 

Что мы получили: если номер конференции набирает абонент с clid 51, то для него устанавливатеся темплейт и меню администратора конференции, всем остальным не даем привилегий.
Но как быть, если конференцию собирает кто то из младших админов? Повышаем первого вошедшего в комнату:

...   100 => {     Answer;     Set(STATUS_ADMIN=${DB(conference/${CALLERID(num)})});     if ("${CONFBRIDGE_INFO(parties,sb)}"="0"){       Set(STATUS_ADMIN=1);     };     switch (${STATUS_ADMIN}) {     case 1: ... 

${CONFBRIDGE_INFO(parties,sb)} — отдает количество участников. Если в конференции их 0, то первый участник становится админом.
Но не всегда удобно говорить по телефону, особенно, если речь идет о конференции с разработчиками, где нужны обе руки. Заводить SIP учетки для разработчиков наших клиентов было бы не правильным, потому будем использовать webrtc.
Много было статей по настройке, с предложениями пропатчить asterisk, но в 13 версии все работает из коробки. Нужно лишь сгенерировать сертификаты и в включить поддержку сокетов.
Скрипт для генерации сертификатов можно найти в исходниках или скачать отдельно: raw.github.com/rillian/asterisk-opus/master/contrib/scripts/ast_tls_cert

mkdir /etc/asterisk/keys /usr/src/asterisk-13/contrib/scripts/ast_tls_cert -C asterisk.southbridge.ru -O "centos admin" -d /etc/asterisk/keys 

http.conf:

[general] enabled=yes bindaddr=0.0.0.0 bindport=8088 

RTP
Так как все мы частенько сидим за натом, включаем поддержку ice и stun, иначе голос нас не найдет
rtp.conf:

[general] rtpstart=10000 rtpend=20000 icesupport=yes stunaddr=stun.l.google.com:19302 

SIP. Настройка пиров
Активируем websocket и создаем пир
sip.conf:

[general] udpbindaddr=0.0.0.0:5060 realm=pbx.domain.ru ; заменить на свой ИП или на доменное имя сервера с астериском. transport=udp,ws  [webrtc](!) host=dynamic context=from-internal type=friend encryption=yes avpf=yes force_avp=yes icesupport=yes nat=force_rport,comedia directmedia=no disallow=all qualify=yes videosupport=yes allow=ulaw,alaw,vp8,h264,h263p,mpeg4 dtlsenable=yes dtlsverify=no dtlscertfile=/etc/asterisk/keys/asterisk.pem dtlscafile=/etc/asterisk/keys/ca.crt dtlssetup=actpass                            ; Пароль сертификата  [101](webrtc) defaultusername=101 secret=101Passw0rd 

На github можно найти множество sip клиентов, например этот github.com/onsip/sipjs-examples
Все, теперь собираем конференцию, даем ссылку клиенту на софтфон с одной кнопкой «Присоединиться к конференции» и все счастливы.

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

Автор: системный администратор компании Centos-admin.ru artzcom.

ссылка на оригинал статьи https://habrahabr.ru/post/282019/