function 'QUEUE_WAITING_COUNT'
Функция Asterisk QUEUE_WAITING_COUNTвозвращает кол-во ожидающих в указанной <queuename> очереди.
синтаксис
QUEUE_WAITING_COUNT([queuename])
Функция Asterisk QUEUE_WAITING_COUNTвозвращает кол-во ожидающих в указанной <queuename> очереди.
QUEUE_WAITING_COUNT([queuename])
tagtopic
Функция 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 в черном списке, где:
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 ARRAY, позволяет назначить множество переменных за раз.
Списку разделенных запятыми переменных присваиваются значения в порядке перечисления.
Пример:
Set(ARRAY(var1,var2)=1,2)
назначит var1 = 1 и var2 = 2
СинтаксисARRAY(var1[,var2[,…][,varN]])
См. пример в описании QUEUE_VARIABLES
Функция Asterisk: Получает или устанавливает CallerID канала.
Позволяет использовать полученное callerid или установить собственное.
Существуют следующие <name-charset>:
синтаксис
CALLERID(datatype[,CID])
Аргументы
datatype - доступные типы данных:
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 могут использоваться как глобальные переменные, так и переменные специфичные для каждого канала, которые могут быть использованы как аргументы для команд в плане набора. Для переменных, используемых в плане набора (extensions.conf) используется следующий синтаксис:
${foo}
где foo - имя переменной. Именем переменной может быть цифробуквенная строка, которая должна начинаться с буквы. Переменные, определенные пользователями, не являются регистрозависимыми ${FOO} и ${Foo} ссылаются на одну и ту же переменную. Но переменные, которые определяются самим Asterisk, являются регистрозависимыми переменная ${EXTEN}будет работать, но ${exten} — не будет.
Существует три типа переменных: глобальные, переменные специфичные для каждого канала и переменные окружения.
Если Вы зададите переменную для какого-либо канала с аналогичным именем, как у существующей глобальной переменной (запомните: определенные пользователем переменные регистронезависимые) то, ссылаясь на это имя переменной в команде, Вы получите значение, которое Вы определили для этой «канальной» переменной (а не значение глобальной переменной). Например, посмотрите сами, что получится, если мы в контексте «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- регистрозависимые.
(Обратите внимание: значения этой переменной не обязательно должно быть цифровым, как это может показаться из названия, и вполне законно ее значением может быть символ пробела. Для команд, которые оперируют значением этой переменной, (Например, 'GotoIf') должен учитываться этот момент).
Команды некоторых приложений используют значения «канальных» переменных или возвращают в них результат своей работы.
При использовании контекстов в качестве макросов, доступны дополнительные специфичные для макросов «канальные» переменные.
Вы можете получить доступ к переменным окружения 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 символов.
${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})}) ; умножение и т.д.
Отличное приложение, сменившее в FreePBX 2.10 устаревший asterisk-stat
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
Создайте файл, например:
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
/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 Mod v2.2.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';
mysql> select recordingfile from cdr ORDER BY calldate DESC LIMIT 1; +--------------------+ | recordingfile | +--------------------+ | 1466591784.246.mp3 | +--------------------+ 1 rows in set (0.00 sec)
[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
Приложение Asterisk: Поставить агента очереди на паузу (временно вывести из обслуживания очереди).
Не направлять вызовы из очереди статическому или динамическому агенту. Устанавливает паузу на указаном интерфейсе, в указанной очереди.
Если очередь не определена, устанавливает паузу для указанного интерфейса во всех очередях, которые он обслуживает.
Приложение не выполняется, если интерфейс агента не найден.
Следующие текстовын значения возвращаются в переменную ${PQMSTATUS} по выполнению:
PauseQueueMember(,SIP/3000)
PauseQueueMember([queuename],interface[,options[,reason]])
Пример
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: Удаление динамического агента очереди
Пытается удалить интерфейс из обслуживание очереди. Если не существует- возвращает код ошибки. Устанавливает следующие значения переменной ${RQMSTATUS}по выполнению:
Пример:
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() вызывает указанную очередь, предварительно настроенную в queues.confили соответствующем модуле FreePBX
В дополнение к настройкам очереди используйте аргументы для определения дополнительных свойств очереди, таких как - продолжение выполнения диалплана по завершению вызова одной из сторон; перехода в другой контекст; назначения голосового приветствия; тайм-аут вызова и тд.
Приложение Queue() не отвечает на вызов автоматически (не открывает аудио канал).
Чтобы воспроизвести вызывающему абоненту голосовое приветствие и включить музыку на удержании (MOH) на время ожидания, перед ним должно быть выполнено какое-либо из приложений Answer, Progressили Ringing.
Приложение возвращает переменную ${QUEUESTATUS}с одним из ниже перечисленных значений:
Также приложение Queue() возвращает в переменную ${MEMBERINTERFACE}с номером агента принявшего вызов и другие переменные. Установите для этого параметр setinterfacevar=yesв настройках очереди queues.conf.
Синтаксис
Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule[,position]]]]]]]]])
Аргументы
options
Примечание: При использовании данной опции из Macroили Gosubне будет возврата.(?)
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 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> имя контекста.
См также
Вам может потребоваться создать множество екстеншенов (расширений) очень похожих друг на друга. Чтобы упростить работу с диалпланом используются Макросы. Для создания макроса используется контекст имя которого начинается с «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] надо написать только одну сроку для выполнения нескольких стандартных действий.
Предполагается, что сервер mysql ( mariadb) установлен.
yum install -y mysql-connector-odbc unixODBC unixODBC-devel
# 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
[freeswitch] Driver=MySQL SERVER=localhost PORT=3306 DATABASE=freeswitchcdr USER=DB_USER PASSWORD=DB_PASSWORD
echo "select 1" | isql -v freeswitch
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select 1 +---------------------+ | 1 | +---------------------+ | 1 | +---------------------+ SQLRowCount returns 1 1 rows fetched
Создайте файл, например:
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`) );
mysqladmin create freeswitchcdr
mysql asteriskcdrdb < freeswitchcdr.sql
mysql> GRANT ALL PRIVILEGES ON freeswitchcdr.* TO DB_USER@localhost IDENTIFIED BY 'DB_PASSWORD'; flush privileges; \q
Расскомментируйте строку 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>
fs_cli
load mod_odbc_cdr
Если в дальнейшем вы будете вносить изменения в файл odbc_cdr.conf.xmlих можно применить командой:
reload mod_odbc_cdr
freeswitch@internal> reload mod_odbc_cdr +OK Reloading XML +OK module unloaded +OK module loaded 2016-07-21 18:58:05.585312 [CONSOLE] switch_loadable_module.c:2008 Stopping: mod_odbc_cdr 2016-07-21 18:58:05.585312 [DEBUG] mod_odbc_cdr.c:542 Destroying table cdr 2016-07-21 18:58:05.585312 [CONSOLE] switch_loadable_module.c:2028 mod_odbc_cdr unloaded. 2016-07-21 18:58:05.585312 [INFO] mod_enum.c:880 ENUM Reloaded 2016-07-21 18:58:05.585312 [DEBUG] mod_odbc_cdr.c:396 Set odbc-dsn [odbc://freeswitch] 2016-07-21 18:58:05.585312 [DEBUG] mod_odbc_cdr.c:405 Set debug-sql [true] 2016-07-21 18:58:05.585312 [DEBUG] mod_odbc_cdr.c:425 Set log-leg [both] 2016-07-21 18:58:05.585312 [DEBUG] mod_odbc_cdr.c:436 Set csv-path [/usr/local/freeswitch/log/odbc_cdr/] 2016-07-21 18:58:05.585312 [DEBUG] mod_odbc_cdr.c:437 Set csv-path-on-fail [/usr/local/freeswitch/log/odbc_cdr/failed/] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:113 Found table [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:117 Set table [cdr] to log A-legs only 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:128 Adding fields to table [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [calldate] (start_stamp) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [clid] (caller_id_name) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [src] (caller_id_number) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [dst] (destination_number) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [channel] (channel_name) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [dstchannel] (bridge_channel) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [lastapp] (hangup_cause) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [lastdata] (sip_hangup_disposition) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [duration] (duration) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [billsec] (billsec) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [disposition] (hangup_cause) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [lastapp] (current_application) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [amaflags] (amaflags) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [uniqueid] (uuid) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [recordingfile] (recordingfile) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] mod_odbc_cdr.c:139 Field [userfield] (branch) added to [cdr] 2016-07-21 18:58:05.585312 [INFO] switch_time.c:1415 Timezone reloaded 1781 definitions 2016-07-21 18:58:05.595283 [CONSOLE] switch_loadable_module.c:1538 Successfully Loaded [mod_odbc_cdr]
cd /var/www/html
git clone https://github.com/g613/asterisk-cdr-viewer.git cd asterisk-cdr-viewer/include
$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>
chan_local - это псевдоканал. Использование этого канала в плане набора позволяетпросто перенаправить уже поступивший вызов в другой контекст плана набора. Часто используется при рекурсивном поиске маршрута для поступившего вызова; В данном случае имеется возможность вернуться в исходную точку в плане набора после завершения вызова.
Синтаксис:
Local/extension@context[/n]
Назначение:
Конструкции с использованием Локального канала могут быть использованы для отправки поступившего вызова в любую точку Вашего плана набора.
Предположим, что в вашей системе имеется карта TE410P. И Вы хотите сделать некие действия, при которых Вам понадобиться использовать команду Dial (например, когда вы помещаете файл для автоматического набора в /var/spool/outgoing), но еще хотите использовать в вашем плане набора процедуру поиска маршрута с минимальной стоимостью (least-cost-routes) или другие алгоритмы. То, что нам нужно сделать до набора номера, мы делаем до того, как chan_local создаст связь между двумя портами, один из которых - это E410P, а другой - это место, где используется команда Dial для совершения вызовов. При этом Вы можете полностью контролировать действия в том месте плана набора, где совершаются исходящие вызовы.
Конечно, это можно было сделать, применив некоторые уловки, но с использованием chan_local позволяет сделать этот процесс более понятным.
Драйвер канала «Local» позволяет вам конвертировать любой екстеншен в канал. Это используется в различных ситуациях, включая работу с агентами очереди вызовов и т.д.
Ниже приведены некоторые примеры (в основном при использовании конференций), где может быть использован локальный канал:
Это так же позволяет нам переходить из контекста в контекст, как при использовании команды 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:
Предостережения:
Если Вы используете chan_local в Ваших call-файлах и Вы хотите передать некоторые переменные канала в Ваш контекст, не забудьте добавить '/n', так как иначе chan_local сам себя 'оптимизирует' и вырежет себя из пути прохождения вызова, и как следствие значения переменных будут потеряны. Например:
Local/00531234567@pbx описывайте как: Local/00531234567@pbx/n
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.
queuerules - правила позволяющие динамически изменять диапазон QUEUE_MIN_PENALTY - QUEUE_MAX_PENALTY,
в зависимости от времени ожидания вызывающего абонента.
Каждый оператор очереди Asteriskимеет параметр penalty.
Пенальти может быть определен в настройках пользователя очереди:
member ⇒ interface[,penalty][,membername][,state_interface][,ringinuse]
или при добавлении динамического агента:
queue add member <dial string> to <queue> [[[penalty <penalty>] as <membername>] state_interface <interface>]
Данный параметр определяет приоритет для посылки вызова на оператора, чем ниже пенальти, тем выше приоритет при выборе оператора для вызова.
Если пенальти не задан, то по умолчанию = 0
Предположим, очередь обслуживают 3 оператора с пенальти - 0,1 и 2 соответственно.
Первым будет вызван оператор с пенальти = 0 и только если он недоступен, оператор с пенальти = 1 и так далее.
Пенальти оператора может быть динамически изменен, например через CLI:
queue set penalty <penalty> on <interface> [in <queue>]
или через AMI Actions QueuePenalty.
Перед тем как входящий вызов будет поставлен в очередь, можно задать переменные канала - QUEUE_MIN_PENALTY
и QUEUE_MAX_PENALTY. Они укажут диапазон пенальти операторов очереди, для посылки вызова.
Например:
exten => s,1,NoOp(**penalty**) same = n,Set(QUEUE_MIN_PENALTY=1) same = n,Set(QUEUE_MAX_PENALTY=2) same = n,Queue(queue101)
Вызовы очереди queue101будут распределены между операторами с пенальти 1 и 2. Но предположим, что все операторы с пенальти 1 и 2 заняты или недоступны. В этом случае можно применить queuerules.
Правила связываются с конкретной очередью параметром defaultrule:
defaultrule = myrule
penaltychange => <время ожидания в секундах>,<абсолютное или относительное изменение QUEUE_MAX_PENALTY>[,абсолютное или относительное изменение QUEUE_MIN_PENALTY]
etc/asterisk/queuerules.conf
[myrule] penaltychange => 30,+3 ; через 30 секунд ожидания в увеличить QUEUE_MAX_PENALTY на +3, но не менять QUEUE_MIN_PENALTY; penaltychange => 60,10,5 ; через 60 секунд ожидания в установить значение QUEUE_MAX_PENALTY = 10 и установить QUEUE_MIN_PENALTY = 5; penaltychange => 75,,7 ; через 75 секунд ожидания не изменять QUEUE_MAX_PENALTY, но установить QUEUE_MIN_PENALTY = 7;
Таким образом очередь может получать дополнительных операторов, в зависимости от нагрузки (времени ожидания).
Правила могут получаться в реальном времени из хранилища Realtime. Для это включите опцию в секции [general] конфига queuerules.conf:
realtime_rules = yes
Данная опция не требует работы только c реалтайм базами данных.При выполнении команды queue reload rulesвсе правила, независимо от расположения в БД или конфигурационном файле, будут применены. При условии, что они имеют уникальные имена и правильную конфигурацию мин/макс пенальти.
В etc/asterisk/extconfig.confопределите таблицу БД в которой находятся правила:
queue_rules => odbc,asterisk,queue_rules
И создайте таблицу в используемой БД.
rule_name | time | min_penalty | max_penalty |
---|---|---|---|
'default' | '10' | '20' | '30' |
'queue1' | '20' | '30' | '55' |
'queue2' | '25' | '-11' | '+1111' |
'queue2' | '400' | '112' | '333' |
'queue3' | '0' | '4564' | '46546' |
'queue_rule' | '40' | '15' | '50' |
[general] ; Look for queue rules in the queue_rules database table through RealTime. Note ; that this option is not strictly "RealTime", in the sense that the queue ; rules are only loaded and parsed during module load/reload. Queue rules ; must have a unique rule name and support relative min/max penalties. ; ; realtime_rules = yes ; ; It is possible to change the value of the QUEUE_MAX_PENALTY and QUEUE_MIN_PENALTY ; channel variables in mid-call by defining rules in the queue for when to do so. This can allow for ; a call to be opened to more members or potentially a different set of members. ; The advantage to changing members this way as opposed to inserting the caller into a ; different queue with more members or reinserting the caller into the same queue with a different ; QUEUE_MAX_PENALTY or QUEUE_MIN_PENALTY set is that the caller does not lose his place in the queue. ; ; Note: There is a limitation to these rules; a caller will follow the penaltychange rules for ; the queue that were defined at the time the caller entered the queue. If an update to the rules is ; made during the caller's stay in the queue, these will not be reflected for that caller. ; ; The syntax for these rules is ; penaltychange => <number of seconds into the call>,<absolute or relative change to QUEUE_MAX_PENALTY>[,absolute or relative change to QUEUE_MIN_PENALTY] ; ; Example: ; [myrule] ; penaltychange => 30,+3 ; 30 seconds into the call increase the QUEUE_MAX_PENALTY by 3, no change to QUEUE_MIN_PENALTY ; penaltychange => 60,10,5 ; 60 seconds into the call increase the QUEUE_MAX_PENALTY to 10 and increase the QUEUE_MIN_PENALTY to 5 ; penaltychange => 75,,7 ; 75 seconds into the call keep the QUEUE_MAX_PENALTY the same and increase the QUEUE_MIN_PENALTY to 7
function 'QUEUE_WAITING_COUNT'
Функции 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_INFO | CONFBRIDGE_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. |
В данном документе приведен список команд, которые Вы можете использовать в плане набора (extensions.conf). Получить список и описание приложений, доступных на вашем сервере Asterisk Вы можете командами CLI:
core show applicationsи core show application <name>.
Asterisk app: AddQueueMember: Динамическое добавление агента для очереди.
Asterisk app: ADSIProg: Загрузка ADSI скрипта Asterisk в телефон.
Asterisk app: AELSub: Перейти в AEL (asterisk extension Language) подпрограмму.
Asterisk app: AGI: Выполнить AGI приложение.
Answer: Ответить на вызов.
Asterisk application: Authenticate: Авторизовать пользователя
BackGround: Проиграть аудио файл с возможностью посылки DTMFкоманд
BackgroundDetect: Распознавать речь при проигрывании аудио файла
Bridge: Соединить два канала
BridgeWait: Put a call into the holding bridge.
Busy: Установить состояние занято.
CallCompletionCancel: Cancel call completion service
CallCompletionRequest: Request call completion service for previous call
CELGenUserEvent: Generates a CEL User Defined Event.
Asterisk: ChangeMonitor: Изменения имени файла для записи разговора.
ChanIsAvail: Проверка доступности канала связи.
ChannelRedirect: Переадресация существующего канала в другую точку плана набора
ChanSpy: Прослушивание канала.
ClearHash: Clear the keys from a specified hashname.
ConfBridge: Conference bridge application.
Congestion: Indicate the Congestion condition.
ContinueWhile: Restart a While loop.
ControlPlayback: Play a file with fast forward and rewind.
DAHDIRAS: Executes DAHDI ISDN RAS application.
DAHDIScan: Scan DAHDI channels to monitor calls.
DAHDISendCallreroutingFacility: Send an ISDN call rerouting/deflection facility message.
DAHDISendKeypadFacility: Send digits out of band over a PRI.
DateTime: Says a specified time in a custom format.
DBdel: Delete a key from the asterisk database.
DBdeltree: Delete a family or keytree from the asterisk database.
DeadAGI: Executes AGI on a hungup channel.
Asterisk application: Dial: Пытается установить соединение, одного устройства с другим..
Dictate: Virtual Dictation Machine.
Directory: Provide directory of voicemail extensions.
DISA: Direct Inward System Access.
DumpChan: Dump Info About The Calling Channel.
EAGI: Executes an EAGI compliant application
Echo: Echo media, DTMF back to the calling party
EndWhile: End a while loop.
Exec: Executes dialplan application.
ExecIf: Executes dialplan application, conditionally.
ExecIfTime: Conditional application execution based on the current time.
ExitWhile: End a While loop.
ExtenSpy: Listen to a channel, and optionally whisper into it.
ExternalIVR: Interfaces with an external IVR application.
Flash: Flashes a DAHDI Trunk.
ForkCDR: Forks the current Call Data Record for this channel.
GetCPEID: Get ADSI CPE ID.
Gosub: Jump to label, saving return address.
GosubIf: Conditionally jump to label, saving return address.
Goto: Jump to a particular priority, extension, or context.
GotoIf: Conditional goto.
GotoIfTime: Conditional Goto based on the current time.
Hangup: Hang up the calling channel.
HangupCauseClear: Clears hangup cause information from the channel that is available through HANGUPCAUSE.
IAX2Provision: Provision a calling IAXy with a given template.
ICES: Encode and stream using 'ices'.
ImportVar: Import a variable from a channel into a new variable
Incomplete: Returns AST_PBX_INCOMPLETE value.
Log: Send arbitrary text to a selected log level.
Asterisk app Macro: Macro Implementation.
MacroExclusive: Exclusive Macro Implementation.
MacroExit: Exit from Macro
MacroIf: Conditional Macro implementation
MailboxExists: Check to see if Voicemail mailbox exists.
MessageSend: Send a text message.
Milliwatt: Generate a Constant 1004Hz tone at 0dbm (mu-law).
MinivmAccMess: Record account specific messages.
MinivmDelete: Delete Mini-Voicemail voicemail messages.
MinivmGreet: Play Mini-Voicemail prompts.
MinivmMWI: Send Message Waiting Notification to subscriber(s) of mailbox.
MinivmNotify: Notify voicemail owner about new messages.
MinivmRecord: Receive Mini-Voicemail and forward via e-mail.
Asterisk: MixMonitor: Record a call and mix the audio during the recording. Use of StopMixMonitor is required to guarantee the audio file is available for processing during dialplan execution.
Asterisk: Monitor: Monitor a channel.
Morsecode: Plays morse code.
MP3Player: Play an MP3 file or M3U playlist file or stream.
MSet: Set channel variable(s) or function value(s).
MusicOnHold: Play Music On Hold indefinitely.
MYSQL: Do several mySQLy things
NBScat: Play an NBS local stream.
NoCDR: Tell Asterisk to not maintain a CDR for this channel.
NoOp: Do Nothing (No Operation).
Originate: Originate a call.
Page: Page series of phones
Asterisk: PauseMonitor: Pause monitoring of a channel.
Asterisk: PauseQueueMember: Pauses a queue member.
Pickup: Directed extension call pickup.
PickupChan: Pickup a ringing channel.
Playback: Play a file.
PlayTones: Play a tone list.
PrivacyManager: Require phone number to be entered, if no CallerID sent
Proceeding: Indicate proceeding.
Progress: Indicate progress.
Asterisk: Queue: Queue a call for a call queue.
Asterisk: QueueLog: Writes to the queue_log file
RaiseException: Handle an exceptional condition.
Read: Read a variable.
ReadExten: Read an extension into a variable.
ReceiveFAX: Receive a FAX and save as a TIFF/F file.
Record: Record to a file.
Asterisk: RemoveQueueMember: Dynamically removes queue members.
ResetCDR: Resets the Call Data Record.
RetryDial: Place a call, retrying on failure allowing an optional exit extension.
Return: Return from gosub routine.
Ringing: Indicate ringing tone.
SayAlpha: Say Alpha.
SayAlphaCase: Say Alpha.
SayCountPL: Say Polish counting words.
SayDigits: Say Digits.
SayNumber: Say Number.
SayPhonetic: Say Phonetic.
SayUnixTime: Says a specified time in a custom format.
SendDTMF: Sends arbitrary DTMF digits
SendFAX: Sends a specified TIFF/F file as a FAX.
SendImage: Sends an image file.
SendText: Send a Text Message.
SendURL: Send a URL.
Set: Set channel variable or function value.
SetAMAFlags: Set the AMA Flags.
SetMusicOnHold: Set default Music On Hold class.
SIPAddHeader: Add a SIP header to the outbound call.
SIPDtmfMode: Change the dtmfmode for a SIP call.
SIPRemoveHeader: Remove SIP headers previously added with SIPAddHeader
SMS: Communicates with SMS service centres and SMS capable analogue phones.
SoftHangup: Hangs up the requested channel.
SpeechActivateGrammar: Activate a grammar.
SpeechBackground: Play a sound file and wait for speech to be recognized.
SpeechCreate: Create a Speech Structure.
SpeechDeactivateGrammar: Deactivate a grammar.
SpeechDestroy: End speech recognition.
SpeechLoadGrammar: Load a grammar.
SpeechProcessingSound: Change background processing sound.
SpeechStart: Start recognizing voice in the audio stream.
SpeechUnloadGrammar: Unload a grammar.
StackPop: Remove one address from gosub stack.
StartMusicOnHold: Play Music On Hold.
Stasis: Invoke an external Stasis application.
Asterisk: StopMixMonitor: Stop recording a call through MixMonitor, and free the recording's file handle.
Asterisk: StopMonitor: Stop monitoring a channel.
StopMusicOnHold: Stop playing Music On Hold.
StopPlayTones: Stop playing a tone list.
System: Execute a system command.
TestClient: Execute Interface Test Client.
TestServer: Execute Interface Test Server.
Transfer: Transfer caller to remote extension.
TryExec: Executes dialplan application, always returning.
TrySystem: Try executing a system command.
Asterisk: UnpauseMonitor: Unpause monitoring of a channel.
Asterisk: UnpauseQueueMember: Unpauses a queue member.
UserEvent: Send an arbitrary user-defined event to parties interested in a channel (AMI users and relevant res_stasis applications).
Verbose: Send arbitrary text to verbose output.
VMAuthenticate: Authenticate with Voicemail passwords.
VMSayName: Play the name of a voicemail user
VoiceMail: Leave a Voicemail message.
VoiceMailMain: Check Voicemail messages.
VoiceMailPlayMsg: Play a single voice mail msg from a mailbox by msg id.
Wait: Waits for some time.
WaitExten: Waits for an extension to be entered.
WaitForNoise: Waits for a specified amount of noise.
WaitForRing: Wait for Ring Application.
WaitForSilence: Waits for a specified amount of silence.
WaitMusicOnHold: Wait, playing Music On Hold.
WaitUntil: Wait (sleep) until the current time is the given epoch.
While: Start a while loop.
Zapateller: Block telemarketers with SIT.
Загрузка asterisk ADSI скрипта в телефон
This application programs an ADSI Phone with the given script
Синтаксис
ADSIProg([script])
[Arguments]
script - adsi скрипт для использования. Если не задано используется скрипт по умолчанию - «asterisk.adsi»
см также
Приложение диалплана Atserisk AELSub.
Перейти в AEL (asterisk extension Language) подпрограмму.
Выполняет указанную подпрограмму, назначенную в AEL, из другого языка диалплана: extensions.conf, realtime или Lua.
СинтаксисAELSub(routine[,args])
Аргументы
routine - наименование подпрограммы в extensions.ael
см также
Выполнить приложение Aasterisk Gateway Interface (AGI) в канале вызова.
AGI позволяет Asterisk запустить внешнюю программу, написанную на любом языке,
для контроля над каналами связи, воспроизведением аудио, чтения DTMFсигналов и др.,
связываясь с Asterisk через стандартный потоковый ввод/вывод - stdin/stdout:
AGI >>>-stdout->>> Asterisk Asterisk >>>-stdin->>> AGI
AGI приложение отправляет команды через STDOUT,
Asterisk передает данные через STDIN.
По состоянию версии Asterisk 1.6.x, выполнение диалплана будет продолжаться даже после завершения вызова, пока скрипт явно не сигнализирует прекратить, просто закрыв соединение или соответствующей командой.
Запущенный локально AGI скрипт получит сигнал SIGHUP, при разъединении в канале, если только не используется DeadAGI
FastAGI (удаленный) сервер, соответственно, получит HANGUP. Оба этих сигнала могут быть отключены установкой переменной Set(AGISIGHUP=no), непосредственно перед выполнением скрипта AGI.
Если же требуется, чтобы AGI приложение завершалось немедленно, после получения информации о разъединении канала, установите переменную Set(AGIEXITONHANGUP=yes)
Используйте команду 'agi show commands' CLI, для получения полного списка команд AGI или 'agi show commands topic <command_name>' для описания указанной команды:
*CLI> agi show commands
Приложение диалплана Asterisk AGI возвращает ${AGISTATUS} переменную с одним из следующих значений: