Asterisk™: будущее телефонии Второе издание - Меггелен Джим Ван
exten => 123,1,Answer() exten => 123,2,Hangup()
Не переживайте, если вы не понимаете, что такое Answer() и Hangup(), мы очень скоро их рассмотрим. Здесь главное - запомнить, что для отдельного добавочного номера Asterisk выполняет приоритеты по порядку.
Ненумерованные приоритеты
В более старых версиях Asterisk нумерация приоритетов вызывала множество проблем. Представьте, что в добавочном номере 15 приоритетов и требуется добавить что-то в шаге 2. Номера всех последующих приоритетов пришлось бы менять вручную. Asterisk не обрабатывает пропущенные шаги или неправильно пронумерованные приоритеты, и отладка ошибок такого типа превращалась в бесцельную и досадную трату времени.
Начиная с версии 1.2 Asterisk решила эту проблему. Был введен приоритет n, что означает «следующий». Каждый раз, когда Asterisk встречает приоритет n, она берет номер предыдущего приоритета и добавляет 1. Это упрощает внесение изменений в диалплан, поскольку теперь не надо изменять номера всех шагов. Например, диалплан может быть таким:
exten => 123,1 Answer() exten => 123,n выполнить что-то exten => 123,n выполнить что-то еще exten => 123,n выполнить последнее exten => 123,n Hangup()Asterisk будет самостоятельно вычислять номер следующего приоритета при каждой встрече с приоритетом n[69]. Однако следует отметить, что приоритет под номером 1 должен быть задан обязательно. Если случайно для идущего первым приоритета задать n вместо 1, добавочный номер будет недоступен.
Метки приоритетов
Начиная с версии 1.2 в Asterisk стало общепринятой практикой присваивать приоритетам текстовые метки. Это обеспечивает возможность ссылаться на приоритет не по номеру, который может быть неизвестен, потому что теперь в диалпланах, как правило, используются ненумерованные приоритеты. Чтобы присвоить приоритету текстовую метку, просто добавляем ее в круглых скобках после приоритета: exten => 123,г(метка)1приложение()
Очень распространенной ошибкой является использование запятой между символами n и (, как в данном примере:
exten => 123,n,(метка),приложение() ;<-- ЭТО НЕ БУДЕТ РАБОТАТЬ Это приведет к нарушению данной части диалплана, будет выдано сообщение об ошибке, из-за того что приложение не найдено.
В следующей главе мы рассмотрим, как переходить с одного приоритета на другой, используя логику диалплана. Вы будете встречать множество меток приоритетов и станете очень часто использовать их в своих диалпланах.
Приложения
Приложения - это рабочие лошадки диалплана. Каждое приложение выполняет определенное действие над данным каналом, например воспроизведение звука, прием тонального ввода, вызов канала, разрыв соединения и т. д. В предыдущем примере было представлено два простых приложения: Answer() и Hangup(). Сейчас мы подробнее рассмотрим, как они работают.
Для выполнения некоторых приложений, таких как Answer() и Hangup(), не требуется никаких дополнительных инструкций. Некоторым приложениям необходима дополнительная информация. Эти данные, называемые аргументами, могут передаваться в приложения, чтобы оказывать влияние на то, как они выполняют свои действия. Чтобы передать аргументы в приложение, разместите их через запятую в круглых скобках, следующих за именем приложения.
Иногда вместо запятой в качестве разделителя между аргументами можно увидеть символ вертикальной черты (|). Допускается использование любого из этих символов. В примерах данной книги для разделения аргументов приложения будет применяться запятая, поскольку авторы предпочитают такой синтаксис. Однако при синтаксическом разборе диалплана Asterisk преобразует все запятые в аргументах приложений в символы вертикальной черты.
Когда мы создадим наш первый диалплан в следующем разделе, вы научитесь использовать приложения и связанные с ними аргументы.
Простой диалплан
Теперь мы готовы создать наш первый диалплан. Давайте начнем с очень простого примера. Asterisk должна будет ответить на звонок, воспроизвести звуковой файл и разорвать соединение. Используем этот простой пример, чтобы обозначить наиболее важные концепции диал- плана.
Предложенные в данной главе примеры разработаны исходя из предположения, что был создан и сконфигурирован (соответственно описанию в предыдущей главе) по крайней мере один канал (Zap, SIP или IAX2 - неважно) и что все вызовы, поступающие на этот канал, направляются в контекст диалплана [incoming]. Если к какому-то из предыдущих примеров вы подошли творчески, вероятно, вам придется вносить некоторые поправки, чтобы обеспечить соответствие имен каналов.
Добавочный номер s
В наших каналах мы применяем определенную технологию, и поэтому, прежде чем приступить к настройке диалплана, придется остановиться еще на одном вопросе. Необходимо рассмотреть добавочный номер s. Когда в контекст поступают вызовы, для которых не указан конкретный добавочный номер (например, вызов FXO-линии), они передаются на добавочный номер s. (s - сокращение от start (начало), поскольку именно здесь начнется обработка вызова, если с ним не передана информация о добавочном номере.)
Поскольку это именно то, что требуется для нашего диалплана, перейдем к делу. Для каждого вызова будет выполняться три действия (ответ на него, воспроизведение звукового файла и разъединение), поэтому добавочному номеру s понадобится три приоритета. Поместим три приоритета в контекст [incoming], поскольку было принято решение о том, что все входящие вызовы должны обрабатываться в этом контексте[70].
[incoming]
exten => s,1,приложение() exten => s,n,приложение() exten => s,n,приложение()
Теперь осталось только вставить приложения - и наш первый диал- план готов.
Обратите внимание, что можно было бы пронумеровать каждый приоритет, как показано ниже, но теперь так делать не рекомендуется, поскольку это сильно усложняет внесение изменений в диалплан впоследствии:
[incoming]
exten => s,1,приложение() exten => s,2,приложение() exten => s,3,приложение()
Приложения Answer(), Playback() и Hangup()
Прежде чем мы будем отвечать на звонок, воспроизводить звуковой файл и затем выполнять разъединение вызова, нам нужно научиться это делать. Приложение Answer() (Ответ) используется для ответа каналу, по которому выполняется звонок. Оно выполняет исходную настройку для канала, получающего входящий вызов. (Некоторые приложения не требуют обязательного ответа каналу, но соответствующий ответ на звонок перед тем, как выполнять какие-либо действия над каналом, является очень хорошей практикой.) Как упоминалось ранее, Answer() не принимает аргументов.
Приложение Playback() (Воспроизведение) воспроизводит в канале предварительно записанный звуковой файл. При использовании приложения Playback() ввод, поступающий от пользователя, просто игнорируется.
С Asterisk поставляется множество профессионально записанных звуковых файлов, которые должны находиться в папке, используемой для хранения звуков по умолчанию (обычно это /var/lib/asterisk/sounds/). При компиляции Asterisk можно выбрать для установки различные наборы образцов звуков, записанных на разных языках и в разных форматах файлов. Во многих примерах данной книги будут использоваться эти файлы, а также несколько файлов из Extra Sound Package, поэтому, пожалуйста, потратьте немного времени и установите этот пакет (см. главу 3). Также, посетив сайт http://thevoice. digium.com/, можно создать собственные голосовые сообщения, записанные тем же голосом, что и предоставляемые стандартные сообщения.