В прошлой статье я рассмотрел базовый сценарий UAC клиента, но зачастую в процессе обучение или тестирование необходимо смоделировать ситуацию в которой sipp будет выступать в качестве вызываемого абонента.
Передо мной стояла задача - узнать что будет слышать вызывающий абонент при отстуствии сообщения 180 ringing.
Как и в прошлой статье я буду целиком и полностью ссылаться на официальную документацию.
Написание сценария
Т.к. я уже обозначил задачу давайте схематично изобразим процесс обмена сообщениями между устройствами. В качестве вызывающего абонента А я использую SIP телефон.
A SIPP
----------> INVITE
<---------- 100
[5000ms] Pause
<---------- 200
----------> ACK
----------> BYE
<---------- 200
[4000ms] Pause
Если Вы читали мою предыдущую статью, то думаю уже знакомы с синтаксисом сценариев и понимание кода не вызовет у Вас затруднений.
Первый шаг одинаков для каждого сценария: создаем файл uas_no180.xml, в заголовке прописываем:
?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="Basic UAS responder">
Далее опираясь на схему ожидаем получение сообщения INVITE от пользователя А
<recv request="INVITE" crlf="true">
</recv>
На полученный запрос INVITE sipp отвечает сообщением 100 TRYING, командой pause заменяем отсутсвующее сообщение 180Ringing.
<send>
<![CDATA[
SIP/2.0 100 Trying
[last_Via:]
[last_From:]
[last_To:];tag=[call_number]
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Length:0
]]>
</send>
<pause milliseconds="5000"/>
После паузы отправляем ответ 200OK в тело сообщения добавляем протокол SDP с описанием сессии.
<send retrans="500">
<![CDATA[
SIP/2.0 200 OK
[last_Via:]
[last_From:]
[last_To:];tag=[pid]SIPpTag01[call_number]
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Type: application/sdp
Content-Length: [len]
v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [media_ip]
t=0 0
m=audio [media_port] RTP/AVP 0
a=rtpmap:0 PCMU/8000
]]>
</send>
На ответ 200ОК ожидаем получения ACK. После разговора ожидаем запроса BYE, отвечаем на него сообщением 200OK и заканчиваем скрипт типовыми тегами.
<recv request="ACK"
optional="true"
rtd="true"
crlf="true">
</recv>
<recv request="BYE">
</recv>
<send>
<![CDATA[
SIP/2.0 200 OK
[last_Via:]
[last_From:]
[last_To:]
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
]]>
</send>
<timewait milliseconds="4000"/>
<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>
<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>
</scenario>
Создание диалплана
Т.к. мы будем устанавливать соединение между sipp и телефоном необходимо прописать соответствующий диалплан. Я использую SIP телефон и в соответствующем подразделе "План нумерации" добавляю номер для sipp.
S4, L8 (4xxxx | 111@192.168.1.23:5071)
В моем случае к уже существующему правилу я добавляю номер, при наборе которого будет вызван абонент с ip адресом 192.168.1.23:5071, это и есть адрес устройства на котором запущен sipp.
Вы также можете задать диалплан в своем софтфоне.
Запуск сценария
Последним шагом остается лишь запуск сценария с соответсвующими ключами.
sudo sipp 192.168.1.23 -sf uas_no180.xml -p 5071
Данное окно и будем говорить нам об успешном запуске. Набирая номер 111 произведем звонок. Скрипт отрабатывает так, как это было задумано и позволяет нам наглядно рассмотреть ситуацию в которой сообщение 180Ringing не было получено или отправлено.
Для более наглядного теста uas сценариев можно использовать ключ -rtp_echo
sudo sipp 192.168.1.23 -sf uas_no180.xml -p 5071 -rtp_echo
Он позволит sipp ретранслировать полученные rtp пакеты, тем самым позволяя Вам оценить качество звука и наличие потерь и задержек с точки зрения потребителя.
Надеюсь рассмотрение такого простенького uas сценария поможет в дальнейшем изучении sipp.