10 сентября 2014 в 16:04

Установка и настройка Asterisk для работы с WebRTC tutorial


В сети есть много информации и инструкций по теме, но на текущий момент они уже не актуальны и довольно сложны. Во многих случаях используют webrtc2sip но его довольно сложно собрать и заставить работать. Под катом я написал подробную инструкцию как заставить работать WebRTC через Asterisk.

1. Подготовка системы (ubuntu 14.04)

обновляем

apt-get install aptitude
aptitude update && aptitude upgrade -y
apt-get install openssl


качаем 13 версию астериска:
cd /usr/src/
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
tar -zxvf asterisk-13-current.tar.gz


в пакете с астером есть скрипт который устанавливает все зависимости, для начала попробуем его использовать.
cd asterisk-13.2.0/contrib/scripts/
./install_prereq install

в моем случае скрипт выдал кучу конфликтов, у меня ubuntu 64 а скрип пытается поставить i386 пакеты. Поэтому установим все зависимости вручную.

aptitude install -y libncurses-dev libz-dev libssl-dev libxml2-dev libsqlite3-dev uuid-dev uuid libcurl-dev libspeex-dev libspeexdsp-dev libogg-dev libvorbis-dev libasound2-dev portaudio19-dev libcurl4-openssl-dev libpq-dev unixodbc-dev libsqlite0-dev libmysqlclient15-dev libneon27-dev libgmime-dev libusb-dev liblua5.1-0-dev lua5.1 libopenh323-dev libvpb-dev libgtk2.0-dev libmysqlclient-dev libbluetooth-dev libradiusclient-ng-dev freetds-dev libsnmp-dev libiksemel-dev libcorosync-dev libnewt-dev libpopt-dev libical-dev libspandsp-dev libjack-dev libresample-dev libc-client-dev binutils-dev libsrtp-dev libgsm1-dev libedit-dev doxygen libjansson-dev libldap-dev subversion git libxslt1-dev mc htop iftop


еще раз воспользуемся скриптом для установки дополнительных пакетов libsrtp и pjproject они очень важны для работы webrtc

./install_prereq install-unpackaged


тут все собралось без проблем, но если вдруг возникнут ошибки то ставим все руками
cd /usr/src/
git clone https://github.com/cisco/libsrtp.git
cd libsrtp
./configure CFLAGS=-fPIC && make libsrtp.a && make uninstall && make install
cd ..
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local.conf
/sbin/ldconfig

git clone https://github.com/asterisk/pjproject.git
cd pjproject
./configure --enable-shared --with-external-speex --with-external-gsm --with-external-srtp --disable-sound --disable-resample && make && make install
/sbin/ldconfig


на этом система готова для установки астериска с поддержкой webrtc.

Установка Asterisk


cd /usr/src/asterisk-13.2.0/
./configure --with-crypto --with-ssl --with-srtp
make menuselect


в меню надо проверить есть ли звездочки
что бы было отмечено [x] , если xxx то не собран данный модуль

Channel Drivers -> chan_pjsip и chan_sip
Resource Modules -> res_srtp, res_crypto и res_http_websocket

если все есть, то продолжаем, если нет — проверяем заново зависимости.

make && make install && make samples && make config


Генерируем сертификаты.

mkdir /etc/asterisk/keys
cd /usr/src/asterisk-13.2.0/contrib/scripts/
./ast_tls_cert -C IP_или_Имя_Сайта -O "Имя_Сервиса" -d /etc/asterisk/keys

скрипт запросит установить пароль (не менее 4 символов) на сертификат.

Установка завершена, переходим к настройкам.

Настройка


редактируем файл http.conf
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088


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


sip.conf

[general]
context=default
allowguest=no
allowoverlap=no
alwaysauthreject=yes
useragent=Имя_Вашей_АТС
callevents=yes
limitonpeer=yes
srvlookup=yes 
tos_sip=cs3
tos_audio=ef
canreinvite=no
disallow=all
allow=alaw
allow=gsm
allow=slin
allow=g729
allow=ulaw
externaddr=Внешний_IP
media_address=Внешний_IP
udpbindaddr=0.0.0.0:5060
realm=Внешний_IP	
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=yes
disallow=all
qualify=yes
videosupport=no
allow=ulaw,alaw,vp8,h264,h263p,mpeg4
dtlsenable=yes
dtlsverify=no
dtlsverify=fingerprin
dtlscertfile=/etc/asterisk/keys/asterisk.pem
dtlscafile=/etc/asterisk/keys/ca.crt
dtlssetup=actpass

[101](webrtc)
defaultusername=101
secret=101

[102](webrtc)
defaultusername=102
secret=102


extensions.conf
[from-internal]
exten => 999,1,Answer()
same => n,Playback(demo-congrats)
same => n,Hangup()

exten => 888,1,Answer()
same => n,Echo()
same => n,Hangup()

exten => _XXX,1,Noop(webrtc test call)
same => n,DIAL(SIP/${EXTEN})
same => n,Hangup()


Тестирование


Для тестирования можем использовать HTML5 sip client с сервера sipml5.org/call.htm или установить его на свой сервер.

aptitude install apache2
cd /var/www/
svn checkout http://sipml5.googlecode.com/svn/trunk/ webphone


теперь веб HTML5 сип клиент доступен на нашем сервере Внещний_IP/webphone/call.htm
Настройка

Display Name: 101
Private Identity*: 101
Public Identity*: sip:101@Внешний_IP
Password: 101
Realm*: Внешний_IP


в Expert mode
WebSocket Server URL[2]: ws://Внешний_IP:8088/ws
ICE Servers[4]: []  или если сервер за NAT   [{ url: 'stun:stun.l.google.com:19302'}]


Тестируем


Звонок между двумя ноутами:

Звонок на андроид (chrome)



лог звонка
webrtc*CLI> 
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
    -- Executing [104@from-internal:1] NoOp("SIP/103-00000020", "webrtc test call") in new stack
    -- Executing [104@from-internal:2] Dial("SIP/103-00000020", "SIP/104") in new stack
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
    -- Called SIP/104
    -- SIP/104-00000021 is ringing
webrtc*CLI> 
    -- SIP/104-00000021 answered SIP/103-00000020
    -- Channel SIP/103-00000020 joined 'simple_bridge' basic-bridge <13742dcb-5019-4fd2-b85e-0e1b70b1ccd7>
    -- Channel SIP/104-00000021 joined 'simple_bridge' basic-bridge <13742dcb-5019-4fd2-b85e-0e1b70b1ccd7>


webrtc*CLI> sip show channels
Peer             User/ANR         Call ID          Format           Hold     Last Message    Expiry     Peer      
91.203.82.152    104              0a9b261a3926a75  (ulaw|vp8)       No       Tx: ACK                    104       
91.203.82.152    103              3f8b4b42-600d-8  (ulaw|vp8)       No       Rx: ACK                    103       


Тесты проводились на
chrome 37.0.2062.94 — работает голос, видео, DTMF.
android chrome 37.0.2062.117 — работает голос, видео, DTMF.
Firefox 32.0 — работает голос, DTMF. Видео работает только в одну сторону.

P.S. Сейчас сервер работает, можете звонить и проверять как работает WebRTC.
+16
18475
230
Alexcr 3,2

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

+1
Ovoshlook #
pjproject они очень важны


И в чем заключается важность PJSIP если вы работаете исключительно с CHAN_SIP?
0
Alexcr #
нет инфы зачем он нужен(или я не нашел) но без PJSIP неверно отрабатывает ICE и dtls.
В логах замечал такое
ERROR[1923]: pjsip:0 <?>: 	icess0x326c0e8 ..Error sending STUN request: Invalid argument 

но все работало :)
+1
beho1der #
Насколько знаю(тестировал) раньше не работали звонки в локальной сети, так как насколько понимаю по протоколу ICE трафик принудительно уходил через gateway как сейчас с этим?
0
Alexcr #
я stund ставил на сервере с астером.
0
beho1der #
Может напишите для полноты, так как это достаточно важный вопрос. Редко где это описывают!
+1
xReaper #
Stun — ICE Это же разные вещи товарищи
0
Alexcr #
вырезка из webrtc.pbxware.ru/sipml5/expert.htm#aIceServers пункт 4
This must be an array of STUN/TURN servers to use. The format is as explained at www.w3.org/TR/webrtc/#rtciceserver-type
To disable TURN/STUN to speedup ICE candidates gathering you can use an empty array. e.g. [].

Если указать вместо stun сервера [] то sipml заюзает ICE для определения STUN сервера.
+1
xReaper #
Нет вы немного попутали, сервер стан нужен для определиния внешнего адреса, также он помогает для прохождение Натов, ну тут в принципе ничего нового.
А вот айс, это довольно новая штучка, принцип такой, каждый участник диалога в сип сообщения вставляет все ай пи адреса которые можно использовать для того что бы трафик голосовой к нему пришел, и на этом основании будет выбран лучший кандидат. Это даёт преимущество в том случае где некоторое количество трафика могут быть отправлены напрямую, кстати даже если сети разные, довольно интересная вещь, но я пока грамотноё использование не видел.
0
Alexcr #
www.rtcquickstart.org/ICE-STUN-TURN-server-installation
code.google.com/p/rfc5766-turn-server/
manpages.ubuntu.com/manpages/precise/man8/stund.8.html

пример (88.88.88.88 — внешний ип астера)
stund -h 192.168.1.1 -a 88.88.88.88
+1
Alexcr #
Блин перчик-файс никто не заметил :)
+1
Gen1us2k #
А астер уже не крашится при входящем звонке с сип-транка? Нет проблем с SRTP? Нет ли проблем с ICE? Всегда ли слышно обоих человек при входящем звонке?
0
Alexcr #
Астер не падает, с SRTP вообще никогда проблем не видел :). ICE работает звук бегает без проблем тестил PROV — WebRTC, WebRTC — PROV и WebRTC — WebRTC.
Заметил проблему, иногда звонок в браузере срывается а на астере он еще есть.
+1
Gen1us2k #
Ну видимо за девять месяцев они все-таки сделали нормальную поддержку WebRTC.
0
Ovoshlook #
Не сделали. Есть проблемы с односторонним голосом и подобные вещи. Которые происходят рандомно, по крайней мере так было с 12.4.0. Хотя очень много проблем они все же решили, включая добавление в исходящий INVITE sha-2 sdp поля. Раньше не было и нельзя было позвонить с астера на вебфон. Вообще самый стаблильный сервер для работы с WebRTC это kamailio (ну и opensips я думаю. Не щупал его, но так как модули для обработки webrtc есть и там и там- то я думаю можно и его).
0
62mkv #
проблемы с односторонним звуком как правило обусловлены некорректным определением порта или пары адрес: порт для RTP-медиа абонента. воспроизводилось >90 % при наличии на хосте абонента более 1-го IP-адреса (по крайней мере, при активном OpenVPN с подсетью 10.0.0.x)

выставление icesupport=yes в rtp.conf снимает эту проблему (практически?) начисто. проверялось на 12.4.0, т.е. на pj-стеке.
0
norguhtar #
У меня неожиданный вопрос. У вас вызов на asterisk проходит? К примеру обезьянок послушать.
0
Alexcr #
Да проходило, тестил echo и playback
0
norguhtar #
Очень интересно, так-как вот по идее не должно. Видимо вам повезло больше :)
0
beho1der #
Вызов в плане звука или сам факт звонка?
0
norguhtar #
В плане звука. Я словил баг когда rtp есть и доходит до клиента, но фактически звука нет. Судя по тому что видно в webrtc-internals и то как ведет себя ICE есть проблемы из-за rtcp-mux и некорректной работы failback в браузерах. В итоге нормально и стабильно это работает только во FreeSwitch где как раз есть поддержка rctp-mux.
0
beho1der #
я ловил такую проблему когда тестировал в локальной сети, оказалось что rtp трафик упорно летел наружу и работало только когда сервер находился вне локальной сети!
0
norguhtar #
Нет.Тут rtp трафик приходит куда надо. Чтобы в локалке приходило куда надо все равно требуется ICE. В этом случае более менее правильно выбирает.
0
roginvs #
Посмотрите тут groups.google.com/d/topic/sip_js/d5Tivv02Ct0, там у людей такая же проблема: соединие по SIP-у есть, звука нет. Проблема в установке DTLS сессии.
0
norguhtar #
Нет там такой проблемы. Звук идет ошибок насчет DTLS не наблюдается.
0
roginvs #
DTLS ошибки и не будут наблюдаться ни в логах астериска, ни в javascript консоли. При этом будет идти в сторону браузера RTP трафик. В любом случае, попробуйте собрать версию 11.16.0 — на ней у меня WebRTC завёлся.
0
norguhtar #
DTLS ошибки и не будут наблюдаться ни в логах астериска, ни в javascript консоли.

Это прекрасно, все что я могу сказать. И каким образом обнаружить тогда проблемы? Я ставил последнюю 13 доступную из репозитория. Или я так понимаю из него может не работать?
0
norguhtar #
Посмотрел, версию. Стояла более старая после обновления заработало.

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