wiki:Chapter5

ГЛАВА 5


Основы Диалпланов (Dialplan Basics)

Всё должно быть сделано настолько просто, насколько возможно, ​но не проще! - Альберт Энштейн (1879-1955)

Dialplan(в дальнейшем Диалплан пр.пер.) - действительно основа любой Астериск системы , поскольку определяет, как Астериск обрабатывает входящие и исходящие вызовы. В основе это список команд или шагов, которые будет выполнять Астериск. В отличие от традиционных телефонных систем, диалплан Астериск полностью настраиваем. Чтобы успешно установить Вашу собственную систему Астериск, Вы должны понять диалплан.

Если Вы попытались прочесть некоторые примеры диалпланов и посчитали их подавляющими(сокрушающими), или если Вы безуспешно пытались написать диалплан Астериск, справка под рукой. Эта глава объясняет, как работает диалплан шаг-за-шагом и дает навыки, необходимые для создания Ваших собственных. Примеры были созданы, чтобы дополнять один другой, так что не стесняйтесь возвращаться и перечитывать раздел, если что-то не имеет смысла. Пожалуйста также отметьте, что эта глава ни в коем случае не даёт исчерпывающий обзор всех возможностей диалплана; наша цель состоит в том, чтобы объяснить основные принципы. Мы затронем более расширенные возможности dialplan в более поздних главах.

Синтаксис диалпланов (Dialplan Syntax)

Диалпланы Астериск описываются в файле extensions.conf


Файл extensions.conf обычно находтся в каталоге /etc/asterisk/ , но его местоположение может измениться в зависимости от того, как Вы установили Астериск. Этот файл также может находиться в /usr/local/asterisk/etc/, /usr/local/etc/asterisk/ и /opt/asterisk/etc/


Диалплан состоит из четырех главных понятий: контексты, расширения, приоритеты, и приложения. В следующих главах мы опишем каждую из этих частей и объясним как они взаимодействуют. После объяснения ролей которые эти элементов играют в диалплане, мы приступим к созданию базового, работоспособного диалплана.

Примеры конфигурационных файлов

Если Вы устанавливали типовые файлы конфигурации, когда устанавливали Астериск, Вы вероятно имете extensions.conf файл. Вместо того, чтобы начать с демонстрационного файла, мы предлагаем, чтобы Вы создали свой extensions.conf файл. Это будет удобнее, поскольку это даст Вам лучшее понимание понятий и основных принципов диалплана.

Следует заметить, что демонстрационный extensions.conf файл остается фантастическим ресурсом, полным примеров и идей, которые Вы можете использовать после того, как Вы изучили фундаментальные понятия. Мы предлагаем, чтобы Вы переименовали типовой файл в extensions.conf.sample. Таким образом, Вы сможете обратиться к нему в будущем. Вы можете также найти типовые файлы конфигурации в каталоге настроек Астериск.

Контексты (Contexts)

Диалпланы разбиты на секции, назваемые контекстами. Контекстами называются группы расширений, которые удовлетворяют нескольким целям. Контексты держат различные части диалплана от взаимодействия друг с другом. Расширение, определенное в одном контексте, полностью изолировано от расширений в любом другом контексте, если взаимодействие не оговорено отдельно. (Мы расскажем, как разрешить взаимодействие между контекстами в конце главы.) Как простой пример, давайте, предположим, что у нас есть две компании, пользующиеся сервером Астериск. Если мы помещаем голосовое меню каждой компании в его собственный контекст, они эффективно отделены друг от друга. Это позволяет нам независимо определять то, что случается, когда, скажем, расширение 0 набрано: люди, нажимающие 0 в голосовом меню Компании A, получат секретаря Компании A, и гости, нажимающие 0 в голосовом меню Компании B, получат секретаря Компании B. (Этот пример предполагает, конечно, что мы настроили Астериск передавать звонки секретарям, когда гости нажимают 0.)

Контексты обозначаются, помещением название контекста в квадратные скобки ([]). Название может быть составлено из символов от A до Z (прописные и строчные буквы), числа 0 до 9, дефиса и символа подчеркивания. Например, следующий контекст для входящих звонков:

[incoming]

Максимальная длина имени контекста 79 символов (80 символов - 1 завершающий пустой указатель)





Все инструкции, помещенные после определения контекста, являются его частью, до определения следующего контекста. В начале диалплана есть два специальных контекста [general] и [globals]. Секция [general] содержит список общих настроек диалпланов (насчет которых вы вероятно никогда не будете волноваться), контекст [globals] мы обсудим в разделе "Глобальные переменные". Сейчас важно понимать, что эти секции особенные. Пока вы избегаете названий [general] и [globals], вы можете называть свои контексты так как, вам нравится.

Когда Вы объявляете канал (который является соединением чего-либо с системой), один из параметров, который определяет описание канала, является контекстом. Другими словами, контекст - точка диалплана, где начинаются соединения канала.

Другое важное использование контекстов (возможно самое важное) - обеспечение безопасности. При правильном использовании контекстов, Вы можете предоставить определенным абонентам доступ к возможностям (например, таким как дальний запрос), которые не доступны другим. Если Вы не проектируете свой диалплан тщательно, Вы можете неосторожно позволить другим мошеннически использовать Вашу систему. Пожалуйста помните это, когда Вы строите свою систему Астериск.


Предупреждение

Каталог doc/ исходных текстов Астериск содержит очень важный файл, под названием security.txt, который обрисовывает в общих чертах несколько шагов, которые Вы должны предпринять, для обеспечения безопасности в Вашей системе Астериск. Жизненно важно, чтобы Вы прочли и поняли этот файл. Если Вы проигнорируете рекомендации по безопасности, описанные в общих чертах там, Вы можете закончить тем, что позволите любому пользоваться дальними звонками за Ваш счет! Если Вы не отнесетесь к безопасности своей системы Астериск серьезно, Вы можете закончить тем, что заплатите буквально! Пожалуйста не торопитесь и приложите усилия для страховки Вашей системы от мошенничества.

Расширения (Extensions)

В мире телекоммуникаций, слово расширение обычно применяется для числового идентификатора линии связанного с определенным телефоном. В Астериск, однако, расширения намного мощнее, поскольку определяют уникальный ряд шагов (каждый шаг содержит приложение), с помощью которых Астериск обрабатывает запрос . В пределах каждого контекста мы можем определить столько расширений, сколько нам нужно. Когда специфическое расширение будет вызвано (входящим звонком или цифрами, набираемыми на канале), Астериск выполнит шаги, определенные для данного расширения. Это - расширения, которые определяют то, что случается с запросами, проходящими через диалплан. Хотя расширения, конечно, могут использоваться, чтобы определить телефонные расширения в традиционном смысле (то есть, расширение 153 будет заставлять телефонный аппарат SIP на столе Джона звонить), в диалплане Астериск, они могут использоваться намного шире. Синтаксис для расширения - слово exten, вместе со стрелкой, состоящей из знаков равняется и больше, например:

exten ⇒

За этим следует название (или число) расширения. Имея дело с традиционными телефонными системами, мы зачастую думаем о расширениях как о номерах, которые Вы набрали бы, чтобы совершить другой телефонный звонок. В Астериск Вы получаете намного больше; например, названия расширения могут быть любой комбинацией чисел и писем. В течение этой и следующей глав, мы будем использовать и числовые и алфавитно-цифровые расширения.


Назначение названий к расширениям может походить на революционное понятие, но когда Вы реализуете множество поддержек транспортов VoIP (или еще активно поддержите) набор по имени или адресу электронной почты вместо набора числа, это будет иметь прекрасный смысл. Это - одна из особенностей, которая делает Астериск настолько гибким и мощным.

Полное расширение состоит из трех компонентов:

• Название (или число) расширения

• Приоритет (каждое расширение может включать множество шагов; номер шага называют "приоритетом")

• Приложение (или команда), которое выполнит некоторое действие на звонок.

Эти три компонента разделяются запятыми, например:

exten ⇒ name,priority,application()

Это простой пример того, реального расширения:

exten ⇒ 123,1,Answer()

В этом примере, название расширения 123, приоритет 1, и приложение - Answer ().
Теперь, давайте перейдем к объяснению приоритетов и приложений.

Приоритеты (Priorities)

Каждое расширение состоит из множества шагов, называемых приоритетами. Все приоритеты нумеруются последовательно, начиная с 1, и выполняют одно определенное приложение. Например, следующее расширение ответит на телефон (приоритет 1), и затем опускает трубку (приоритет 2):

exten ⇒ 123,1,Answer()
exten ⇒ 123,2,Hangup()

Не беспокойтесь, если Вы не понимаете, что такое Answer () и Hangup () — объясним их коротко. Ключевая точка для запоминания - то, что для определенного расширения, Астериск следует за приоритетами.

Ненумерованные приоритеты (Unnumbered priorities)

В старых версиях Астериск нумерация приоритетов вызывала множество проблем. Представьте у Вас есть расширение с 15-ю приоритетами, и Вам нужно добавить добавить кое-что после 2-го. Все последующие приоритеты должны были бы быть вручную перенумерованы. Астериск не обрабатывает недостающие шаги или ненумерованные приоритеты. Отладка этих типов ошибок была бессмысленна и создавала неверие в свои силы. Начинаясь с версии 1.2, Астериск эта проблема решена. Это решается использованием приоритета n, который обозначает "следующий". Каждый раз, когда Астериск сталкивается с приоритетом, названным n, она берет число предыдущего приоритета и добавляет 1. Это облегчает внесение изменений в Ваш диалплан, поскольку Вы не должны продолжать перенумеровывать все Ваши шаги. Для примера Ваш диалплан мог бы выглядеть так:

exten ⇒ 123,1,Answer()
exten ⇒ 123,n,do something
exten ⇒ 123,n,do something else
exten ⇒ 123,n,do one last thing
exten ⇒ 123,n,Hangup()

Предупреждение


Очень частая ошибка при написании меток вставка запятой между n и (например:

exten ⇒ 123,n,(label),application() ;←- ЭТО НЕ ЗАРАБОТАЕТ

Ошибка испортит эту часть диалплана, и вы получите сообщение, что приложение не найдено.

Астериск разрешает простую арифметику в пределах приоритета, такого как n+200 или приоритет s (того же самое), его использование мы рассмотрим в дальнейшей главе. !!!!!!!!!(перепроверить)
Пожалуйста отметьте, что расширение s и приоритет s являются двумя отличными понятиями.

В следующей главе мы расскажем, как переходить между различными приоритетами, основаясь на логике диалплана. Вы будете видеть намного больше меток приоритета, и Вы будете их часто использовать в Ваших диалпланах.

Приложения (Applications)

Приложения - рабочие лошади диалплана. Каждое приложение выполняет определенное действие на текущем канале, такое как воспроизведние звука, поддержка тонового набора, вызов канала, прерывание звонка, и т.д. В предыдущем примере Мы рассморели два простх приложения: Answer () и Hangup (). Сейчас Вы узнаете, как они работают.

Некоторые приложения, такие как Answer () и Hangup (), не нуждаются в дополнительных параметрах. Другие приложения запрашивают дополнительную информацию. Эта информация, называемая аргументами, должна быть передана приложению, чтобы задать, как они будут выполнять свои действия. Чтобы передать аргументы приложению, разместите их в круглых скобках, расположенных за именем приложения, отделенным запятыми.

Предупреждение

Иногда, Вы можете также видеть символ трубы ( | ) используемый как разделитель аргументов, вместо запятой. Не стесняйтесь использовать, то что Вы предпочитаете. Для примеров в этой книге мы будем использовать запятую, чтобы отделить аргументы приложения, поскольку авторы предпочитают этот вид синтаксиса. Вы должны знать, однако, что, когда Астериск разбирает диалплан, она преобразовывает любые запятые в прикладных аргументах в трубы ( | ).


Поскольку мы создадим свой первый диалплан в следующей секции, в ваших интересах учиться использовать приложения (и их аргументы).

Простой диалплан (A Simple Dialplan)

Теперь мы готовы создать наш первый dialplan. Мы начнем с очень простого примера. Мы собираемся проинструктировать Астериск отвечать на запрос, воспроизводить звуковой файл, и вешать трубку. Мы будем использовать этот простой пример, чтобы показать самые важные принципы диалплана. Для примеров в этой главе, для правильной работы, мы предполагаем, что по крайней мере один канал (either Zap, SIP, or IAX2) был создан и сконфигурирован (как описано в предыдущей главе), и что все запросы, входящие в тот канал, обрабатываются [incoming] контекстом диалплана. Если Вы творчески подошли к предыдущим примерам, Вы должны внести изменения, соответствующие Вашим специфическим названиям канала.

Расширение s (The s Extension)

Из-за технологии используемой в наших каналах, мы должны рассказать еще одну вещь прежде, чем мы начнем наш диалплан. Мы должны объяснить расширение s. Когда запросы входят в контекст без определенного расширения местоположения(например, звонок с линии FXO), их передают к s расширению. ( s обозначает “start,” поскольку это - то, что стартует, если никакой расширенной информации не передано со звонком).

Так как это все, в чем мы нуждаемся для нашего диалплана, давайте начнем заполнять блоки. Мы будем выполнять три действия на звонок (ответить, воспроизвести звуковой файл, повесить трубку), таким образом наше расширение, названное s, будет нуждаться в трех приоритетах. Мы поместим эти три приоритета в [incoming], потому что мы решили, что все входящие звонки должны начаться в этом контексте.(1)

(1) Нет ничего специального ни в каком названии контекста. Мы могли назвать этот контекст [stuff_that_comes_in], и пока это было контекстом, назначенным определением канала в sip.conf, iax.conf, zaptel.conf, и др., канал войдет в нужный контекст диалплана. Настоятельно рекомендуется, чтобы Вы давали свои названия контекстов, которые помогут Вам понять их цель. Некоторые хорошие названия контекста могли бы включать [incoming], [local_calls], [long_distance], [sip_telephones], [user_services], [experimental], [remote_locations], и т.д. Всегда помните, что контекст определяет, как канал входит в диалплан, так название должно соответствовать.

[incoming]
exten ⇒ s,1,application()
exten ⇒ s,n,application()
exten ⇒ s,n,application()

Теперь у нас есть все, что нам нужно, мы создадим свой первый диалплан.

Предупреждение

Заметьте, что мы пронумеровали каждый приоритет как показано ниже, но это больше не предпочтительный метод, поскольку это усложняет изменения диалплана впоследствии:

[incoming]
exten ⇒ s,1,application()
exten ⇒ s,2,application()
exten ⇒ s,3,application()

Приложения Answer(), Playback() и Hangup()

(The Answer(), Playback(), and Hangup() Applications)

Если нам нужно ответить на запрос, воспроизвести звуковой файл, и затем повесить трубку, мы должны научиться, как это сделать. Приложение Answer () используется, чтобы ответить на канал, который звонит. Происходит начальная настройка канала, получающего входящий звонок. (Некоторые приложения не требуют, чтобы Вы ответили на канал сначала, но отвечать на канале прежде, чем выполнить любые другие действия, является очень хорошей привычкой). Как мы упоминали ранее, Answer () не требует аргументов.

Приложение Playback () используется для воспроизведения ранее зарегистрированного звукового файла на канале. Когда используется Playback () пользовательский ввод игнорируется.

Предупреждение

В Астериск включено множество профессионально записанных звуковых файлов, которые находятся в каталоге звуков по умолчанию (обычно /var/lib/asterisk/sounds/). Когда Вы собираете Астериск, Вы можете выбрать установку различных наборов типовых звуков, которые были записаны на различных языках в различных форматах файлов. Мы будем использовать эти файлы во многих из наших примеров. Некоторые файлы в наших примерах установлены из Дополнительного Звукового Пакета(Extra Sound Package), так что пожалуйста найдите время, чтобы установить его (см. Главу 3). Вы также може получить свои собственные звуковые сообщения, записанные теми же самыми голосами, посетив  http://thevoice.digium.com/.

Используя Playback(), укажите имя файла (без расширения) как аргумент. Например, Playback(filename) должно воспроизвести звуковой файл под названием filename.gsm, расположенного в каталоге звуков по умолчанию. Если необходимо, Вы можете указать полный путь к необходимому Вам файлу, например:

Playback(/home/john/sounds/filename)

Предыдущий пример воспроизведет filename.gsm из /home/john/sounds/ каталога. Вы можете также использовать относительные пути от каталога звуков Астериск следующим образом:

Playback(custom/filename)

Этот пример воспроизведет filename.gsm из custom/ подкаталога каталога звуков по умолчанию (вероятно/var/lib/asterisk/sounds/custom/filename.gsm). Отметьте, что, если указанный справочник содержит больше чем один файл с тем именем файла, но с различными расширениями файла, Астериск автоматически воспроизведет лучший файл. 2

2 Аsterisk выбирает лучший файл, основанный на перекодировке cost―that, это выбор файла, который наименее загружает центральный процессор, для преобразования в его родной звуковой формат. Когда Вы стартуете Аsterisk, он вычисляет затраты преобразования между различными звуковыми форматами (они часто изменяются от системы до системы). Вы можете видеть эти затраты перевода, набрав show translation в командной строке Аsterisk. Показанные числа представляют, сколько миллисекунд требуется Аsterisk для перекодирования одной секунды аудио. Мы расскажем больше о различных звуковых форматах (известных как кодеки) в Главе 8.

Приложение Hangup() делает то, что его название подразумевает: отключает активный канал. Вы должны использовать это приложение в конце контекста, если Вы хотите по окончанию текущего запроса гарантировать, что гости не перемещаются по диалплану способом, который Вы, вероятно, не ожидаете. Hangup () не использует аргументов.

Наш первый диалплан (Our First Dialplan)

Теперь, когда мы спроектировали свое расширение, давайте соединим все части, чтобы создать наш первый диалплан. Как типично для многих технических книг (особенно, книг по программированию), наш первый пример назовут “Привет Мир!”

Первым приоритетом нашего расширения мы ответим на звонок. Во втором мы воспроизведем звуковой файл под названием hello-world.gsm, и в третьем мы закончим звонок. Вот то, на что похож диалплан:

[incoming]
exten ⇒ s,1,Answer()
exten ⇒ s,n,Playback(hello-world)
exten ⇒ s,n,Hangup()
Если Вы сконфигурировали канал или два, вперед к испытаниям ! ‖ Просто создайте файл, под названием extensions.conf, (вероятно в/etc/asterisk), и вставьте четыре строки спроектированного нами диалплана. Если это не работает, проверьте консоль Астериск на сообщения об ошибках, и удостоверьтесь, что Ваши каналы назначены на [incoming] контекст. Даже при том, что этот пример очень короток и прост, он подчеркивает основные понятия контекстов, расширений, приоритетов, и приложений. Если Вы можете заставить это работать, у Вас есть фундаментальное знание, на котором построены все диалпланы. Давайте полагаться на наш пример. В конце концов, телефонная система, которая просто воспроизводит звуковой файл и затем вешает трубку, не особо полезна!

Создание интерактивного диалплана (Building an Interactive Dialplan)

Диалплан, который мы только построили, был статическим; он будет всегда выполнять те же самые действия на каждом запросе. Мы собираемся начать добавлять немного логики к нашему диалплану так, чтобы он выполнял различные действия, основанные на вводе пользователя. Чтобы сделать это, мы  должны рассказать еще об нескольких приложениях.

Background(), WaitExten(), and Goto() приложения

Один из самых важных ключей к построению интерактивного диалплана Астериск является Background()# приложение. Как Playback(), оно воспроизвоит зарегистрированный звуковой файл. В отличие от Playback(), однако, когда гость нажимает клавишу (или ряд клавиш) на ее телефонной клавиатуре, он прерывает воспроизведение и идет в расширение, которое приписывается нажатой цифре(ам). Если гость нажмет 5, например, то Астериск прекратит воспроизведение, и передаст контроль над вызовом по первому приоритету расширения 5.

Наиболее распространенное применение приложения Background() - создание голосовых меню (часто называемые автодежурными или телефонными деревьями). Множество компаний используют голосовые меню, чтобы направить гостей к надлежащим расширениям, таким образом освобождая их секретарей от необходимости отвечать на каждый отдельный запрос.

| Фактически, если у Вас не сконфигурированы каналы, настало время это сделать. Есть реальное удовлетворение, которое появляется после прохождения Вашего первого запроса в систему Астериск, которую Вы построили на пустом месте. Люди получают забавную усмешку на своем лице, поскольку понимают, что они только что создали телефонную систему. Это удовольствие может быть также и вашим, так пожалуйста, не идите дальше, пока Вы не добились работы маленького диалплана.
2 нужно отметить, что некоторые люди ожидают, что Background(), из-за его названия, продолжается и в dialplan, в то время как звук воспроизводится, но его название связано с тем фактом, что звук воспроизводится на заднем плане, при ожидании DTMF на переднем плане.

У Background() такой-же синтаксис как и у Playback():

exten ⇒ 123,1,Answer()
exten ⇒ 123,n,Background(main-menu)

Сырец

| В более ранних версиях Asterisk, если фоновая () применение готовых играть звук оперативное и не было никаких приоритетов в текущем расширение, Asterisk будет сидеть и ждать ввода от абонента. Asterisk не делает это по умолчанию. Если вы хотите Asterisk ждать ввода от абонента после оперативного звуковой закончил играть, Вы можете позвонить WaitExten? () приложения. WaitExten? () приложение ожидает абоненту ввести DTMF цифр, а часто называют непосредственно после Справочная () применения, например: exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(main-menu) exten ⇒ 123,n,WaitExten?() Если вы хотите WaitExten? () приложения к подождать определенное количество секунд ответ (вместо использования по умолчанию тайм-аут), просто передать количество секунд Первый аргумент WaitExten? (), например: exten ⇒ 123,n,WaitExten?(5) Оба Справочная () и WaitExten? () позволяет абоненту ввести DTMF цифр. Asterisk, то попытки найти расширения в нынешних условиях, соответствующих цифр, абонент вступил. Если Asterisk находит однозначного соответствия, он будет посылать вызов, что расширение. Продемонстрируем, добавив несколько строк в нашем примере: exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(main-menu) exten ⇒ 123,n,WaitExten?() exten ⇒ 2,1,Playback(digits/2) exten ⇒ 3,1,Playback(digits/3) exten ⇒ 4,1,Playback(digits/4) Если вы позвоните в расширение 123 в приведенном выше примере, он будет играть звук запрос, который говорит: "главное меню." Это будет ждать вас ввести или 2, 3 или 4. При нажатии кнопки 1 из этих цифр, Asterisk будет указано, что цифра обратно к вам. Вы также обнаружите, что, если вы введете различных цифр (например, 5), она не даст вам, что вы ожидали. Возможно также, что Asterisk найдете неоднозначной матча. Это можно легко объяснить если добавить расширение имени 1 к предыдущему примеру: exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(main-menu) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Playback(digits/1) exten ⇒ 2,1,Playback(digits/2) exten ⇒ 3,1,Playback(digits/3) exten ⇒ 4,1,Playback(digits/4) Dial расширение 123, а затем в главном меню строку наберите 1. Почему не Asterisk сразу же считываются номер один для вас? Это потому, что цифра 1 неоднозначно; Asterisk не знает, вы пытаетесь идти на расширение или продление 1 123. Это ждет несколько секунд, чтобы увидеть, если вы собираетесь набрать другую цифру (например, 2 в расширении 123). Если вы не набирать больше цифр, Asterisk в конечном итоге тайм-аут и отправить призыв к расширению 1. (Мы научимся выбирать наши собственные ценности тайм-аут в главе 6.) Прежде чем, давайте рассмотрим, что мы делали до сих пор. Когда пользователи обращаются в наш план набора, они услышат приветствие. Если они нажимают 1, они будут слышать номер один, и если они нажмут 2, они будут слышать номер два, и так далее. Хотя это хорошее начало, давайте украшать это мало. Мы будем использовать Гото () заявление, чтобы диалплана повторить приветствие после воспроизведении номер. Как следует из названия, Гото () приложение используется для передачи вызова в другую часть диалплана. Синтаксис Гото () требует от нас применения пройти назначения связи, расширение и приоритет в качестве аргументов для применения, например: exten ⇒ 123,n,Goto(context,extension,priority) Теперь, давайте использовать Гото () применении в плане набора: [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(main-menu) exten ⇒ 1,1,Playback(digits/1) exten ⇒ 1,n,Goto(incoming,123,1) exten ⇒ 2,1,Playback(digits/2) exten ⇒ 2,n,Goto(incoming,123,1) Эти две новые строки (выделены жирным шрифтом) отправит контроль перезвонить на 123 Расширение после воспроизведения выбранного номера. Если вы смотрите вверх детали Гото () приложения, вы обнаружите, что вы может реально пройти ни один, два или три аргумента для приложения. Если вы передаете один аргумент, Asterisk будет считать его назначения приоритет в текущем расширением. Если вы передадите два аргумента, Asterisk будет рассматривать их как расширение и приоритетных пойти в текущем контекста. В этом примере, мы прошли все три аргумента для ясности но проходит точно расширение и приоритет будет уже имеют тот же эффект. Обработка недействительных записей и тайм-ауты Теперь, когда наш первый голосовое меню начинает собираться вместе, давайте добавим некоторую дополнительную специальных расширений. Во-первых, нам необходимо расширение на наличие недействительных записей, когда абонент прессы неправильное значение (например, нажатие 9 в примере выше), вызов направляется в расширение я. Во-вторых, нам необходимо расширение справляться с разными ситуациями, когда абонент не дает ввода во времени (тайм-аут по умолчанию 10 секунд). Звонки будет отправлен на продление, если т абонента занимает слишком много времени, чтобы нажать цифры после WaitExten? () была вызвана. Вот то, что наши диалплана будет выглядеть после того как мы добавили эти два расширения: [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(enter-ext-of-person) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Playback(digits/1) exten ⇒ 1,n,Goto(incoming,123,1) exten ⇒ 2,1,Playback(digits/2) exten ⇒ 2,n,Goto(incoming,123,1) exten ⇒ 3,1,Playback(digits/3) exten ⇒ 3,n,Goto(incoming,123,1) exten ⇒ i,1,Playback(pbx-invalid) exten ⇒ i,n,Goto(incoming,123,1) exten ⇒ t,1,Playback(vm-goodbye) exten ⇒ t,n,Hangup() Использование я т и расширения делает нашу диалплана чуть более надежной и удобной для пользователей. Это, как говорится, все еще весьма ограничены, так как вне абоненты не имеют возможности подключения с живым человеком. Для этого нам понадобится, чтобы узнать о других приложений, называется Dial (). Using the Dial() Application Одним из наиболее полезных функций Asterisk является его возможность подключения различных абонентов каждого другие. Это особенно полезно, когда абоненты используют различные методы коммуникации. Например, абонент может быть общения по сравнению с традиционным аналоговым телефонной сети, а пользователь B может сидеть в кафе, на полпути во всем мире и разговаривал по телефону IP. К счастью, Asterisk занимает большую часть тяжелой работы из подключения и перевода между разнородными сетями. Все, что нужно сделать, это научиться использовать Dial () приложения. Синтаксис Dial () приложение немного сложнее, чем у других приложений мы использовали до сих пор, но это не должно пугать вас. Dial () принимает до 4 аргументы. Первый пункт назначения, что Вы пытаетесь звонить, которые (в простейшем форме) состоит из техники (или транспорт), по которому для посылки вызова, косую черту, и удаленной точке или ресурса. Наиболее распространенные типы технологии включают Зап (Для аналоговых и T1/E1/J1 каналов), SIP и IAX2. Например, давайте предположим, что мы хотите позвонить конечной Зап определенных Zap / 1, который является канал FXS с аналоговым телефон подключен в нее. Технология Zap, и ресурс 1. Кроме того, призыв к SIP устройства (как определено в sip.conf), возможно, назначение SIP / Джейн, а также призыв к Устройство IAX (определена в файле iax.conf), возможно, назначение IAX2/Fred. Если бы мы хотели Asterisk звонить Zap / 1 канал, когда добавочный 123 будет достигнут в плане набора, мы будем добавить следующие расширения: exten ⇒ 123,1,Dial(Zap/1) Мы также можем набрать несколько каналов одновременно, объединением направления с амперсанд (и), например: exten ⇒ 123,1,Dial(Zap/1&Zap/2&SIP/Jane) Dial () приложение будет позвонить в указанных направлениях одновременно, и мост входящего вызова с какой канала назначения отвечает на вызов в первую очередь. Если Dial () Заявление не может связаться с любым из направлений, Asterisk будет установить переменную DIALSTATUS с той причине, что она не могла набрать направлениям, и продолжать с Следующим приоритетом в расширении .* Dial () приложение также позволяет подключиться к удаленной точке VoIP, которые ранее не определено в одном из файлов конфигурации канала. Полный синтаксис для этого типа соединения составляет: Dial(technology/user[:password]@remote_host[:port]remote_extension) В качестве примера, вы можете набрать в демонстрации сервера Digium использованием IAX2 протоколу, используя следующие расширения: exten ⇒ 500,1,Dial(IAX2/guest@…/s) Полный синтаксис для Dial () применение немного отличается, когда речь идет Зап каналы, как показано на рисунке: Dial(Zap/[gGrR]channel_or_groupremote_extension) Например, вот как бы вы набрать 1-800-555-1212 на Зап номер канала 4. exten ⇒ 501,1,Dial(Zap/4/18005551212) Второй аргумент Dial () приложение тайм-аут, указанный в считанные секунды. Если Тайм-аут дается, Dial () будет пытаться звонить назначения (ы), что количество секунд прежде чем произойдет переход на следующий приоритет в расширение. Если ни один тайм-аут указано, Dial () будет продолжать набирать называемый канал (ы), пока кто-ответы или абонент повесил трубку. Давайте добавим интервал 10 секунд наше расширение: exten ⇒ 123,1,Dial(Zap/1,10)

  • Не волнуйтесь, мы расскажем переменных (в "Использование переменных"), и показать вам, как ваши диалплана сделать

решения, основанные на значении этого DIALSTATUS переменной. Если на вызов ответить прежде, чем тайм-аут, каналы соединяются, и это диалплана сделать. Если адресат просто не отвечает, занят, или по иным причинам недоступны, Asterisk будет установить переменную DIALSTATUS, а затем продолжить с Следующим приоритетом в расширении. Скажем, что мы научились так далеко в другой пример: exten ⇒ 123,1,Dial(Zap/1,10) exten ⇒ 123,n,Playback(vm-nobodyavail) exten ⇒ 123,n,Hangup() Как видите, этот пример будет играть ВМ-nobodyavail.gsm звуковой файл, если звонок идет без ответа. Третий аргумент Dial () является вариант строки. Она может содержать один или более символов , что изменить поведение Dial () приложения. Хотя перечень возможных вариантов слишком велика для покрытия здесь, один из самых популярных вариантов м вариантом. Если вы поместите м письмо в качестве третьего аргумента, вызывающая сторона будет слышать музыку провести вместо звонить в то время как пункт назначения канала вызывается (если, конечно, что музыка на линии был настроен правильно). Чтобы добавить опцию м до последнего, например, мы просто изменить первую строку: exten ⇒ 123,1,Dial(Zap/1,10,m) exten ⇒ 123,n,Playback(vm-nobodyavail) exten ⇒ 123,n,Hangup() После расширения номерами 1 и 2 в нашей диалплана несколько бесполезных теперь, что мы знаем, как с помощью Dial () приложение, давайте заменить их новыми расширениями , что позволит абонентам вне достичь Иоанна и Джейн: [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(enter-ext-of-person) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Dial(Zap/1,10) exten ⇒ 1,n,Playback(vm-nobodyavail) exten ⇒ 1,n,Hangup() exten ⇒ 2,1,Dial(SIP/Jane,10) exten ⇒ 2,n,Playback(vm-nobodyavail) exten ⇒ 2,n,Hangup() exten ⇒ i,1,Playback(pbx-invalid) exten ⇒ i,n,Goto(incoming,123,1) exten ⇒ t,1,Playback(vm-goodbye) exten ⇒ t,n,Hangup() Четвертый и последний аргумент Dial () приложение URL. Если назначения канал поддерживает получения URL в момент звонка, указанного URL будет отправлено (Например, если у вас есть телефон, поддерживающий IP получать URL, он появится 132 | Глава 5: Основы плана набора на дисплее телефона; то же самое, если вы используете программный телефон, URL может всплывающем на экране компьютера). Этот аргумент очень редко. Обратите внимание, что второй, третий и четвертый аргументы могут быть пустым. Например, если Вы хотите задать опцию, но не тайм-аут, просто оставьте тайм-аут аргумент пустой, как это: exten ⇒ 1,1,Dial(Zap/1m) Adding a Context for Internal Calls В нашем примере сих пор мы ограничивались едином контексте, но это, вероятно, справедливо предположить, что почти все установки Asterisk будет больше, чем один контекст, в их плане набора. Как мы уже упоминали в начале этой главы, одна из важных функций контекстах том, чтобы отделить льготы (например, принятия междугородную или позвонив определенными расширениями) для различных классов абонентов. В нашем следующем примере мы добавим к нашему диалплана путем создания внутреннего расширения 2 телефона, и мы создали возможность для этих 2 расширений звонить друг другу. Чтобы достичь этого, мы создадим новые условия, называется [Сотрудников]. Как и в предыдущих примерах, мы предположили, что FXS аналогового канала (Zap / 1, в данном случае) уже настроен, и что ваша zapata.conf файл настроен так, что любые звонки, выданных Zap / 1 начала в [сотрудников] контексте. В течение нескольких примерах, приведенных в конце главы, мы будем также считать, что канал FXO Зап был настроен как Zap / 4, при звонках, поступающих в этот канал доводится до [входящих] контекста. Мы также предположил, что вы, по крайней мере один канал SIP (названный SIP / Джейн), который настроен на начало в [сотрудников] контексте. Мы сделать это познакомить Вас с использованием других типов каналов. Если у вас нет оборудования для каналов, перечисленных выше (например, Zap / 4), или если вы используете оборудование с различными названиями каналов (например, не SIP / Джейн), просто измените примеры чтобы они соответствовали вашим конкретной системы конфигурации. Наш план набора в настоящее время выглядит следующим образом: [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(enter-ext-of-person) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Dial(Zap/1,10) exten ⇒ 1,n,Playback(vm-nobodyavail) exten ⇒ 1,n,Hangup() exten ⇒ 2,1,Dial(SIP/Jane,10) exten ⇒ 2,n,Playback(vm-nobodyavail) exten ⇒ 2,n,Hangup() exten ⇒ i,1,Playback(pbx-invalid) exten ⇒ i,n,Goto(incoming,123,1) exten ⇒ t,1,Playback(vm-goodbye) exten ⇒ t,n,Hangup() [employees] exten ⇒ 101,1,Dial(Zap/1) exten ⇒ 102,1,Dial(SIP/Jane) В этом примере мы добавили два новых расширений [сотрудников] контексте. Это Кстати, лицо, использующее канал Zap / 1 может поднять трубку телефона и набрать на лицо канала SIP / Джейн по телефону 102. А с другой стороны, телефон зарегистрирован в качестве SIP / Джейн может набрать Zap / 1, набрав 101. Мы произвольно решили использовать расширения 101 и 102 для нашего примера, но не стесняйтесь использовать все нумерации вы хотите для вашего расширения. Вы также должны Помните, что вы не ограничены в 3-значный расширений, вы можете использовать как любое количество цифры, как вам нравится. (Ну, почти. Расширения должна быть короче 80 символов, и вы не должны использовать одного символа расширений для собственного использования, так как они защищены.) Не забывайте, что вы можете использовать имена, а, вот так: [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(enter-ext-of-person) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Dial(Zap/1,10) exten ⇒ 1,n,Playback(vm-nobodyavail) exten ⇒ 1,n,Hangup() exten ⇒ 2,1,Dial(SIP/Jane,10) exten ⇒ 2,n,Playback(vm-nobodyavail) exten ⇒ 2,n,Hangup() exten ⇒ i,1,Playback(pbx-invalid) exten ⇒ i,n,Goto(incoming,123,1) exten ⇒ t,1,Playback(vm-goodbye) exten ⇒ t,n,Hangup() [employees] exten ⇒ 101,1,Dial(Zap/1) exten ⇒ john,1,Dial(Zap/1) exten ⇒ 102,1,Dial(SIP/Jane) exten ⇒ jane,1,Dial(SIP/Jane) Это, конечно, не мешало бы добавить расширения имени, если Вы считаете, что ваши пользователи могут быть набранных через протокол VoIP, такие как SIP, поддерживающий набор по имени. Вы также можете увидеть 134 | Глава 5: Основы плана набора , что возможно иметь различные расширения в плане набора кольцо же конечной точке. Например, вы могли бы расширение кольца 200 SIP / Джордж, а затем расширение 201 игры оперативного какой-то, а затем кольцо SIP / George. Теперь, что наши внутренние абоненты могут звонить друг другу, мы хорошо на нашем пути в направлении с Полный план набора. Далее мы увидим, каким образом мы можем сделать наш план набора более масштабируемой и легче изменить в будущем. Using Variables Переменные могут быть использованы в плане набора Asterisk, чтобы помочь уменьшить машинопись, добавить ясности, или добавить дополнительные логики плана набора. Если у вас есть опыт программирования на компьютере, Вы, наверное, уже понял, что переменная. Если нет, то не волнуйтесь, мы будем объяснять какие переменные и как они используются. Вы можете думать о переменной контейнер, который может содержать одно значение времени. Таким образом, для Например, мы можем создать переменную JOHN и присвоить ей значение Zap / 1. Это Кстати, когда мы пишем наш план набора, мы можем сослаться на канал Джона по имени, а не запоминания, что Иоанн использует канал имени Zap / 1. Есть два пути, чтобы ссылаться на переменную. Для ссылки имя переменной, просто введите имя переменной, таких, как Джон. Если, с другой стороны, вы хотите, чтобы ссылки его значение, вы должны ввести знак доллара, открывающую фигурную скобку, имя переменной, и закрывающей фигурной скобки. Вот как мы будем ссылаться на переменную внутри Dial () применения: exten ⇒ 555,1,Dial(${JOHN}) В нашем плане набора, когда мы пишем $ () JOHN, Asterisk автоматически заменить его любое значение было присвоено переменной с именем Иоанн. * * Обратите внимание, что имена переменных чувствительны к регистру. Переменную с именем Иоанна отличается от переменной с именем Иоанн. Ради удобства чтения, все переменные Имена в примерах будут записаны в верхнем регистре. Вы должны также помнить, что любые переменные, установленные Asterisk будут заглавными, а также. Некоторые переменные, такие, как канал или EXTEN защищены Asterisk. Вы Не следует пытаться установить эти переменные.

Есть три типа переменных, мы можем использовать в наших диалплана: глобальные переменные, канал переменных и переменных окружения. Давайте момент, чтобы посмотреть на каждого типа. Global variables Поскольку их названия, глобальные переменные, применяются ко всем расширения во всех контекстах. Мировой переменных полезны тем, что они могут быть использованы в любом месте диалплана увеличить читаемость и управляемости. Предположим на минуту, что вы большой план набора и несколько сотен ссылок на Zap / 1 канал. Теперь представьте, что вы должны были пройти Строительство Интерактивные плана набора | 135 Ваш план набора и изменить все эти ссылки на Zap / 2. Было бы долго и errorprone процесса, по меньшей мере. С другой стороны, если бы вы определили глобальной переменной со значением Zap / 1 на Начало Вашего плана набора, а затем, что вместо ссылки, вам придется изменить только одна линия. Глобальные переменные должны быть объявлены в [глобальных] контексте в начале extensions.conf файл. Они также могут быть определены программно, используя глобальный () диалплана функции. † Вот пример того, как оба способа заглянуть в план набора. Первый показывает определение глобальной переменной с именем JOHN со значением Zap / 1. Это переменная установлена в то время Asterisk разбирает плана набора. Второй пример показывает, как Глобальная переменная может быть установлена в плане набора. В этом случае, переменная с именем Георгия быть присвоено значение SIP / George, когда продление 124 набирается в [сотрудников] контекст: [globals] JOHN=Zap/1 [employees] exten ⇒ 124,1,Set(GLOBAL(GEORGE)=SIP/George)

Channel variables

Канала переменная является переменной, которая связывается только с конкретного вызова. В отличие от глобальные переменные, канал переменные определены только на время текущего вызова и доступны только для каналов, участвующих в этот призыв. Есть множество предопределенных переменных, доступных каналов для использования в плане набора, которые будут рассмотрены в channelvariables.txt файла в документ подкаталог Asterisk источника. Источник переменные устанавливаются с помощью Set () применения: exten ⇒ 125,1,Set(MAGICNUMBER=42) We’ll cover many uses for channel variables in Chapter 6.

Environment variables Переменные среды способ доступа к переменным среды Unix изнутри Asterisk. Они ссылаются с помощью ENV () плана набора функций. Синтаксис выглядит следующим образом $ (ENV (VAR)), где УАК Unix переменной окружения вы хотите создать ссылку. Окружающая среда переменных не являются широко используется в плане набора Asterisk, но они доступны если вы в них нуждается.

Adding variables to our dialplan Теперь, когда мы узнали о переменных, давай им работу в нашей плана набора. Мы будем добавить глобальные переменные для двух человек, Джон и Джейн: † Не волнуйтесь! Мы рассмотрим план набора функций в "плана набора функций".

[globals] JOHN=Zap/1 JANE=SIP/Jane [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(enter-ext-of-person) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Dial(${JOHN},10) exten ⇒ 1,n,Playback(vm-nobodyavail) exten ⇒ 1,n,Hangup() exten ⇒ 2,1,Dial(${JANE},10) exten ⇒ 2,n,Playback(vm-nobodyavail) exten ⇒ 2,n,Hangup() exten ⇒ i,1,Playback(pbx-invalid) exten ⇒ i,n,Goto(incoming,123,1) exten ⇒ t,1,Playback(vm-goodbye) exten ⇒ t,n,Hangup() [employees] exten ⇒ 101,1,Dial(${JOHN}) exten ⇒ john,1,Dial(${JOHN}) exten ⇒ 102,1,Dial(${JANE}) exten ⇒ jane,1,Dial(${JANE})

Шаблону Если мы хотим быть в состоянии дать людям возможность набрать через Asterisk Asterisk и подключения вызывающего абонента за пределами ресурса, нам нужен способ, чтобы матч на возможные номер телефона , что абонент может набрать. Можете ли вы представить, как утомительно было бы вручную написать диалплана с расширением для каждого возможного числа вы могли бы набрать? К счастью, Asterisk только вещь для подобных ситуаций: по шаблону. Сопоставление позволяет создать один расширение в плане набора, соответствующий разных номеров. Паттернами синтаксис При использовании шаблонов, некоторые буквы и символы представляют собой то, что мы пытаемся совпадать. Patterns всегда начинаются с символа подчеркивания (_). Это говорит Asterisk, что мы соответствия по шаблону, а не на явное расширение имени. (Это означает, конечно, что вы никогда не должны начинаться имена ваши расширения с подчеркивания.) * * Если вы забыли подчеркнуть на передней панели модели, Asterisk будет думаю, это просто расширение имени и впредь не буду делать по шаблону. Это один из самых распространенных ошибок, которые люди делают, когда, начиная, чтобы узнать Asterisk.

После подчеркнуть, можно использовать один или несколько из следующих символов. X Подходит для любого одна цифра от 0 до 9. Z Подходит для любого одна цифра от 1 до 9. N Подходит для любого одна цифра от 2 до 9. [15-7] Матчи одна цифра из диапазона цифры указаны. В этом случае картина заменяет один 1, 5, 6 или 7. . (Период) Wildcard матча; соответствует одному или более символов, независимо от того, какие они есть. * * Если вы не будете осторожны, шаблон матчах можно сделать плане набора делать вещи вы не ожидали (например, соответствие встроенные расширения таких как я или ч). Вы должны использовать групповой символ в шаблоне только после того, Вы соответствовали как и многие другие цифры, как это возможно. Например, следующая картина матч вероятно, никогда не используется: _. В самом деле, Asterisk предупредит вас, если вы пытаетесь использовать его. Вместо этого, используйте эту 1, если это вообще возможно: _X.

! (Взрыва) Wildcard матча; ноль или более символов, независимо от того, какие они есть. Для использования шаблонов в плане набора, просто поставил шаблон на месте расширение имя (или номер): расширениями ⇒ _NXX, 1, воспроизведение (AUTH-большое спасибо) В этом примере, соответствует любому 3-значный расширение с 200 до 999 (N матчи любую цифру от 2 до 9, и каждый X матчи цифру от 0 до 9). То есть, если абонент набрал какой-либо 3-значные расширения между 200 и 999 в этом контексте, он услышал звуковой файл авторизации-thankyou.gsm. Еще одна важная вещь, чтобы знать о шаблону, что, если считает, Asterisk более чем один шаблон, который набрал расширения, он будет использовать самые специфические 1 (идет слева направо). Скажем, у вас были определены следующие две модели, а также абонентов набрал 555-1212: exten ⇒ _555XXXX,1,Playback(digits/1) exten ⇒ _55512XX,1,Playback(digits/2) В этом случае второе продление будет выбран, поскольку он является более конкретной.

Паттернами примеры Прежде чем идти дальше, давайте рассмотрим несколько паттернов примеров. В каждой из них см. если вы можете сказать, что картина будет соответствовать перед чтением объяснение. Мы начнем с легким 1: _NXXXXXX Эта модель будет соответствовать любой 7-значный номер, до тех пор, как первая цифра была на два- выше. Эта картина была бы совместима с любыми североамериканского плана нумерации местных 7-значный номер. В районах с 10-значный набор, что картина будет выглядеть следующим образом: _NXXNXXXXXX Обратите внимание, что ни один из этих двух моделей будет обрабатывать звонки. Мы опишем тех, в ближайшее время.

NANP и Толя Мошенничество Североамериканский Количество плана (NANP) является общей телефонной нумерации используется в 19 странах в Северной Америке и странах Карибского бассейна. Страны, входящие в NANP Доля код страны 1. В Соединенных Штатах и Канаде, телекоммуникационных правила аналогичны (и разумный) достаточно что Вы можете разместить междугороднего звонка в большинстве номеров в код страны 1 и ожидать платить разумные жертвы. То, что многие люди не понимают, однако, является то, что 19 стран, многие из которых имеют разные правила телекоммуникаций, доля NANP. (Более подробная информация можно найти на  http://www.nanpa.com.) Один популярный метод мошенничества, использования NANP пытается обмануть наивные американцы в призывая дорогие минуту платных номеров в страны Карибского бассейна; абонентов считают, что, поскольку они набрали 1-NPA-NXX-XXXX достичь числа, они будут выплачивать свои стандартные национальных междугородных курсу на вызов. Поскольку в стране идет речь, возможно, правил , которые позволяют эту форму вымогательства, вызывающий, в конечном счете несет ответственность за стоимость звонка. Единственным способом избежать такого рода деятельность, чтобы заблокировать звонки на определенные коды (809, например) и снять ограничения только по мере необходимости.

Давайте попробуем другой: _1NXXNXXXXXX Это один немного сложнее. Это будет соответствовать числу 1, а затем области код между 200 и 999, то любой 7-значный номер. В NANP вызовом, то вы будет использовать этот образец для любого междугородной номер. ‡ Теперь, даже сложнее, например: _011.

Если это один слева вас чесать затылок, смотреть на него снова. Вы заметили, на период в конце? Этот шаблон совпадает с любым количеством, которое начинается с 011 и имеет по крайней мере один больше цифры. В NANP, это означает международный номер телефона. (Мы будем использовать эти структуры в следующем разделе, чтобы добавить исходящий набор возможностей нашего плана набора.)

Использование $ () EXTEN канале переменной

Мы знаем, что вы думаете … Вы сидите и спрашиваете себя: "Так что же происходит если я хочу использовать соответствие шаблону, но мне нужно знать, какие цифры на самом деле набрал? " К счастью, Asterisk только ответ. Всякий раз, когда вы набираете расширение набора Asterisk $ () EXTEN канале переменной цифры, которые набрали. Мы можем использовать приложение называемых SayDigits? (), чтобы проверить его: exten ⇒ _XXX,1,SayDigits?(${EXTEN}) В этом примере SayDigits? () приложение будет читать с Вами 3-значный расширение Вы набрали. Часто, это полезно для манипулирования $ () EXTEN, лишив ряд цифр от перед расширением. Это достигается с помощью синтаксиса $ (EXTEN: х), где х, где вы хотите возвращаемая строка для запуска, слева направо. Например, если Значение EXTEN это 95551212, $ (EXTEN: 1) равна 5551212. Давайте рассмотрим еще один Например: exten ⇒ _XXX,1,SayDigits?(${EXTEN:1}) В этом примере SayDigits? () применения начнется на второй цифре, и, следовательно, читать назад только две последние цифры набранных расширением.

Дополнительные возможности работы с цифр Манипуляция $ (Переменная) EXTEN правильно имеет синтаксис $ (EXTEN: х: у), где х, начиная позиции, и у числа цифр на возвращение. Принимая во внимание следующие строки наберите: 94169671111 можно выделить следующую цифру строки, используя $ (EXTEN: х: у) построить: $ (EXTEN: 1:3) будет содержать 416. $ (EXTEN: 4:07) будет содержать 9671111. $ (EXTEN: -4:4) начнется 4 цифры с конца, и вернуть четыре цифры, что дает нам 1111. $ (EXTEN: 1) даст нам все, после первых цифр, 4169671111 (если число цифры на возвращение является пустым, то он вернет все остальные строки). Это очень мощный построить, но большинство из этих вариантов не очень распространены в нормальных условиях эксплуатации. По большей части, вы будете использовать $ (EXTEN: 1), чтобы содрать внешних код доступа.

‡ Если вы выросли в Северной Америке, вы поверили, что вы набираете 1 до междугороднего звонка есть "длинный кодового расстояния ". Это неверно. Номер 1, по сути, международный код страны для всех стран NANP. Имейте это в виду, если вы когда-нибудь отправить свой номер телефона, чтобы кто-то в другой стране. Они могут не знаю, что ваш код страны, и таким образом не сможет позвонить вам всего лишь код зоны и телефонный число. Ваше полное число телефона с кодом страны должна быть напечатана по 1 НПД NXX XXXX (где НПД Ваш код города) -e.g., 1 416 555 1212.

Включение исходящего набора Теперь, когда мы ввели шаблону, мы можем пойти о процессе позволяет пользователям совершать исходящие звонки. Первое, что мы сделаем, это добавить переменную [Глобальных] контексте определить, какой канал будет использоваться для исходящих звонков: [globals] JOHN=Zap/1 JANE=SIP/Jane OUTBOUNDTRUNK=Zap/4 Далее, мы будем добавлять контексте нашего плана набора номеров для исходящих. Вы можете спросить себя в этот момент: "Почему мы должны отдельных контекстов для исходящих звонки? "Это связано с тем, что мы можем регулировать и контролировать абонентов разрешения делать исходящие звонки, а также какие виды исходящих звонков они позволили сделать. Для начала, давайте создадим условия для местных звонков. Чтобы быть последовательными в самых традиционных телефон переключается, мы дадим 9 на фронт наших моделей, так что пользователям нужно набрать 9 перед вызовом внешней номер: [outbound-local] exten ⇒ _9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten ⇒ _9NXXXXXX,n,Congestion() exten ⇒ _9NXXXXXX,n,Hangup() * * Обратите внимание, что номера 9 на самом деле не дать вам внешней линии, в отличие от многих традиционных систем PBX. Когда вы набираете 9 по аналоговой линии, гудок прекратится. Если вы хотите гудка продолжать даже после того, 9 номеров, добавить следующие строки (сразу после контексте определения): ignorepat ⇒ 9 Эта директива сообщает Asterisk продолжать оказывать гудка на аналоговые линии, даже после того, абонент набрал указанный шаблон. Это не будет работать с телефонами VoIP, так как они обычно не отправить цифр системы, поскольку они вводятся, они направляются в Asterisk все сразу. К счастью, большинство популярных VoIP телефоны могут быть сконфигурированы для подражания те же функции. Давайте рассмотрим, что мы только что сделали. Мы добавили в глобальной переменной называется ИСХОДЯЩИХ TRUNK, который просто определяет канал мы используем для исходящих вызовов. § Кроме того, мы добавил условия для местных исходящих вызовов. В приоритетных 1, мы принимаем набранных расширение, Строительство Интерактивные плана набора | 141 сдирать с 9 $ (EXTEN: 1) синтаксиса, а затем попытаться набрать этот номер на канал обозначается переменной OUTBOUNDTRUNK. Если вызов успешно, абонент преодолеть с исходящим каналом. Если вызов не удается (так как канал занят или номер не может быть набранных по некоторым причинам), заторов () применение называется, которая играет "быстрый сигнал" занято "(скопление тон), чтобы знать, что абонент вызов был неудачным. Прежде чем идти дальше, давайте удостоверимся, что наш план набора позволяет исходящие чрезвычайной номера: [outbound-local] exten ⇒ _9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten ⇒ _9NXXXXXX,n,Congestion() exten ⇒ _9NXXXXXX,n,Hangup() exten ⇒ 911,1,Dial(${OUTBOUNDTRUNK}/911) exten ⇒ 9911,1,Dial(${OUTBOUNDTRUNK}/911) ; So that folks who dial “9” ; first will also get through Опять же, мы предполагаем, ради этих примеров, что мы в Соединенных Штатах или Канаде. Если вы находитесь за пределами этого района, пожалуйста, заменить 911 с аварийно-спасательных служб номер в вашем конкретном месте. Это то, что вы не хотите забыть положить в плане набора! Затем, давайте добавим контексте для дальних звонков: [outbound-long-distance] exten ⇒ _91NXXNXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten ⇒ _91NXXNXXXXXX,n,Playtones(congestion) exten ⇒ _91NXXNXXXXXX,n,Hangup() Теперь, когда у нас есть эти два новых условиях, как мы можем позволить внутренним пользователям принимать использовать их? Нам нужны пути для контекстов, чтобы иметь возможность использовать функциональность , содержащиеся в других контекстах.

Включает в себя Asterisk имеет функцию, которая позволяет использовать расширения от контекста, в рамках другом контексте посредством директивы включают. Это используется для контроля доступа к различным разделы плана набора. Мы будем использовать включить функциональность, позволяющая пользователям в нашей [Сотрудников] контексте возможность делать исходящие звонки. Но сначала давайте покрытия синтаксис. Заявление включить имеет следующий вид, где контексте это имя удаленной связи мы хотим включить в нынешних условиях: include ⇒ context § Преимуществом этого является то, что если в один прекрасный день мы решили направить все наши звонки через другие каналы, мы нужно изменить название канала присваивается переменной OUTBOUNDTRUNK только в [глобальных] контексте, а не того, чтобы вручную изменить все ссылки на канал в плане набора. Когда мы включаем других контекстов, в рамках наших нынешних условиях, мы должны иметь в виду Порядок, в котором мы в том числе их. Asterisk будет первым стараемся соответствовать набранных расширения в нынешних условиях. В случае неудачи, будет пытаться включить первую контексте (В том числе контекстов, включенных в этом контексте), а затем перейдите к другой включены условия, в том порядке, в котором они были включены. Как он сидит, наши нынешние диалплана имеет два контекста для исходящих звонков, но нет никакой для людей [сотрудников] контексте их использования. Давайте средство правовой защиты, что, в том числе 2 исходящий контексты, в [сотрудников] контексте, например: [globals] JOHN=Zap/1 JANE=SIP/Jane OUTBOUNDTRUNK=Zap/4 [incoming] exten ⇒ 123,1,Answer() exten ⇒ 123,n,Background(enter-ext-of-person) exten ⇒ 123,n,WaitExten?() exten ⇒ 1,1,Dial(${JOHN},10) exten ⇒ 1,n,Playback(vm-nobodyavail) exten ⇒ 1,n,Hangup() exten ⇒ 2,1,Dial(${JANE},10) exten ⇒ 2,n,Playback(vm-nobodyavail) exten ⇒ 2,n,Hangup() exten ⇒ i,1,Playback(pbx-invalid) exten ⇒ i,n,Goto(incoming,123,1) exten ⇒ t,1,Playback(vm-goodbye) exten ⇒ t,n,Hangup() [employees] include ⇒ outbound-local include ⇒ outbound-long-distance exten ⇒ 101,1,Dial(${JOHN}) exten ⇒ john,1,Dial(${JOHN}) exten ⇒ 102,1,Dial(${JANE}) exten ⇒ jane,1,Dial(${JANE}) [outbound-local] exten ⇒ _9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten ⇒ _9NXXXXXX,n,Congestion() exten ⇒ _9NXXXXXX,n,Hangup() exten ⇒ 911,1,Dial(${OUTBOUNDTRUNK}/911) exten ⇒ 9911,1,Dial(${OUTBOUNDTRUNK}/911) [outbound-long-distance] exten ⇒ _91NXXNXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten ⇒ _91NXXNXXXXXX,n,Playtones(congestion) exten ⇒ _91NXXNXXXXXX,n,Hangup() Эти два заявления включают позволит абонентам в [сотрудников] контексте делать исходящие звонки. Следует также отметить, что в интересах безопасности, вы должны всегда убедитесь, что ваш [входящей связи] никогда не позволяет исходящего номера. (Если случайно он сделал, люди могли набрать в вашей системе, а затем сделать исходящих вызовов ущерб, который будет взимается за вами!)

Заключение И там у вас это-простые, но функциональные плана набора. Это не совсем полнофункциональный, но мы рассмотрели все основные принципы. В следующих главах мы продолжим добавлять новые функции, чтобы этот фундамент. Если части этого плана набора не имеет смысла, вы можете вернуться и перечитать раздел или 2 прежде чем перейти к следующей главе. Это необходимо, чтобы вы понимаете, этих принципов и как их применять, а в последующих главах построить эту информацию.

Attachments