Решил собрать небольшой гайд по использованию SIPP c предустановленными или собственными сценариями.

Полная информация о SIPP находится в документации, она же и является единственным источником всех знаний.

Здесь же будут описаны первые шаги при работе с sipp.

После прочтения документации, на данном этапе будет достаточно раздела "Create your own XML scenarios" опишу краткий этап создания собственного сценария. Все сценарии имеют расширение .xml и описанную в документации структуру, многом напоминающую структуру html. Довольно полезным источником станет данный репозиторий.

На нем собрано большое количество базовых сценариев на основе которых можно будет с легкостью выстроить собственный. План работы скрипта будет довольно прост:

 INVITE ---------->               
        100 <----------         
         180 <----------                
         200 <----------             
         ACK ---------->                                  
       Pause [   5000ms]           
              [ NOP ]              
       Pause [   5000ms]           
         BYE ---------->                 
        200 <----------

Отправляем INVITE, ожидаем ответов 100, 180, 200, после высылаем ACK, Pause(пауза на 5000мс), проигрывание заранее записанного аудиофайла, пауза на 5000мс, запрос BYE,ожидаем ответ 200.

Создаем файл сценария

nano firstscen.xml

Любой сценарий начинается строками(имя опционально):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="Basic Sipstone UAC">

Соответствуя плану мы должны отправить запрос INVITE, используем для этого метод send:

<send>
    <![CDATA[
    
      INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port]
      From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
      To: sut <sip:[service]@[remote_ip]:[remote_port]>
      Call-ID: [call_id]
      Cseq: 1 INVITE
      Contact: sip:sipp@[local_ip]:[local_port]
      Max-Forwards: 70
      Subject: Performance Test
      Content-Type: application/sdp
      Content-Length: [len]

      v=0
      o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
      s=-
      t=0 0
      c=IN IP[media_ip_type] [media_ip]
      m=audio [media_port] RTP/AVP 0
      a=rtpmap:0 PCMU/8000


    ]]>
        </send>

Если на данном этапе вам не понятна структура этого сообщения рекомендую ознакомиться с документацией, а пока можете просто скопировать это.

После запроса INVITE закономерно ожидаем ответов, опишем это используя команду "recovery response"

<recv response="100"> optional="true"
  </recv>

  <recv response="180"> optional="true"
  </recv>

  <recv response="200">
  </recv>

В нашем случае мы ожидаем сразу 3х ответов, из них ответы 100 и 180 нам не обязательны(на это указывает optional="true"), а вот ответ 200 система воспримет как обязательный для продолжения работы сценария.

<send>
    <![CDATA[

      ACK sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port]
      From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
      To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
      Call-ID: [call_id]
      Cseq: 1 ACK
      Contact: sip:sipp@[local_ip]:[local_port]
      Max-Forwards: 70
      Subject: Performance Test
      Content-Length: 0

    ]]>
  </send>

После полученного ответа 200 OK отправим запрос ACK

<pause milliseconds="5000"/>

Выставляем паузу в 5000мс

<nop>
    <action>
      <exec play_pcap_audio="g711a.pcap"/>
    </action>
  </nop>

Команда nop используется для описания действий, в данном случае мы говорим сценарию проиграть записанный ранее файл g711a.pcap, этот файл хранится в дистрибуте о котором я говорил вначале, также вы можете использовать абсолютно любой .pcap файл, но для быстроты написания первого сценария возьмем этот.

<pause milliseconds="5000"/>

Снова зададим паузу в 5000 мс

<send retrans="500">
    <![CDATA[
      BYE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
      From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
      To: sut <sip:[service]@[remote_ip]:[remote_port]>[peer_tag_param]
      Call-ID: [call_id]
      CSeq: 2 BYE
      Contact: sip:sipp@[local_ip]:[local_port]
      Max-Forwards: 70
      Subject: Performance Test
      Content-Length: 0
    ]]>
  </send>

  <recv response="200">
  </recv>

Здесь мы на аналогии с предыдущими запросами отправляем запрос BYE c соответстующим полем CSeq и ожидаем ответа 200OK.

Все, теперь наш сценарий написан и мы можем запустить его

sudo sipp ip_адрес_вызываемого_устройства -sf название_сценария.xml -r 1 -rp 1000 -s номер_абонента -l 1

Ключ sf позволяет запускать сторонние сценарии, таким образом Вы можете запустить все сценарии из описанного выше дистрибутива, что несомннено станет полезным учебным материалом.


Забыл упомянуть, сценарий заканчивается закрывающимся тегом </scenario>

Комментарии (3)


  1. tuxi
    29.01.2022 00:45

    насколько помню стандарт, вместо 180 «Ringing» сначала может придти 181 «Call is Being Forwarded», отработает скрипт?


    1. Ovoshlook
      29.01.2022 12:32
      +2

      Нет, не отработает. Но в этом и задача sipp: Гонять конкретные сценарии и ожидать конкретного поведения от тестируемого сервиса.


  1. Ovoshlook
    29.01.2022 12:21

    Наверное не "recovery response" а "receive response"...