Многие наверно пользовались 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