Команда Asterisk Dial

Приложение Asterisk ‘Dial’, пытается установить соединение, одного устройства с другим. Чаще всего, ваш Диалплан будет строится вокруг данного приложения. Многочисленные опции, превращают его в мощное средство для реализации разнообразных задач.

Данное приложение направляет вызовы на один или несколько назначенных каналов. Как только один из запрашиваемых каналов отвечает, происходит соединение. Эти два канала и составляют активное соединение. Вызовы на остальные запрашиваемые каналы прекращаются (hangup). Если тайм-аут не назначен, вызов будет ждать бесконечно, пока кто-то из пользователей не произведет отбой, или все вызываемые каналы получат статус «занят» или «недоступен»(busy or unavailable).

Если ${OUTBOUND_GROUP} переменная установлена, все каналы созданные этим приложением будут группированы, как (Set(GROUP()=…).

При использовании переменной ${OUTBOUND_GROUP_ONCE} все каналы созданные этим приложением будут также сгруппированы, как (Set(GROUP()=…),
но в отличии от ${OUTBOUND_GROUP}, после использование значение не сохранится и будет удалено. см также function ‘GROUP_COUNT’

Приложение «Dial» также возвращает следующие переменные:

${DIALEDTIME}: Время с начала набора до разъединения вызова.

${ANSWEREDTIME}: Фактическое время соединения (разговора).

${DIALSTATUS}: Состояние вызова.

  • CHANUNAVAIL
  • CONGESTION
  • NOANSWER
  • BUSY
  • ANSWER
  • CANCEL
  • DONTCALL: Для Privacy и Screening Modes. Будет установлен, если вызываемый абонент выбирает для отправки вызывающему абоненту сценария «Go Away».
  • TORTURE: Для Privacy и Screening Modes. Будет установлен, если вызываемый абонент выбирает для отправки вызывающему абоненту сценария «Torture».
  • INVALIDARGS

Синтаксис

Dial(Technology/Resource[&Technology2/Resource2[&…]][,timeout[,options[,URL]]])

Аргументы

Technology/Resource

Определение устройств для вызова в формате ‘Technology/Resource’, где <Technology> означает специфическую технологию драйвера канала, а <Resource> доступные для заданной технологии каналы.

  • DAHDI/1 — Вызов устройства DAHDI.
  • DAHDI/g0/${EXTEN} — Вызов через группу каналов DAHDI
  • SIP/100 — Вызов SIP пира.
  • PJSIP/${EXTEN}@pjsip_trunk — вызов через PJSIP транк.
  • Local/100@from-internal/n — вызов через локальный прокси драйвер Asterisk.

Technology2/Resource2 — Параллельный вызов дополнительных устройств. Если требуется вызвать более одного устройства используйте синтаксис: Technology2/Resource2&Technology3/Resourse3&…..

timeout — Таймаут вызова устройства. Если не задано, время по умолчанию 136 лет.

exten => _1XXX,1,Dial(PJSIP/${EXTEN},60,)

Опции команды Dial

  • A(x): Воспроизведение голосового сообщения для вызывающей стороны. Где (х) звуковой файл.
exten => _1XXX,1,Dial(PJSIP/${EXTEN},60,A(demo-congrats))
  • a: Ответить на вызов, вне зависимости от состояния вызываемого канала. Обычно ответ на вызов происходит, когда отвечает вызываемый канал, но иногда требуется ответить до того, как поднимут трубку. Например при использовании опций A() и M().
  • b([[context^]exten^]priority[(arg1[^…][^argN])]): Перед началом исходящего вызова создается новый канал и выполняется GoSub. Gosub будет выполняться для каждого канала назначения.
[icoming]
exten => _9981138,1,Dial(SIP/666&PJSIP/89219981138@siptrunk,,b(option-b,s,1))

[option-b]
exten => s,1,Verbose(*option b*)
exten => s,n,return

Пример использования опции Dial(,,b)

[from-gsm]
exten  => s,1,Dial(PJSIP/666@fs,,b(add-X^addheader^1))

[add-X]
exten => addheader,1,Set(PJSIP_HEADER(add,X-MyShits)=${URIENCODE(съешь этих мягких французких булочек)})
same => n,return

В приведенном выше примере, опция b добавляет в SIP INVITE кастомный заголовок X-MyShits:,
который, затем, можно прочитать при помощи функции PJSIP_HEADER или SIP_HEADER

Executing [666@from-bk:1] Dial("PJSIP/828-000000d1", "PJSIP/666@fs,,b(add-X^addheader^1)") in new stack
    -- PJSIP/fs-000000d2 Internal Gosub(add-X,addheader,1) start
    -- Executing [addheader@add-X:1] Set("PJSIP/fs-000000d2", "PJSIP_HEADER(add,X-MyShits)=%D1%81%D1%8A%D0%B5%D1%88%D1%8C%20%D1%8D%D1%82%D0%B8%D1%85%20%D0%BC%D1%8F%D0%B3%D0%BA%D0%B8%D1%85%20%D1%84%D1%80%D0%B0%D0%BD%D1%86%D1%83%D0%B7%D0%BA%D0%B8%D1%85%20%D0%B1%D1%83%D0%BB%D0%BE%D1%87%D0%B5%D0%BA") in new stack
    -- Executing [addheader@add-X:2] Return("PJSIP/fs-000000d2", "") in new stack
  == Spawn extension (from-fs, 666, 1) exited non-zero on 'PJSIP/fs-000000d2'
    -- PJSIP/fs-000000d2 Internal Gosub(add-X,addheader,1) complete GOSUB_RETVAL=
    -- Called PJSIP/666@fs
INVITE sip:666@192.168.0.1:5070 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.2:6667;rport;branch=z9hG4bKPjc2dbeee5-47b3-4420-a096-9b3f885ff2f2
From: <sip:828@192.168.0.2>;tag=f685e0e1-ed0f-4e06-9fc3-946099bc23cd
To: <sip:666@192.168.0.1>
Contact: <sip:asterisk@192.168.0.2:6667>
Call-ID: 5cac5e7a-249e-46ca-bc2a-bb8a6066e10a
CSeq: 25872 INVITE
Allow: OPTIONS, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, REGISTER, REFER, MESSAGE
Supported: 100rel, timer, replaces, norefersub
Session-Expires: 1800
Min-SE: 90
X-MyShits: %D1%81%D1%8A%D0%B5%D1%88%D1%8C%20%D1%8D%D1%82%D0%B8%D1%85%20%D0%BC%D1%8F%D0%B3%D0%BA%D0%B8%D1%85%20%D1%84%D1%80%D0%B0%D0%BD%D1%86%D1%83%D0%B7%D0%BA%D0%B8%D1%85%20%D0%B1%D1%83%D0%BB%D0%BE%D1%87%D0%B5%D0%BA
Max-Forwards: 70
User-Agent: Asterisk PBX 14.2.1
  • B([[context^]exten^]priority[(arg1[^…][^argN])]): Выполнить переход, аналогичный GoSub до того, как будет вызван канал указанный в Technology/Resource
[sub-4555]
exten => s,1,playback(${ARG1})
exten => s,n,return
[from-4555]
exten => _4555,1,Answer
exten => _4555,n,Dial(PJSIP/2829@fs_pjsip,60,B(sub-4555,s,1(demo-congrats)))
Таким образом, опция ‘b‘ работает для нескольких каналов, перечисленных в Technology/Resource, ‘B‘ — для одного.
  • Не создавать запись детализированного отчета о звонках (CDR) для этого вызова.
  • c: Если приложение Dial() отменяет этот вызов, всегда устанавливать HANGUPCAUSE в ‘answered elsewhere’
  • d: Позволяет вызывающему абоненту набрать одну цифру, во время ожидания ответа. Расширение должно быть назначено в текущем контексте или в контексте определенном переменной EXITCONTEXT.
  • D([called][:calling[:progress]]): Отправить DTMF строку набора, после ответа на вызов, но до того как каналы будут соединены.

DTMF может быть отправлен как вызываемой стороне, так и вызывающей. Оба аргумента могут быть использованы отдельно. Если указан PROGRESS, его DTMF посылается к вызываемой стороне сразу после получения сообщения PROGRESS message. (пример: использовать для автоматического донабора пин-кода в карточных системах).

  • e: Выполнить расширение ‘h’ после завершения вызова.
  • f([x]): Если <x> задано, принудительно подставить значение в качестве CallerID.
  • F(context,exten,priority) — Когда вызывающий абонент завершает вызов, переадресовать вызываемого абонента аналогично GoTo по указанному назначению и выполнить.
    • F — если вызывающий абонент завершает вызов а параметры не заданы, перейти на ‘n’ следующий приоритет в текущем контексте.
  • g — Когда вызов завершен вызываемой стороной (в отличии от опции F), выполнить следующий приоритет в текущем контексте.
  • G — Если вызов отвечен, переадресовать вызывающую сторону на указанный приоритет(context,exten,priority), а вызываемую на указанный приоритет плюс 1.

Пример использования опции G

[incoming]
exten => _9981138,1,Set(_callbackdest=${CALLERID(num)}) ;сохраним callerid в переменной
exten => _9981138,n,Dial(SIP/666,,G(callback,s,1)) ;вызов с опцией G
[callback]
exten => s,1,Goto(s,called) ; переход для вызывающего абонента
exten => s,n,Verbose(*callback init*) ; приоритет для инициации callback (приоритет 1 плюс 1)
exten => s,n,Wait(5) ; ждем 5 секунд
exten => s,n,Dial(PJSIP/${callbackdest}@siptrunk,,) ; вызываем абонента по его callerid
exten => s,n,hangup
exten => s,n(called),Verbose(*callback dest*) ; сюда попадает вызывающий абонент и далее вызов разъединяется, чтобы система сама перезвонила ему.
exten => s,n,hangup
  • h — Разрешить вызывающей стороне послать сигнал завершения вызова DTMF кодом из features.conf.
  • H — Разрешить вызываемой стороне послать сигнал завершения вызова DTMF кодом из features.conf.
  • i — Игнорировать любые запросы на переадресацию вызова.
  • I — Asterisk will ignore any connected line update requests or any redirecting party update requests it may receive on this dial attempt.
  • k — Разрешить вызываемой (called) стороне припарковать вызов набором DTMF кода, назначенного в features.conf.
  • K — Разрешить вызывающей (calling) стороне припарковать вызов набором DTMF кода, назначенного в features.conf.
  • L(x[:y][:z]) — Ограничить продолжительность вызова до Х миллисекунд. Воспроизвести сообщение, когда Y миллисекунд осталось. Повторять каждые Z миллисекунд, пока не истечет время. Опции зависят от следующих переменных:
    • LIMIT_PLAYAUDIO_CALLER — Воспроизвести сообщение вызывающему. YES по умолч.: (true) \ NO
    • LIMIT_PLAYAUDIO_CALLEE — Воспроизвести сообщение вызывамому. YES по умолч.: (true) \ NO
    • LIMIT_TIMEOUT_FILE — If specified, filename specifies the sound prompt to play when the timeout is reached. If not set, the time remaining will be announced. FILENAME
    • LIMIT_CONNECT_FILE — If specified, filename specifies the sound prompt to play when the call begins. If not set, the time remaining will be announced. FILENAME
    • LIMIT_WARNING_FILE — If specified, filename specifies the sound prompt to play as a warning when time x is reached. If not set, the time remaining will be announced. FILENAME
      • x — Maximum call time, in milliseconds
      • y — Warning time, in milliseconds
      • z — Repeat time, in milliseconds
  • m(class) — Назначить для данного вызова специфический класс Музыки на Удержании (MOH).
  • M(x) — Выполнить указанный (x) Макро-контекст, когда вызываемая сторона ответит на вызов. Аргументы разделяются запятой. Возвращает переменную ${MACRO_RESULT} и выполняет по завершению Macro:
    • ABORT — Отключить оба канала.
    • CONGESTION — Канал переполнен.
    • BUSY — Канал занят.
    • CONTINUE — Отключить вызываемую сторону и и продолжить для вызывающей стороны выполнение диалплана со следующего приоритета.
    • GOTO:[[<CONTEXT>^]<EXTEN>^]<PRIORITY> — Переадресовать вызов в указанный контекст.
      • macro — Макрос для выполнения.
      • arg — Аргументы Макроса.

Пример опции Dial(,,,M(x))

exten => _4886,1,Dial(SIP/4886,,M(testM,argument1,argument2))

[macro-testM]
exten = s,1,verbose(${ARG1})
    same => n,verbose(${ARG2})
	same => n,set(MACRO_RESULT=BUSY)

вывод консоли для приведенного выше диалплана

-- Executing [4886@from-fs-pjsip:1] Dial("PJSIP/fs_pjsip-000000ce", "SIP/4886,,M(testM,argument1,argument2)") in new stack
  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
    -- Called SIP/4886
    -- SIP/4886-00000066 is ringing
    -- SIP/4886-00000066 answered PJSIP/fs_pjsip-000000ce
    -- Executing [s@macro-testM:1] Verbose("SIP/4886-00000066", "argument1") in new stack
argument1
    -- Executing [s@macro-testM:2] Verbose("SIP/4886-00000066", "argument2") in new stack
argument2
    -- Executing [s@macro-testM:3] Set("SIP/4886-00000066", "MACRO_RESULT=BUSY") in new stack
    -- Auto fallthrough, channel 'PJSIP/fs_pjsip-000000ce' status is 'BUSY'
    -- Executing [h@from-fs-pjsip:1] Hangup("PJSIP/fs_pjsip-000000ce", "") in new stack
  == Spawn extension (from-fs-pjsip, h, 1) exited non-zero on 'PJSIP/fs_pjsip-000000ce'
  • n(delete) — Mодификатор экранного/конфиденциального режима (screen/privacy mode). Определяет, что вступления (introductions) не должны сохраняться в папке priv-callerintros.
    • delete — удалить группу если не указано или установлено — 0, записанное представление не будет удалено, если вызывающий абонент повесит трубку до ответа. если установлено 1 — вступление всегда удаляется.
  • N — This option is a modifier for the call screening/privacy mode. It specifies that if Caller*ID is present, do not screen the call.
  • o(x) — Использует Caller ID входящего вызова,в качестве Caller ID для исходящего вызова. Это полезно, если вы переадресовали вызов и хотите, чтобы адресат трансфера видел callerid внешнего абонента. Если o(${CALLERID(all)}) аналогично o без параметра.
  • O(x) — Включает режим оператора услуг. Эта опция работает только при вызове каналом DAHDI, другого DAHDIканала. Если используется не DAHDI интерфейс опция буден проигнорирована. Когда оператор ответил, вызывающий канал теряет контроль над линией и не может, например, прервать вызов, пока это не сделает оператор.
    • mode:
      • 1 — если звонящий повесит трубку, раньше оператора, то будет немедленно вызван снова.
      • 2 — вернет вызов оператору, если он повесит трубку.
  • p — Включает режим экрана( screening mode). Это основной privacy mode без запоминания.
  • P(x) — Включает частный режим (privacy mode). Использует параметр x, как family/key в AstDB. Если (x) не задан, в качестве ДБ family/key используется текущий екстеншен.
  • r(tone) — По умолчанию: Генерирует КПВ вызывающей стороне, даже если вызываемая сторона на самом деле не звонит. Аудио канал не подключается, пока вызываемая сторона не ответит.
    • tone — генерирует КПВ тон, назначенный в indications.conf для текущей зоны.
  • R — Тоже, что и r, но разрешает заменить КПВ, если early media получен для данного канала.
  • S(x) — Повесить трубку через (x) секунд после ответа.
  • s(x) — принудительно подставить (х) callerid для исходящего вызова. Работает с опцией f
  • t — Разрешает вызываемой стороне, переадресовать вызов DTMF кодом, назначенным в features.conf.
  • T — Разрешает вызывающей стороне, переадресовать вызов DTMF кодом, назначенным в features.conf.
Будьте осторожны с назначением опции (T). При некоторых условиях, она может быть использована для взлома Asterisk.
  • U(x[^arg[^…]]): — Выполнить GoSub маршрут, после ответа вызываемой стороны. синтаксис: U(sub^ARG1^ARG2). После выполнения возвращает переменную ${GOSUB_RESULT}:
    • GOSUB_RESULT
      • ABORT — Всем отбой.
      • CONGESTION — Канал переполнен.
      • BUSY — Канал занят.
      • CONTINUE — Выполнить следующий приоритет. если вызываемая сторона положила трубку.
      • GOTO:[[<CONTEXT>^]<EXTEN>^]<PRIORITY> — перейти на указанный контекст.
    • x — имя контекста GoSub.
    • arg — аргументы GoSub

Пример использования опции U()

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

[internal]
exten => _4XXX,n,Dial(SIP/${EXTEN},30,trU(sub-monitor,s,1))
[sub-monitor]
exten => s,1,Set(WAV=/var/spool/asterisk/monitor/${UNIQUEID})
exten => s,n,Set(MP3=/var/spool/asterisk/monitor/mp3/${UNIQUEID})
exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32  --silent "${WAV}.wav"  "${MP3}.mp3" && rm -f "${WAV}.wav" && chmod o+r "${MP3}.mp3")
exten => s,n,Set(CDR(recordingfile)=${UNIQUEID}.mp3)
;exten => s,n,Set(CDR(userfield)=${ARG1})
exten => s,n,MixMonitor(${WAV}.wav,b,${monopt})
exten => s,n,return
  • u(x) — Работает совместно с опцией f.
    • x — принудительно установить исходящий callerid индикатор в одно из значений, заданных как (x):
      • allowed_not_screened allowed_passed_screen
      • allowed_failed_screen allowed
      • prohib_not_screened prohib_passed_screen
      • prohib_failed_screen prohib unavailable
  • w — Разрешить вызывающей стороне включить запись разговора приложением Monitor набором DTMF кода, назначенного в features.conf.
  • W — Разрешить вызываемой стороне включить запись разговора приложением Monitor набором DTMF кода, назначенного в features.conf.
  • x — Разрешить вызывающей стороне включить запись разговора приложением MixMonitor набором DTMF кода, назначенного в features.conf.
  • X — Разрешить вызываемой стороне включить запись разговора приложением MixMonitor набором DTMF кода, назначенного в features.conf.
  • z — При форвардинге вызова, отменить любой тайм-аут набора, который был установлен для данного вызова.

URL — Добавить значение Access-URL: в SIP Invite.
Если вызываемое устройство поддерживает данную функцию, возможно вывести на дисплей телефона дополнительную информацию.

Оригинал статьи: https://asterisk-pbx.ru/wiki/asterisk/app/dial