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

Asterisk CLI - интерфейс командной строки

$
0
0

Asterisk CLI - интерфейс командной строки

asterisk -vvvvvv

Командная строка является мощным инструментом для мониторинга и управления работой Asterisk PBX. При запуске asterisk с флагом -r или -c, появиться следующие приглашение:

# asterisk   -vvvr
*CLI> 

Введите core show helpи нажмите enter для получения полного списка команд:

Командная строка поддерживает вывод доступных команд по неполному вводу нажатием 'Tab':

Для получения дополнительной информации о конкретной команде, вы можете ввести core show help<command>. Например:

*CLI> core show help manager
                manager reload Reload manager configurations
    manager set debug [on|off] Show, enable, disable debugging of the manager code
          manager show command Show a manager interface command
         manager show commands List manager interface commands
        manager show connected List connected manager interface users
           manager show eventq List manager interface queued events
         manager show settings Show manager global settings
            manager show users List configured manager users
             manager show user Display information on a specific manager user
*CLI> 

Вот некоторые полезные команды:

Core

  • core set verbose <0-9> - порог отображаемой информации.
  • core reload - перечитать все конфиги
  • core restart gracefullyперезагрузить Asterisk по завершению всех текущих вызовов (свободные каналы закрываются)
  • core restart now Restart перезагрузить Asterisk немедленно
  • core restart when convenientперезагрузить Asterisk если нет разговоров

SIP

  • sip show peersпоказать существующие SIPекстеншены и их статус
  • sip show peer 100 отображает информацию о конкретном SIPекстеншене
  • sip show registryотображает состояние зарегистрированных транков

PJSIP

  • pjsip set logger {on|off|host} – Enable/Disable PJSIP Logger Output
  • pjsip show aors– Show PJSIP Aors

   Aor:  <Aor..............................................>  <MaxContact>
    Contact:  <Aor/ContactUri.................................>  <Status....>  <RTT(ms)..>
 =========================================================================================

      Aor:  1000                                                 1
    Contact:  1000/sip:1000@192.168.1.32:5060;transport=UDP;rin  Avail               9.645

      Aor:  1001                                                 1
  • pjsip show aor– Show PJSIP Aor

localhost*CLI> pjsip show aor 1000

      Aor:  <Aor..............................................>  <MaxContact>
    Contact:  <Aor/ContactUri.................................>  <Status....>  <RTT(ms)..>
 =========================================================================================

      Aor:  1000                                                 1
    Contact:  1000/sip:1000@192.168.1.32:5060;transport=UDP;rin  Avail              13.017


 ParameterName        : ParameterValue
 ==========================================================================================
 authenticate_qualify : false
 contact              : sip:1000@192.168.1.32:5060;transport=UDP;rinstance=56471484e9cd2c68
 default_expiration   : 3600
 mailboxes            :
 max_contacts         : 1
 maximum_expiration   : 7200
 minimum_expiration   : 60
 outbound_proxy       :
 qualify_frequency    : 60
 remove_existing      : true
 support_path         : false

DAHDI

  • dahdi show statusсостояние портов dahdi
  • dahdi show channelsпоказать существующие каналы

Кодеки

  • core show translation recalcрасчет перекодировки кодеков
Spoiler

ещё

  • module show like mysqlотобразить загруженные модули содержащие в названии mysql
  • pri set debug {on|off} span 1 Enables PRI debugging on a span
  • rtp set debug {on|off|ip} Enable/Disable RTP debugging

Простые CLI приемы

Есть несколько трюков, которые помогут вам в интерфейсе командной строки Asterisk. Очень удобно завершение неполного ввода клавишей TAB. Если вы введете начало команды и нажмите клавишу Tab, Asterisk попытается завершить имя команды, или покажет возможные команды, которые начинаются с буквы, которые Вы ввели. Например, введите 'co', а затем нажмите клавишу Tab.

 localhost*CLI> co
 confbridge  config      core
 localhost*CLI> co

Теперь наберите 'cor', и нажмите TAB снова. На этот раз Asterisk завершит слово, т.к. 'core' является единственной командой, которая начинается с 'cor'. Этот трюк также работает с под-командами. Например, наберите 'core show' и нажмите TAB. (Возможно, вам придется дважды нажать вкладку, если вы не поставили пробел после слова 'show'.) Asterisk покажет вам все под-команды.

localhost*CLI> core show [Tab]
application     applications    calls           channel         channels
channeltype     channeltypes    codec           codecs          config
file            function        functions       hanguphandlers  help
hint            hints           image           license         profile
settings        sound           sounds          switches        sysinfo
taskprocessors  threads         translation     uptime          version
warranty
localhost*CLI> core show

Повторение предыдущих команд.

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

Run Linux Shell Commands from The Asterisk CLI

Восклицательный знак перед командой позволяет предавать команды оболочке Linux.

 localhost*CLI> !whoami
 root
 localhost*CLI>

Настройка Asterisk


FreePBX

$
0
0

FreePBX

Настройка FreePBX Asterisk GUI Документация Мануал

FreePBX это полнофункциональный веб-интерфейс для конфигурации Asterisk PBX.

Если Вы знакомы с Asterisk, то знаете, настройка ATCосуществляется при помощи конфигурационных файлов. FreePBX предлагает простой, интуитивно понятный интерфейс для настройки и управления Asterisk PBX.
FreePBX также поставляется со многими дистрибьютивами:
AsteriskNOW, FreePBX Distro, Trixbox, Elastix
Документация Мануал FreePBX Asterisk Gui

Скачать FreePBX

Документация

Общее

Уязвимости

Admin modules

Документация по административным модулям FreePBX

Applications

Документация по модулям приложений FreePBX

Connectivity

Документация по модулям входящих исходящих соединений FreePBX.

  • Inbound Routes - Наведение входящих вызовов , DID.
  • Outbound Routes - Маршрутизирует исходящие вызовы по требуемым транкам.
  • Zap Channel DIDs - Назначение DIDдля конкретных ZAP каналов.
  • Trunks - Управляет ZAP (Dahdi), SIPпротокол, IAXканалами для выхода в общую телефонную сеть, или соединения АТС.

Settings Modules

Документация по модулям глобальных настроек каналов и приложений FreePBX

UCP

Примеры

Устаревшее

FreeSWITCH CDR Viewer

$
0
0

FreeSWITCH CDR Viewer

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

Подготовим 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 Call Center Stats

$
0
0

Asterisk Call Center Stats

Статистика очередей колл центра Asterisk PBX.
Мод основанный на Asternic Call Center Stats lite.

Ключевые изменения:
Вместо парсинга текстового лога очереди /var/log/asterisk/queueu_log в MySQL
используется нативная БД,
формируемая, непосредственно, приложением app_queue - Asterisk PBX.

Отчеты в Asterisk Call Center Stats:

Сортировка

  • Выбор данных по:
    • очередям
    • агентам
    • дате

Реалтайм

  • Состояние агентов в реальном времени.
  • Информация о очереди:
    • Свободные агенты.
    • В разговоре.
    • Количество вызовов в очереди.
  • Вызовы ожидающие в очереди.

asterisk queue stats realtime

Отвеченные вызовы

  • Отвеченные вызовы по очередям и агентам.
  • Среднее время ожидания для очередей и агентов.
  • Среднее время разговора для очередей и агентов.
  • Количество отвеченных вызовов по агентам.
  • Процент отвеченных вызовов для очередей и агентов.

asterisk queue stats answered calls

asterisk queue stats answered calls

Неотвеченные вызовы

  • Количество неотвеченных вызовов по очередям.
  • Средняя позиция в очереди при выходе.
  • Причина разъединения: повесили трубку или отключены по таймауту.

asterisk queue stats unanswered calls

Распределение вызовов

  • Распределение вызовов по дате, по часам и дням недели

asterisk queue stats distribution calls

asterisk queue stats distribution calls

Установка Asterisk Call Center Stats

Установка приложения статистики очередей колл-центра Asterisk PBX.

Укажем Asterisk сохранять лог очереди в БД

Создайте таблицу в БД asterisk.

CREATE TABLE IF NOT EXISTS `queuelog` (
`time` varchar(32) DEFAULT NULL,
`callid` char(64) DEFAULT NULL,
`queuename` char(64) DEFAULT NULL,
`agent` char(64) DEFAULT NULL,
`event` char(32) DEFAULT NULL,
`data` char(64) DEFAULT NULL,
`data1` char(64) DEFAULT NULL,
`data2` char(64) DEFAULT NULL,
`data3` char(64) DEFAULT NULL,
`data4` char(64) DEFAULT NULL,
`data5` char(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

в файле /etc/asterisk/logger.confвыключите лог в файл:

 queue_log_to_file = no

в файле /etc/asterisk/asterisk.conf

 [options]
 queue_adaptive_realtime = yes

в файле /etc/asterisk/extconfig.conf

 queue_log => odbc,asterisk,queuelog

где asterisk ваше db конфиг, например в /etc/asterisk/res_odbc_custom.conf

[asterisk]
enabled => yes
dsn => asterisk
username => dbuser
password => dbpass
pre-connect => yes

Примените конфигурацию

 asterisk -rx 'core reload'

Установка и настройка Asterisk Call Center Stats

Скачайте приложение в директорию веб сервера (в примере /var/www/html):

 wget http://asterisk-pbx.ru/downloads/cdr/asterisk-queue-stats.tar.gz

Распакуйте:

 cd /var/www/html
 tar zxvf asterisk-queue-stats-001.tar.gz
 cd queue-stats

Отредактируйте файл config.phpв соответствии в вашими данными, где

  • $dbname - БД в которой вы создали таблицу queuelog (в примере - asterisk)
  • $dbname - Пользователь ДБ
  • $dbpass - Пароль БД (см. /etc/asterisk/res_odbc.conf или /etc/asterisk/res_odbc_custom.conf)

// Credentials for MYSQL database
$dbhost = 'localhost';
$dbname = 'asterisk';
$dbuser = 'root';
$dbpass = '';

// Credentials for AMI (for the realtime tab to work)
// See /etc/asterisk/manager.conf

$manager_host   = "127.0.0.1";
$manager_user   = "admin";
$manager_secret = "amp111";

Задайте права на директорию queue-stats:

 chown -R asterisk. /var/www/html/queue-stats

Откройте статистику в вашем любимом веб браузере:

http://ip.add.res.s/queue-stats
Spoiler

Настроим Asterisk, FreeSWITCH, OpenSIPs.

$
0
0

Настроим Asterisk, FreeSWITCH, OpenSIPs.

Интегратор облачных систем телефонных коммуникаций.

Реализуем сложные ТЗ.

Удаленно, в любой точке мира.

Установка IP АТС на открытом программном обеспечении включает в себя следующие этапы:

  1. Разработка технического задания с учетом требований заказчика и возможностей IP АТС.
  2. Подготовка договора на установку и настройку и, если требуется, поставку оборудования.
  3. Подготовка счета на оплату с учетом технического задания, согласование сроков и порядка оплаты.
  4. Удаленная установка IP АТС в любой точке мира.
  5. Установка IP АТС с выездом на объект (Санкт Петербург).
  6. Предварительная настройка оборудования в нашем сервисном центре.
  7. Сдача проекта. Проверка работоспособности всех компонентов и алгоритмов работы IP АТС.
  8. Обучение для дальнейшей эксплуатации IP АТС сотрудниками заказчика.
  9. Бесплатная техническая поддержка в течении месяца с момента запуска в эксплуатацию.

Мы находимся в Санкт-Петербурге, но работаем по всему миру!

Решения

VoIPАТС

  • Неограниченное количество VoIPабонентов и транков.
  • Запись разговоров и детализированный отчет о звонках.
  • Факс на e-mail.
  • Русскоязычный интерфейс.
  • CTI - Интеграция со сторонними приложениями.

Колл Центр

Дополнительно

  • Аудит и обслуживание уже установленных систем Asterisk, FreeSWITCH и др.
  • Написание кастомизированного диаплана под любые нужды.
  • Интеграция с устаревшими TDMАТС (Avaya, NEC, Nortel, Samsung, Panasonic, LG).
  • Аудит и настройки безопасности VoIPсистем.
  • Биллинг. Многопользовательские системы.
  • SIP proxy, SBC.

Напишите нам!

Свяжитесь с нами для получения подробной информации!
Офисная АТС

Only edit this fieldset if “Функционал” is set to “Офисная АТС”.

Колл Центр

Only edit this fieldset if “Функционал” is set to “Колл Центр”.

Кастомные решения

Only edit this fieldset if “Функционал” is set to “Все сложно”.

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

$
0
0

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

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

В Asterisk поддерживается несколько очередей вызовов. Их определения находятся в файле queues.conf, имена очередей вызовов используются в качестве аргумента команды Queue в файле конфигурации плана набора extensions.conf. Агенты, которые обрабатывают вызовы, поступающие в очередь, описываются в файле agents.conf.

Новая возможность (начиная с 31 июля, 2005 CVS HEAD) Сообщения с периодическим напоминанием вызывающему абоненту, что о нем еще не забыли, можно включить, используя новые опции: periodic-announce и periodic-announce-frequency. С их помощью, через, определенные параметром periodic-announce-frequency промежутки времени ожидания, абоненту будет проигрываться определенное голосовое сообщение, например: «Спасибо за Ваше терпение, Ваш звонок очень важен для нас….» . Например:

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

function 'QUEUE_MEMBER_COUNT'

function 'QUEUE_MEMBER_PENALTY'

$
0
0

function 'QUEUE_MEMBER_PENALTY'

Данная функция объявлена устаревшей. Используйте function 'QUEUE_MEMBER'

Получить статус или установить пенальти для пользователя.

СинтаксисQUEUE_MEMBER_PENALTY(queuename,interface)

Смотрите:

function 'QUEUE_MEMBER'

Функции Asterisk


function 'REALTIME_STORE'

$
0
0

function 'REALTIME_STORE'

Функция Asterisk: Запись множества полей в реалтайм хранилище.

Description

Эта функция запишет новый набор значений в хранилище RealTime. Если движок RT обеспечивает уникальный идентификатор записи, хранящейся, REALTIME_STORE (…) = .. создает переменную с именем канала ${RTSTOREID}, которая содержит значение уникального идентификатора. В настоящее время, максимум 30 пар 'поле/значение' поддерживается.

Синтаксис

REALTIME_STORE(family,field1,fieldN[,…],field30=val1,val2,valN[,…],val30)

Пример:

  Set(REALTIME_STORE(hints,exten,channels)=${ARG2},${ARG1})

Смотри также:

Функции Asterisk

function 'REALTIME'

$
0
0

function 'REALTIME'

Функция Asterisk: Получить/Записать значение в реалтайм хранилище.

Описание

Данная функция читает или записывает значение из/в Реалтайм хранилище.

Конструкция REALTIME(….)читает имена/значения, а REALTIME(….)=записывает новые значения.
При чтении, функция возвращает текстовую строку с разделителями. Имя и значениеразделяются символом указанным в <delim1>,
а сами пары Имя/значениеразделяются символом <delim2>. такие дела…

Если совпадений не найдено, возвращается NULL. При записи, всегда возвращается NULL.

Синтаксис

REALTIME(family,fieldmatch[,matchvalue[,delim1|field[,delim2]]])

Аргументы

  • delim1|field - Используйте <delim1> вместе <delim2> для чтения, а <field> без <delim2> для записи.

Если выполняется чтение, а <delim1> не задан, по умолчанию назначается ','.

  • delim2 - Параметр только для чтения, если не задан, по умолчанию '='.

Пример

Рассмотрим использование функции REALTIME() на простом примере реализации HOT DESK.
Абонент может занять любое рабочее место и назначить свой номер для приема звонков (hot desking).

В таблице hintsреалтайм хранилища сохраняется соответствие exten > channels.

  • exten - номер набираемый для вызова абонента.
  • channels - SIPпир вызываемый системой при наборе номера exten.

+-------+------------+
| exten | channels   |
+-------+------------+
| 6666  | 0000000009 |
| 7105  | 0000000001 |
+-------+------------+
Контекст ext-loginобрабатывает запрос абонента на регистрацию номера, кодом 0000ХХХХ, где ХХХХ номер абонента:
  • Set(hintdb=${EXTEN:4}) - сохраняем номер в переменную, предварительно отрезав 0000.
  • GoSub(sub-setsip,s,1(${CALLERID(NUM)},${hintdb})) - отправим вызов в контекст sub-setsip, с аргументами:
    • CALLERID(num) - это будет параметр channels
    • hintdb - это номер exten, который надо сопоставить с channels.

[ext-login]
exten => _0000XXXX,1,PlayBack(beep)
    same => n,Set(hintdb=${EXTEN:4})
    same => n,Verbose(${CALLERID(NUM)});
    same => n,GoSub(sub-setsip,s,1(${CALLERID(NUM)},${hintdb}))
В контексте sub-setsipсначала проверим есть ли запись о channels, т.е. аппарате с которого происходит запрос в таблице.
Если есть, отправим вызов на приоритет update, если нет, на приоритет new.
  • Set(_VCHAN=${CUT(REALTIME(hints,channels,${ARG1},:,:),:,4)})
  • GotoIf($[«${VCHAN}» = «${ARG1}»]?update:new)

в случае если запись для данного устройства уже существует, в приоритете updateзапишем новый номер в строку где channels = CALLERID(num)

  • Set(REALTIME(hints,channels,${ARG1},exten)=${ARG2})

если же строк совпадающих с CALLERID(num) устройства нет, а приоритете newсоздадим новую запись, при помощи функции REALTIME_STORE:

  • Set(REALTIME_STORE(hints,exten,channels)=${ARG2},${ARG1})

[sub-setsip]
exten => s,1,Verbose(***channels=${ARG1}***exten=${ARG2})
     same => n,Set(_VCHAN=${CUT(REALTIME(hints,channels,${ARG1},:,:),:,4)})
     same => n,GotoIf($["${VCHAN}" = "${ARG1}"]?update:new)
     same => n(update),Verbose(***UPDATE***)
     same => n,Set(REALTIME(hints,channels,${ARG1},exten)=${ARG2})
     same => n,SayDigits(${ARG2})
     same => n,PlayBack(ru/agent-loginok)
     same => n,hangup
     same => n(new),Verbose(***NEW***)
     same => n,Set(REALTIME_STORE(hints,exten,channels)=${ARG2},${ARG1})
     same => n,SayDigits(${ARG2})
     same => n,PlayBack(ru/agent-loginok)
     same => n,hangup

теперь при наборе номера 6666 (exten), система вызовет пир 0000000009 (channels):

[internal-call]
exten => _XXXX,1,Set(CALLERID(num)=${CUT(REALTIME(hints,channels,${CALLERID(num)},:,:),:,2)})
exten => _XXXX,n,Dial(SIP/${CUT(REALTIME(hints,exten,${EXTEN},:,:),:,4)},,treU(sub-monitor,s,1))
exten => h,1,Hangup

См. также

Функции Asterisk

function 'REALTIME_FIELD'

$
0
0

function 'REALTIME_FIELD'

Функция запроса в реальном времени. RealTime query function.

Описание
Данная функция получает одно значение -<fieldname> из БД, где <fieldmatch> содержит значение <matchvalue>.
This function retrieves a single item, <fieldname> from the RT engine, where<fieldmatch> contains the value <matchvalue>. When written to, the REALTIME_FIELD() function performs identically to the REALTIME() function.

Синтаксис
REALTIME_FIELD(family,fieldmatch,matchvalue,fieldname)

Пример
Разрешим вызовы на VIP абонента, только с определенных номеров, где

  • 4888 - привилегированный абонент
  • 4ХХХ - все отстальные

/etc/asterisk/extconfig.conf

[settings]
did_family => odbc,sql,did
cos_family => odbc,sql,cos1
Формат - family ⇒ engine,контекст в res_odbc.conf,таблица в БД

/etc/asterisk/extensions.conf

 [realtime-did]
 switch => Realtime/did1@did_family

Формат - switch ⇒ Realtime/контекст-в-БД@family

таблица did

+----+---------+-------+----------+---------+---------------------+
| id | context | exten | priority | app     | appdata             |
+----+---------+-------+----------+---------+---------------------+
|  1 | did1    | _4888 |        1 | goto    | cos1,${EXTEN},1     |
|  2 | did1    | _4XXX |        1 | dial    | PJSIP/${EXTEN},,    |
+----+---------+-------+----------+---------+---------------------+
Здесь вызовы на привилегированного абонента отправляются в контекст cos1,
на остальных разрешается набор.

Контекст cos1

[cos1]
exten => _4XXX,1,gotoif($["${CALLERID(num)}" = "${REALTIME_FIELD(cos_family,master,${EXTEN},slave)}"]?vip:all)
exten => _4XXX,n(all),verbose(DENY for ${CALLERID(num)})
exten => _4XXX,n,hangup
exten => _4XXX,n(vip),verbose(ALLOW for ${REALTIME_FIELD(cos_family,master,${EXTEN},slave)})
exten => _4XXX,n,dial(PJSIP/${EXTEN},,)

В данном контексте, проверяется по таблице cos1, может ли абонент связываться с VIP абонентом.
Если CallerID присутствует в таблице, то может.

таблица cos1

+--------+-------+
| master | slave |
+--------+-------+
| 4888   | 2667  |
| 4888   | 2668  |
+--------+-------+

см. также

Функции 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 - имя для участника обработки очереди, под которым он будет добавлен (версии 1.4+).
  • stateinterface - альтернативный интерфейс, который будет использоваться для определения состояния участника обработки очереди (версии 1.6+).
Код возврата

При возникновении ошибки возвращает -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 в алфавитном порядке

function 'AES_DECRYPT'

function 'DB'

$
0
0

function 'DB'

Функция Asterisk: читает или записывает во внутреннюю БД Asterisk (astdb.sqlite3).

Описание Данная функция может читать или записывать значения в базу данных Asterisk.
В режиме чтения, функция возвращает соответствующее значение из БД в переменную DB_RESULT,
или ничего, если не существует. Чтобы убедиться, что запись существует, используйте функцию function 'DB_EXISTS'.

Синтаксис

DB(family/key)

Пример

Переадресация с внешним CallerID при помощи диалплана

Назначение

Подстановка CallerID внешнего абонента при переадресации принятого вызова на другой внутренний номер.

Описание

В данном примере, функция DBвычисляет длину CallerID вызывающего абонента и если длина более 3-х знаков,
определяет callerid, как внешний и устанавливает его для передачи в качестве CallerID внутреннего абонента, если вызов, в дальнейшем, будет переадресован.
По завершении вызова, фальшивое CALLTRACE очищается при помощи функции DB_DELETE.
(опция 'e', команды Dial, указывает выполнить расширение 'h', по завершению вызова.)

В примере:внутренние номера 1ХХ, вызовы из контекста [from-internal]

[from-internal]
exten => _1XX,1,Noop(+++set external callerid +++)
exten => _1XX,n,GoSub(sub-transfer_external_cid,${EXTEN},1(${CALLERID(num)},${EXTEN}))

[sub-transfer_external_cid]
exten => _XXX,1,Noop(~~~http://asterisk-pbx.ru~~~)
exten => _XXX,n,Set(cidint=${ARG1})
exten => _XXX,n,GotoIf($[${LEN(${DB(CALLTRACE/${ARG1})})} > 3]?external:internal)
exten => _XXX,n(external),Set(CALLERID(num)=${DB(CALLTRACE/${ARG1})})
exten => _XXX,n,Dial(SIP/${ARG2},,Tte)
exten => _XXX,n(internal),Dial(SIP/${ARG2},,Tteo)
exten => h,1,Set(DB_DELETE(CALLTRACE/${cidint})=ignored)

См. также Option app DIAL(,,o)

 

function 'CUT'

$
0
0

function 'CUT'

Функция Asterisk: разрезать строку по заданными разделителям.

Описание

Вырезать информацию из строки (переменной), ориентируясь на разделители.

Синтаксис

 CUT(varname,char-delim,range-spec)

Аргументы

  • varname - переменная для операции.
  • char-delim - Разделитель, по умолчанию '-'.
  • range-spec - Номер поля, который вам нужен со смещением начиная с 1-го, также возможно задавать диапазон полей через '-' и группировать при помощи амперса́нда - '&'.

Пример

Предположим, имеется таблица БД - devices, с данными SIPустройств.

+------+-------+------------+------------+------+-------------+---------------+
| id   | tech  | dial       | devicetype | user | description | emergency_cid |
+------+-------+------------+------------+------+-------------+---------------+
| 4889 | pjsip | PJSIP/4889 | fixed      | 4889 | sip 4889    |               |
| 4887 | sip   | SIP/4887   | fixed      | 4887 | sip 4887    |               |
| 4886 | sip   | SIP/4886   | fixed      | 4886 | sip 4886    |               |
+------+-------+------------+------------+------+-------------+---------------+
 exten => _4XXX,1,verbose(${REALTIME(devices,user,${EXTEN},:,:)})

Функция REALTIME()возвращает на строку содержащую user:4889 c двоеточием в качестве разделителя:

 Verbose("id:4889:tech:pjsip:dial:PJSIP/4889:devicetype:fixed:user:4889:description:sip 4889:")
Требуется получить технологию из поля под порядковым номером 6, в данном случае PJSIP/4889.
используем для этого функцию CUT():
 exten => _4XXX,1,verbose(${CUT(REALTIME(devices,user,${EXTEN},:,:),:,6)})

и получим требуемое значение:

 Verbose("PJSIP/4889") 

Поля 4,5 и 6:

 exten => _4XXX,1,verbose(${CUT(REALTIME(devices,user,${EXTEN},:,:),:,4-6)}) 
 Verbose("pjsip:dial:PJSIP/4889")

Поля 6 и 8:

 exten => _4XXX,1,verbose(${CUT(REALTIME(devices,user,${EXTEN},:,:),:,6&8)}) 
 Verbose("PJSIP/4889:fixed")

Функции Asterisk


function 'REALTIME_DESTROY'

$
0
0

function 'REALTIME_DESTROY'

Функция Asterisk: RealTime Destroy.

Описание

Данная функция действует наподобие REALTIME(....),
но в отличии от нее, только удаляет запись в AstDB.
Если в asterisk.confпараметр live_dangerously=no, то функция REALTIME_DESTROY,
будет выполнять только из диалплана, но не по внешним протоколам.

Синтаксис

REALTIME_DESTROY(family,fieldmatch[,matchvalue[,delim1[,delim2]]])

пример

exten => _0001,1,PlayBack(beep)
    same => n,Verbose(${CALLERID(NUM)});
    same => n,GoSub(sub-delsip,s,1(${CALLERID(NUM)}))

[sub-delsip]
exten => s,1,Verbose(${ARG1})
  same => n,Set(REALTIME_DESTROY(hints,channels,${ARG1},:,:)=ignored)
  same => n,Playback(ru/agent-loggedoff)
  same => n,hangup
См. также

Функции Asterisk

function 'REALTIME_HASH'

$
0
0

function 'REALTIME_HASH'

[Synopsis]
RealTime query function. [Description]
This function retrieves a single record from the RT engine, where <fieldmatch>
contains the value <matchvalue> and formats the output suitably, such that
it can be assigned to the HASH() function.  The HASH()functionthen provides
a suitable method for retrieving each field value of the record. [Syntax]
REALTIME_HASH(family,fieldmatch,matchvalue) [Arguments]
Not available
см. также

Функции Asterisk

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

Viewing all 1041 articles
Browse latest View live


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