Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
handbook:prefix [2016/12/01 11:38] tpor |
handbook:prefix [2016/12/05 14:43] (текущий) tpor |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Обработка входящих и исходящих вызовов. Файл extensions.conf ====== | + | ====== Обработка входящих вызовов. Файл extensions.conf ====== |
- | Часто возникает необходимость переопределения формата входящих/исходящих номеров, например, заменить префикс входящего звонка от некоторого провайдера с "7" на "8".// | + | Часто возникает необходимость переопределения формата входящих номеров, например, заменить префикс входящего звонка от некоторого провайдера с "7" на "8".\\ |
- | Предположим, у нас есть две объединенные АТС Askozia, условно обозначим их АТС N и АТС Z (статьи по объединению двух АТС: [[https://www.askozia.ru/blogs/askozia/askozia-to-combine-the-two-offices/|Объединение двух станций Askozia]], [[http://blog.telefon1c.ru/soiediniaiem-mypbx-u100-s-askozia/|Соединяем MyPBX U100 c Askozia]]). Необходимо, чтобы АТС Z принимала входящие звонки от АТС N с префиксом "7". Для этого выполним следующие действия:\\ | + | Предположим, у нас есть две объединенные АТС Askozia, условно обозначим их АТС Москва и АТС Питер (статьи по объединению двух АТС: [[https://www.askozia.ru/blogs/askozia/askozia-to-combine-the-two-offices/|Объединение двух станций Askozia]] и [[http://blog.telefon1c.ru/soiediniaiem-mypbx-u100-s-askozia/|Соединяем MyPBX U100 c Askozia]]).\\ Необходимо, чтобы АТС Питер принимала входящие звонки от АТС Москва с префиксом "8". Для этого выполним следующие действия:\\ |
- | 1. Вводим IP адрес АТС Z в браузере, переходим в **Учетные записи** -> **Провайдеры** и открываем для редактирования провайдер для АТС N.\\ | + | 1. Вводим IP адрес АТС Питер в браузере, переходим в **Учетные записи** -> **Провайдеры** и открываем для редактирования провайдер для АТС Москва.\\ |
2. Переходим в **Дополнительно**, находим текстовое поле **Manual Dialplan Incoming** и вставляем в него следующую строчку:\\ | 2. Переходим в **Дополнительно**, находим текстовое поле **Manual Dialplan Incoming** и вставляем в него следующую строчку:\\ | ||
- | ExecIf($[${CALLERID(num):0:1}=7]?Set(CALLERID(num)=8${CALLERID(num):1}))\\ | + | <code>ExecIf($[${CALLERID(num):0:1}=7]?Set(CALLERID(num)=8${CALLERID(num):1}))</code>\\ |
- | {{ :handbook:2016-12-01_114017.png?direct |}}\\ \\ | + | {{ :handbook:2016-12-01_114017.png?direct |}}\\ |
- | + | Собственно и все, сохраняем настройки для провайдера и проверяем примененные настройки!\\ \\ | |
- | Собственно и все, сохраняем настройки для провайдера и проверяем примененные настройки.\\ \\ | + | Давайте же теперь разберемся, что мы все-таки сделали!\\ \\ |
- | Давайте же теперь разберемся, что мы все-таки сделали.\\ | + | Вы наверное заметили комментарий под полем **Manual Dialplan Incoming**: "//Изменения будут добавлены в текущий контекст файла extensions.conf//".\\ |
- | Вы наверное заметили комментарий под полем **Manual Dialplan Incoming**: "//Изменения будут добавлены в текущий контекст файла extensions.conf//". Это один из самых важных конфигурационных файлов. В нем определяется обработка и маршрутизация входящих и исходящих вызовов. Этот файл управляет поведением всех соединений проходящих через Вашу АТС.// | + | **Extensions.conf** - это один из самых важных конфигурационных файлов. В нем определяется обработка и маршрутизация входящих и исходящих вызовов. Этот файл управляет поведением всех соединений проходящих через Вашу АТС.\\ \\ |
- | Содержание файла "extensions.conf" разбито на секции, в которых могут быть определены статические настройки и определения или выполняемые команды плана набора, в этом случае они называются контекстами. Секции, предназначенные для статических настроек, называются general и **globals**, для этого служит поле **Manual Dialplan Global**. Каждая секция в файле extensions.conf начинается со строки с именем секции, заключенного в квадратные скобки. Это делает файл extensions.conf, по формату, похожим на традиционные .ini файлы в системе Windows. Соответственно поле **Manual Dialplan Incoming** отвечает за секцию, предназначенную для входящих звонков, а **Manual Dialplan Outgoing** - для исходящих звонков.\\ | + | Содержание файла "extensions.conf" разбито на секции, в которых могут быть определены статические настройки или выполняемые команды плана набора (//контексты//). Секции, предназначенные для статических настроек, называются **globals**, для этого служит поле **Manual Dialplan Global**. Соответственно поле **Manual Dialplan Incoming** отвечает за секцию, предназначенную для входящих звонков, а **Manual Dialplan Outgoing** - для исходящих звонков.\\ \\ |
- | С полем Manual Dialplan Incoming разобрались, теперь перейдем непосредственно к строке, которую мы добавили, а точнее разберемся какие //изменения// мы добавили в контекст файла extensions.conf.\\ | + | С полем Manual Dialplan Incoming разобрались, теперь перейдем непосредственно к строке, которую мы добавили в это поле, а точнее разберемся какие **//изменения//** мы внесли в контекст файла extensions.conf. Для начала изучим немного теории о встроенном языке Asterisk.\\ \\ |
- | В плане набора (extensions.conf) возможно использование переменных, для которых используется следующий синтаксис:\\ | + | В плане набора (extensions.conf) возможно использование **переменных**, для которых используется следующий синтаксис:\\ |
- | **${foo}**\\ | + | **${foo}**, где //foo// - имя переменной.\\ |
- | где //foo// - имя переменной.\\ | + | Переменные, определенные пользователями, не являются регистрозависимыми — ${FOO} и ${Foo} ссылаются на одну и ту же переменную. Но переменные, которые определяются самим Asterisk, являются регистрозависимыми — переменная ${EXTEN} будет работать, но ${exten} — не будет. Подробнее об использовании переменных в плане набора Asterisk описано [[http://asterisk.ru/knowledgebase/Asterisk+variables|здесь]].\\ \\ |
- | Именем переменной может быть цифробуквенная строка, которая должна начинаться с буквы. Переменные, определенные пользователями, не являются регистрозависимыми — ${FOO} и ${Foo} ссылаются на одну и ту же переменную. Но переменные, которые определяются самим Asterisk, являются регистрозависимыми — переменная ${EXTEN} будет работать, но ${exten} — не будет. Подробнее об использовании переменных в плане набора Asterisk описано [[http://asterisk.ru/knowledgebase/Asterisk+variables|здесь]].\\ | + | **Список предопределенных функций и команд**(устанавливаемых самим Asterisk), которые мы использовали для изменения контекста конфигурационного файла:\\ |
- | Ниже описаны предопределенные функции (устанавливаемые самим Asterisk), которые мы использовали для изменения контекста конфигурационного файла:\\ | + | |
**${CALLERID(num)}** - получение текущего значения номера из CallerID [[http://asterisk.ru/knowledgebase/Asterisk+func+callerid|Описание команды CALLERID()]];\\ | **${CALLERID(num)}** - получение текущего значения номера из CallerID [[http://asterisk.ru/knowledgebase/Asterisk+func+callerid|Описание команды CALLERID()]];\\ | ||
- | **SET()** - используется для установки значения какой то конкретной переменной в рамках сложного выражения, в котором это значение используется в качестве промежуточного для дальнейшего вычисления конечного результата, и когда может потребоваться использование этого промежуточного результата в других выражениях ([[http://asterisk.ru/knowledgebase/Asterisk+func+set|Синтаксис функции SET()]]);\\ | + | **SET()** - используется для установки значения какой-то конкретной переменной в рамках сложного выражения ([[http://asterisk.ru/knowledgebase/Asterisk+func+set|Синтаксис функции SET()]]);\\ |
**ExecIf** - выполнение внешней программы по заданному условию;\\ | **ExecIf** - выполнение внешней программы по заданному условию;\\ | ||
**${foo:offset:length}** - возвращает подстроку строки foo, начиная со смещения offset и ограничивая возвращаемую строку размером в length символов [[http://asterisk.ru/knowledgebase/Asterisk+variables|Функции для работы со строками]];\\ | **${foo:offset:length}** - возвращает подстроку строки foo, начиная со смещения offset и ограничивая возвращаемую строку размером в length символов [[http://asterisk.ru/knowledgebase/Asterisk+variables|Функции для работы со строками]];\\ | ||
**${foo}${bar}** - соединение двух строк.\\ \\ | **${foo}${bar}** - соединение двух строк.\\ \\ | ||
Таким образом, наши изменения в контексте конфигурационного файла можно интерпретировать следующим образом:\\ | Таким образом, наши изменения в контексте конфигурационного файла можно интерпретировать следующим образом:\\ | ||
- | ExecIf($[${CALLERID(num):0:1}=7]?Set(CALLERID(num)=8${CALLERID(num):1})) | + | <code>ExecIf($[${CALLERID(num):0:1}=7]?Set(CALLERID(num)=8${CALLERID(num):1}))</code>\\ |
- | 1. Получаем текущее значение входящего номера в виде строки с помощью функции CALLERID(). | + | 1. Получаем текущее значение входящего номера в виде строки с помощью функции CALLERID().\\ |
- | 2. Получаем первый символ данной строки (с помощью функции получения подстроки из строки). | + | 2. Получаем первый символ данной строки (с помощью функции получения подстроки из строки).\\ |
3. Если первый символ входящего номера равен "7", то устанавливаем текущему значению входящего номера новый номер, начинающийся с "8". Новый номер формируется соединением двух строк: "8" и номером текущего входящего номера без "7" (//8${CALLERID(num):1}//). | 3. Если первый символ входящего номера равен "7", то устанавливаем текущему значению входящего номера новый номер, начинающийся с "8". Новый номер формируется соединением двух строк: "8" и номером текущего входящего номера без "7" (//8${CALLERID(num):1}//). | ||