Настройка SIP-I/SIP-T транка с помощью 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 дамп такого звонка:

Как видно в 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 собаку съели и смогли разобраться во многих нюансах.

ссылка на оригинал статьи http://habrahabr.ru/post/156469/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *