Диалплан asterisk для "чайников"
Общее понятие диалплана
Вы вероятно уже слышали тезис о том, что диалплан - это сердце asterisk. Это верно, но это не ответ на вопрос о том, что же это такое. Так вот, диалплан - это высокий уровень абстрагирования от конкретных протоколов и оборудования.
Из аналогий:
В
терминах файловой системы диалплан - это имя файла (в то время как сам файл - это индексный дескриптор (linux) или запись в каталоге (windows)). При этом (в linux это нормально, в windows это ошибка, но возможно) для одного файла может быть несколько имен. Или же имя ссылается не на 1 файл, а на несколько (на группу файлов, т.е. на каталог). Или имя ссылается на функцию операционной системы (con - console, prn - printer,...)
В библиотечных терминах: диалплан - это каталог книг [в библиотеке], при этом у каждой книги есть свой "реальный" номер (ISBN), который может совпадать, а может и не совпадать с "виртуальным" (каталожным) номером. При этом в каталоге под какими-либо номерами могут находиться не книги, а ссылки на другие каталоги, или (например) пометка о том, что книга утрачена/взята/...
Проще говоря, диалплан - это список телефонных номеров, с каждым из которых может быть связано какое-либо действие (или последовательность действий): звонок одному или нескольким абонентам (группе), подключенным к аналоговым (ТФОП) и/или ip телефонам (по протоколу SIP, IAX2, MGCP, H323, ...), либо же будет выполнена одна или несколько функций АТС (переадресация звонка, автоответчик, факс, запрос пароля и т.д.). И номера в диалплане никак не связаны с реальными номерами абонентов. Т.е. набирая номер 1234 или 8-911-123-45-67, Вы совсем необязательно позвоните на местный (или на мобильный) номер. Вот пример структуры диалплана:
номер 1234: совершить вызов абонента SIP с номером 1234
номера 1300 по 1399: днем совершить вызов по указанным IAX номерам, ночью - выдать голосовое сообщение "по всем вопросам звоните в рабочее время с ... по ..."
номера 1400-1499: совершить вызов абонента с соответствующим SIP номером, если нет ответа в течение 45 секунд, перевести звонок на мобильный (для каждого местного номера записан свой номер мобильного; номера мобильных берутся из базы данных с даными вида "местный=мобильный", например "1450=+79111234567")
номер +79113456789: выдать голосовое сообщение, что звонки на этот номер запрещены.
Контексты диалплана
Время от времени возникает необходимость, чтобы один и тот же номер для разных абонентов (или в разное время) выполнял разные функции.
Например, когда на Кубу звонит директор, набирая номер 1234, АТС должна соединить через оператора телефонии с кубинским номером. Если же на этот номер попытается позвонить (к примеру) грузчик или уборщица [со своих местных телефонов], то должна включиться другая функция АТС, воспроизводящая голосовое сообщение типа "звонок на этот номер запрещен".
Другой пример: в рабочее время со своего телефона директор может звонить куда угодно, в том числе и на Кубу. В ночное же время и в выходные дни (например, если охранник ночью захочет воспользоваться телефоном директора) при звонках на Кубу АТС включит функцию, запрашивающую пароль для разрешения звонка.
Для того, чтобы обеспечить подобный функционал, asterisk использует понятие контекстов. В рамках одного контекста номера телефонов должны быть уникальными и (если упрощенно) для каждого набираемого номера (или группы номеров) можно включить только одну функцию, например: при наборе номера 1234 можно сделать любое (но только одно) из действий:
- Совершить вызов набранного номера
- Запросить пароль и если он верен, совершить вызов
- Выдать голосовое сообщение (например: "звонок на этот номер запрещен").
- ...
При этом все остальные (или не все, а только местные) звонки для всех контекстов разрешены, т.е. для местных (офисных) номеров выполняется одна и та же функция (совершить вызов набранного номера).
Так как же быть, если для телефона директора надо выполнить первое действие, а для телефона уборщицы - третье? Очень просто - для каждого действия (точнее, для каждой последовательности действий) мы создаем свой контекст:
действие № 1 - контекст1,
действие № 2 - контекст2,
действие № 3 - контекст3.
При этом для каждого [телефона] абонента в настройках asterisk задается контекст, в рамках которого данный абонент может набирать номера. То есть для директорского телефона мы укажем контекст1 ("звони куда угодно"), а для телефона уборщицы - контекст3 (разрешены только местные звонки, при звонках на Кубу выдается голосовое сообщение о запрете вызова).
А как быть, если хочется, чтобы в разное время для одного и того же телефона срабатывали разные функции? Да и не хочется для разных контекстов (контекст1, контекст2, контекст3) повторно описывать одно и то же действие (разрешить звонки на местные номера).
Для подобных целей в asterisk предусмотрена возможность включения контекстов друг в друга (include).
Например, для местных звонков создается ЛокальныйКонтекст. Этот контекст включается в контекст1, контекст2, контекст3. При этом звонки на местные номера будут разрешены всем. Теперь для директора мы создадим отдельный контекст - контекстДиректор, в котором включаем (include): в дневное время - контекст1 [разрешить все вызовы], в ночное время и выходные - контекст2 [запросить пароль]. Для уборщицы же можно оставить контекст3 [звонки на Кубу запрещены всегда]. При этом поскольку ЛокальныйКонтекст включен в контекст1, контекст2 и контекст3 (и в КонтекстДиректор соответственно), звонки на местные номера разрешены как директору, так и уборщице [в любое время суток].
Теперь уточним понятие диалплана с учетом контекстов: диалплан - это набор списков телефонных номеров (каждый список - это контекст), при этом для каждого из номеров в любом списке можно назначить свою функцию (действие): звонок на определенного абонента, выдача голосового сообщения, запрос пароля, и так далее.
И напоследок обратите внимание: в диалплане указываются номера, на которые выполняются звонки, а не номера тех, кто совершает звонки.
|