несколько полезностей по Астериску

Не претендуя на роль всезнайки по Астериску, все же решил опубликовать свою проблему и ее решение. Когда ты дорастаешь до использования IP-телефонии — это этап. Следующий этап — подключить родных, друзей и близких к VoIP-серверу самим созданному.

Покидать «понты», заявить - «как вы жили без внутренней связи?». Как мама жила в другом городе без бесплатных переговоров с сыном? Как же друзья на даче обходились без «московского телефона»? А ты такой гордый, одним кликом на Киви-кошелек и заходом в веб-морду Астериска, решаешь их проблемы.Но эти клики и заходы породили одну интересную проблему.


Попробую описать, есть два телефонных номера,они же аккаунты, на провайдере voip.ttt.ru (вымышленно). Один номер +7(499)504-ХХ-ХХ , второй  номер +7(499)505-ХХ-ХХ. Созданы два транка. При исходящих все как положено, звонок уходит CID высвечивается, сказка... .
Проблема начинается при приеме звонка. Звонок от провайдера приходит без DID, т.е. вместо того что бы получить в заголовках строку, где Астериску понятно, что звонит некто +79161112233 к нему на 7499504ХХХХ (или 7499505ХХХХ ) и далее рулить диалпланом, я получаю от провайдера s@<IP - адрес >:5060 .


В нормальной ситуации пишем контексты для каждого транка :

[incoming504]

exten => _X.,1,Dial(SIP/1000,60,tT)
exten => _X.,2,Hangup()

[incoming505]

exten => _X.,1,Dial(SIP/1100,60,tT)
exten => _X.,2,Hangup()

В результате то что пришло на +7(499)504-ХХ-ХХ идет на [incoming504] и телефон звонит у мамы, а другой на [incoming505] к друзьям.
Что порождает веселый приход от провайдера s@<IP - адрес >:5060 ? Зачем он так делает? На вопрос «Зачем?», ответ скорее всего такой - в корпоративном доступе такого нет (там приходит все как у больших, с номером ) и я так понимаю это сделано что бы компании не пользовались "аккаунтами для физиков" - они дешевле. Хочешь несколько номеров - купи корпоративный тариф. Там и диапазон портов есть, а не только 5060 и сигнализация полная.
А чем это плохо :
- В два часа ночи, вашей маме звонят и спрашивают: «НУ ЧО? В КЛУБЕ ЗАТУСИМСЯ?». Мама до утра пьет валерьянку и желает вам приятных сновидений....
- Друзья пытаются понять, к какому это подъезду их дачи-избушки подвезли пиццу? И главное кто?
- Ну и прочая веселуха...

Итого: висят оба аккаунта на одном порту (это не изменить) и одном IP, оба зарегистрированы. Что делает этот гад Астер? Правильно, хватает первый по порядку диалплан подходящий для voip.ttt.ru:5060 , потому что без номера оба аккаунта подходят к условию Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. :5060 , ну и естественно звонки идут ...ээээ...не туда.
Не знаю на сколько правильно и красиво это решение, но оно работает. Реализовал я его в таком виде :

[DID_ttt-trunk_default]

exten = s,1,Set(foomtt=${SIP_HEADER(TO):9:3})  ;; выдрать из поля ТО: из сип-заголовка первые три цифры номера после кода.
;;;Почему с 9го знака ? Да потому что поле ТО: содержит еще много всякой мути.
;; Вот приблизительный вид " <sip:Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. >; ".
;;; 9й символ — 9, после него читаем 3 символа - 505.
exten = s,n,GotoIf($[${foomtt} = 504]?dial1) ; пусть маме звонит если 504
exten = s,n,GotoIf($[${foomtt} = 505]?dial2)  ; это к друзьям 505
exten = s,n(dial1),Goto(ringroups-custom-4,s,1)  ;;; дзинь-дзинь все телефоны у мамы !!!
exten = s,n,Hangup() exten = s,n(dial2),Dial(SIP/1111,15,rt) ;; дзинь-дзинь телефон у друзей !!!
exten = s,n,Hangup()

Еще раз - для сортировки берется поле ТО: из сип-заголовка.

PS пароли на транках могут быть разные или одинаковые - параллельно. Только через сип-заголовок (((

Удачи в покорении Астера !