Мой опыт работы с Webrtc

в 12:00, , рубрики: asterisk, javascript, WebRTC, костыли, телефония, метки: , , ,

Привет, читатели

В этом топике я хочу рассказать вам о моем опыте работы с SIP телефонией через webrtc. Рассказать о том, с какими проблемами встречался, какой софт я пробовал, какие костыли писал :).

Что было использовано:

  • Asterisk 11.5.1
  • GMS шлюз
  • SipML5

Начало:

Изначально задача стояла так: обеспечить работающую телефонию в браузере. Раз задача поставлена, значит надо делать. Решили не использовать flash звонилки, а попробовать звонить через webrtc. Из js звонилок были JSSIP и SipML5. Использовать я решил в проекте SipML5.

Сначала начали использовать связку asterisk+webrtc2sip. Заработало всё хорошо, но возникла проблема в очень долгом соединении входящего звонка. Проблема пропадала после рестарта webrtc2sip. Погуглив я узнал о том, что астериск, умеет работать с webrtc.
Сделал также, как описано в вике sipml5. Собрал, проверил — работает. Запилил очередь, разрулил диалпланы, подключил GSM шлюз. Всё заработало хорошо, проблема ушла, но появились другие проблемы:

  • Начал падать астериск при нажатии на холд
  • Звонка нет, а sipml звонит

Увидев, что последняя версия астериска 11.5.1 я принял решение обновиться.
Собрал, запустил — работает отлично и без патчей. Но проблемы также остались.
Закомментировав в rtp.conf
stunaddr=stun.l.google.com:19302

При холде звонка астериск падать перестал. Но вторая проблема осталась.

Решил сбрасывать звонок, если в течение четырех секунд оператор не взял трубку.
Для этого добавил на 'i_new_call'

setTimeout(function() {
    if (!ctx.is_active) {
        ctx.sip_hangup();
    }
}, 4200);

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

Вооружившись wireshark пошел смотреть в чем дело. Оказалось, если звонок снять с холда, то соединение приходит с другого порта. Очевидно, что решение — не использовать холд такой, какой он есть, а просто включать/выключать микрофон оператору.

audio_tracks = this.session_call.o_session.o_stream_local.getAudioTracks();
for (var i = 0, l = audio_tracks.length; i < l; i++) {
    audio_tracks[i].enabled = false;
}

Погоняв всё вроде бы работало так, как надо, но возникла периодическая тишина при входящем звонке.

Ну, тут проблема оказалась в том, что GSM шлюз был подключен к астериску из приватной сети. Перенастроив все на публичные адреса. И эта проблема ушла

Заключение

Надеюсь статья поможет кому-нибудь в настройке телефонии через webrtc.
Опытных чуваков прошу простить. Первый опыт работы с телефонией

Автор: Gen1us2k

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js