Добрый день, коллеги.
У меня плохо получается излагать свои мысли в письменном виде (да и не родной для меня русский язык), но постараюсь описать свой метод настройки данного типа транка.
Так получилось, что наш местный телеком начал давать доступ в 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 собаку съели и смогли разобраться во многих нюансах.
Автор: milleroff
Все добавил как указал автор, а поле isup в исходящих инвайтах не появляется