Quantcast
Channel: IP АТС Asterisk
Viewing all 1135 articles
Browse latest View live

function 'QUEUE_MEMBER'

$
0
0

function 'QUEUE_MEMBER'

Функция Asterisk QUEUE_MEMBERвыдает статистику и статус агентов обслуживающих очередь.

Описание

Предоставляет доступ к счетчикам очереди (только чтение)
и информации о агентах очереди (чтение/запись).

  • <queuename> - требуется для всех операция
  • <interface> - только о конкретном пользователе.

Синтаксис

QUEUE_MEMBER(queuename,option[,interface])

Аргументы

option

  • logged - Возвращает кол-во обслуживающих указанную очередь зарегистрированныхагентов.
  • free - Возвращает кол-во свободных агентов, включая агентов не принимающих вызовы, до истечения wrapuptime.
  • ready - В отличии от free, возвращает кол-во свободных агентов, готовых немедленно принять вызов.
  • count - Возвращает общее кол-во агентов очереди, включая неактивных.
  • penalty - Устанавливает или получает пенальтидля пользователя(агента) очереди.
  • paused - Получает статус паузы агента.
  • ringinuse - Получает статус параметра ringuse.
пример:

Рассмотрим пример использования функции QUEUE_MEMBER.
Обновим в БД информацию о состоянии агентов очереди,
каждый раз, когда какой-либо агент входит, выходит или устанавливает
или отменяет паузу в обслуживание очереди.

Дано: 4-ре очереди номер q1,q2,q3 и q4 обслуживаются динамическими агентами.
Агенты набирают 3-х значный код операций очереди.

mysql

 CREATE TABLE queuemember_status (queueid varchar(8), logged  varchar(8), free  varchar(8), ready  varchar(8), count  varchar(8));

extconfig.conf

 queuemember_status=odbc,sql3,queuemember_status

dialplan - agent logged off, logged on, pause, unpause

где:
${CALLERID(num)} - номер агента
q${EXTEN:0:1} - id очереди

[from-agent]
exten => _[1234]00,1,Noop(agent logged off)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,RemoveQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loggedoff)
   same => n,GoSub(sub-renew-queuemember,s,1(${queueN}))

exten => _[1234]01,1,Noop(agent logged on)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,AddQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loginok)
   same => n,GoSub(sub-renew-queuemember,s,1(${queueN}))

exten => _[1234]02,1,Noop(agent pause)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,PauseQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loggedoff)
   same => n,GoSub(sub-renew-queuemember,s,1(${queueN}))

exten => _[1234]03,1,Noop(agent unpause)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,UnpauseQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loginok)
   same => n,GoSub(sub-renew-queuemember,s,1(${queueN}))
   
   
[sub-renew-queuemember]
exten => s,1,Noop(renew queuemember)     
   same => n,set(REALTIME(queuemember_status,queueid,${queueN},logged)=${QUEUE_MEMBER(${queueN},logged)})
   same => n,set(REALTIME(queuemember_status,queueid,${queueN},free)=${QUEUE_MEMBER(${queueN},free)})
   same => n,set(REALTIME(queuemember_status,queueid,${queueN},ready)=${QUEUE_MEMBER(${queueN},ready)})
   same => n,set(REALTIME(queuemember_status,queueid,${queueN},count)=${QUEUE_MEMBER(${queueN},count)})
   same => n,hangup
 

см. также

Функции Asterisk


function 'QUEUE_MEMBER_LIST'

$
0
0

function 'QUEUE_MEMBER_LIST'

Функция Asterisk QUEUE_MEMBER_LISTвозвращает список интерфейсов обслуживающих очередь.

Описание

Возвращает, разделенный запятой список интерфейсов очереди <queuename>.

синтаксис

QUEUE_MEMBER_LIST(queuename)

См. также

function 'QUEUE_VARIABLES'

$
0
0

function 'QUEUE_VARIABLES'

Функция Asterisk QUEUE_VARIABLESвозвращает предустановленные переменные с информацией о состоянии очереди.

Описание

Доступны перечисленные ниже переменные.
Возвращает '0' если очередь найдена и setqueuevar определена, '-1' в противном случае.

Синтаксис

QUEUE_VARIABLES(queuename)

Аргументы

  • queuename
  • variables:
    • QUEUEMAX - Максимально разрешенное кол-во вызовов в очереди.
    • QUEUESTRATEGY - Стратегия очереди.
    • QUEUECALLS - Кол-во вызовов в очереди в данный момент.
    • QUEUEHOLDTIME - Среднее время ожидания в очереди на данный момент.
    • QUEUECOMPLETED - Кол-во отвеченных вызовов.
    • QUEUEABANDONED - Кол-во отвергнутых (неотвеченных) вызовов.
    • QUEUESRVLEVEL - Заданный уровень обслуживания очереди.
    • QUEUESRVLEVELPERF - Текущий уровень обслуживания очереди.
Пример:

Запишем в БД текущее состояние очереди при поступлении нового вызова в очередь.
Ключи Fcкоманды QUEUEвелят продолжить выполнения диалплана, если вызывающий или вызываемый, соответственно, завершают вызов.

exten => _488X,1,Queue(${EXTEN},Fc)
   same => n,set(QUEUE_VARIABLES(${EXTEN})) 
   same => n,Goto(queue-variables,s,1)

[queue-variables]     
exten => s,1,Noop()    
   same => n,set(REALTIME(queue_adv,queue,${queue},queuesrvlevelperf)=${QUEUESRVLEVELPERF})
   same => n,set(REALTIME(queue_adv,queue,${queue},queueabandoned)=${QUEUEABANDONED})
   same => n,set(REALTIME(queue_adv,queue,${queue},queuecompleted)=${QUEUECOMPLETED})
   same => n,set(REALTIME(queue_adv,queue,${queue},queueholdtime)=${QUEUEHOLDTIME})
   same => n,set(REALTIME(queue_adv,queue,${queue},queuecalls)=${QUEUECALLS})
   same => n,hangup
вывод консоли

запись в БД

 select * from queuelog_adv;
+-------+------------+---------------+----------------+----------------+-------------------+
| queue | queuecalls | queueholdtime | queuecompleted | queueabandoned | queuesrvlevelperf |
+-------+------------+---------------+----------------+----------------+-------------------+
| 4884  | 0          | 8             | 12             | 1              | 33.3              |
+-------+------------+---------------+----------------+----------------+-------------------+
1 row in set (0.00 sec)

Функции Asterisk

function 'QUEUE_WAITING_COUNT'

$
0
0

Запись разговоров

$
0
0

function 'BLACKLIST'

$
0
0

function 'BLACKLIST'

Функция Asterisk: сверяет callerid с черным списком в базе данных Astersik.

Check if the callerid is on the blacklist.

Описание

Использует astdbдля проверки не содержит ли family 'blacklist' CallerID вызывающего абонента.
Возвращает '1' или '0', соответственно.

Uses astdb to check if the Caller*ID is in family 'blacklist'. Returns '1' or '0'.

Синтаксис

BLACKLIST()

Пример

Контекст для проверки CallerID в черном списке, где:

  • 1000 - вызываемый абонент.
  • 6662666 - CallerID в черном списке.

exten => _1000,1,GotoIf($[${BLACKLIST()}]?black,1)
   same => n,Dial(PJSIP/1000,,tr)

exten => black,1,Playback(privacy-you-are-blacklisted)
   same => n,Hangup()

Добавить номер в черный список, при помощи Asterisk CLI:

 asterisk -rx "database put blacklist 6662666 1"

Посмотреть записи с family blacklist, при помощи Asterisk CLI:

asterisk -rx 'database show' | grep blacklist
/blacklist/6662666                                   : 1

Посмотреть записи при помощи sqlite cli:

sqlite> select *  from astdb where key like '%blacklist%';
/blacklist/6662666|1

Смотри также:
function 'DB'

Функции Asterisk

function 'ARRAY'

$
0
0

function 'ARRAY'

Функция Asterisk ARRAY, позволяет назначить множество переменных за раз.

Описание

Списку разделенных запятыми переменных присваиваются значения в порядке перечисления.

Пример:

 Set(ARRAY(var1,var2)=1,2) 

назначит var1 = 1 и var2 = 2

СинтаксисARRAY(var1[,var2[,…][,varN]])

См. пример в описании QUEUE_VARIABLES

Функции Asterisk

function 'CALLERID'

$
0
0

function 'CALLERID'

Функция Asterisk: Получает или устанавливает CallerID канала.
Позволяет использовать полученное callerid или установить собственное.
Существуют следующие <name-charset>:

  • unknown - Unknown
  • iso8859-1 - ISO8859-1
  • withdrawn - Withdrawn
  • iso8859-2 - ISO8859-2
  • iso8859-3 - ISO8859-3
  • iso8859-4 - ISO8859-4
  • iso8859-5 - ISO8859-5
  • iso8859-7 - ISO8859-7
  • bmp - ISO10646 Bmp String
  • utf8 - ISO10646 UTF-8 String

синтаксис
CALLERID(datatype[,CID])

Аргументы

datatype - доступные типы данных:

  • all
  • name
  • name-valid
  • name-charset
  • name-pres
  • num
  • num-valid
  • num-plan
  • num-pres
  • subaddr
  • subaddr-valid
  • subaddr-type
  • subaddr-odd
  • tag
  • priv-all
  • priv-name
  • priv-name-valid
  • priv-name-charset
  • priv-name-pres
  • priv-num
  • priv-num-valid
  • priv-num-plan
  • priv-num-pres
  • priv-subaddr
  • priv-subaddr-valid
  • priv-subaddr-type
  • priv-subaddr-odd
  • priv-tag
  • ANI-all
  • ANI-name
  • ANI-name-valid
  • ANI-name-charset
  • ANI-name-pres
  • ANI-num
  • ANI-num-valid
  • ANI-num-plan
  • ANI-num-pres
  • ANI-tag
  • RDNIS
  • DNID
  • dnid-num-plan
  • dnid-subaddr
  • dnid-subaddr-valid
  • dnid-subaddr-type
  • dnid-subaddr-odd

CID - Дополнительный параметр.

Пример

Задать CallerID номер

  exten => s,1,Set(CALLERID(num)=812991138)

Задать CallerID имя

  exten => s,1,set(CALLERID(name)=Звездочкин)

получить CallerID

  exten => s,1,Set(_callidvar=${CALLERID(num)}

Функции Asterisk


Asterisk: AddQueueMember

$
0
0

Asterisk: AddQueueMember

Приложение Asterisk: Динамическое добавление интерфейса для обработки очереди вызовов.

Описание

AddQueueMember(queuename[[,interface[[,penalty[[,options[[,membername[[,stateinterface]]]]]))

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

Аргументы
  • queuename - имя очереди вызовов, в которую необходимо добавить интерфейс.
  • interface - Название интерфейса для добавления в очередь, если не указано, используется текущий интерфейс.
  • penalty - Целое число большее или равное нулю, доступные участники, обрабатывающие очередь, с меньшим значением пенальти получают вызовы в первую очередь.
  • options: (версии 1.2+)
    • j - Если заданный интерфейс уже обрабатывает поступающие вызовы данной очереди и существует команда с приоритетом n+101, тогда с нее продолжиться выполнение команд плана набора. Иначе, команда выйдет с кодом ошибки.
    • В версии 1.6+ нет значений для поля «options», т.к. параметр «j» был удален, но, если необходимо указать остальные параметры, то этот аргумент должен быть указан как пустой параметр: ,,
  • membername - имя для участника обработки очереди, под которым он будет добавлен.
  • stateinterface - альтернативный интерфейс, который будет использоваться для определения состояния участника обработки очереди.
Код возврата

При возникновении ошибки возвращает -1.

По завершению выполнения, команда также установит переменную AQMSTATUS в одно из значений:

  • ADDED
  • MEMBERALREADY
  • NOSUCHQUEUE
Пример:
 AddQueueMember(sales,PJSIP/2666)

Используя вариант этой команды: AddQueueMember(<queuename>), вы добавите интерфейс, который совершает вызов, в список участников, которые обрабатывают очередь. <queuename> - это имя очереди вызовов, описанной в файле queues.conf

пример2:

exten => _101,1,Noop(agent logged on)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,AddQueueMember(${queueN},Local/${CALLERID(num)}@from-queue/n)
   same => n,PlayBack(ru/agent-loginok)
*CLI> queue show q1
q1 has 0 calls (max 11) in 'random' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
   Members:
      Local/4887@from-queue/n (ringinuse disabled) (dynamic) (Not in use) has taken no calls yet
   No Callers
См. также

Команды диалплана Asterisk в алфавитном порядке

Настройка очереди в Asterisk - queues.conf

$
0
0

Настройка очереди в Asterisk - queues.conf

Общие (глобальные) настройки очередей.

 [general]
Persistent Members (Постоянные пользователи )

Сохранять каждого динамического пользователя во внутренней БД Asterisk (astdb), чтобы после перезагрузки, все пользователи были восстановлены из записей очереди в astdb.
По умолчанию:

 persistentmembers = no
AutoFill Behavior (Автозаполнение очереди)

Старое по умолчанию поведение очереди (autofill=no) подразумевало последовательный тип подключения, при котором ожидающий абонент, подключался к пользователю, только с первой позиции в очереди. Новое поведение по умолчанию, (autofill=yes) позволяет ожидающему абоненту, подключится к пользователю (агенту) очереди, с любой позиции, если есть свободные агенты, не дожидаясь, пока он займет головную позицию. Такое поведение позволяет быстрее обрабатывать вызовы и является предпочтительным.

 autofill = yes
Monitor Type (Приложение для записи разговоров )

Приложение Asterisk: MixMonitorзаписывает разговор непосредственно в один файл,
в отличии от устаревшего Asterisk: Monitor, раздельно записывающего вх. исх. голосовые потоки.

 monitor-type = MixMonitor
UpdateCDR behavior(Изменить поведение CDR)

Записать в поле CDRdstchannelимя агента, которое вы можете установить во время входа в систему с параметром MemberName Asterisk: AddQueueMember.

 updatecdr = yes
Таймаут

Таймаут выхода из очереди по не ответу, не является параметром очереди, а может быть назначен как опция вызова приложения Queue
Queue(queuename,[options],[optionalurl],[announceoverride],[timeout])Пример:

 Queue(queuename,t,,,45)
shared_lastcall (общий последний вызов)

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

 shared_lastcall=no
Negative_penalty_invalid

Рассматривать пользователей с отрицательным пенальти, как неактивных (не подавать на них вызовы).

 negative_penalty_invalid = no
log_membername_as_agent

Регистрировать агентов как именем, а не номером интерфейса

 log_membername_as_agent = no

Параметры очередей

 [queuename]
Musicclass

Устанавливает класс Музыки на Удержании (MOH) используемый данной очередью. Эта установка будет иметь приоритет над всеми, кроме переменной канала, заданной в диалплане: Set(CHANNEL(musicclass)=whatever)

 musicclass = default
announce

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

 announce = file_to_play

periodic-announce = thank-you-message
periodic-announce-frequency = 60 ; проигрывать каждые 60 секунд ожидания
Новая возможность (начиная с 06 января, 2005): Теперь для очередей можно использовать параметр 'weight' (который подразумевает приоритет вызова), для гарантии того, что вызов, ожидающий в очереди с более высоким приоритетом, будет обработан одним из первых. Будет задерживаться обработка вызовов только для менее приоритетных очередей, если участник, который обрабатывает очередь, уже занимается вызовом из более высокоприоритетной очереди.
weight =

weight = целое число
Новые возможности (начиная с 28 сентября, 2004): Полностью и правильно поддерживается, начиная с релиза v1.0 . Если у Вас возникло желание удалять все вызовы, поступившие в очередь, у которой нет участников или агентов, для ее обработки, добавьте в файл queues.conf следующую строку:
leavewhenempty = yes
; При использовании CVS-HEAD версии, используйте:
; leavewhenempty=strict
; joinempty=strict
Новая возможность: Анонс позиции в очереди Появилась в Asterisk, начиная с версии v0.7.2 (см. багрепорт #214 в Mantis bugtracker). Рассмотрим пример файла конфигурации queues.conf.sample, на предмет параметров, которые можно в нем использовать:
;
; Вызовы могут быть записаны, с использованием системы мониторинга Asterisk
; Эта возможность можно включить для команды Queue, запись начнется,
; когда вызов из очереди начнет обрабатываться оператором. Будут записаны
; только состоявшиеся вызовы, в запись не будет включен тот промежуток времени,
; пока вызывающий абонент слушает музыку в процессе ожидания, т.е. пока его
; вызов не будет обработан оператором (MOH).
; Для включения записи вызовов, просто определите параметр "monitor-format",
; иначе, эта возможность будет отключена.
;
; monitor-format = gsm|wav|wav49

; Как часто абоненту, ожидающему в очереди вызовов, сообщать его позицию и/или
; приблизительное время ожидания обработки его вызова (0=выключено)
;
;announce-frequency = 90
;
; Нужно ли нам включать в периодический анонс приблизительное время ожидания
; обработки вызова абонента?
; Возможные значения: yes, no, или once (только один раз); время ожидания будет
; сообщаться только в том случае, если абонент ожидает своей очереди более 1 минуты.
;
;announce-holdtime = yes|no|once
;
; Далее идут описания звуковых файлов, для анонса абоненту эго позиции в очереди и/или
; приблизительного времени ожидания обработки его вызова.
; Файлы, используемые по умолчанию, приведены ниже,
; Вы можете изменить их имена на другие, если Вам это реально нужно.
;
;queue-youarenext = "queue-youarenext" ; ("You are now first in line.")
;queue-thereare = "queue-thereare" ; ("There are")
;queue-callswaiting = "queue-callswaiting" ; ("calls waiting.")
;queue-holdtime = "queue-holdtime" ; ("The current est. holdtime is")
;queue-minutes = "queue-minutes" ; ("minutes.")
;queue-thankyou = "queue-thankyou" ; ("Thank you for your patience.")
;Обратите внимание: что не нужно использовать точку с запятой, описывайте файлы без этого символа, например:
;queue-thankyou=yoursoundfile
;
; Обратите внимание, что значение timeout'а, по достижении которого, происходит выход из очереди
; вызовов, можно определить в самой команде queue в файле extensions.conf:
; Queue(queuename|options|optionalurl|announceoverride|timeout)
; пример: Queue(dave|t|||45)

Wrapuptime

Этот параметр может быть использован как для агентов, так и для самой очереди вызовов. Необходимость использования этой настройки в файле queue.conf, обусловлено тем, что в этом файле для очереди могут быть описаны агенты, в качестве участников, которые обрабатывают эту очередь.

;
; Параметр wrapuptime - это значение минимального промежутка времени,
; с момента, когда работа с абонентом завершена и до того,
; как участник обработки может принять новый вызов из очереди.
; Значение в миллисекундах. (0 - задержка отсутствует)
;
;wrapuptime=15

Memberdelay

Параметр устанавливает время задержки между моментом, когда агент отвечает на вызов и соединения его с вызывающим абонентом.

;memberdelay = 5

timeoutrestartЕсли параметр «timeoutrestart» установлен в значение yes, тогда значение таймаута для агента будет сбрасываться, если от него будет получен сигнал BUSY или CONGESTION. Это бывает полезно, когда агент имеет возможность отметить вызов, отвергая его или, производя некоторые действия, которые имеют подобный эффект. (Обнаружено, что если вызов агента завершился со статусом NOANSWER (ring, no-answer), это так же заставляет вызов отправить к следующему агенту в очереди по алгоритму roundrobin). ;timeoutreset = yes

Замечания

  • Параметр penalty: Очередь вызовов могут обрабатывать люди с разными обязанностями и, следовательно, у одних это обязанность основная , а у других - второстепенная, и основную нагрузку по приему вызовов нам надо возложить на одних людей, а для подстраховки - других (к примеру, если у нас есть очередь, куда поступают вызовы от клиентов, которые хотят что-то купить, то основная обязанность ее обработки ложиться на менеджеров, следовательно, их определяем без пенальти. Еще некоторые люди могут принимать звонки, если у менеджеров полный завал, с пенальти 1, и, с пенальти 2, мы можем определить агентов совсем уж не относящихся к продажам, например, телефон в службе технической поддержки).
  • Если вы включите группу участников в определение Вашей очереди вызовов, тогда вызовы будут распределяться между агентами в группе, в заданном для нее порядке, вне зависимости от заданной стратегии. Теперь, определим каждого агента при помощи директивы member=.

member=Agent/@1 ; группа агентов
member=Agent/501 ; одиночный агент

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

Некоторые пояснения работы режимов распределения вызовов между агентами: roundrobin и rrmemory Режим roundrobin не сбивает алгоритм режима «циклического распределения входящих вызовов между агентами», Фактически, использование режима roundrobin без запоминания того, кто обработал последний вызов, приводит к тому, что вызовы циклически распределяются между агентами. Ниже приводятся пояснения по работе этих режимов от kpfleming.

При использовании режима roundrobin, запоминается последний агент, с которого начался поиск свободного участника для передачи ему поступившего вызова. Поиск агента для следующего вызова начнется со следующего агента из списка. В том случае, если у нас есть свободный агент, то для первого вызова, поиск свободного агента будет осуществляться в последовательности: 1→2→3, для второго - в последовательности: 2→3→1, для следующего: 3→2→1, и т.д.

При использовании режима rrmemory, запоминается последний агент, которого пытались вызвать (у которого звонил телефон), вне зависимости от того, с кого из них начался поиск свободного агента. Тогда, поиск свободного агента для следующего вызова начнется с агента, который по списку следующий за тем, который ответил на первый вызов. Если у нас есть свободные агенты, то поиск свободного агента для обработки первого поступившего вызова будет произведен в следующем порядке 1→2 (предположим, что агент номер 2, отвечает на него), далее, при поступлении следующего вызова, порядок поиска агента для направления ему вызова будет такой: 3→1 (предположим, что агент номер 1 отвечает на него), тогда порядок поиска для следующего вызова будет таким: 2→3→1, и т.д. Если же использовать режим roundrobin, то для первого поступившего вызова, в том случае, если агент номер 2 принимает вызов, тогда, он снова первый в списке поиска свободного агента, при поступлении следующего вызова. Если же используется режим rrmemory, тогда он будет перемещен в конец списка, при поиске свободного агента для второго вызова.

Однако, Вы можете добиться циклического распределения вызовов между агентами, используя режим roundrobin, и задав различные значения параметра penalty для каждого агента, для обеспечения порядка выбора свободного агента в том порядке, который Вам необходим. Приложение app_queue будет всегда сначала искать свободного агента у которого нет пенальти, далее среди тех, у кого значение пенальти - 1, и т.д.

queues example

[sales]
announce-frequency=45
announce-holdtime=yes
announce-position=yes
autofill=no
autopause=no
autopausebusy=no
autopausedelay=0
autopauseunavail=no
eventmemberstatus=yes
eventwhencalled=yes
joinempty=yes
leavewhenempty=no
maxlen=0
memberdelay=0
monitor-type=mixmonitor
penaltymemberslimit=0
periodic-announce-frequency=0
queue-callswaiting=queue-callswaiting
queue-thankyou=queue-thankyou
queue-thereare=queue-thereare
queue-youarenext=queue-youarenext
reportholdtime=no
retry=5
ringinuse=yes
servicelevel=60
setinterfacevar=yes
strategy=ringall
timeout=15
timeoutpriority=app
timeoutrestart=no
weight=0
wrapuptime=0
member=Local/100@from-queue/n,0,100,hint:100@ext-local
member=Local/101@from-queue/n,0
member=Local/102@from-queue/n,0
member=Local/103@from-queue/n,0
member=Local/104@from-queue/n,0
member=Local/105@from-queue/n,0

Настройка Asterisk

Использование переменных в плане набора Asterisk

$
0
0

Использование переменных в плане набора Asterisk

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

${foo}

где foo - имя переменной. Именем переменной может быть цифробуквенная строка, которая должна начинаться с буквы. Переменные, определенные пользователями, не являются регистрозависимыми ${FOO} и ${Foo} ссылаются на одну и ту же переменную. Но переменные, которые определяются самим Asterisk, являются регистрозависимыми переменная ${EXTEN}будет работать, но ${exten} — не будет.

Существует три типа переменных: глобальные, переменные специфичные для каждого канала и переменные окружения.

  • Глобальные переменные могут быть определены или в секции [globals] файла конфигурации extensions.conf или используя команду SetGlobalVar в плане набора. Если переменная однажды определена, тогда она может быть использована для любого канала в любое время.
  • Переменные специфичные для каждого канала задаются с помощью команды Set (команда SetVar устарела). Каждый канал использует изолированное пространство для имен переменных, следовательно, для различных вызовов не будет коллизий в значениях переменной с одним и тем же именем и переменная будет автоматически очищена, когда вызов по какому-либо каналу будет завершен.
  • Переменные окружения обеспечивают доступ из Asterisk к переменным окружения unix. Их список можно найти ниже в данной странце.

Если Вы зададите переменную для какого-либо канала с аналогичным именем, как у существующей глобальной переменной (запомните: определенные пользователем переменные регистронезависимые) то, ссылаясь на это имя переменной в команде, Вы получите значение, которое Вы определили для этой «канальной» переменной (а не значение глобальной переменной). Например, посмотрите сами, что получится, если мы в контексте «FooTest» с одним экстеншеном 100, проделаем следующие действия:

[FooTest]
exten => 100,1,SetGlobalVar(FOO=5)
exten => 100,2,NoOp(${FOO})
exten => 100,3,NoOp(${foo})
exten => 100,4,Set(foo=8)
exten => 100,5,NoOp(${FOO})
exten => 100,6,NoOp(${foo})
(Замечание: использование команды NoOp поможет нам отследить наши действия и значения переменных.) Если вы произведете вызов на экстеншен 100 в контексте FooTest, и перед вами консоль Asterisk, которая отображает подробную информацию о происходящем, то Вы увидите приблизительно следующую информацию:
— Executing SetGlobalVar("Zap/1-1", "FOO=5") in new stack
— Setting global variable 'FOO' to '5'
— Executing NoOp("Zap/1-1", "5") in new stack
— Executing NoOp("Zap/1-1", "5") in new stack
— Executing Set("Zap/1-1", "foo=8") in new stack
— Executing NoOp("Zap/1-1", "8") in new stack
— Executing NoOp("Zap/1-1", "8") in new stack
Мы видим, что после выполнения команды SetGlobalVar, переменные ${FOO} и ${foo} возвращают значение глобальной переменной с присвоенным значением 5. После выполнения команды Set, глобальная переменная «foo» перекрывается канальной переменной «foo»; Обе переменные ${FOO} и ${foo} (на самом деле это одна и та же переменная) имеют значение 8. Тем не менее, значение глобальной переменной остается неизменным и равным 5, и при использовании ее в других каналах будет получено значение глобальной переменной ${foo}, которое по прежнему равно пяти.

Наследование переменных специфичных для каналов

Если мы в команде Set присоединим спереди к имени переменной одиночный символ _ , то в этом случае эта переменная будет унаследована каналом, который будет создан основным каналом, например, при использовании команды Dial(Local/…); . Однажды будучи наследована, эта переменная не будет далее унаследована. В случае, если мы присоединим спереди к имени переменной два символа _, переменная будет наследоваться неограниченное число раз. (Работает только для CVS HEAD, не поддерживается в Asterisk 1.0.9.)

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

[TestInherit]
exten => 100,1,Set( __ FOO=5)
exten => 100,2,Dial(Local/test@CheckInherit)
exten => test,1,NoOp(${FOO})
Как результат, переменная FOO будет унаследована. Без символов подчеркивания, в новом канале типа local эта переменная будет не определена.

Пример

exten => 104,1,Set(FEE=${fee})
exten => 104,2,Set(_FIE=${fie})
exten => 104,3,Set(__FUM=${fum})
exten => 104,4,Dial(Local/105)

exten => 105,1,NoOp(${FEE})
exten => 105,2,NoOp(${FIE})
exten => 105,3,NoOp(${FUM})
exten => 105,4,Dial(Local/106)

exten => 106,1,NoOp(${FEE})
exten => 106,2,NoOp(${FIE})
exten => 106,3,NoOp(${FUM})
как результат получим:
— Executing Set("SIP/oberon-365e", "FEE=fee") in new stack
— Executing Set("SIP/oberon-365e", "_FIE=fie") in new stack
— Executing Set("SIP/oberon-365e", "__FUM=fum") in new stack
— Executing Dial("SIP/oberon-365e", "Local/105") in new stack
— Called 105
— Executing NoOp("Local/105@default-7263,2", "") in new stack
— Executing NoOp("Local/105@default-7263,2", "") in new stack
— Executing NoOp("Local/105@default-7263,2", "fum") in new stack
— Executing Dial("Local/105@default-7263,2", "Local/106") in new stack
— Called 106
— Executing NoOp("Local/106@default-49be,2", "") in new stack
— Executing NoOp("Local/106@default-49be,2", "") in new stack
— Executing NoOp("Local/106@default-49be,2", "fum") in new stack
(Этот пример не будет правильно работать в версиях до релиза Asterisk 1.2.)

Предопределенные переменные специфичные для каналов

Ниже приведен список специфичных для каналов переменных устанавливаемых самим Asterisk, значения которых Вы можете использовать в плане набора. В отличии от переменных определенных пользователем, переменные определяемые самим Asterisk- регистрозависимые.

  • ${ACCOUNTCODE}: Код аккаунта, если назначен - см. Asterisk billing. (объявлена устаревшей, начиная с версии 1.2.0 и удалена в версии 1.4.0. Используйте ${CDR(accountcode)} .
  • ${ANSWEREDTIME}: Время, когда на вызов ответили.
  • ${BLINDTRANSFER}: Активный канал SIP, который совершает вызов. Тут будет определено имя SIPканала, который совершает вызов при трансфере вызова типа blind - см. BLINDTRANSFER?
  • ${CALLERID(all)} : Текущее значение имени и номера из CallerID - Смотри раздел Установка Callerid?, посвященный работе с CallerID в Asterisk версии 1.4
  • ${CALLERID(name)} : Текущее значение имени из CallerID - Переменная ${CALLERIDNAME}использовалась в Asterisk до версии 1.2.0, она объявлена УСТАРЕВШЕЙ, начиная с версии 1.2.0 и удалена в версии 1.4.
  • ${CALLERID(num)} : Текущее значение номера из CallerID - Переменная :${CALLERIDNUM} использовалась в Asterisk до версии 1.2.0, она объявлена УСТАРЕВШЕЙ, начиная с версии 1.2.0 и удалена в версии 1.4.

(Обратите внимание: значения этой переменной не обязательно должно быть цифровым, как это может показаться из названия, и вполне законно ее значением может быть символ пробела. Для команд, которые оперируют значением этой переменной, (Например, 'GotoIf') должен учитываться этот момент).

  • ${CALLINGPRES}: Переменная, содержащая PRI Call ID Presentation, для входящих вызовов (См. callingpres )
  • ${CHANNEL}: Текущее имя канала
  • ${CONTEXT}: Текущее имя контекста
  • ${DATETIME}: Текущее время и дата в формате: DDMMYYYY-HH:MM:SS Эта переменная объявлена устаревшей в версии Asterisk 1.2, вместо нее используйте конструкцию:${STRFTIME(${EPOCH},,%d%mNaVH:NaVS)})
  • ${DIALEDPEERNAME}: Имя вызываемого абонента. В данный момент не работает, см DIALEDPEERNAME?
  • ${DIALEDPEERNUMBER}: Номер вызываемого абонента. В данный момент не работает, см DIALEDPEERNUMBER?
  • ${DIALEDTIME}: Время, когда был набран номер. (Работает, только, если вызываемый абонент ответил на вызов?!)
  • ${DIALSTATUS}: Статус вызова. См. DIALSTATUS
  • ${DNID}: Dialed Number Identifier. Для поддержки ограничений на исходящие вызовы, см. DNID?
  • ${EPOCH}: Текущее время в UNIX формате (количество секунд прошедшее с 1 января 1970 года)
  • ${EXTEN}: Текущий екстеншен
  • ${HANGUPCAUSE}: Последний код возврата, возвращенный по окончании соединения для Zap канала, соединенного с интерфейсом PRI
  • ${INVALID_EXTEN}: Запрашиваемый екстеншен, для случаев, когда он переадресуется на обработку i (неправильного) екстеншена
  • ${LANGUAGE}: Текущий язык сообщений. См. Asterisk multi-language?
  • ${MEETMESECS}: Количество секунд, в течении которых пользователь участвовал в конференции MeetMe?.
  • ${PRIORITY}: Текущее значение приоритета.
  • ${RDNIS}: Caller ID, для абонента совершающего переадресацию DNIS. Для поддержки ограничений на исходящие вызовы, см. RDNIS?
  • ${SIPDOMAIN}: Домен назначения для исходящего SIPвызова (если присутствует)
  • ${SIP_CODEC}: Используется для установки кодека, для вызова через SIPканал (предположительно не работает в версии 1.0.1, ok в 1.0.3 & 1.0.4, нет уверенности насчет 1.0.2)
  • ${SIPCALLID}: Значение заголовочного поля Call-ID: в сообщениях SIPдиалога.
  • ${SIPUSERAGENT}: Значение заголовочного поля «user agent» в сообщениях SIPдиалога.
  • ${TIMESTAMP}: Текущая дата и время в формате: YYYYMMDD-HHMMSS Эта переменная объявлена устаревшей в версии Asterisk 1.2, вместо нее используйте конструкцию: ${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
  • ${TRANSFERCAPABILITY}: Тип канала.
  • ${TXTCIDNAME}: Результат работы приложения TXTCIDName (см. ниже)
  • ${UNIQUEID}: Текущий уникальный идентификатор вызова
  • ${TOUCH_MONITOR}: используется для «записи одним нажатием» (см. features.conf, и флаги wW для команды dial). Если установлена на обоих концах связи, тогда эта переменная содержит app_args (аргументы) для приложения app_monitor, иначе для нее будут использоваться аргументы по умолчанию: WAV||m

Переменные, используемые различными приложениями

Команды некоторых приложений используют значения «канальных» переменных или возвращают в них результат своей работы.

  • Команда AgentCallbackLogin? возвращает в ${AGENTBYCALLERID_${CALLERID}}: ID успешно авторизированного агента.
  • Команда ChanIsAvail возвращает в ${AVAILCHAN}: первый доступный канал
  • Команда Dial использует значение переменной ${VXML_URL}: для отправки XML Url в телефон Cisco 7960.
  • Команда Dial использует значение переменной ${ALERT_INFO}: для передачи информации о типе звонка в телефоны Cisco.
  • Команда Dial возвращает в ${CAUSECODE}: Код ошибки, если вызов не удался.
  • Команда Dial возвращает в ${DIALSTATUS}: текстовый код результата последней попытки вызова абонента.
  • Команда Dial использует значение переменной ${TRANSFER_CONTEXT}: Если установлена эта переменная, при выполнении процедуры перевода вызова (#transfer), то будет использоваться для выполнения команд экстеншен из указанного контекста.
  • Команда EnumLookup возвращает в переменной ${ENUM}: результат поиска.
  • Команда Hangup использует значение переменной ${PRI_CAUSE}для установки кодов возврата PRI интерфейса.
  • Команда MeetMe использует значение переменной {MEETME_AGI_BACKGROUND}: для определения AGI скрипта, который необходимо выполнить.
  • Команда MeetMe возвращает в переменной ${MEETMESECS}: количество секунд, которое пользователь провел в конференции.
  • Команда Playback возвращает в переменной ${PLAYBACKSTATUS}: Результат выполнения команды (FAILED|SUCCESS).
  • Команда Queue возвращает в переменной ${QUEUESTATUS}: Причину, по которой, помещенный в очередь, вызов, покинул ее.
  • Команда TXTLookup возвращает в переменной ${TXTCIDNAME}: результат поиска в DNS.
  • Команда VoiceMail возвращает в переменной ${VMSTATUS}: результат выполнения приложения VoiceMail?. Возможные значения: SUCCESS | USEREXIT | FAILED .

Переменные, специфичные для макросов

При использовании контекстов в качестве макросов, доступны дополнительные специфичные для макросов «канальные» переменные.

  • ${ARG1}: первый аргумент, переданный макросу
  • ${ARG2}: второй аргумент, переданный макросу (и так далее …)
  • ${MACRO_CONTEXT}: Имя контекста екстеншена, вызвавшего данный макрос
  • ${MACRO_EXTEN}: Екстеншен, вызвавший данный макрос
  • ${MACRO_OFFSET}: Устанавливается макросом, для определения приоритета, с которого продолжится выполнение команд, после завершения работы макроса
  • ${MACRO_PRIORITY}: Приоритет екстеншена, на момент вызова данного макроса

Переменные окружения

Вы можете получить доступ к переменным окружения unix, используя следующий синтакс:

${ENV(''foo'')}

${ENV(ASTERISK_PROMPT)} : текущий CLI prompt? для Asterisk .
${ENV(RECORDED_FILE)} : имя файла, под которым была сохранена последняя запись, 
сделанная командой Record 

Функции для работы со строками

Размер строки

${LEN(foo)}
возвращает размер строки foo. Например,
exten => 100,1,Set(Fruit=pear)
exten => 100,2,NoOp(${LEN(Fruit)})
exten => 100,3,NoOp(${LEN(${Fruit})})
первая команда NoOp должна показать значение 5 (размер строки «fruit»). Вторая команда NoOp должна показать значение 4 (размер строки «pear»).

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

Подстроки

${foo:offset:length}
возвращает подстроку строки foo, начиная со смещения offset и ограничивая возвращаемую строку размером в length символов.
  • Если значение offset отрицательное, то смещение будет отсчитываться не от начала строки, а от ее конца.
  • Если значение length пропущено или отрицательное, то размер возвращаемой строки не ограничивается и будет возвращена вся строка, начиная со смещения offset.

Примеры:

${123456789:1} - возвращает строку 23456789
${123456789:-4} - возвращает строку 6789
${123456789:0:3} - возвращает строку 123
${123456789:2:3} - возвращает строку 345
${123456789:-4:3} - возвращает строку 678
Пример использования:
exten => _NXX.,1,Set(areacode=${EXTEN:0:3}) - получаем первые 3 цифры 
из переменной ${EXTEN}
exten => _516XXXXXXX,1,Dial(${EXTEN:3}) - получаем значение переменной ${EXTEN} 
после 3 цифры
exten => 100,1,Set(whichVowel=4)
exten => 100,2,Set(foo=AEIOU:${whichVowel}:1) - переменная ${foo} 
будет иметь значение 'U'

Соединение строк

Для соединения двух строк, просто напишите директиву, как показано ниже:

${foo}${bar}
555${theNumber}
${longDistancePrefix}555${theNumber}

Математические операции с переменными

Для математических действий с переменными, например, инкремент, умножение, сложение. Просто напишите:

exten => s,1,Set(SOMEVAR=$[${SOMEVAR} + 1]) ; инкремент
exten => s,2,Set(SOMEVAR=$[2 * ${SOMEVAR}]) ; умножение и т.д.
Вы должны использовать пробелы в выражениях, как показано выше.

Начиная с релиза Asterisks 1.2, так же доступна функция MATH...

exten => s,1,Set(SOMEVAR=${MATH(${SOMEVAR}+1)}) ; инкремент
exten => s,2,Set(SOMEVAR=${MATH(2*${SOMEVAR})}) ; умножение и т.д.

Asterisk Dialplan - extensions.conf

Файлы конфигурации Asterisk

Настройка Asterisk

Asterisk-cdr-viewer

$
0
0

Asterisk-cdr-viewer

Отличное приложение, сменившее в FreePBX 2.10 устаревший asterisk-stat

Asterisk статистика звонков

установка

  • cd /var/www/html
  • tar -xzvf asterisk-cdr-viewer-*.tgz
  • cp asterisk-cdr-viewer/contrib/httpd/asterisk-cdr-viewer.conf /etc/httpd/conf.d/

asterisk-cdr-viewer.conf

Alias /acdr/ "/var/www/html/asterisk-cdr-viewer/"

<Location "/acdr/">
        AuthName "Asterisk-CDR-Stat"
        AuthType Basic
        AuthUserFile /var/www/html/asterisk-cdr-viewer/.htpasswd
        AuthGroupFile /dev/null
        require valid-user
</Location>
  
  cd /var/www/html/asterisk-cdr-viewer
  htpasswd -b .htpasswd user password
  • service restart httpd
  • change settings in /var/www/asterisk-cdr-viewer/include/config.inc.php

Asterisk CDR MySQL table

Создайте файл, например:

touch asteriskcdrdb.sql

И скопируйте структуру таблицы БД:

CREATE TABLE cdr (
   calldate datetime NOT NULL default '0000-00-00 00:00:00',
   clid varchar(80) NOT NULL default '',
   src varchar(80) NOT NULL default '',
   dst varchar(80) NOT NULL default '',
   dcontext varchar(80) NOT NULL default '',
   channel varchar(80) NOT NULL default '',
   dstchannel varchar(80) NOT NULL default '',
   lastapp varchar(80) NOT NULL default '',
   lastdata varchar(80) NOT NULL default '',
   duration int(11) NOT NULL default '0',
   billsec int(11) NOT NULL default '0',
   disposition varchar(45) NOT NULL default '',
   amaflags int(11) NOT NULL default '0',
   accountcode varchar(20) NOT NULL default '',
   uniqueid varchar(32) NOT NULL default '',
   userfield varchar(255) NOT NULL default '',
   did varchar(50) NOT NULL default '',
   recordingfile varchar(255) NOT NULL default '',
   KEY `calldate` (`calldate`),
   KEY `dst` (`dst`),
   KEY `accountcode` (`accountcode`),
   KEY `uniqueid` (`uniqueid`)
);
 mysqladmin create asteriskcdrdb
 mysql asteriskcdrdb < asteriskcdrdb.sql
 mysql> GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO db_asteriskuser@localhost  IDENTIFIED BY 'DB_PASSWORD';
 flush privileges;
 \q

Asterisk cdr_mysql

/etc/asterisk/cdr_mysql.conf

[global]
hostname=localhost
dbname=asteriskcdrdb
table=cdr
password=DB_PASSWORD
user=db_asteriskuser
;port=3306
;sock=/tmp/mysql.sock
;timezone=UTC ; Previously called usegmtime

localhost*CLI> module show like mysql
Module                         Description                              Use Count
cdr_mysql.so                   MySQL CDR Backend                        0
res_config_mysql.so            MySQL RealTime Configuration Driver      0
app_mysql.so                   Simple Mysql Interface                   0
3 modules loaded

настройка записи

To display the links to the recorded files:

    * change the following settings in configuration file ( config.inc.php ):
         1. $system_monitor_dir = '/var/spool/asterisk/monitor'; - is the directory where call recordings are stored
         2. $system_audio_format = 'wav'; - audio file format 
    * Use like this command to start recording ( in asterisk dialplan ):
    [macro-monitor]
    exten => s,1,Set(MONITOR_FILE=/var/spool/asterisk/monitor/${UNIQUEID})
    exten => s,n,MixMonitor(${MONITOR_FILE}.wav,b)
  select * from cdr ORDER BY calldate DESC LIMIT 5;
  

Модификация Asterisk-CDR-Viewer

Простейшая настройка

..viewer/inc/config.inc.php

 $system_column_name = 'recordingfile';
 $system_storage_format = 0;
 $system_monitor_dir = '/var/spool/asterisk/monitor/mp3';
 
Spoiler
диалплан

[from-om]
exten => _X.,1,GoSub(sub-monitor,s,1(${EXTEN}))
exten => _X.,n,Dial(PJSIP/${EXTEN}@sip_trunk,,)
  
[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

директория /var/spool/asterisk/monitor/mp3 должна быть создана.

# which lame

/usr/local/bin/lame

How To

Asterisk: PauseQueueMember

$
0
0

Asterisk: PauseQueueMember

Приложение Asterisk: Поставить агента очереди на паузу (временно вывести из обслуживания очереди).

Описание

Не направлять вызовы из очереди статическому или динамическому агенту. Устанавливает паузу на указаном интерфейсе, в указанной очереди.
Если очередь не определена, устанавливает паузу для указанного интерфейса во всех очередях, которые он обслуживает.
Приложение не выполняется, если интерфейс агента не найден.
Следующие текстовын значения возвращаются в переменную ${PQMSTATUS} по выполнению:

  • PAUSED
  • NOTFOUND
пример:
 PauseQueueMember(,SIP/3000)
Синтаксис

PauseQueueMember([queuename],interface[,options[,reason]])

Аргументы
  • queuename - имя очереди
  • queuename - интерфейс агента
  • options - ?
  • reason - если назначено, дополнительная информация добавляется в лог очередии в события AMI.

Пример

exten => _[1234]02,1,Noop(agent pause)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,PauseQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loggedoff)
   SIP/4887 (ringinuse disabled) (dynamic) (paused) (Not in use) has taken no calls yet
См. также

Asterisk: RemoveQueueMember

$
0
0

Asterisk: RemoveQueueMember

Приложение Asterisk: Удаление динамического агента очереди

Описание

Пытается удалить интерфейс из обслуживание очереди. Если не существует- возвращает код ошибки. Устанавливает следующие значения переменной ${RQMSTATUS}по выполнению:

  • REMOVED - интерфейс удален
  • NOTINQUEUE - не обслуживает эту очередь
  • NOSUCHQUEUE - нет очереди
  • NOTDYNAMIC - интерфейс не динамический

Пример:

 RemoveQueueMember(techsupport,SIP/3000)

Пример2:

exten => _[1234]00,1,Noop(agent logged off)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,RemoveQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loggedoff)
Синтаксис

RemoveQueueMember(queuename[,interface])

См. также

Asterisk: Queue

$
0
0

Asterisk: Queue

Команда Asterisk постановки вызова в очередь

Описание

Приложение Asterisk Queue() вызывает указанную очередь, предварительно настроенную в queues.confили соответствующем модуле FreePBX
В дополнение к настройкам очереди используйте аргументы для определения дополнительных свойств очереди, таких как - продолжение выполнения диалплана по завершению вызова одной из сторон; перехода в другой контекст; назначения голосового приветствия; тайм-аут вызова и тд.

Приложение Queue() не отвечает на вызов автоматически (не открывает аудио канал).
Чтобы воспроизвести вызывающему абоненту голосовое приветствие и включить музыку на удержании (MOH) на время ожидания, перед ним должно быть выполнено какое-либо из приложений Answer, Progressили Ringing.

Приложение возвращает переменную ${QUEUESTATUS}с одним из ниже перечисленных значений:

  • TIMEOUT
  • FULL
  • JOINEMPTY
  • LEAVEEMPTY
  • JOINUNAVAIL
  • LEAVEUNAVAIL
  • CONTINUE

Также приложение Queue() возвращает в переменную ${MEMBERINTERFACE}с номером агента принявшего вызов и другие переменные. Установите для этого параметр setinterfacevar=yesв настройках очереди queues.conf.

Синтаксис

Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule[,position]]]]]]]]])

Аргументы

options

  • C: Установить статус вызова «answered elsewhere» даже если вызов отвергнут.
  • c: Продолжить выполнение диалплана, если вызываемыйпервым положил трубку.
  • d: режим модема с минимальной задержкой.
  • F([[context^]exten^]priority): Если вызывающийабонент повесил трубку первым, продолжить обработку вызова для вызываемогоагента в указанном контексте. Любые переменные определенные для данного контекста должны начинаться с одинарной или двойной нижней черты ('_'), чтобы наследоваться в контексте назначения.
  • F: Отличает от предыдущей опции тем, что не переходит в другой контекст, если вызывающийабонент повесил трубку, но продолжает выполнение текущего контекста со следующего приоритета.

Примечание: При использовании данной опции из Macroили Gosubне будет возврата.(?)

  • h: Разрешить вызываемойстороне повесить трубку нажатием -'*'.
  • H: Разрешить вызывающейстороне повесить трубку нажатием -'*'.
  • n: Не предпринимать повторных попыток вызова агентов очереди по истечению таймаута и перейти к выполнению следующего приоритета в текущем контексте.
  • i: Игнорировать установки переадресации вызова, если таковые заданы на вызываемых екстеншенах агентов очереди.
  • I: Данная опция указывает Asterisk игнорировать любые запросы на обновление или перенаправление получаемые от вызываемых устройств.
  • r: Установить КПВ (гудки) вместо Музыки на Удержании для ожидающих в очереди. Периодические анонсы будут воспроизводится по прежнему, если заданы.
  • R: Установить КПВ (гудки) вместо Музыки на Удержании для ожидающих в очереди, если устройство действительно вызывается.
  • t: Разрешить вызываемомуабоненту переадресацию вызова при помощи кода, назначенного в features.conf.
  • T:Разрешить вызывающемуабоненту переадресацию вызова при помощи кода, назначенного в features.conf.
  • w: Разрешить вызываемомуабоненту записать разговор при помощи приложения Asterisk: Monitor.
  • W: Разрешить вызывающемуабоненту записать разговор при помощи приложения Asterisk: Monitor.
  • k: Разрешить вызываемойстороне припарковать вызов посылкой DTMFкода, назначенного в features.conf.
  • K: Разрешить вызывающейстороне припарковать вызов посылкой DTMFкода, назначенного в features.conf.
  • x: Разрешить вызываемомуабоненту записать разговор при помощи приложения Asterisk: MixMonitor
  • X: Разрешить вызывающемуабоненту записать разговор при помощи приложения Asterisk: MixMonitor

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

timeout - Завершить вызов приложения Queue() по истечению заданного в секундах таймаута. Данная опция превалирует над параметром <timeout> в настройках очереди queues.conf, если в настройках очереди задано timeoutpriority=app. Например, если timeout=30, но Queue(qname,,,,10), то вызов перейдет на следующий приоритет через 10 секунд.
Смотрите подробнее в queue timing options - queues.conf.

AGI - выполнить AGI скрипт, когда вызывающая при ответе оператора.

macro - Перейти в Macro-контекст при ответе оператора.

gosub - Перейти по Sub-маршруту при ответе оператора.

rule - Назначить специфические правила, вместо правил по умолчанию см. Asterisk queuerules.conf.

position - Попытаться поставить вызывающего абонента на указанную позицию в очереди. Например, если указано '1' на первую, а '3' на третью.

См. также

Команды диалплана Asterisk в алфавитном порядке


Asterisk app Macro

$
0
0

Asterisk app Macro

Приложение Asterisk Macro выполняет переход в специальный контекст, передавая специфические параметры и если приказано возвращается в исходный контекст.

Описание

При выполнении macroиспользуется контекст macro-<name>, только со стандартным расширением 's'.
В этом контексте исполняются все назначенные шаги и по окончании возвращаются в родительский контекст,
где продолжается выполнение диалплана.
Вызываемые расширение (extension), контекст и приоритет сохраняются в переменных:
${MACRO_EXTEN}, ${MACRO_CONTEXT} и ${MACRO_PRIORITY} соответственно. Аргументы становятся данными Macro-контекста.
Если произвести переход из Macro-контекста командой GoToв другой контекст,
Macro утратит контроль и передаст его назначенному в GoTo контексту.

If ${MACRO_OFFSET} is set at termination, Macro will attempt to continue at priority MACRO_OFFSET + N + 1 if such a step exists, and N + 1 otherwise.

WARNING!!!: Because of the way Macro is implemented (it executes the priorities contained within it via sub-engine), and a fixed per-thread memory stack allowance, macros are limited to 7 levels of nesting (macro calling macro calling macro, etc.); It may be possible that stack-intensive applications in deeply nested macros could cause asterisk to crash earlier than this limit. It is advised that if you need to deeply nest macro calls, that you use the Gosub application (now allows arguments like a Macro) with explict Return() calls instead. WARNING!!!: Use of the application 'WaitExten' within a macro will not function as expected. Please use the 'Read' application in order to read DTMF from a channel currently executing a macro.

Синтаксис

Macro(name[,arg1[,arg2[,…]]])

Аргументы

name - Macro-<name> имя контекста.

См также

Использование Макросов в Asterisk

Вам может потребоваться создать множество екстеншенов (расширений) очень похожих друг на друга. Чтобы упростить работу с диалпланом используются Макросы. Для создания макроса используется контекст имя которого начинается с «macro-» и далее уникальное имя макроса. Выполнение макроса начинается с ектеншена 's'. В макросах используются локальные переменные:

${MACRO_EXTEN} – Екстеншен вызываемый макросом ${MACRO_CONTEXT} – Контекст вызываемый макросом ${MACRO_PRIORITY} – активный приоритет вызываемый макросом ${MACRO_OFFSET} – если установлено вызывает смещение n + ${MACRO_OFFSET} ${ARGn} – аргумент 'n' в макросе.

[macro-oneline]
;
; Однолинейный телефон
;
; ${ARG1} – Телефон
;
exten => s,1,Dial(${ARG1},20)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,3,Hangup
exten => s,102,Voicemail(b${MACRO_EXTEN})
exten => s,103,Hangup
[macro-twoline]
;
; Двухлинейный телефон
;
; ${ARG1} – Телефон (линия) 1
; ${ARG2} – Телефон (линия) 2
;
exten => s,1,Dial(${ARG1},20)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,102,Dial(${ARG2},20)
exten => s,103,Voicemail(b${MACRO_EXTEN})

[default]
exten => 1000,1,Macro(oneline,DAHDI/1)
exten => 1001,1,Macro(oneline,SIP/1001)
exten => 1002,1,Macro(twoline,DAHDI/3,DAHDI/4)

Когда макросы [macro-oneline] и [macro-twoline] созданы, в контексте [default] надо написать только одну сроку для выполнения нескольких стандартных действий.

12/08/2014 16:51

FreeSWITCH CDR MySQL

$
0
0

FreeSWITCH CDR MySQL

Просмотр данных CDR FreeSWITCH при помощи веб интерфейса CDR-Viewer БД MySQL

Подготовим FreeSWITCH для работы с MySQL через ODBC

Предполагается, что сервер mysql ( mariadb) установлен.

 yum install -y mysql-connector-odbc unixODBC unixODBC-devel

Проверим odbcinst.ini

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1

Заполним odbc.ini

[freeswitch]
Driver=MySQL
SERVER=localhost
PORT=3306
DATABASE=freeswitchcdr
USER=DB_USER
PASSWORD=DB_PASSWORD
Проверим подключение к MySQL

Создадим БД MySQL в формате Asterisk CDR

Создайте файл, например:

 touch freeswitchcdr.sql

И скопируйте в него структуру таблицы БД:

CREATE TABLE cdr (
   calldate datetime NOT NULL default '0000-00-00 00:00:00',
   clid varchar(80) NOT NULL default '',
   src varchar(80) NOT NULL default '',
   dst varchar(80) NOT NULL default '',
   dcontext varchar(80) NOT NULL default '',
   channel varchar(80) NOT NULL default '',
   dstchannel varchar(80) NOT NULL default '',
   lastapp varchar(80) NOT NULL default '',
   lastdata varchar(80) NOT NULL default '',
   duration int(11) NOT NULL default '0',
   billsec int(11) NOT NULL default '0',
   disposition varchar(45) NOT NULL default '',
   amaflags int(11) NOT NULL default '0',
   accountcode varchar(20) NOT NULL default '',
   uniqueid varchar(32) NOT NULL default '',
   userfield varchar(255) NOT NULL default '',
   did varchar(50) NOT NULL default '',
   recordingfile varchar(255) NOT NULL default '',
   KEY `calldate` (`calldate`),
   KEY `dst` (`dst`),
   KEY `accountcode` (`accountcode`),
   KEY `uniqueid` (`uniqueid`)
);
Создаем БД:freeswitchcdr
 mysqladmin create freeswitchcdr
Создаем таблицу:cdr
 mysql asteriskcdrdb < freeswitchcdr.sql
Задаем права на БД с параметрами определенными в odbc.ini

 mysql> GRANT ALL PRIVILEGES ON freeswitchcdr.* TO DB_USER@localhost  IDENTIFIED BY 'DB_PASSWORD';
 flush privileges;
 \q

Подготовим FreeSWITCH

Расскомментируйте строку event_handlers/mod_odbc_cdrв файле исходников FS ../freeswitch/modules.conf

и выполните make && make install.

По окончании компиляции скопируйте файл odbc_cdr.conf.xml из исходников в директорию, где установлен FS.

В моем примере это /usr/local/src/freeswitchи /usr/local/freeswitchсоответственно

cp /usr/local/src/freeswitch/src/mod/event_handlers/mod_odbc_cdr/conf/autoload_configs/odbc_cdr.conf.xml /usr/local/freeswitch/conf/autoload_configs/odbc_cdr.conf.xml

И заполните файл следующим содержанием, где параметры БД (odbc-dsn), данные определенные нами в odbc.ini:

<configuration name="odbc_cdr.conf" description="ODBC CDR Configuration">
  <settings>
    <!-- <param name="odbc-dsn" value="freeswitchcdr:DB_USER:DB_PASSWORD"/> -->
        <param name="odbc-dsn" value="odbc://freeswitch"/>
        <!-- global value can be "a-leg", "b-leg", "both" (default is "both") -->
        <param name="log-leg" value="both"/>
    <!-- value can be "always", "never", "on-db-fail" -->
    <param name="write-csv" value="on-db-fail"/>
        <!-- location to store csv copy of CDR -->
    <param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr"/>
    <!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" -->
    <param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
    <!-- dump SQL statement after leg ends -->
        <param name="debug-sql" value="true"/>
  </settings>
  <tables>
        <!-- only a-legs will be inserted into this table -->
    <table name="cdr" log-leg="a-leg">
      <field name="calldate" chan-var-name="start_stamp"/>
          <field name="clid" chan-var-name="caller_id_name"/>
          <field name="src" chan-var-name="caller_id_number"/>
          <field name="dst" chan-var-name="destination_number"/>
          <field name="dcontext" chan-var-name=""/>
          <field name="channel" chan-var-name="channel_name"/>
      <field name="dstchannel" chan-var-name="bridge_channel"/>
          <field name="lastapp" chan-var-name="hangup_cause"/>
          <field name="lastdata" chan-var-name="sip_hangup_disposition"/>
          <field name="duration" chan-var-name="duration"/>
          <field name="billsec" chan-var-name="billsec"/>
      <field name="disposition" chan-var-name="hangup_cause"/>
          <field name="lastapp" chan-var-name="current_application"/>
          <field name="amaflags" chan-var-name="amaflags"/>
          <field name="uniqueid" chan-var-name="uuid"/>
          <field name="recordingfile" chan-var-name="recordingfile"/>
          <field name="userfield" chan-var-name=""/>
    </table>
  </tables>
</configuration>
Загрузим модуль mod_odbc_cdr
 fs_cli
 load mod_odbc_cdr

Если в дальнейшем вы будете вносить изменения в файл odbc_cdr.conf.xmlих можно применить командой:

 reload mod_odbc_cdr
Spoiler

Подготовим Asterisk CDR Viewer

 cd /var/www/html
 git clone https://github.com/g613/asterisk-cdr-viewer.git
 
 cd asterisk-cdr-viewer/include

Отредактируем файл config.inc.php

$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'DB_USER';
$db_pass = 'DB_PASSWORD';
$db_name = 'freeswitchcdrdb';
$db_table_name = 'cdr';
$db_options = array();

Если все сделано правильно в Asterisk-CDR-Viewer будут отображаться свежие данные о вызовах:

Для того, чтобы работала сортировка по статусу вызова надо отредактировать файл ../asterisk-cdr-viewer/templates/form.tpl.phpзаменив секцию:

<td nowrap=""nowrap>
<input <?php if ( isset($_REQUEST['disposition_neg'] ) && $_REQUEST['disposition_neg'] == 'true' ) { echo 'checked="checked"'; } ?> type="checkbox" name="disposition_neg" value="true" /> not
<select name="disposition" id="disposition">
<option <?php if (empty($_REQUEST['disposition']) || $_REQUEST['disposition'] == 'all') { echo 'selected="selected"'; } ?> value="all">All Dispositions</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'ANSWERED') { echo 'selected="selected"'; } ?> value="ANSWERED">Answered</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'BUSY') { echo 'selected="selected"'; } ?> value="BUSY">Busy</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'FAILED') { echo 'selected="selected"'; } ?> value="FAILED">Failed</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'NO ANSWER') { echo 'selected="selected"'; } ?> value="NO ANSWER">No Answer</option>
</select>
</td>

на следующий код:

<td nowrap=""nowrap>
<input <?php if ( isset($_REQUEST['disposition_neg'] ) && $_REQUEST['disposition_neg'] == 'true' ) { echo 'checked="checked"'; } ?> type="checkbox" name="disposition_neg" value="true" /> not
<select name="disposition" id="disposition">
<option <?php if (empty($_REQUEST['disposition']) || $_REQUEST['disposition'] == 'all') { echo 'selected="selected"'; } ?> value="all">All Dispositions</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'NORMAL_CLEARING') { echo 'selected="selected"'; } ?> value="NORMAL_CLEARING">Answer</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'USER_BUSY') { echo 'selected="selected"'; } ?> value="USER_BUSY">Busy</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'UNALLOCATED_NUMBER') { echo 'selected="selected"'; } ?> value="UNALLOCATED_NUMBER">No Number</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'NO_ROUTE_DESTINATION') { echo 'selected="selected"'; } ?> value="NO_ROUTE_DESTINATION">No Route</option>
<option <?php if (isset($_REQUEST['disposition']) && $_REQUEST['disposition'] == 'ORIGINATOR_CANCEL') { echo 'selected="selected"'; } ?> value="ORIGINATOR_CANCEL">No Answer</option>
</select>
</td>

FreeSWITCH

Asterisk Local channel

$
0
0

Asterisk Local channel

chan_local - это псевдоканал. Использование этого канала в плане набора позволяетпросто перенаправить уже поступивший вызов в другой контекст плана набора. Часто используется при рекурсивном поиске маршрута для поступившего вызова; В данном случае имеется возможность вернуться в исходную точку в плане набора после завершения вызова.

Синтаксис:

Local/extension@context[/n]

Назначение:

Конструкции с использованием Локального канала могут быть использованы для отправки поступившего вызова в любую точку Вашего плана набора.

Предположим, что в вашей системе имеется карта TE410P. И Вы хотите сделать некие действия, при которых Вам понадобиться использовать команду Dial (например, когда вы помещаете файл для автоматического набора в /var/spool/outgoing), но еще хотите использовать в вашем плане набора процедуру поиска маршрута с минимальной стоимостью (least-cost-routes) или другие алгоритмы. То, что нам нужно сделать до набора номера, мы делаем до того, как chan_local создаст связь между двумя портами, один из которых - это E410P, а другой - это место, где используется команда Dial для совершения вызовов. При этом Вы можете полностью контролировать действия в том месте плана набора, где совершаются исходящие вызовы.

Конечно, это можно было сделать, применив некоторые уловки, но с использованием chan_local позволяет сделать этот процесс более понятным.

Драйвер канала «Local» позволяет вам конвертировать любой екстеншен в канал. Это используется в различных ситуациях, включая работу с агентами очереди вызовов и т.д.

Ниже приведены некоторые примеры (в основном при использовании конференций), где может быть использован локальный канал:

  • Допустим, что вы хотите сделать WEB интерфейс для билинга использования конференций… Вы можете создать Ваш скрипт, который будет спрашивать вызываемый номер, и использовать «Local/number@context» в качестве канала в Вашем .call файле, где вы определяете конференцию в качестве екстеншена для вызова.
  • Предположим, что вы хотите соединить две конференции между собой.
  • Предположим, что вы хотите добавить музыку ожидания (MusicOnHold) в конференцию (только вот зачем).
  • Вы хотите использовать .call файлы для автоматического набора номера, а так же хотите быть уверенными, что CDRзаписи и записи в логе будут созданы.

Это так же позволяет нам переходить из контекста в контекст, как при использовании команды Gosub?; Смотри примеры ниже.

Примеры:

[ inbound ]
; Сюда поступают все входящие вызовы
exten => s,1,Answer
exten => s,2,Dial(local/200@internals,30,r)
exten => s,3,Playback(sorrynoanswer)
exten => s,4,Hangup

[ internals ]
; сюда наши телефоны попадают по умолчанию
exten => 200,1,Dial(sip/blah)
exten => 200,102,VoiceMail(${EXTEN}@default)

exten => 201,1,Dial(zap/1)
exten => 201,102,VoiceMail(${EXTEN}@default)

exten => _0.,1,Dial(Zap/g1/${EXTEN:1}) ; исходящие вызовы в виде 0+номер

so that let me to call a local (internal) extension, without:
  • duplicate the Dial & voicemail statements
  • don't letting them to Dial out, since in internal context I have the possibility to dialout.

Предостережения:

Если Вы используете chan_local в Ваших call-файлах и Вы хотите передать некоторые переменные канала в Ваш контекст, не забудьте добавить '/n', так как иначе chan_local сам себя 'оптимизирует' и вырежет себя из пути прохождения вызова, и как следствие значения переменных будут потеряны. Например:

Local/00531234567@pbx описывайте как: Local/00531234567@pbx/n

Каналы в Asterisk

QueuePenalty

$
0
0

QueuePenalty

Synopsis
Set the penalty for a queue member.
Description
Change the penalty of a queue member
Syntax
Action: QueuePenalty
ActionID: <value>
Interface: <value>
Penalty: <value>
Queue: <value>
Arguments
ActionID - ActionID for this transaction. Will be returned.
Interface - The interface (tech/name) of the member whose penalty to change.
Penalty - The new penalty (number) for the member. Must be nonnegative.
Queue - If specified, only set the penalty for the member of this queue. Otherwise, set the penalty for the member in all queues to which the member belongs.

Функции Asterisk

$
0
0

Функции Asterisk

Функции Asterisk используются в диалплане. Это не командыдиалпланаи не могут быть использованы прямо. Функции возвращают значение для дальнейшего использования в логике диалплана.

function 'AES_DECRYPT'AES_DECRYPT(key,string) Decrypt a string encoded in base64 with AES given a 16 character key.
function 'AES_ENCRYPT'AES_ENCRYPT(key,string) Encrypt a string with AES given a 16 character key.
function 'AMI_CLIENT'AMI_CLIENT(loginname,field) Checks attributes of manager accounts
function 'ARRAY'ARRAY(var1[,var2[,…][,varN]]) Allows setting multiple variables at once.
function 'AST_CONFIG'AST_CONFIG(config_file,category,var Retrieve a variable from a configuration file.
function 'AUDIOHOOK_INHERIT'AUDIOHOOK_INHERIT(source) Set whether an audiohook may be inherited to another channel
function 'BASE64_DECODE'BASE64_DECODE(string) Decode a base64 string.
function 'BASE64_ENCODE'BASE64_ENCODE(string) Encode a string in base64.
function 'BLACKLIST'BLACKLIST() Check if the callerid is on the blacklist.
function 'CALLCOMPLETION'CALLCOMPLETION(option) Get or set a call completion configuration parameter for a channel.
function 'CALLERID'CALLERID(datatype[,CID]) Gets or sets Caller*ID data on the channel.
function 'CALLERPRES'CALLERPRES() Gets or sets Caller*ID presentation on the channel.
function 'CDR'CDR(name[,options]) Gets or sets a CDR variable.
function 'CDR_PROP'CDR_PROP(name) Set a property on a channel's CDR.
function 'CHANNEL'CHANNEL(item) Gets/sets various pieces of information about the channel.
function 'CHANNELS'CHANNELS([regular_expression]) Gets the list of channels, optionally filtering by a regular expression.
function 'CHECKSIPDOMAIN'CHECKSIPDOMAIN(domain) Checks if domain is a local domain.
function 'CONFBRIDGE'CONFBRIDGE(type,option) Set a custom dynamic bridge and user profile on a channel for the ConfBridge application using the same options defined in confbridge.conf.
CONFBRIDGE_INFOCONFBRIDGE_INFO(type,conf) Get information about a ConfBridge conference.
function 'CONNECTEDLINE'CONNECTEDLINE(datatype[,i]) Gets or sets Connected Line data on the channel.
function 'CSV_QUOTE'CSV_QUOTE(string) Quotes a given string for use in a CSV file, escaping embedded quotes as necessary
function 'CURL'CURL(url[,post-data]) Retrieves the contents of a URL
function 'CURLOPT'CURLOPT(<option>) Set options for use with the CURL() function
function 'CUT'CUT(varname,char-delim,range-spec) Slices and dices strings, based upon a named delimiter.
function 'DB'DB(family/key) Read from or write to the Asterisk database.
function 'DB_DELETE'DB_DELETE(family/key) Return a value from the database and delete it.
function 'DB_EXISTS'DB_EXISTS(family/key) Check to see if a key exists in the Asterisk database.
function 'DB_KEYS'DB_KEYS([prefix]) Obtain a list of keys within the Asterisk database.
function 'DEC'DEC(variable) Decrements the value of a variable, while returning the updated value to the dialplan
function 'DEVICE_STATE'DEVICE_STATE(device) Get or Set a device state.
function 'DIALGROUP'DIALGROUP(group[,op]) Manages a group of users for dialing.
function 'DIALPLAN_EXISTS'DIALPLAN_EXISTS(context[,extension[ Checks the existence of a dialplan target.
function 'ENUMLOOKUP'ENUMLOOKUP(number[,method-type[,opt General or specific querying of NAPTR records for ENUM or ENUM-like DNS pointers.
function 'ENUMQUERY'ENUMQUERY(number[,method-type[,zone Initiate an ENUM query.
function 'ENUMRESULT'ENUMRESULT(id,resultnum) Retrieve results from a ENUMQUERY.
function 'ENV'ENV(varname) Gets or sets the environment variable specified.
function 'EVAL'EVAL(variable) Evaluate stored variables
function 'EXCEPTION'EXCEPTION(field) Retrieve the details of the current dialplan exception.
function 'EXISTS'EXISTS(data) Test the existence of a value.
function 'EXTENSION_STATE'EXTENSION_STATE(extension[@context] Get an extension's state.
function 'FAXOPT'FAXOPT(item) Gets/sets various pieces of information about a fax session.
function 'FEATURE'FEATURE(option_name) Get or set a feature option on a channel.
function 'FEATUREMAP'FEATUREMAP(feature_name) Get or set a feature map to a given value on a specific channel.
function 'FIELDNUM'FIELDNUM(varname,delim,value) Return the 1-based offset of a field in a list
function 'FIELDQTY'FIELDQTY(varname,delim) Count the fields with an arbitrary delimiter
function 'FILE'FILE(filename[,offset[,length[,opti Read or write text file.
function 'FILE_COUNT_LINE'FILE_COUNT_LINE(filename[,format]) Obtains the number of lines of a text file.
function 'FILE_FORMAT'FILE_FORMAT(filename) Return the newline format of a text file.
function 'FILTER'FILTER(allowed-chars,string) Filter the string to include only the allowed characters
function 'FRAME_TRACE'FRAME_TRACE(filter list type) View internal ast_frames as they are read and written on a channel.
function 'GLOBAL'GLOBAL(varname) Gets or sets the global variable specified.
function 'GROUP'GROUP([category]) Gets or sets the channel group.
function 'GROUP_COUNT'GROUP_COUNT([groupname][@category]) Counts the number of channels in the specified group.
function 'GROUP_LIST'GROUP_LIST() Gets a list of the groups set on a channel.
function 'GROUP_MATCH_COUNT'GROUP_MATCH_COUNT(groupmatch[@categ Counts the number of channels in the groups matching the specified pattern.
function 'HANGUPCAUSE'HANGUPCAUSE(channel,type) Gets per-channel hangupcause information from the channel.
function 'HANGUPCAUSE_KEYS'HANGUPCAUSE_KEYS() Gets the list of channels for which hangup causes are available.
function 'HASH'HASH(hashname[,hashkey]) Implementation of a dialplan associative array
function 'HASHKEYS'HASHKEYS(hashname) Retrieve the keys of the HASH() function.
function 'HINT'HINT(extension[@context][,options]) Get the devices set for a dialplan hint.
function 'IAXPEER'IAXPEER(peername[,item]) Gets IAX peer information.
function 'IAXVAR'IAXVAR(varname) Sets or retrieves a remote variable.
function 'ICONV'ICONV(in-charset,out-charset,string Converts charsets of strings.
function 'IF'IF(expresion?[true][:false]) Check for an expresion.
function 'IFMODULE'IFMODULE(modulename.so) Checks if an Asterisk module is loaded in memory.
function 'IFTIME'IFTIME(timespec?[true][:false]) Temporal Conditional.
function 'IMPORT'IMPORT(channel,variable) Retrieve the value of a variable from another channel.
function 'INC'INC(variable) Increments the value of a variable, while returning the updated value to the dialplan
function 'ISNULL'ISNULL(data) Check if a value is NULL.
function 'JITTERBUFFER'JITTERBUFFER(jitterbuffer type) Add a Jitterbuffer to the Read side of the channel. This dejitters the audio stream before it reaches the Asterisk core. This is a write only function.
function 'KEYPADHASH'KEYPADHASH(string) Hash the letters in string into equivalent keypad numbers.
function 'LEN'LEN(string) Return the length of the string given.
function 'LISTFILTER'LISTFILTER(varname,delim,value) Remove an item from a list, by name.
function 'LOCAL'LOCAL(varname) Manage variables local to the gosub stack frame.
function 'LOCAL_PEEK'LOCAL_PEEK(n,varname) Retrieve variables hidden by the local gosub stack frame.
function 'LOCK'LOCK(lockname) Attempt to obtain a named mutex.
function 'MAILBOX_EXISTS'MAILBOX_EXISTS(mailbox[@context]) Tell if a mailbox is configured.
function 'MASTER_CHANNEL'MASTER_CHANNEL() Gets or sets variables on the master channel
function 'MATH'MATH(expression[,type]) Performs Mathematical Functions.
function 'MD5'MD5(data) Computes an MD5 digest.
function 'MESSAGE'MESSAGE(argument) Create a message or read fields from a message.
function 'MESSAGE_DATA'MESSAGE_DATA(argument) Read or write custom data attached to a message.
function 'MINIVMACCOUNT'MINIVMACCOUNT(account:item) Gets MiniVoicemail account information.
function 'MINIVMCOUNTER'MINIVMCOUNTER(account:name[:operand Reads or sets counters for MiniVoicemail message.
function 'MUTEAUDIO'MUTEAUDIO(direction) Muting audio streams in the channel
function 'ODBC'ODBC(property[,argument]) Controls ODBC transaction properties.
function 'ODBC_FETCH'ODBC_FETCH(result-id) Fetch a row from a multirow query.
function 'PASSTHRU'PASSTHRU([string]) Pass the given argument back as a value.
function 'PITCH_SHIFT'PITCH_SHIFT(channel direction) Pitch shift both tx and rx audio streams on a channel.
function 'PJSIP_DIAL_CONTACTS'PJSIP_DIAL_CONTACTS(endpoint[,aor[, Return a dial string for dialing all contacts on an AOR.
function 'PJSIP_ENDPOINT'PJSIP_ENDPOINT(name,field) Get information about a PJSIP endpoint
function 'PJSIP_HEADER'PJSIP_HEADER(action,name[,number]) Gets, adds, updates or removes the specified SIP header from a PJSIP session.
function 'PJSIP_MEDIA_OFFER'PJSIP_MEDIA_OFFER(media) Media and codec offerings to be set on an outbound SIP channel prior to dialing.
function 'POP'POP(varname[,delimiter]) Removes and returns the last item off of a variable containing delimited text
function 'PP_EACH_EXTENSION'PP_EACH_EXTENSION(mac,template) Execute specified template for each extension.
function 'PP_EACH_USER'PP_EACH_USER(string,exclude_mac) Generate a string for each phoneprov user.
function 'PRESENCE_STATE'PRESENCE_STATE(provider,field[,opti Get or Set a presence state.
function 'PUSH'PUSH(varname[,delimiter]) Appends one or more values to the end of a variable containing delimited text
function 'QUEUE_EXISTS'QUEUE_EXISTS([queuename]) Check if a named queue exists on this server
function 'QUEUE_MEMBER'QUEUE_MEMBER(queuename,option[,inte Count number of members answering a queue.
function 'QUEUE_MEMBER_COUNT'QUEUE_MEMBER_COUNT(queuename) Count number of members answering a queue.
function 'QUEUE_MEMBER_LIST'QUEUE_MEMBER_LIST(queuename) Returns a list of interfaces on a queue.
function 'QUEUE_MEMBER_PENALTY'QUEUE_MEMBER_PENALTY(queuename,inte Gets or sets queue members penalty.
function 'QUEUE_VARIABLES'QUEUE_VARIABLES(queuename) Return Queue information in variables.
function 'QUEUE_WAITING_COUNT'QUEUE_WAITING_COUNT([queuename]) Count number of calls currently waiting in a queue.
function 'QUOTE'QUOTE(string) Quotes a given string, escaping embedded quotes as necessary
function 'RAND'RAND([min][,max]) Choose a random number in a range.
function 'REALTIME'REALTIME(family,fieldmatch[,matchva RealTime Read/Write Functions.
function 'REALTIME_DESTROY'REALTIME_DESTROY(family,fieldmatch[ RealTime Destroy Function.
function 'REALTIME_FIELD'REALTIME_FIELD(family,fieldmatch,ma RealTime query function.
function 'REALTIME_HASH'REALTIME_HASH(family,fieldmatch,mat RealTime query function.
function 'REALTIME_STORE'REALTIME_STORE(family,field1,fieldN RealTime Store Function.
function 'REDIRECTING'REDIRECTING(datatype[,i]) Gets or sets Redirecting data on the channel.
function 'REGEX'REGEX(«regular expression» string) Check string against a regular expression.
function 'REPLACE'REPLACE(varname,find-chars[,replace Replace a set of characters in a given string with another character.
function 'SET'SET(varname[=value]) SET assigns a value to a channel variable.
function 'SHA1'SHA1(data) Computes a SHA1 digest.
function 'SHARED'SHARED(varname[,channel]) Gets or sets the shared variable specified.
function 'SHELL'SHELL(command) Executes a command using the system shell and captures its output.
function 'SHIFT'SHIFT(varname[,delimiter]) Removes and returns the first item off of a variable containing delimited text
function 'SIPCHANINFO'SIPCHANINFO(item) Gets the specified SIP parameter from the current channel.
function 'SIPPEER'SIPPEER(peername[,item]) Gets SIP peer information.
function 'SIP_HEADER'SIP_HEADER(name[,number]) Gets the specified SIP header from an incoming INVITE message.
function 'SORT'SORT(key1:val1[,key2:val2[,…]]) Sorts a list of key/vals into a list of keys, based upon the vals.
function 'SPEECH'SPEECH(argument) Gets information about speech recognition results.
function 'SPEECH_ENGINE'SPEECH_ENGINE(name) Get or change a speech engine specific attribute.
function 'SPEECH_GRAMMAR'SPEECH_GRAMMAR([nbest_number/]resul Gets the matched grammar of a result if available.
function 'SPEECH_RESULTS_TYPE'SPEECH_RESULTS_TYPE()
function 'SPEECH_SCORE'SPEECH_SCORE([nbest_number/]result_ Gets the confidence score of a result.
function 'SPEECH_TEXT'SPEECH_TEXT([nbest_number/]result_n Gets the recognized text of a result.
function 'SPRINTF'SPRINTF(format,arg1[,arg2[,…][,ar Format a variable according to a format string.
function 'SRVQUERY'SRVQUERY(service) Initiate an SRV query.
function 'SRVRESULT'SRVRESULT(id,resultnum) Retrieve results from an SRVQUERY.
function 'STACK_PEEK'STACK_PEEK(n,which[,suppress]) View info about the location which called Gosub
function 'STAT'STAT(flag,filename) Does a check on the specified file.
function 'STRFTIME'STRFTIME([epoch][,timezone[,format] Returns the current date/time in the specified format.
function 'STRPTIME'STRPTIME(datetime,timezone,format) Returns the epoch of the arbitrary date/time string structured as described by the format.
function 'STRREPLACE'STRREPLACE(varname,find-string[,rep Replace instances of a substring within a string with another string.
function 'SYSINFO'SYSINFO(parameter) Returns system information specified by parameter.
function 'TESTTIME'TESTTIME(date,time[,zone]) Sets a time to be used with the channel to test logical conditions.
function TIMEOUT TIMEOUT(timeouttype) Gets or sets timeouts on the channel. Timeout values are in seconds.
function 'TOLOWER'TOLOWER(string) Convert string to all lowercase letters.
function 'TOUPPER'TOUPPER(string) Convert string to all uppercase letters.
function 'TRYLOCK'TRYLOCK(lockname) Attempt to obtain a named mutex.
function 'TXTCIDNAME'TXTCIDNAME(number[,zone-suffix]) TXTCIDNAME looks up a caller name via DNS.
function 'UNLOCK'UNLOCK(lockname) Unlocks a named mutex.
function 'UNSHIFT'UNSHIFT(varname[,delimiter]) Inserts one or more values to the beginning of a variable containing delimited text
function 'URIDECODE'URIDECODE(data) Decodes a URI-encoded string according to RFC 2396.
function 'URIENCODE'URIENCODE(data) Encodes a string to URI-safe encoding according to RFC 2396.
function 'VALID_EXTEN'VALID_EXTEN([context],extension[,pr Determine whether an extension exists or not.
function 'VERSION'VERSION([info]) Return the Version info for this Asterisk.
function 'VMCOUNT'VMCOUNT(vmbox[,folder]) Count the voicemails in a specified mailbox.
function 'VM_INFO'VM_INFO(mailbox[@context],attribute Returns the selected attribute from a mailbox.
function 'VOLUME'VOLUME(direction[,options]) Set the TX or RX volume of a channel.

Настройка Asterisk

Viewing all 1135 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>