Настройка SIP-I/SIP-T транка с помощью Yate

в 18:36, , рубрики: ip-телефония, sip, voip, yate, телефония, метки: , ,

image

Добрый день, коллеги.

У меня плохо получается излагать свои мысли в письменном виде (да и не родной для меня русский язык), но постараюсь описать свой метод настройки данного типа транка.

Так получилось, что наш местный телеком начал давать доступ в PSTN другим VoIP провайдерам лишь посредством протокола SIP-I. Тем кто успел подключится по E1/SS7 повезло (а может и нет), а новым приходится как-то выкручиваться: одни покупают дорогие софтсвичи, другие ищут варианты подешевле, а то и бесплатно. Мы пошли вторым путем. Если интересно чем это все закончилось, добро пожаловать под кат.

Введение

SIP-I и SIP-T относятся к двум очень похожим между собой технологиям для взаимодействия ISUP и SIP сетей. В частности они предоставляют методы для транспортировки конкретных ISUP параметров через сеть основанной на протоколе SIP, так что вызовы инициированные и терминированные в сетях ISUP могут спокойно проходить через сеть SIP, без потери информации.

SIP-T был разработан IETF — та же контора которая разработала сам SIP. Примерно в тоже время была разработана последняя версия SIP (середина 2002-го). Данный протокол описан в RFC 3372, RFC 3398, RFC 3578 и RFC 3204.

SIP-I был разработан ребятами из ITU в 2004-ом году и использует большинство конструкций определенных в SIP-T. Он описан в ITU-T Q.1912.5.

Оба протокола описывают методы маппинга сообщений, параметров и кодов ошибок между SIP и ISUP. Так же они полностью совместимы с обычной сетью основанной на SIP.

SIP-I отличается от SIP-T тем, что использует много стандартов и драфтов IETF, да и намного богаче в параметрах которые позволяет передавать. SIP-I содержит не только базовые параметры звонка, но и позволяет использовать параметры дополнительных услуг, таких как CLIP и CLIR.

На данный момент в вариантах связи SoftSwitch — SoftSwitch, SIP-T более распостранен. Например в CDMA2000 он используется для взаимодействия между MSC. SIP-I рассматривается как вариант для взаимодействия между SoftSwitch-ом и обычными сетями в 3GPP.

Дабы не нагружать вас сухой теорией, покажу как выглядит в WireShark дамп такого звонка:

Настройка SIP I/SIP T транка с помощью Yate

Как видно в Message Body был добавлен раздел «application/isup» где в свою очередь были инкапсулированы все поля ISUP.

Настройка

В интернете вообще очень мало информации по настройке данных протоколов, а реальных примеров днем с огнем не сыщешь. Мы довольно основательно подошли к этому делу и наткнулись на Yate.

Yate позиционирует себя как телефонный движок нового поколения. Его трудно как-то выделить по классу, так как он умеет все. Написан он румынскими программистами из Null Team. На хабре есть несколько статей про него, но там он используется в других решениях.

Плюсы:
1. Написан на C++.
2. Модульная структура.
3. Есть модули на все случаи жизни.
4. Позволяет писать конфигурацию на разных языках программирования: php, perl, python, javascript.

Минусы:
1. Очень мало документации. Мне например пришлось полностью читать исходники чтобы понять до конца принципы его работы. Кстати в почтовой рассылке люди жалуются на это, но как сказал один мудрый человек: «Документация у Yate есть, и она очень хорошая, просто написана на C++».

Я не буду описывать процесс установки и первоначальной настройки. Их можно найти на сайте проекта и на хабре. Я опишу лишь основные моменты чтобы наш софтсвитч начал понимать SIP-I/SIP-T.

И так, чтобы Yate смог кодировать и декодировать поля из «application/isup» надо включить следующий параметр в файле ysipchan.conf:

[sip-t]
isup=enable

После этого при входящем звонке от телекома в стандартных сообщениях Yate появятся поля isup как на примере ниже. Эти поля мы уже можем использовать при маршрутизации и биллинге.

Sniffed 'call.preroute' time=1350892372.716302
  thread=0x7f017c011600 'Call Router'
  data=(nil)
  retval='(null)'
  param['id'] = 'sip/4'
  param['module'] = 'sip'
  param['status'] = 'incoming'
  param['address'] = '172.xxx.xxx.xxx:5060'
  param['billid'] = '1350892357-3'
  param['answered'] = 'false'
  param['callid'] = 'sip/SBCxdl85tuup8zxylqx8xbcdp5pcvtbtpw8@SoftX3000/zxzlwuzt-CC-23/'
  param['message-prefix'] = 'isup.'
  param['isup.protocol-type'] = 'itu-t92+'
  param['isup.protocol-type'] = 'itu-t'
  param['isup.message-type'] = 'IAM'
  param['isup.NatureOfConnectionIndicators'] = '0sat,cont-check-none,echodev'
  param['isup.ForwardCallIndicators'] = 'national,e2e-none,interworking,isup-notreq,sccp-none'
  param['isup.CallingPartyCategory'] = 'ordinary'
  param['isup.TransmissionMediumRequirement'] = '3.1khz-audio'
  param['isup.CalledPartyNumber'] = 'xxxxxxxxx'
  param['isup.CalledPartyNumber.nature'] = 'subscriber'
  param['isup.CalledPartyNumber.plan'] = 'isdn'
  param['isup.CalledPartyNumber.inn'] = 'false'
  param['isup.OptionalForwardCallIndicators'] = 'non-CUG'
  param['isup.CallingPartyNumber'] = 'xxxxxxxxx'
  param['isup.CallingPartyNumber.nature'] = 'national'
  param['isup.CallingPartyNumber.plan'] = 'isdn'
  param['isup.CallingPartyNumber.complete'] = 'true'
  param['isup.CallingPartyNumber.restrict'] = 'allowed'
  param['isup.CallingPartyNumber.screened'] = 'network-provided'
  param['isup.PropagationDelayCounter'] = '0'
  param['isup.LocationNumber'] = ''
  param['isup.LocationNumber.nature'] = '0'
  param['isup.LocationNumber.plan'] = 'unknown'
  param['isup.LocationNumber.inn'] = 'true'
  param['isup.LocationNumber.restrict'] = 'unavailable'
  param['isup.LocationNumber.screened'] = 'network-provided'
  param['isup.ParameterCompatInformation.PropagationDelayCounter'] = 'transit,cnf,discard-param,nopass-param'
  param['isup.ParameterCompatInformation.EchoControlInformation'] = 'transit,nopass-param'
  param['isup.ParameterCompatInformation'] = '31 d4 37 c0'
  param['isup.parameters-unhandled-cnf'] = 'PropagationDelayCounter'
  param['caller'] = 'xxxxxxxxx'
  param['called'] = 'xxxxxxxxx'
  param['ip_transport'] = 'UDP'
  param['newcall'] = 'true'
  param['domain'] = '172.xxx.xxx.xxx'
  param['device'] = 'Huawei SoftX3000 V300R010'
  param['username'] = ''
  param['xsip_nonce_age'] = '0'
  param['antiloop'] = '19'
  param['ip_host'] = '172.xxx.xxx.xxx'
  param['ip_port'] = '5060'
  param['ip_transport'] = 'UDP'
  param['sip_uri'] = 'sip:xxxxxxxxx@172.xxx.xxx.xxx:5060;user=phone'
  param['sip_from'] = 'sip:xxxxxxxxx@172.xxx.xxx.xxx;user=phone'
  param['sip_to'] = '<sip:xxxxxxxxx@172.xxx.xxx.xxx;user=phone>'
  param['sip_callid'] = 'SBCxdl85tuup8zxylqx8xbcdp5pcvtbtpw8@SoftX3000'
  param['device'] = 'Huawei SoftX3000 V300R010'
  param['sip_allow'] = 'INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,PRACK,SUBSCRIBE,NOTIFY,UPDATE,MESSAGE,REFER'
  param['sip_supported'] = '100rel'
  param['sip_user-agent'] = 'Huawei SoftX3000 V300R010'
  param['sip_privacy'] = 'none'
  param['sip_p-charging-vector'] = 'icid-value=0a.0a.00.0a-2012102210555100;orig-ioi=www.huawei.com;icid-generated-at=172.xxx.xxx.xxx'
  param['sip_p-asserted-identity'] = '<sip:xxxxxxxxx@172.xxx.xxx.xxx;user=phone>'
  param['sip_contact'] = '<sip:xxxxxxxxx@172.xxx.xxx.xxx:5060;user=phone>'
  param['sip_content-type'] = 'multipart/mixed;boundary=ssboundary-1_'
  param['rtp_addr'] = '172.xxx.xxx.xxx'
  param['media'] = 'yes'
  param['formats'] = 'alaw,mulaw'
  param['transport'] = 'RTP/AVP'
  param['rtp_rfc2833'] = 'false'
  param['rtp_port'] = '40016'
  param['rtp_forward'] = 'possible'

Исходящий звонок от нас выглядит так (regexroute.conf):

; Контекст определенный на этапе preroute
[PSTN]

; Выставляем параметры для всех звонков попавших в данный контекст.
 .*=;osip_P-Asserted-Identity=<sip:${caller}@172.xxx.xxx.xxx:5060$()user=phone>;
        message-prefix=isup.;
        isup.message-type=IAM;
        isup.protocol-type=itu-t92+;
        isup.NatureOfConnectionIndicators=echodev;
        isup.CallingPartyCategory=ordinary;
        isup.ForwardCallIndicators=national,e2e-none,interworking,isup-notreq,sccp-none;
        isup.TransmissionMediumRequirement=3.1khz-audio;
        isup.CalledPartyNumber=${called};
        isup.CalledPartyNumber.nature=national;
        isup.CalledPartyNumber.plan=isdn;
        isup.CalledPartyNumber.inn=false;
        isup.CallingPartyNumber=${caller};
        isup.CallingPartyNumber.nature=national;
        isup.CallingPartyNumber.plan=isdn;
        isup.CallingPartyNumber.complete=true;
        isup.CallingPartyNumber.restrict=allowed;
        isup.CallingPartyNumber.screened=network-provided

; Уже сама маршрутизация
.*=sip/sip:${called}@172.xxx.xxx.xxx

Вот и все. Теперь все SIP инвайты от нас идут с полями ISUP в Message Body.

Если у уважаемого сообщества есть вопросы буду рад ответить. Мы на Yate собаку съели и смогли разобраться во многих нюансах.

Автор: milleroff


  1. stas:

    Все добавил как указал автор, а поле isup в исходящих инвайтах не появляется

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js