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