Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. + 7 499 704 2566 Skype Me™!

Функция SIP_HEADER, подключение к провайдеру.

Оцените материал
(0 голосов)

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),...
В случае не соответствия - на дальнейшую обработку в плане набора.