воскресенье, 27 марта 2016 г.

Шаблоны и настройка звонков между SIP-клиентами в Asterisk

Как известно, чтобы съесть слона, достаточно есть его по кусочкам. Сегодня рассмотрим ещё несколько простых тем:
  • использование шаблонов для описания SIP-клиентов в файле /etc/asterisk/sip.conf,
  • настройка номерного плана /etc/asterisk/extensions.conf, для соединения абонентов друг с другом,
  • использование в номерном плане шаблонов номеров и встроенных переменных,
  • использование встроенных функций номерного плана и настройку тестовых номеров для проговаривания номер звонящего абонента.
1. Использование шаблонов

В прошлой заметке Настройка SIP-клиента и тестовых номеров в Asterisk у нас получился файл /etc/asterisk/sip.conf со следующим содержимым:
[general]
allowguest=no
alwaysauthreject=yes

[1000]
call-limit=1
type=friend
context=phones
host=dynamic
secret=password
deny=0.0.0.0/0.0.0.0
permit=169.254.254.0/24
Теперь, чтобы добавить новых SIP-клиентов, можно просто скопировать секцию 1000 и отредактировать её. Если подобных клиентов будет много, то при необходимости поменять одну и ту же настройку у всех клиентов, нужно будет потратить некоторое время на правку настроек каждого клиента. Вместо этого можно создать шаблон, в котором будут указываться общие настройки для определённой группы клиентов. Шаблон потом можно назначить каждому из клиентов. Файл /etc/asterisk/sip.conf будет выглядеть следующим образом:
[general]
allowguest=no
alwaysauthreject=yes

[ata](!)
call-limit=1
language=ru
type=friend
context=phones
host=dynamic
deny=0.0.0.0/0.0.0.0
permit=169.254.254.0/24

[1000](ata)
secret=password

[1001](ata)
secret=password2
Восклицательный знак в скобках указывает, что эта секция является шаблоном. Если же в скобках указан какой-то другой текст, то он интерпретируется как название шаблона, который нужно использовать как настройки по умолчанию для этой секции. Каждому клиенту можно назначать и более одного шаблона. В этом случае шаблоны перечисляются в скобках через запятую. Например, один шаблон может указывать настройки клиентов в локальной сети, а другой - настройки кодеков для определённых моделей шлюзов. Если я правильно понимаю, то шаблоны не могут быть иерархическими, а при указании нескольких шаблонов, настройки предыдущих шаблонов перекрываются настройками из последующих.

Как обычно, для вступления новых настроек в силу, выполним соответствующую команду:
# asterisk -rx 'sip reload'
2. Звонки между SIP-клиентами

Для соединения абонентов между собой в Asterisk существует приложение номерного плана Dial. У этого приложения есть множество различных возможностей и настроек, но сейчас нам достаточно знать, что вызов приложения типа Dial(SIP/1000) означает соединение звонящего с SIP-абонентом с идентификатором 1000. Если у нас есть всего два тестовых абонента, то достаточно настроить в номерном плане в файле /etc/asterisk/extensions.conf всего две записи:
exten => 1000,1,Dial(SIP/1000)

exten => 1001,1,Dial(SIP/1001)
После этого можно перезагрузить номерной план такой командой:
# asterisk -rx 'dialplan reload'
Теперь с одного телефона можно позвонить на другой.

3. Шаблоны номеров и переменные

У настроек, рассмотренных в предыдущем разделе, есть один большой недостаток - при появлении нового SIP-клиента для него нужно создавать новую запись в номерном плане. Чтобы исправить этот недостаток, воспользуемся шаблонами и предопределённой переменной ${EXTEN}. Шаблоны позволяют не указывать точный номер телефона, а предопределённая переменная ${EXTEN} позволяет передать номер в приложение:
exten => _1XXX,1,Dial(SIP/${EXTEN})
Шаблоны номеров начинаются с символа подчёркивания. Далее следуют цифры или подстановочные символы:
  • [15-7] - одна из цифр: 1, 5, 6 или 7,
  • X - одна цифра от 0 до 9. Является более короткой записью для [0-9],
  • Z - одна цифра от 1 до 9. Является более короткой записью для [1-9],
  • N - одна цифра от 2 до 9. Является более короткой записью для [2-9],
  • . - одно или более соответствий предыдущему подстановочному символу. Например, шаблон _N. будет совпадать с любым количеством цифр от 2 до 9,
  • ! - ноль и более соответствий предыдущему подстановочному символу. Например, шаблон _1N! будет соответствовать номеру 1 и любым номерам, начинающимися с единицы и продолжающимися цифрами от 2 до 9.
Переменная ${EXTEN} содержит в себе набранный номер. Из этого номера можно вырезать произвольные фрагменты. Например, ${EXTEN:1} вернёт все цифры, кроме первой. ${EXTEN:1:2} вернёт две цифры после первой.

Ещё одна важная деталь номерного плана состоит в том, что Asterisk стремится найти наиболее точно заданный шаблон. Например, если задать в номерном плане два шаблона:
exten => _XXXX,1,Playback(tt-monkeyintro)

exten => _1XXX,1,Dial(SIP/${EXTEN})
То первое соответствие будет срабатывать только для тех номеров, которые не начинаются с 1. То есть Asterisk не обращает внимания на порядок перечисления шаблонов и выбирает для номеров, начинающихся с 1 второе правило, хотя первое для таких номеров тоже подходит.

Итак, осталось перезагрузить номерной план и проверить прохождение звонков с одного номера на другой:
# asterisk -rx 'dialplan reload'
4. Функции и ещё несколько тестовых номеров

Кроме переменных, таких как ${EXTEN}, в Asterisk существуют ещё и функции. Функции вызываются похожим образом, но могут принимать аргументы. Одной из таких функций является функция ${CALLERID()}. Она возвращает информацию о звонящем абоненте. Если указать ей аргумент num, то она вернёт номер звонящего абонента.

Кроме того, в Asterisk существуют приложения SayDigits() и SayNumber(). Первое произносит цифры, переданные ему в аргументе. Второе умеет произносить целые числа от 0 до 99999999 (8 цифр, числа до 100 миллионов), переданные ему в аргументе.

Воспользуемся функцией ${CALLERID()} и приложениями SayDigits() и SayNumber() для создания в номерном плане в /etc/asterisk/extensions.conf ещё двух тестовых номеров, с помощью которых можно узнать номер телефона, с которого вы позвонили на соответствующий тестовый номер:
exten => 502,1,SayDigits(${CALLERID(num)})

exten => 503,1,SayNumber(${CALLERID(num)})
Первое приложение кажется не столь полезным, однако оно, в отличие от второго, позволяет точно воспроизводить номера телефонов, начинающихся с одного и более нулей. В этом случае второй тестовый номер опустит старшие нули и воспроизведёт только число, в то время как первый позволит узнать точное количество нулей в начале номера.

Можно совместить оба приложения в пределах одного тестового номера, так чтобы сначала проговаривался номер, а потом, после небольшой паузы, цифры номера. Заодно воспользуемся сокращением same, которое можно использовать, чтобы не повторять номер в каждой строчке номерного плана:
exten => 504,1,SayNumber(${CALLERID(num)})
same  =>     n,Wait(1)
same  =>     n,SayDigits(${CALLERID(num)})
Как обычно, теперь нужно перезагрузить номерной план:
# asterisk -rx 'dialplan reload'
Эти тестовые номера могут оказаться полезными новым сотрудникам, сотрудникам, временно севшими за чужое рабочее место, и техническому персоналу для диагностики проблем телефонии.

Полезные ссылки:

Комментариев нет: