Asterisk. Команда Dial.

Dial() - Пытается установить новое исходящее соединение и соединить каналы. 

Dial(type/identifier,timeout,options,URL)
Dial(type1/identifier1&type2/identifier2&type3/identifier3...,timeout,options,URL)
 

Это приложение позволяет соединять все возможные типы каналов. 

Dial() – самое важное приложение в Asterisk.

Приложение Dial() работает с любыми типами каналов (SIP, IAX2, H.323, MGCP, Local, Zap), но для каждого типа канала существуют свои параметры которые нужно передать этой команде. То есть, SIP-каналу для соединения нужен сетевой адрес и пользователь, а Zap-каналу нужен телефонный номер.
Когда задается сетевой тип канала, в качестве опций Dial() могут передаваться: хост назначения (имя или IP-адрес), имя пользователя, пароль и удаленный добавочный номер или можно указать имя записи канала в соответствующем конфигурационном файле (в этом случае информация поступает из этого файла). Имя пользователя и пароль допускается  заменить именем, указанным в квадратных скобках ([ ]) в соответствующем конфигурационном файле канала. Имя хоста является необязательным.

Пример использования команды Dial:
exten => s,1,Dial(SIP/eugene:test@company.com)
 Этот пример будет работать,  если в конфигурационном файле sip.conf прописаны соответствующие параметры (fromuser=eugene, password=test, host=company.com)

Кроме того, что Asterisk умеет соединять SIP, IAX, H.323, Skinny, PRI, FX(O/S) и некоторые другие каналы, с помощью приложения Dial() возможно соединять множество локальных каналов. Dial() может запускать множество совершенно независимых и уникальных действий в других частях диалплана. 

Добавочный номер указывается после адреса:
exten => s,1,Dial(SIP/eugene:test@company.com/100)
Таким образом указывается другому концу соединения направить вызов на добавочный номер 100 в том  контексте, куда поступил вызов. Указывать добавочный номер в Dial() необязательно, так как дальний конец соединения сам управляет тем, что происходит с вызовом, вы же указывая определенные параметры можете только запрашивать определенную обработку на той стороне.

Если не задан параметр timeout (время ожидания ответа), канал будет совершать вызов неопределенно долго.  Параметр timeout задается в секундах и всегда следует за адресной информацией:

exten => s,1,Dial(SIP/eugene:test@company.com/100,120)
 

Функциональность приложения Dial() во многом определяется флагами. Их указывают после адреса и времени ожидания:
exten => s,1,Dial(SIP/eugene:test@company.com/100,120,флаги)
Если время ожидания не задано и нужно задать флаги, необходимо обозначить место, где можно указать время ожидания. Делается это введением дополнительной запятой на
месте времени ожидания:
exten => s,1,Dial(SIP/eugene:test@company.com/100,,флаги)
Для приложения Dial() могут использоваться следующие флаги:

A( x ) - Воспроизводится приветствие для вызываемой стороны, где x – имя звукового файла, используемого в качестве приветствия.
C - Сброс записи Call Detail Record для звонка (например, чтобы пользователю не приходилось оплачивать время, прошедшее до вызова приложения Dial()).
d - Пользователь может набирать одноразрядный добавочный номер в процессе ожидания ответа на звонок. Тогда звонок перейдет на этот добавочный номер (или в текущем контексте, или, если производится выход, в контексте, заданном переменной EXITCONTEXT).
D([ вызываемый ][: вызывающий ]) - DTMF-коды передаются после ответа на звонок до того, как установлено соединение. Параметр вызываемый передается вызываемой стороне, а параметр вызывающий – вызывающей стороне. Эти параметры могут использоваться по отдельности.
f - Caller ID (ID звонящего) вызывающей стороны принудительно устанавливается как добавочный номер, связанный с каналом, с помощью подсказки диалплана. Это нужно, например, когда провайдер разрешает задавать в качестве Caller ID только выделенные для вас номера. Например, при наличии PRI, флаг f использовался бы для переопределения любого заданного локально Caller ID для SIP-телефона.
g - Выполнение диалплана продолжается в текущем контексте, если вызываемый абонент вешает трубку.
G( контекст ^ добавочныйномер ^ приоритет ) - Когда ответ на звонок получен, вызывающая сторона переводится в заданный приоритет, а вызываемая сторона – в заданный приоритет +1. В сочетании с этой опцией нельзя использовать никакие другие опции, определяющие операции после ответа.
h - Позволяет вызванному абоненту разорвать соединение нажатием кнопки *.
H - Позволяет вызывающему абоненту разорвать соединение нажатием кнопки *.
i - Игнорируются все попытки перенаправить вызов для данной попытки вызова.
j - Переход в приоритет n + 101 в случае занятости запрашиваемых каналов (где n – текущий приоритет).
L( x [: y ][: z ]) - Продолжительность звонка ограничивается x (в миллисекундах), дается предупреждение, когда осталось y (миллисекунд), и предупреждение повторяется каждые y миллисекунд вплоть до истечения допустимой продолжительности разговора. Параметр x – обязательный; y и z – необязательные. Для обеспечения дополнительного контроля могут использоваться следующие специальные переменные:

  • LIMIT_PLAYAUDIO_CALLER=yes|no - Определяет, воспроизводится ли звуковой файл для вызывающего абонента. По умолчанию – yes.
  • LIMIT_PLAYAUDIO_CALLEE=yes|no - Определяет, воспроизводится ли звуковой файл для вызываемого абонента.
  • LIMIT_TIMEOUT_FILE= имяфайла - Определяет, какой файл воспроизводится, когда время истекло.
  • LIMIT_CONNECT_FILE= имяфайла - Определяет, какой файл воспроизводится в начале вызова.
  • LIMIT_WARNING_FILE= имяфайла - Определяет, какой файл воспроизводится, если определен аргумент y. По умолчанию проговаривается оставшееся время. m[класс]

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

M( x [ ^аргумент ]) - При соединении выполняется макрос x и передаются (необязательно) аргументы, разделенные символом ^. Макрос также может задавать одно из следующих значений для переменной канала:

  • MACRO_RESULT -  чтобы обозначить, что должно произойти после завершения макроса:
  • ABORT (прервать) - Повесить трубку на обоих концах соединения.
  • CONGESTION (перегрузка) - Действовать так, как при перегрузке линии.
  • BUSY (занято) - Действовать так, как при занятости линии. Если задана опция j, вызов перенаправляется в приоритет n + 101, где n – текущий приоритет.
  • CONTINUE (продолжить) - Отключить вызываемую сторону и продолжить выполнение диал­плана.
  • GOTO:<контекст>^<добавочныйномер>^<приоритет> Выполнить переадресацию вызова в заданную точку. В сочетании с этой опцией нельзя использовать другие дополнительные опции, определяющие действия после ответа. Также сервисы офисной АТС не выполняются для вызванного канала, поэтому не получится задать значения времени ожидания посредством функции TIMEOUT в этом макросе.

n - Эта опция является модификатором для экранного/конфиденциального режима (screen/privacy mode). Она определяет, что вступления (introductions) не должны сохраняться в папке priv callerintros.
N - Модификатором для экранного/конфиденциального режима. Указывает не экранировать вызов, если представлен Caller ID.
o - Использует Caller ID, полученный по входящему плечу вызова, в качестве Caller ID на исходящем плече вызова. Нужно, если вы принимаете вызов и перенаправляете его в другую точку, но хотите передать Caller ID из входящего плеча вызова, а не заменять его локальным Caller ID. 
O[x] - Включение режима услуг оператора (Operator Services) для канала Zaptel. При использовании в не-Zaptel-интерфейсе эта опция игнорируется. После ответа вызываемой стороны источник вызова теряет контроль над линией. Вызывающий абонент может повесить трубку, но линия не освободится пока не повесит трубку вызываемая сторона. Если аргумент не задан или задана 1, то, когда вызывающий абонент вешает трубку, его телефон немедленно зазвонит. Если задан аргумент 2, то, когда «оператор» выполняет мгновенный сброс магистральной линии, зазвонит телефон вызывающего абонента.
p - Активируется режим экранирования. По сути, это конфиденциальный режим без запоминания.
P[(x)] - Задает конфиденциальный режим. Может быть задан необязательный параметр x как значение семейство/ключ локальной базы данных AstDB. Эта опция используется для принятия звонков на основании черного списка (запрещающего звонки с указанных номеров) или белого списка (список номеров, звонки с которых должны приниматься обязательно). См. также LookupBlacklist().
r - Указывает генерировать сигналы вызова вызывающему абоненту, не передавая никаких аудиосигналов до тех пор, пока не получен ответ на звонок. Обычно этот флаг редко используется, т.к. Asterisk сам генерирует сигналы вызова.
S(x) - Прерывает звонок через x секунд после ответа вызываемой стороны.
t - Разрешает вызываемой стороне переадресовать звонок, нажав кнопку #. Если используется эта опция, повторные приглашения выключены, так как Asterisk нужно отслеживать вызов, для  фиксации момента нажатия кнопки # вызываемой стороной.
T - Разрешает ответившему абоненту переадресовывать соединенный вызов, нажав кнопку #. При использовании этой опции  повторные приглашения выключены, так как Asterisk нужно отслеживать вызов, для  фиксации момента нажатия кнопки # вызываемой стороной.
w - Разрешает ответившему абоненту начинать и останавливать запись разговора, нажав последовательность кнопок automon (задается в файле features.conf). Если задана переменная TOUCH_MONITOR, ее значение будет передано как аргумент в приложение Monitor() в начале записи. Если переменная не задана, в Monitor() передаются значения по умолчанию, WAV||m.
W - Позволяет вызывающему абоненту записывать разговор на диск, нажав последовательность кнопок automon (которая задана в файле features.conf).
k - Позволяет ответившему абоненту парковать вызов (переключать на другой телефон), передав последовательность из DTMF-сигналов (определяется для парковки вызовов в файле features.conf).
K - Позволяет вызывающей стороне парковать вызов, передав DTMF-последовательность сигналов(определяется для парковки вызовов в файле features.conf). 

Если включен аргумент URL, этот URL будет отправлен каналу (если поддерживается).

 Если задать переменную OUTBOUND_GROUP перед вызовом команды Dial(), все каналы типа peer, созданные данным приложением, будут помещаться в эту группу вызовов.

Например все каналы peer, созданные приложением Dial(), будут частью группы вызовов test:

exten => 123,1,Set(OUTBOUND_GROUP=test)                ; используем OUTBOUND_GROUP
exten => 123,n,Dial(IAX2/office/12345)

Если  задаётся переменная OUTBOUND_GROUP_ONCE, все каналы peer, созданные данным приложением, будут помещены в эту группу. Однако, в отличие от OUTBOUND_GROUP, эта переменная будет сброшена после использования.

Приложение Dial() при выходе задает следующие переменные:
DIALEDTIME (время дозвона) - Общее время с момента начала выполнения Dial() до завершения.
ANSWEREDTIME (время ответа) - Общее время вызова.
DIALSTATUS (статус звонка) - Статус звонка, задается одним из следующих значений:
CHANUNAVAIL (канал недоступен) - Канал недоступен.
CONGESTION (перегрузка) -Канал возвратил сигнал перегрузки, что означает невозможность завершить соединение.
NOANSWER (не отвечает) - Канал не ответил в течение времени, заданного опцией времяожидания-ответа.
BUSY (занят) - Вызываемый канал в настоящее время занят.
ANSWER (ответ) - Канал ответил на вызов.
CANCEL (отмена) - Вызов был отменен.
DONTCALL (не вызывать) - Вызов был переведен в состояние DONTCALL опциями экранирования или конфиденциальности.
TORTURE (отключение) - Вызов был переведен в состояние TORTURE опциями экранирования или конфиденциальности.
INVALIDARGS (недействительные аргументы) - В приложение Dial() были переданы недействительные аргументы.

Еще несколько примеров:

Набираем семизначный номер по Zap-каналу 4:
exten => 123,1,Dial(DAHDI/4/1234567)          

Набираем тот же номер, но на этот раз дозвон будет осуществляться только в течение 10 с, после чего будет продолжено выполнение диалплана:
exten => 123,1,Dial(DAHDI/4/1234567,10) 
exten => 123,2,Playback(im-sorry)
exten => 123,3,Hangup()

Набираем тот же номер, но на этот раз без времени ожидания, и используем флаги t, T и m:

exten => 123,1,Dial(DAHDI/4/1234567,,tTm)          

Набираем добавочный номер 100 на удаленном хосте (по протоколу IAX),  используя заданные имя пользователя и пароль:

exten => 123,1,Dial(IAX2/username:password@remotehost/100)       

Набираем номер, но ограничиваем звонок 5 мин (300 000 мс), начинаем предупреждать  вызывающего абонента через 4 мин (240 000 мс) разговора и повторяем предупреждение каждые 30 с (30 000 мс):

exten => 127,1,Dial(Zap/4/2317154,,L[300000:240000:30000])      

 

См. также: RetryDial()