|
SIP_HEADER Извлекает заголовок SIP
описание SIP_HEADER(имя[,номер])
Пример 1:
- exten => s,1,Set(foo=${SIP_HEADER(headername)})
Пример2:
- exten => +49123456789,1,Set(DN=${SIP_HEADER(TO):5})
- exten => +49123456789,2,Set(DN=${CUT(DN,@,1)})
Пример 3:
- exten => 1,1,Set(TESTAT=${CUT(SIP_HEADER(From),@,2)})
- exten => 1,n,GotoIf($["${TESTAT}" != ""]?hasat)
- exten => 1,n,Set(FROM_IP=${CUT(CUT(SIP_HEADER(From),>,1),:,2)})
- exten => 1,n,Goto(gotip)
- exten => 1,20(hasat),Set(FROM_IP=${CUT(CUT(CUT(SIP_HEADER(From),@,2),>,1),:,1)})
- exten => 1,n(gotip),NoOp(Gateway IP is ${FROM_IP})
Какое практическое применение данной функции можно привести в качестве примера? Рассмотрим подключение IP PBX Asterisk к провайдеру, предоставляющему услуги по протоколу SIP.(Рассмотрен пример получения нескольких городских номеров). Следующая конфигурация должна обеспечить подключение к поставщику сервисов.
[мой_поставщик_услуг]
- type=friend
- host=10.10.10.10
- fromuser=мой_уникальный_id
- secret=мой_секретный пароль
- context=incoming_calls
- dtmfmode=rfc2833
- disallow=all
- allow=ulaw
- deny=0.0.0.0/0
- permit=10.251.55.100/32
- insecure=invite
Параметр fromuser (от пользователя) влияет на то, как структурировано наше сообщение INVITE при отправке вызова поставщику сервисов. Если имя пользователя задано в параметре fromuser, при отправке вызова поставщику меняются поля From: (От:) и Contact: (Контакт:) сообщения INVITE. Этого может требовать сам поставщик, если он использует эти поля в процедуре аутентификации.В конце видим выражение insecure=invite, которое может быть необходимо для вашего поставщика, потому что источник сообщения INVITE может находиться на платформе сервера, но передаваться через его прокси-сервер SIP. По сути, это означает, что в строке Contact (Контакт) (поле сообщения INVITE, которое вы проверяете при приеме вызова от своего поставщика) может быть совсем не тот IP-адрес, по которому находится участник сети. Это выражение указывает Asterisk игнорировать данное несоответствие и принимать приглашение в любом случае.
Теперь в разделе [general] файла sip.conf требуется задать один дополнительный параметр: register. register (реестр) укажет поставщику сервисов, куда направлять адресованные нам вызовы. (Это необходимо для того, что бы Вы могли принимать входящие звонки.)
Параметр register имеет следующий вид:
- register => имяпользователя:пароль@мой.поставщик_сервисов
Проверяем прошла ли регистрация? CLI> sip show registry
Если у Вас только один номер на этом можно и закончить настройку. Если несколько, то встает вопрос как организовать распределение входящих вызовов из организованного SIP транка? При направлении любого (в "диал-план" передается exten - s) входящего звонка в IVR или DISA, также вопросов не возникает. Но при необходимости маршрутизации входящего вызова внутреннему абоненту в зависимости от набранного "внешнего" номера на помощь приходит функция SIP_HEADER. Включив режим отладки при входящем вызове ( sip set debug on ), Мы можем просмотреть что в заголовках SIP передается вся необходимая информация. (набранный "внешний" номер в поле TO: ).

Для получения данной информации вызываем SIP_HEADER в качестве параметра предаем - TO. - SIP_HEADER(TO). Результат запишем в переменную - ABNUM.
- exten = s,1,Set(ABNUM=${SIP_HEADER(TO)})
Результатом будет строка вида:
- TO: sip:номер_телефона@ip_адрес;user=phone
Из полученной строки необходимо выделить номер вызываемого абонента. Применим функцию -CUT и разделитель полей - @ - в первом случае и - : - во втором.
- exten = s,n,Set(ABNUM=${CUT(ABNUM,@,1)}) // отсекается ip_адрес, остается - sip:номер_телефона
- exten = s,n,Set(ABNUM=${CUT(ABNUM,:,2)}) // отсекается sip - остается только вызываемый номер
В результате данных манипуляций - переменная ABNUM, будет содержать необходимый нам номер. Осталось сравнить его и принять решение о маршрутизации вызова. Выполним это с использованием функции GotoIF, и в случае, если это тот номер который нам необходим, направим на внутреннего абонента с номером - 6000.
- exten = s,n,Gotoif($[${ABNUM}=XXXXXXX]?abon:out)
- exten = s,n(abon),Goto(default,6000,1)
- exten = s,n,Hangup()
- exten = s,n(out),...
В случае не соответствия - на дальнейшую обработку в плане набора. |