Пообщавшись в комментариях к посту, я понял, что не все до конца понимают принцип работы SIP в браузере. Поэтому, решил экспромтом написать небольшую статью, где в общих чертах раскрыть эту тему.
Действующие лица:
HTTP сервер
Ничего особенного от него не требуется, только поддержка HTTP протокола.
SIP сервер
Помимо обычных для SIP протоколов — UDP, TCP, TLS, требуется поддержка WebSocket. WebSocket очень простой протокол, работает он следущим образом:
- клиент подключается к серверу по TCP или TLS
- передает HTTP запрос, в котором есть признак того, что клиент хочет переключиться на WebSocket
- сервер отвечает 101 Protocol Switching
- WebSocket подключение готово для передачи данных в дуплексном режиме, это практически TCP с небольшим заголовком для каждого блока передаваемых данных
В некоторых заголовках SIP сообщения есть информация о протоколе транспортного уровня, например:
Via: SIP/2.0/UDP 192.168.1.1;branch=z9hG4bKyQz1234567
А так как WebSocket не описан в основном документе по SIP, потребовалось расширение, это еще не стандарт, но его уже можно использовать. В этом документе нет принципиальных изменений rfc3261, по большой части он просто разрешает очевидные вещи, например, такой заголовок:
Via: SIP/2.0/WS df7jal23ls0d.invalid;branch=z9hG4bKyQz1234567
Браузер
Здесь все сложнее, требуется целый букет технологий: WebSocket для подключения к SIP серверу; SIP стэк, который можно реализовать на JavaScript; WebRTC для передачи аудио и видео.
Как оно работает
Уже наверное понятно, прелесть всей схемы в том, что не требуется никаких согласующих протоколы агентов. Клиент в браузере является полноценным участником и взаимодействует напрямую с любым SIP сервером, и любыми клиентами, например, с хардварным IP телефоном. Единственное требование — это поддержка WebRTC кодеков.
Как потестировать
Информацию о том может ли Asterisk общаться по WebSocket мне найти не удалось. Но есть другие SIP сервера с поддержкой WebSocket, они конечно уступают по функционалу, но для тестирования его достаточно. Например, сервер для Windows, начиная с версии 3.2 поддерживает WebSocket и даже имеет встроенный HTTP сервер.
Автор: vf1