Pull to refresh

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

JavaScriptAsteriskDevelopment of communication systems
Привет, хабралюди

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

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


  • Asterisk 11.5.1
  • GSM шлюз
  • 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.
Опытных чуваков прошу простить. Первый опыт работы с телефонией
Tags:javascriptwebrtcтелефониякостыли
Hubs: JavaScript Asterisk Development of communication systems
Total votes 10: ↑6 and ↓4+2
Views14K

Popular right now

Top of the last 24 hours