Описание
В Asterisk версии 1.0.X:
Read(variable[|filename][|maxdigits][|option])
Начиная с Asterisk версии 1.2:Read(variable[|filename][|maxdigits][|option][|attempts][|timeout])
Начиная с Asterisk версии 1.6:Read(variable[,filename[&filename2…]][,maxdigits][,option][,attempts][,timeout])
Считывает в указанную переменную, вводимую пользователем, DTMF последовательность, завершенную символом ‘#’, заданное число раз.
Параметры команды:
- variable: имя переменной, в которой будет сохранена введенная пользователем последовательность.
- filename: имя звукового файла (или файлов, начиная с версии 1.6) или тона, если используется опция ‘i’, проигрываемых пользователю до считывания последовательности.
- maxdigits: максимально возможное число считываемых цифр. Считывание прекращается если введено максимальное количество цифр (в этом случае от пользователя не требуется нажатия кнопки ‘#’). Значение по умолчанию: 0 – нет лимита – команда ждет, пока пользователь не нажмет кнопку ‘#’. Любое значение меньше нуля приводят к такому же результату. Максимальное значение для этого параметра – 255.
- option: дополнительные параметры, допустимые значения ‘s’, ‘i’, ‘n’:
- attempts: если больше 1, то указывается число попыток чтения последовательности, в том случае, если пользователь ничего не набрал.
- timeout: Количество секунд ожидания ввода пользователя. Если значение больше нуля, то это значение будет использоваться вместо значения таймаута по умолчанию. (Начиная с версии 1.6, могут использоваться не целые значения).
Начиная с версии 1.6, данное приложение по завершении устанавливает значение переменной канала READSTATUS в соответствии с результатом своей работы, в одно из значений:
OK | ERROR | HANGUP | INTERRUPTED | SKIPPED | TIMEOUT
Asterisk cmd transfer() после ответа()
Мне нужно передать вызов, используя функцию “передача” звездочки после того, как функция ответа ответит на вызов.
Если я передаю вызов без ответа с “ответом”, работает нормально. Если я передам после ответа, ошибка в конце сообщения отображается в кли:
Мой контекст прост… на соединение нужно ответить, и пользователь войдет в DTMF, и соединение будет передано с передачей.
Он должен быть с передачей, потому что это сервер переадресации sip.
Работает:
exten => s,1,Transfer(SIP/1120@xxx.xxx.xxx.xxx)
Не работает:
exten => s,1,Answer()
...
read some dtmf
...
exten => s,n,Transfer(SIP/1120@xxx.xxx.xxx.xxx)
Ошибка:
[2021-01-22 07:31:56] NOTICE[32021]: chan_sip.c:20716 handle_response_refer: SIP transfer to <sip:1120@xxx.xxx.xxx.xxx> failed, REFER not allowed.
-- Auto fallthrough, channel 'SIP/1313001-000e0e7c' status is 'UNKNOWN'
Количество попыток для обратных вызовов
atxfercallbackretries – устанавливает количество попыток, когда Asterisk будет отправлять неудачный трансфер обратно инициатору. По умолчанию используется значение 2.
Пример конфигурации:
[general] atxfernoanswertimeout = 15 atxferdropcall = no atxferloopdelay = 10 atxfercallbackretries = 2
Параметры поведения
Эти параметры настраиваются в разделе [general] файла features.conf
Общие варианты трансфера
; transferdigittimeout = 3; Количество секунд ожидания между цифрами при передаче вызова ; (по умолчанию - 3 секунды)
Варианты Attended трансфера
; xfersound = beep; указать, что передача участия завершена ; xferfailsound = beeperr; указать неудачную передачу ; transferdialattempts = 3; Количество попыток, по которому переводчик может набрать номер до ; возвращаясь к первоначальному вызову. ; transferretrysound = "beep"; Звук для воспроизведения, когда переводчик не набирает действительное расширение. ; transferinvalidsound = "beeperr"; Звук для воспроизведения, когда переводчик не набирает действительное расширение и не выполняет повторные попытки.
Команды cli (command line interface) asterisk (freepbx) | it блоги – windows, *nix, vmware, hyper-v, netapp, seo, html, видеонаблюдение
В этой статье мы расскажем как пользоваться Asterisk CLI (Command Line Interface), или проще говоря командной строкой Asterisk. CLI необходима для дебага ошибок и управления самим Asterisk.
1) Для входа в Asterisk CLI необходимо ввести следующие команды:
# rasterisk
или
# asterisk -rvvvvv
Ключ -rvvvvv отвечает за уровень отображения дебага.
Для выполнения команд из консоли Linux можно воспользоваться следующим синтексом:
asterisk -rx "sip show peers"
В кавычках вы указываете какую команду хотите применить.
Для выхода из консоли необходимо ввести «quit» или «exit«.
Приведем список существующих команд Asterisk CLI:
- logger show channels — выводит список лог файлов
- logger set level {DEBUG|NOTICE|WARNING|ERROR|VERBOSE|DTMF} {on|off} — включение/отключение определенного уровня логирования
- logger rotate — ротация и новое открытие файлов логирования
- logger remove channel — удаляет канал из логирования
- logger reload — перезагружает логирование
- logger mute — установка паузы на вывод информации в CLI Asterisk (т.е. в консоль не будет сыпаться никакая информация). Отключается это повторным вводом команды.
- logger add channel — добавление нового канала для логирования
- local show channels — выводит список локальных каналов АТС (внутренние вызовы)
- keys show — выводит список ключей RSA
- keys init — установка пароля для ключа RSA
- indication show — выводит список индикаторов и стран
- indication remove — удаление индикатора страны
- indication add — установка индикатора для страны
- iax2 unregister — снять регистрацию (принудительно) с IAX2 пира
- iax2 test losspct — устанавливает % потерянных пакетов для тестирования работоспособности IAX2
- iax2 show users [like] — выводит список пользователей IAX
- iax2 show threads — выводит список вспомогательных потоков IAX
- iax2 show stats — выводит статистику IAX пиров
- iax2 show registry — выводит статус регистраций IAX пиров
- iax2 show provisioning — выводит список шаблонов IAX для автонастройки
- iax2 show peers — выводит информацию об IAX пирах
- iax2 show peer — выводит информацию о IAX пире
- iax2 show netstats — выводит сетевую статистику о IAX каналах
- iax2 show firmware — выводит список доступных прошивок под IAX пользователей
- iax2 show channels — выводит активные каналы IAX
- iax2 show callnumber usage — выводит текущие записи в таблице IP
- iax2 show cache — выводит кэш диалплана IAX
- iax2 set mtu — устанавливает размер MTU IAX сообщений
- iax2 set debug trunk {on|off} — включение/отключение дебага IAX каналов
- iax2 set debug jb {on|off} — включение/отключение дебага джиттер-буфера IAX
- iax2 set debug {on|off|peer} — включение/отключение дебага IAX
- iax2 reload — перечитать конфигурационные файлы IAX
- iax2 prune realtime — очищает кэш realtime
- iax2 provision — производит автонастройку IAX пира
- http show status — вывести статус HTTP сервера
- group show channels — выводит список активных каналов с указанием групп
- file convert — конвертация формата аудиофайла
- features show — выводит список настроенных коротких кодов
- fax show version — показываем версию факсового модуля
- fax show stats — выводит историю передачи факсов
- fax show settings — показывать глобальные настройки факсов
- fax show sessions — показывает статус всех существующих факсовых сессий
- fax show session — показывает статус конкретной факсовой сессии
- fax show capabilities — показывает информацию о используемых факсовых модулях
- fax set debug {on|off} — включение/отключения дебага факсов
- dnsmgr status — показывает статус DNS Manager
- dnsmgr reload — перезагружает конфигурацию DNS Manager
- dnsmgr refresh — выполняет немедленное обновление DNS
- dialplan show — выводит подробный список диалпланов
- dialplan show globals — показывает глобальные переменные диалплана
- dialplan show chanvar — показывает используемые переменные на канале
- dialplan set global — установить глобальную переменную в диалплан
- dialplan set extenpatternmatchnew true — использовать новый алгоритм набора номеров
- dialplan set extenpatternmatchnew false — использовать старый алгоритм набора номеров
- dialplan set chanvar -установить переменную на канал
- dialplan save — сохранить диалплан в файл
- dialplan remove include — удалить «include» из контекста
- dialplan remove ignorepat — удалить указанный черный список из контекста
- dialplan remove extension — удалить указанный внутренний номер
- dialplan remove context — удалить указанный контекст
- dialplan reload — перечитать extensions.conf
- dialplan debug — включение дебага диалплана
- dialplan add include — включить один контекст в другой контекст
- dialplan add ignorepat — добавить новый шаблон в черный список
- dialplan add extension — добавление внутреннего номера в контекст
- devstate list — выводит список состояний устройств
- devstate change — изменить состояние внутреннего номера (доступные значения: UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING | RINGINUSE | ONHOLD)
- database showkey — выводит данные из БД Asterisk по определенному ключу
- database show — выводит данные из БД Asterisk
- database query — запустить специальный запрос к astdb
- database put — добавить/обновить значение в базе данных
- database get — получить из базы данных данные
- database deltree — удаление из базы данных дерева ключей/значений
- database del — удаление из базы данных ключа/значения
- data show providers — выводит доступную для получения, по запросу data get, информацию
- data get — запрос на получение данных API
- dahdi show version — выводит версию модуля Dahdi
- dahdi show status — выводит статус интерфейсных плат Dahdi
- dahdi show channel — выводит информацию о конкретном канале
- dahdi show channels [group|context] — выводит список активных DAHDI каналов
- dahdi show cadences — выводит список каденций
- dahdi set swgain {rx|tx} — установить коэффициент усиления звука на канале софтверно
- dahdi set hwgain {rx|tx} — установить коэффициент усиления звука на канале хардварно
- dahdi set dnd — установить/снять статус DND (Do Not Disturb) на канале
- dahdi restart — полный рестарт каналов Dahdi
- dahdi destroy channels — разрушить канал Dahdi
- dahdi create channels — создать канал Dahdi
- core waitfullybooted — ждать полной загрузки Asterisk
- core stop when convenient — выключение Asterisk, после того когда закончатся текущие вызовы
- core stop now — немедленное выключение Asterisk
- core stop gracefully — «теплое» выключение Asterisk
- core show warranty — выводит информацию о гарантии на Asterisk
- core show version — выводит версию Asterisk
- core show uptime [seconds] — выводит информацию о продолжительности работы Asterisk и ОС
- core show translation — выводит информацию (матрицу) о перекодировании аудиокодеков
- core show threads — выводит информацию о запущенных приложениях Asterisk
- core show taskprocessors — выводит информацию о запущенных процессах Asterisk
- core show sysinfo — выводит информацию об операционной системе
- core show switches — выводит альтернативные маршруты
- core show sound — выводит информацию по конкретным звуковым файлам
- core show sounds — выводит доступные звуки
- core show settings — выводит некоторые настройки ядра Asterisk
- core show profile — выводит информацию о профилях
- core show license — выводит информацию о версии Asterisk
- core show image formats — выводит информацию о поддерживаемых форматах изображений
- core show hint — выводит информацию о зарегистрированных кодах (feature code) в Asterisk, по конкретному внутреннему номеру
- core show hints — выводит информацию о зарегистрированных кодах (feature code) в Asterisk
- core show help — выводит список команд CLI Asterisk
- core show hanguphandlers — выводит информацию о разрывах вызовов на конкретном канале
- core show hanguphandlers all — выводит информацию о разрывах вызовов на всех каналах
- core show function — выводит описание специальных функций диалплана
- core show file version [like] — выводит список версий файлов используемых в Asterisk
- core show file formats — выводит имена доступных форматов файлов
- core show config mappings — выводит информацию о доступных к использованию базах данных
- core show codec — выводит информацию о конкретном кодеке
- core show codecs — выводит список поддерживаемых аудиокодеков
- core show channeltypes — выводит список доступных технологий и протоколов для канала
- core show channel — выводит информацию о конкретном канале
- core show channels [concise|verbose|count] — выводит информацию о текущих каналах
- core show calls [uptime] — выводит информацию о количестве текущих вызовов
- core show application — выводит информацию о конкретном приложении диалплана
- core show applications [like|describing] — показывает доступные приложения диалплана
- core set verbose — установка уровня дебага
- core set debug channel — Включение/отключение дебага на канале
- core restart when convenient — перезагрузка Asterisk после завершения текущих вызовов
- core restart now — немедленная перезагрузка Asterisk
- core restart gracefully — мягкий перезапуск Asterisk
- core reload — перечитать все конфигурационные файлы
- core ping taskprocessor — показывает информацию об отклике приложений Asterisk
- core clear profile — чистит информацию о профиле
- core abort shutdown — прерывает отключение
- config show help — выводит список модулей, которые имеют информацию о настройке
- config reload — принудительная перезагрузка модулей с перечиткой конфигурационных файлов
- config list — показывает файлы настройки относящиеся к конкретным приложениям Asterisk
- confbridge unmute — включить голосовой канал у участников конференции
- confbridge unlock — разблокировать конференцию
- confbridge show profile users — выводит информацию о доступных профилях пользователей конференций
- confbridge show profile user — выводит информацию о конкретном пользовательском профиле конференций
- confbridge show profile bridges — выводит информацию о доступных профилях конференций
- confbridge show profile bridge — выводит информацию о конкретном профиле конференций
- confbridge show menus — показывает доступные меню для разных учетных данных
- confbridge show menu — показывает какие команды доступны для управления конференцией
- confbridge record stop — остановить запись разговоров в конференции
- confbridge record start — начать запись разговоров в конференции
- confbridge mute — отключить голосовой канал у участников конференции
- confbridge lock — заблокировать конференцию
- confbridge list — выводит список существующих конференций и их участников
- confbridge kick — удалить участников из конференций
- cli show permissions — показывает возможности настройки CLI
- cli show aliases — показывает алиасы команд CLI
- cli reload permissions — перезагрузка CLI прав пользователей
- cli check permissions — показывает какими возможностями для настройки Asterisk обладает пользователь
- channel request hangup — запрос завершения вызова на данном канале
- channel redirect — перевод вызова в канале
- channel originate — инициировать вызов. Пример команды «channel originate SIP/1000 extension 2000@from-internal«. После ввода данной команды, Asterisk произведет набор номера 1000 и когда он поднимет трубку, Asterisk наберет номер 2000. Необходимо указывать контекст.
- cel show status — выводит статус настроек CEL
- cdr submit — запись ожидаемых сообщения в CDR
- cdr show status — выводит статус настроек CDR
- cdr show active — показывает какие каналы пишутся в CDR
- cdr set debug [on|off] — запуск дебага в CDR
- cc report status — выводит статус всех Call Completion т.е. функций обратного вызова
- cc cancel — снять все Call Completion т.е. функцию обратного вызова, подробнее можно почитать в примере
- bridge technology {suspend|unsuspend} — приостановить/возобновить использование технологий установки вызовов (bridge)
- bridge technology show — выводит статус возможных технологий установки вызовов
- bridge show — выводит информацию о конкретном голосовом канале (bridge)
- bridge show all — выводит список всех двухсторонних голосовых каналов (bridgeй)
- bridge kick — удалить один из каналов из bridge, т.е. разрушить один голосовой канал
- ari show user — выводит информацию по конкретному пользователю ARI
- ari show users — выводит список пользователей ARI
- ari show status — выводит настройки ARI
- ari mkpasswd — шифрование пароля, который используется в ari.conf
- aoc set debug — включение дебага для сообщений AOC
- agi show commands [topic] — выводит список команд AGI
- agi set debug [on|off] — включение/отключение дебага AGI
- agi exec — добавить команду AGI в канал Async AGI
- agi dump html — показывает список AGI команд в формате HTML
- ael set debug {read|tokens|macros|contexts|off} — использование дебага AEL
- ael reload — перечитать конфигурационные файлы AEL
- acl show — показать используемые ACL (Access Control List)
- manager reload — перечитывает конфигурационный файлы, связанные с AMI
- manager set debug [on|off] — включение/отключение дебага AMI
- manager show command — выводит информацию об определенной команде AMI
- manager show commands — выводит список команд AMI
- manager show connected — выводит список подключенных пользователей AMI
- manager show eventq — выводит список очередей событий
- manager show events — выводит список событий AMI
- manager show event — выводит информацию о событии AMI
- manager show settings — выводит глобальные настройки AMI
- manager show users — выводит список настроенных пользователей AMI
- manager show user — выводит информацию об указанном пользователе
- mfcr2 show version — выводит версию библиотеки OpenR2
- mfcr2 show variants — выводит список поддерживаемых вариантов использования каналов MFC/R2
- mfcr2 show channels [group|context] — выводит список каналов MFC/R2
- mfcr2 set idle — перезагружает канал MFC/R2 и устанавливает его в статус IDLE
- mfcr2 set debug — устанавливает канал MFC/R2 в режим дебага
- mfcr2 set blocked — перезагружает канал MFC/R2 и устанавливает его в статус BLOCKED
- mfcr2 call files [on|off] — включение/отключение MFC/R2 файлов
- meetme {mute|unmute} — включает/отключает микрофон для конференций
- meetme {lock|unlock} — блокирует/разблокирует конференцию для новых пользователей
- meetme list — выводит список активных конференц-комнат
- meetme kick — сбросить конференцию или пользователя конференции
- mgcp audit endpoint — аудит указанного пира MGCP
- mgcp reload — перечитать конфигурационные файлы MGCP
- mgcp set debug {on|off} — включение/отключение MGCP дебага
- mgcp show endpoints — выводит список MGCP пиров
- minivm list accounts — выводит список пользователей, использующих Mini-voicemail
- minivm list templates — выводит список шаблонов Mini-voicemail
- minivm list zones — выводит список часовых поясов, настроенных в Mini-voicemail
- minivm reload — перезагрузка конфигурации Mini-voicemail
- minivm show settings — выводит глобальные настройки Mini-voicemail
- minivm show stats — выводит статистику Mini-voicemail
- mixmonitor {start|stop|list} — выполнить команду MixMonitor
- module load — загрузить модуль
- module reload — перезагрузить конфигурацию указанного модуля
- module show [like] -выводит информацию об указанном модуле
- module unload — отключить указанный модуль
- moh reload — перезагрузка модуля MusicOnHold
- moh show classes — выводит список классов и соответствующих каталогов
- moh show files — выводит список звуковых файлов и каталогов, используемых для MusicOnHold
- sip show sched — выводит состояние очереди планировщика
- sip show registry -выводит список зарегистрированных SIP пиров
- sip show peer — выводит информацию об указанном SIP пире
- sip show peers — выводит список существующих SIP пиров
- sip show objects — выводит список объектов SIP
- sip show mwi — выводит список подписок MWI (Message-waiting indicator)
- sip show inuse — выводит информацию о статусе пользователей
- sip show history — выводит историю запросов SIP по конкретному вызову
- sip show domains — выводит список SIP доменов
- sip show channel — выводит подробную информацию о SIP канале
- sip show channelstats — выводит статистику активных SIP каналов
- sip show {channels|subscriptions} — выводит список SIP каналов или подписок
- sip set history {on|off} — включение/отключение истории SIP
- sip set debug {on|off|ip|peer} — включение/отключение SIP дебага
- sip reload — перечитать конфигурационные файлы SIP
- sip qualify peer — отправляет пакет OPTIONS в сторону указанного пира
- sip prune realtime [peer|all] — удалить кэш базы данных Realtime для пользователя/устройства
- sip notify — отправка пакета NOTIFY SIP пользователю
- say load [new|old] — перечитать файл say.conf
- rtp set debug {on|off|ip} — включение/отключение дебага RTP
- rtcp set stats {on|off} — включение/отключение статистики RTCP
- rtcp set debug {on|off|ip} — включение/отключение дебага RTCP
- realtime update2 — используется для теста переменных RealTime
- realtime update — обновляет переменные RealTime
- realtime store — создание новой строки в базе RealTime
- realtime mysql status — выводит информацию о драйвере MySQL RealTime
- realtime mysql cache — выводит кэш таблиц драйвера MySQL RealTime
- realtime load — используется для вывода переменных RealTime
- realtime destroy — удаляет строку из базы данных RealTime
- queue {pause|unpause} member — отключить/подключить пользователя от очереди
- queue show rules — выводит настройки из файла queuerules.conf
- queue show — выводит информацию об очередях
- queue set ringinuse — установка параметра ringinuse для определенной очереди
- queue set penalty — установка параметра penalty для определенной очереди
- queue reset stats — перезагрузить статистику по очередям
- queue remove member — удалить пользователя через из указанной очереди
- queue reload {parameters|members|rules|all} — перезагрузить очередь, пользователей, правил обработки вызовов или все сразу
- queue add member — добавить пользователя в очередь
- pri show version — выводит информацию о версии модуля libpri
- pri show span — выводит информацию о конкретной PRI линии
- pri show spans — выводит информацию о PRI линиях
- pri show debug — выводит информацию о настройках PRI дебага
- pri show channels — выводит информацию о канале PRI
- pri set debug file — включение дебага PRI и запись его в файл
- pri set debug {on|off|hex|intense|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15} span — включение дебага PRI
- pri service enable channel — включение канала PRI
- pri service disable channel — отключение канала PRI
- pri destroy span — разрушить канал PRI
- presencestate list — выводит список пользовательских состояний присутствия
- presencestate change — изменить пользовательский статус состояния присутствия
- parking show — выводит информацию о парковочных слотах и конкретном слоте
- odbc show — выводит список ODBC DSN
- no debug channel — отключение дебага на канале (каналах)
- sip show settings — выводит глобальные настройки SIP
- sip show tcp — выводит список TCP соединений
- sip show users — выводит информацию о SIP пользователях
- sip show user— выводит информацию о конкретном SIP пользователе
- sip unregister — удаление регистрации SIP пира с АТС
- sla show stations — выводит список SLA
- sla show trunks — выводит список SLA транков
- stun set debug {on|off} — включение/отключение STUN дебага
- timing test — запуск проверки синхронизации времени
- transcoder show — выводит загрузку транскодинга канала DAHDI
- udptl set debug {on|off|ip} — включение/отключение дебага UDPTL
- udptl show config — выводит настройки UDPTL
- ulimit — выводит или устанавливает ограничение на использование ресурсов процессами
- voicemail reload — перечитать конфигурационные файлы VoiceMail
- voicemail show users — список пользователей, которые используют голосовую почту
- voicemail show zones — выводит список часовых поясов, настроенных в голосовой почте
- xmldoc dump — собрать XML файлы в указанный файл
Данный список актуален для версии Asterisk 13.3.2
спасибо voipnotes
Написание диалплана asterisk для обработки перевода вызовов
Предположим, что для совершения вызовов используется следующий несложный диалплан:
[global]TRANSFER_CONTEXT=transferDIAL_OPTS=TtDIAL_TIME=20OUT_DIAL_OPTS=TOUT_DIAL_TIME=180Q_OPTS=tDEF_PROV_CID=78888888888PROV1_CID=71111111111PROV2_CID=72222222222TRANSFER_FAILOVER=queues,600,1[sub-mixmonitor]exten =>s,1,GotoIf($[«${RECORDING_STARTED}» = «true»]?end)same => n,Set(__RECORDING_FNAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${ARG1}-${CALLERID(num)}-${UNIQUEID}.wav)same => n,Set(__RECORDING_STARTED=true)same => n,MixMonitor(${RECORDING_FNAME},ab)same =>
n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)same => n(end),Return[local]exten => _XXX,1,Gosub(sub-mixmonitor,s,1(${EXTEN}))same => n,Dial(SIP/${EXTEN},${DIAL_TIME},${DIAL_OPTS})same => n,ExecIf($[«${THIS_IS_TRANSFER}» = «true»]?Return)same =>
n,Hangupexten => _XXX,hint,SIP/${EXTEN}[queues]exten => 600,1,Set(__PREVIOUS_QUEUE=${EXTEN})same => n,Queue(reception,${Q_OPTS},,,600)same => n,Hangupexten => 601,1,Set(__PREVIOUS_QUEUE=${EXTEN})same => n,Queue(sales,${Q_OPTS},,,600)same =>
n,Hangup[internal-default]include => localinclude => queuesexten => _8[2-689]XXXXXXXXX,1,Gosub(sub-mixmonitor,s,1(${EXTEN}))same => n,Set(CALLERID(num)=${DEF_PROV_CID})same => n,Set(CALLERID(name)=)same =>
n,Dial(SIP/def_prov/${EXTEN},${OUT_DIAL_TIME},${OUT_DIAL_OPTS})same => n,ExecIf($[«${THIS_IS_TRANSFER}» = «true»]?Return)same => n,Hangup[from-10X]include => localinclude => queuesexten => _8[2-689]XXXXXXXXX,1,Gosub(sub-mixmonitor,s,1(${EXTEN}))same =>
n,Set(CALLERID(num)=${PROV1_CID})same => n,Set(CALLERID(name)=)same => n,Dial(SIP/prov1/${EXTEN},${OUT_DIAL_TIME},${OUT_DIAL_OPTS})same => n,ExecIf($[«${THIS_IS_TRANSFER}» = «true»]?Return)same => n,Hangup[from-110]include => localinclude => queuesexten =>
_8[2-689]XXXXXXXXX,1,Gosub(sub-mixmonitor,s,1(${EXTEN}))same => n,Set(CALLERID(num)=${PROV2_CID})same => n,Set(CALLERID(name)=)same => n,Dial(SIP/prov2/${EXTEN},${OUT_DIAL_TIME},${OUT_DIAL_OPTS})same => n,ExecIf($[«${THIS_IS_TRANSFER}» = «true»]?Return)same =>
n,Hangupexten => _810Z.,1,Gosub(sub-mixmonitor,s,1(${EXTEN}))same => n,Set(CALLERID(num)=${PROV2_CID})same => n,Set(CALLERID(name)=)same => n,Dial(SIP/prov2/${EXTEN},${OUT_DIAL_TIME},${OUT_DIAL_OPTS})same => n,ExecIf($[«${THIS_IS_TRANSFER}» = «true»]?Return)same =>
n,Hangup[from-trunk]exten => 78888888888,1,Set(CDR(did)=${EXTEN})same => n,ExecIf($[«${CALLERID(name)}» = «»]?Set(CALLERID(name)=${CALLERID(num)}))same => n,Goto(queues,600,1)exten => 71111111111,1,Set(CDR(did)=${EXTEN})same =>
n,ExecIf($[«${CALLERID(name)}» = «»]?Set(CALLERID(name)=${CALLERID(num)}))same => n,Goto(queues,601,1)exten => 72222222222,1,Set(CDR(did)=${EXTEN})same => n,ExecIf($[«${CALLERID(name)}» = «»]?Set(CALLERID(name)=${CALLERID(num)}))same => n,Goto(local,110,1)
Пояснения к диалплану:— вызовы пользователей 100-109 совершаются в контексте from-10X— вызовы пользователя 110 совершаются в контексте from-110— вызовы остальных пользователей совершаются в контексте internal-default— входящие вызовы приходят в контекст from-trunk— номер очереди сохраняется в переменную PREVIOUS_QUEUE перед входом в очередь — после вызова MixMonitor вызывается функция AUDIOHOOK_INHERIT, это нужно для того, чтобы запись продолжалась после перевода вызова
Для того, чтобы абоненты могли использовать сервисные коды перевода вызова, приложения, осуществляющие вызовы абонентов, должны использоваться с опциями разрешающими использование сервисных кодов для перевода вызова. В приведённом диалплане приложения Dial и Queue используются с опциями t и/или T.
Опция t позволяет вызываемой стороне перевести вызов с помощью сервисного кода.Опция T позволяет вызывающей стороне перевести вызов с помощью сервисного кода.Если не указать хотя бы одну из этих опций, сервисные коды перевода вызова не будут работать ни для одной из сторон вызова.
Обратите внимание на то, что исходящие вызовы пользователей 100-109 и 110 осуществляются через различных провайдеров, к тому же, пользователю 110 разрешены международные вызовы, а всем остальным пользователям — нет, эти условия должны быть соблюдены при переводе вызова.
Теперь нужно написать диалплан, который будет осуществлять сам перевод. По умолчанию перевод набирает введённый номер адресата в текущем контексте. Чтобы изменить это поведение, нужно установить значение переменной TRANSFER_CONTEXT, перевод будет выполняться в контексте имя которого указано в переменной TRANSFER_CONTEXT.
Можно добавить эту переменную в раздел [globals] файла extensions.conf, тогда переменная TRANSFER_CONTEXT будет автоматически устанавливаться на каждом новом канале (в приведённом диалплане это уже сделано).Ниже приведён сам контекст transfer, используемый для перевода вызовов:
[transfer]exten => _X.,1,Set(DIAL_OPTS=${DIAL_OPTS}Hg)same => n,Set(OUT_DIAL_OPTS=${OUT_DIAL_OPTS}Hg)same => n,Set(Q_OPTS=${Q_OPTS}H)same => n,Set(OUT_DIAL_TIME=45)same => n,Set(TRANSFER_TO=${EXTEN})same => n,Set(TRANSFERER=${CALLERID(num)})same =>n,GotoIf($[«${BLINDTRANSFER}» = «»]?after_blindxfer_check)same => n,Set(BL_TRANSFERER=${CUT(BLINDTRANSFER,-,1)})same => n,Set(FIELDNUM=${FIELDQTY(BL_TRANSFERER,/)})same => n,Set(BL_TRANSFERER=${CUT(BL_TRANSFERER,/,${FIELDNUM})})same =>
n,ExecIf($[«${BL_TRANSFERER}» != «»]?Set(TRANSFERER=${BL_TRANSFERER}))same => n(after_blindxfer_check),NoOp(transferer: ${TRANSFERER})same => n,GotoIf(${DIALPLAN_EXISTS(queues,${TRANSFER_TO},1)}?queues,${TRANSFER_TO},1)same => n,Set(TR_CONT=${SIPPEER(${TRANSFERER},context)})same =>
n,ExecIf($[«${TR_CONT}» = «»]?Set(TR_CONT=internal-default))same => n,Set(THIS_IS_TRANSFER=true)same => n,Set(DIALSTATUS=)same => n,Gosub(${TR_CONT},${TRANSFER_TO},1)same => n,ExecIf($[«${DIALSTATUS}» = «ANSWER»]?Hangup)same =>
n,Goto(failover)exten => failover,1,Playback(call-will-be-forwarded)same => n,ExecIf($[«${REGEX(«^XFER_FAIL:» ${CALLERID(name)})}» = «0»]?Set(CALLERID(name)=XFER_FAIL: ${CALLERID(name)}))same => n,Set(DIALSTATUS=)same => n,GosubIf($[«${EXTENSION_STATE(${TRANSFERER}@local)}» !
= «NOT_INUSE»]?local,${TRANSFERER},1)same => n,ExecIf($[«${DIALSTATUS}» = «ANSWER»]?Hangup)same => n,Set(THIS_IS_TRANSFER=)same => n,GotoIf($[«${PREVIOUS_QUEUE}» != «»]?queues,${PREVIOUS_QUEUE},1)same => n,Goto(${TRANSFER_FAILOVER})
Вкратце, контекст выполняет следующее:— К опциям приложений Dial и Queue добавляется опция H, она позволяет завершить вызов сервисным кодом (в случае приложения Queue, опция H позволяет завершить вызов нажатием *, поэтому сервисный код отбоя вызова должен начинаться со *, чтобы его ввод работал и для приложения Dial и для приложения Queue).
Выполнение этого сервисного кода во время управляемого перевода вызова позволит отменить перевод и вернуть вызов себе. В остальное время сервисный код будет недоступен, что предотвратит отбой вызоова из-за случайного ввода этого кода.— К опциям приложения Dial добавляется опция g, она нужна для того, чтобы выполнение диалплана продолжалось после завершения приложения Dial (кроме случая, когда уничтожается канал звонящего).
— Определяется номер переводящего (переменная TRANSFERER) и его контекст (переменная TR_CONT). Перевод осуществляется в контексте пользователя, выполняющего вызов.— Если переведённый вызов не был принят, проигрывается сообщение о том, что вызов будет переведён.
Если переводящий всё ещё на линии, он поймёт, что перевод не удался и сможет вернуть вызов сервисным кодом.— К CALLERID(name) добавляется префикс «XFER_FAIL: », чтобы пользователи видели, что это возврат после неудачного перевода.— Если номер переводящего свободен, то производится попытка возврата вызова на номер переводящего.
— Если переводящий занят или не принял вызов, то вызов возвращается в последнюю очередь, в которую он входил.— Если вызов ещё не был в очереди, он переводится на назначение по умолчанию (значение переменной TRANSFER_FAILOVER), в данном случае — очередь reception.
В результате, перевод вызова осуществляется следующим образом:неуправляемый перевод — во время разговора нужно набрать сервисный код ##, ввести номер адресата перевода и нажать # или подождать 4 секунды.управляемый перевод — во время разговора нужно нажать *, ввести номер адресата перевода и нажать # или подождать 4 секунды.
Если адресат перевода не принимает вызов, можно ввести сервисный код ** для отмены перевода и возврата вызова себе. Также можно положить трубку не дожидаясь ответа адресата, если он не ответит, вызов вернётся к переводящему или в очередь, если переводящий занят/не доступен/не взял трубку.
Настройка параметров сервисных кодов asterisk
Настройки сервисных кодов Asterisk находятся в файле features.conf, по умолчанию, сервисные коды следующие:управляемый перевод — не заданнеуправляемый перевод — #отбой вызова — *
Как видите, управляемым переводом вообще нельзя пользоваться по умолчанию. Вносим в раздел [featuremap] файла features.conf:
[featuremap]atxfer=*blindxfer=##disconnect=**Для применения изменений в файле features.conf, нужно выполнить команду в CLI Asterisk «features reload»:
asterisk -rx «features reload»
Теперь имеем следующие сервисные коды:управляемый перевод — *неуправляемый перевод — ##отбой вызова — **
Схожесть кодов управляемого перевода и отбоя вызова не является проблемой, т.к. в описываемой схеме эти коды никогда не будут доступны пользователю одновременно.В разделе файла features.conf [general] указываются различные параметы сервисных кодов, обратите внимание на следующие:featuredigittimeout — максимальная задержка между вводом символов при наборе сервисных кодов в миллисекундах.
Значение по умолчанию — 1000, т.е. 1 секунда. Для ввода сервисных кодов, предлагаемых в этой статье, секунды должно хватить. Для ввода более сложных сервисных кодов пользователям может периодически не хватать времени, поэтому рекомендуется увеличить значение этого параметра до 2000.transferdigittimeout — максимальная задержка в секундах между вводом символов при наборе номера адресата перевода.
Значение по умолчанию — 3. Для более комфортного ввода номера, нужно увеличить это время до 4-5 секунд.Atxferdropcall — при значении по умолчанию «no», если при упарвляемом переводе переводящий кладёт трубку не дожидаясь ответа адресата перевода и адресат перевода так и не принимает вызов до достижения таймаута вызова (значение параметраatxfernoanswertimeout)
, Asterisk попытается вернуть вызов переводящему. Asterisk может пытаться вызвать переводящего определённое количество раз (значение параметра atxfercallbackretries) с определённым интервалом (значение параметра atxferloopdelay). Если установить значение параметра atxferdropcall равным «yes», то Asterisk не будет пытаться вернуть вызов переводящему после неудачного управляемого перевода.
Нужно установить значение «yes», если обработака вызова после неудачного перевода вызова реализована средствами диалплана.ПРИМЕЧАНИЕ: Стандартный механизм возврата вызова после неудачного управляемого перевода не очень хорош, т.к. он не проверяет, свободен ли абонент, на которого должен вернуться вызов, не позволяет выполнять диалплан и не имеет возможности перевести вызов кому-либо другому, если абонент, совершивший перевод, не берёт трубку. Рекомендуется использовать вместо этого возврат вызова, реализованный средствами диалплана.
Для примеров, приведённых в этой статье, использовались следующие значения параметров в разделе [general] файла features.conf:
[general]featuredigittimeout = 2000atxferdropcall = yestransferdigittimeout => 4Пример
; dial 307 = для перезапуска Asterisk ; Замечание: вместо Read() мы также можем использовать команду Authenticate() exten => 307,1,DigitTimeout(4) ; Установка Digit Timeout в 4 секунды exten => 307,2,ResponseTimeout(5) ; Установка Response Timeout в 5 секунды ; Следующая команда проигрывает приглашение: "для перезапуска введите пароль" exten => 307,3,Read(Secret,posix-pass-restart-ast,3) exten => 307,4,NoOp(${Secret}) exten => 307,5,Gotoif($[${Secret} = 123]?6:9) exten => 307,6,Playback(posix-restarting) ; "Перезапуск asterisk" exten => 307,7,Wait(1) exten => 307,8,System(/usr/sbin/asterisk -rx reload) exten => 307,9,Hangup
С использованием dial()
Для всех номеров в диалплане после команды Dial выполняется проверка результатов звонка, и если переменная DIALSTATUS не равна ANSWER (т.е. абонент занят, недоступен, не ответил и т.п.), то выполняется следующая команда Dial, соединяющая абонента, например, с секретарем. В случае неответа секретаря (что тоже возможно) выполняется третья команда Dial и так далее.
; Файл extensions.conf: [local-phones] exten => _XXX,1,Answer() exten => _XXX,n(begin),Dial(SIP/${EXTEN},240,tTg) ; g - после окончания вызова, независимо от результата, продолжить выполнение сценария ; если DIALSTATUS = Answer (ответ на вызов), то завершаем вызов: exten => _XXX,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:) exten => _XXX,n,Dial(SIP/100,240,tTg) ; 100 - номер секретаря exten => _XXX,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:) exten => _XXX,n,Dial(SIP/101,240,tTg) ; 101 - номер второго секретаря exten => _XXX,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:) exten => _XXX,n,Dial(SIP/102,240,tTg) ; 102 - номер третьего секретаря ; если никуда не дозвонились - завершаем вызов (или можем сделать goto на begin и продолжать по кругу до бесконечности) exten => _XXX,n(end),Hangup()
Включение attended и blind transfer
В функции features.conf вы должны настроить параметры blindxfer или atxfer в разделе Featuremap. Параметры настраиваются с помощью символьной строки DTMF, которую вы хотите использовать для доступа к этой функции.
[featuremap] blindxfer = #1 atxfer = *2
Теперь, когда у вас включена функция, вам нужно настроить диалплан таким образом, чтобы конкретный канал мог использовать эту функцию.
В качестве примера, если вы хотите разрешить переводы через приложение Dial, вы можете использовать два варианта: «t» или «T».
- t – разрешить вызываемой стороне передавать вызывающую сторону, отправив последовательность DTMF, определенную в feature.conf. Этот параметр не выполняет принудительное выполнение политики при переводах, инициированных другими методами;
- T – разрешить вызывающей стороне передавать вызываемую сторону, отправив последовательность DTMF, определенную в features.conf. Этот параметр не выполняет принудительное выполнение политики при переводах, инициированных другими методами.
Установка этих параметров для Dial в extensions.conf будет выглядеть примерно так:
exten = 100,1,Dial(PJSIP/MAX,30,T)
Аргументы «t» и «T» работают для приложений Queue и Dial
С использованием attended transfer вместо blind transfer
Можно переделать attended transfer (сопровождаемый вызов), чтобы в случае неответа абонента вызов возвращался к тому, кто сделал перевод. Для этого в файле features.conf есть опции:
;atxfernoanswertimeout = 15 ;atxferdropcall = no ;atxferloopdelay = 10 ;atxfercallbackretries = 2
Рассмотрим ситуацию: абонент А звонит абоненту Б и пообщавшись с ним, просит перевести его на абонента С. Если абонент Б (делая attended transfer) дожидается ответа абонента С, возможно общается с ним, и отключается – то абоненты А и С связываются между собой и общаются. Это стандартный сопровождаемый перевод.
Если же абонент Б делает attended transfer на абонента С и сразу (не дожидаясь ответа) кладет трубку, то получается примерно та же ситуация, что и в случае blind transfer. Однако, всё хорошо только в случае, если абонент С снял трубку (или абонент А не дождавшись ответа, положил трубку сам).
atxferdropcall = yes – после неответа абонента С (или если этот абонент занят / сбросил вызов) происходит разрыв соединения, и абоненту А надо снова совершать вызов.
atxferdrpcall = no – теоретически, после неответа (или занятости/сброса вызова) абонента С, вызов абонента А должен вернуться обратно.
Blind transfer (unattended)
В случае “слепого” перевода всё сложнее: оператор переводит абонента А на абонента Б, и сразу после перевода отключается от разговора. При этом абонент А остается предоставлен судьбе: если абонент Б ему отвечает, то всё хорошо. Если же нет (например, абонент Б занят или не отвечает), то у абонента А в трубке раздаются короткие гудки, после чего ему остается только повесить трубку и попытаться еще раз дозвониться до оператора.
Функции передачи, предоставляемые ядром Asterisk, настраиваются в файлах .conf и доступны по кодами функций.
Технологии драйвера канала, такие как chan_sip и chan_pjsip, имеют встроенную возможность для различных типов трансфера. Эта встроенная функциональность переноса не зависит от функциональности передачи ядра. Функциональность передачи кода основной функции не зависит от канала.