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.

Комментарии (3)


  1. vetash
    20.04.2016 14:36

    Интересно, спасибо!
    >Можно еще попробовать прикрутить сервисы гугла, для распознавания речи и стенографии разговора в архив тикета, но…
    Можете рассказать поподробнее? Думаю многим бы пригодилось.


    1. akhaustov
      20.04.2016 14:36

      Хорошо. Ждите в следующий статьях.


      1. arheops
        20.04.2016 18:00

        … но распознавание 8khz звука сервисами гугла — отвратительное.