Как известно, чтобы съесть слона, достаточно есть его по кусочкам. Сегодня рассмотрим ещё несколько простых тем:
В прошлой заметке Настройка 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'
Для соединения абонентов между собой в 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'
Теперь с одного телефона можно позвонить на другой.
У настроек, рассмотренных в предыдущем разделе, есть один большой недостаток - при появлении нового SIP-клиента для него нужно создавать новую запись в номерном плане. Чтобы исправить этот недостаток, воспользуемся шаблонами и предопределённой переменной ${EXTEN}. Шаблоны позволяют не указывать точный номер телефона, а предопределённая переменная ${EXTEN} позволяет передать номер в приложение:
exten => _1XXX,1,Dial(SIP/${EXTEN})
Шаблоны номеров начинаются с символа подчёркивания. Далее следуют цифры или подстановочные символы:
Переменная ${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'
Кроме переменных, таких как ${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'
Эти тестовые номера могут оказаться полезными новым сотрудникам, сотрудникам, временно севшими за чужое рабочее место, и техническому персоналу для диагностики проблем телефонии.