Многие наверно пользовались JS библиотеками, которые реализуют протокол SIP. На слуху simpl, jssip, sipjs. Когда мне доводилось ими пользоваться меня всегда немного напрягало то, что это полный SIP стэк с соответствующим огромным количеством кода и очень частые проблемы несовместимости в реализации этого протокола между разными реализациями. И вот как то раз я наткнулся на mod_verto, модуль, которые из коробки есть в freeswitch. Модуль слушает веб-сокет и осуществляет сигнализацию между клиентом и сервером с помощью JSON данных. Ясно, что без протокола SDP тут дело не обходится, но сам по себе диалог гораздо проще.
Например регистрация:
Запрос:
[{
"jsonrpc": "2.0",
"method": "login",
"params": {
"login": "100@example.com",
"passwd": "password",
"loginParams": {},
"sessid": "86b75f77-8d75-e53f-6250-3475e8a8a0c9"
},
"id": 3
}]
Ответ:
[{
"jsonrpc": "2.0",
"id": 3,
"result": {
"message": "logged in",
"sessid": "86b75f77-8d75-e53f-6250-3475e8a8a0c9"
}
}]
Круто, правда?
Теперь, как это чудо поднять. Есть неплохая страница на wiki проекта FreeSWITCH. Не буду наниматься копипастой, а просто намечу путь.
- Сгенерировать сертификаты для хоста (документация говорит нам, что необходим WSS, на самом деле это не так, прекрасно работает через WS, но все же SSL он такой SSL)
- Отредактировать $CONFDIR/autoload_configs/verto.conf.xml
- Убедиться, что загружены следующие модули: mod_verto, mod_opus, mod_rtc, mod_vp8 (или mod_vpx, это зависит от версии)
- Добавить разрешения для mod_verto в домен или в конкретного пользователя:
<params> <param name="jsonrpc-allowed-methods" value="verto"/> <param name="jsonrpc-allowed-event-channels" value="demo,conference,presence"/> </params>
После этого должны заработать исходящие вызовы. Для тестов можно использовать WebRTC verto demo phone. Там можно нажать кнопку «LogOut» и ввести свои параметры freeSWITCH.
- Обозначить как другие пользователи могут звонить пользователю mod_verto. В документации показано 3 способа. Я пользовался первым. Просто добавил
",${verto_contact ${dialed_user}@${dialed_domain}}"в<param name="dial-string">
Неочевидное но вероятное
Есть моменты, про которые в документации ни слова.
Передача сообщений. Не знаю на сколько так делать правильно, но это работает. Изменяем /usr/local/freeswitch/conf/chatplan/default.xmlследующим образом:
<context name="default"> <extension name="demo"> <condition field="to" expression="^(.*)$"> <action application="send" data="verto"/> <action application="send" data="sip"/> </condition> </extension> </context>
Firefox и клиентская js либа (verto.js). В chrome все отлично, а вот в firefox звонок разрывается после одного Ring если создавать звонок без поддержки видео но при этом пользователь даст разрешение на использование камеры.
Если мы создаем звонок так:
var call = this.verto.newCall({
destination_number: num,
caller_id_name: caller,
caller_id_number: caller,
useVideo: true,
useStereo: false
});
Права на камеру нужно давать так (тоесть никак):
Полезные команды
freeswitch@internal> verto status
Name Type Data State
=================================================================================================
mine profile ws:0.0.0.0:8081 RUNNING
mine profile wss:0.0.0.0:8082 RUNNING
mine::100@example.net client 127.28.14.53:53968 CONN_REG (WS)
mine::100@example.net client 127.176.193.134:60073 CONN_REG (WS)
mine::100@example.net client 128.176.193.134:59986 CONN_REG (WS)
=================================================================================================
1 profile , 3 clients
