Звонки с использованием Android SDK¶
Описание¶
SIP звонки на устройствах Android возможны как из браузера, так и с использованием Android SDK.
Схема работы¶
1. SIP-сервер как прокси-сервер для передачи вызовов и RTP медиа¶

- Устройство Android начинает звонок
- WCS соединяется с SIP-сервером
- SIP-сервер соединяется с SIP-устройством, принимающим звонок
- Устройство Android и SIP-устройство обмениваются аудио- и видеопотоками
2. SIP-сервер только как сервер для передачи вызовов¶

- Устройство Android начинает звонок
- WCS соединяется с SIP-сервером
- SIP-сервер соединяется с SIP-устройством, принимающим звонок
- Устройство Android и SIP-устройство обмениваются аудио- и видеопотоками
Тестирование¶
Исходящий звонок с Android на SIP-устройство¶
- Для тестирования используем:
- два SIP-аккаунта;
- приложение Phone для совершения звонка;
-
программный телефон для ответа на звонок.
-
Установите на Android-устройство приложение Phone. Запустите приложение, введите URL WCS-сервера для подключения к нему по Websocket и данные звонящего SIP-аккаунта:

-
Запустите программный телефон, введите данные SIP-аккаунта, принимающего звонок:

-
Нажмите в приложении кнопку
Connect, будет установлено соединение с сервером. Затем введите идентификатор SIP-аккаунта, принимающего звонок, и нажмите кнопкуCall:

-
Примите звонок в программном телефоне, нажав кнопку ответа на звонок:

-
Для завершения звонка нажмите кнопку
Hangupв приложении, либо кнопку завершения звонка в программном телефоне.
Прием входящего звонка с SIP-устройства на Android¶
- Для тестирования используем:
- два SIP-аккаунта;
- программный телефон для совершения звонка;
-
приложение Phone для ответа на звонок.
-
Установите на Android-устройство приложение Phone. Запустите приложение, введите URL WCS-сервера для подключения к нему по Websocket и данные SIP-аккаунта, принимающего звонок:
Нажмите в приложении кнопку Connect, будет установлено соединение с сервером -
Запустите программный телефон, введите данные звонящего SIP-аккаунта:

-
В программном телефоне введите идентификатор SIP-аккаунта, принимающего звонок, и нажмите кнопку вызова:

-
Примите звонок в приложении, нажав
Answer:

-
В программном телефоне убедитесь, что звонок начался:

-
Для завершения звонка нажмите кнопку
Hangupв приложении, либо кнопку завершения звонка в программном телефоне.
Последовательность выполнения операций¶
Ниже описана последовательность вызовов при использовании примера Phone-min для создания звонка

-
Создание звонка:
Session.createCall(),Call.call()code
CallOptions callOptions = new CallOptions(mCalleeView.getText().toString()); AudioConstraints audioConstraints = callOptions.getConstraints().getAudioConstraints(); MediaConstraints mediaConstraints = audioConstraints.getMediaConstraints(); ... call = session.createCall(callOptions); call.on(callStatusEvent); /** * Make the outgoing call */ call.call(); Log.i(TAG, "Permission has been granted by user"); -
Отправка
SIP INVITEна SIP сервер -
Отправка
SIP INVITEна SIP устройство -
Получение подтверждения от SIP-устройства
-
Получение подтверждения от SIP-сервера
-
Получение от сервера события, подтверждающего успешное соединение.
-
Стороны звонка обмениваются аудио- и видеопотоками
-
Завершение звонка
Call.hangup()code
-
Отправка
SIP BYEна SIP-сервер -
Отправка
SIP BYEна SIP-устройство -
Получение подтверждения от SIP-устройства
-
Получение подтверждения от SIP-сервера
Известные проблемы¶
1. Невозможно совершить SIP-звонок, если поля SIP Login, SIP Authentification name содержат недопустимые символы¶
Симптомы
Звонок не совершается, зависает в статусе PENDING
Решение
Согласно RFC3261, SIP Login и SIP Authentification name не должны содержать неэкранированных пробелов, спецсимволов и не должны заключаться в угловые скобки <>.
Например, такое заполнение полей не соответствует стандарту
sipLogin='Ralf C12441@host.com'
sipAuthenticationName='Ralf C'
sipPassword='demo'
sipVisibleName='null'
а такое соответствует