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

Команда Asterisk: While

$
0
0

Команда Asterisk: While

Команда плана набора Asterisk While - Повторять цикл (loop) пока условие верно.

Описание

Петля создается между приложениями While() и EndWhile() и выполняется, пока условие заданное в While(условие) верно. Условие вычисляется один раз за цикл, в самом начале.
примечания:

  • Цикл While/EndWhile может параллельно выполнять множество наборов за раз.
  • Если условие неверно, выполнение диалплана продолжается после EndWhile
  • Модификатор цикла, приложение ContunueWhile
Синтаксис

While(expr)

Пример 1

exten => _4881,1,Answer
exten => _4881,n,Set(i=1)
exten => _4881,n,While($[${i} < 5])
exten => _4881,n,SayNumber(${i})
exten => _4881,n,Set(i=$[${i} + 1])
exten => _4881,n,EndWhile
пример 2

Сбор конференц-моста из БД, средствами диалплана, при помощи команды While()

БД:

+------+--------+
| id   | number |
+------+--------+
| 1    | 2666   |
| 2    | 2667   |
| 3    | 2668   |
+------+--------+

extconfig.conf:

 autoconfbridge = odbc,category(res_odbc.conf),autoconfbridge 

exten => _4884,1,Answer
 same => n,Set(i=1)
 same => n,While($[${i} <= 3]) ; макс кол-во участников.
 same => n,originate(SIP/${REALTIME_FIELD(autoconfbridge,id,${i},number)},app,confbridge,<conf_name>)
 same => n,Set(i=$[${i} + 1])
 same => n,EndWhile
пример: autodial

Автообзвон абонентов из базы данных средствами диалплана.

extconfig.conf

 autodial=>odbc,sql2,autodial

БД

> select * from autodial;
+------+--------+--------+-------+
| id   | number | status | count |
+------+--------+--------+-------+
| 1    | 2666   | new    | 0     |
| 2    | 2667   | new    | 0     |
| 3    | 2668   | new    | 0     |
+------+--------+--------+-------+

func_odbc.conf

[SQL]
dsn=sql2
mode=multirow
readsql=SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}

extensions.conf

[autodial]
exten => s,1,Noop
same => n,Set(_i=${ODBC_FETCH(${ODBC_SQL(1)})})  ;получаем id = SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}
  same => n,While($[${REALTIME_FIELD(autodial,id,${i},count)} <= 3])                            ; старт цикла
  same => n,Set(REALTIME(autodial,id,${i},status)=inuse)                                        ; статус вызова
  same => n,Dial(PJSIP/${REALTIME_FIELD(autodial,id,${i},number)}@fs_pjsip,5,U(sub-answer^s^1)) ; набор номера, с подпрограммой диалплана
                                                                                                ; sub-answer, выполняется, если вызываемый номер
                                                                                                ; ответил на вызов.
																								; ответил.
  same => n,Goto(s-${DIALSTATUS}) ; определяем действия в зависимости от статуса вызова
same => n(s-ANSWER),hangup  
same => n(s-NOANSWER),goto(s,loop) ; направим неотвеченные вызовы на приоритет loop
same => n(s-BUSY),goto(s,loop) 
same => n(s-CANCEL),Set(REALTIME(autodial,id,${i},status)=cancel)
same => n(s-CANCEL),hangup
  same => n(loop),set(count=${REALTIME_FIELD(autodial,id,${i},count)})                          ; приоритет для неотвеченных вызовов
  same => n,Set(REALTIME(autodial,id,${i},count)=$[${count} + 1])                               ; счетчик неотвеченных вызовов
  same => n,GotoIf($[${REALTIME_FIELD(autodial,id,${i},count)} >= 3]?no-answer,s,1)             ; если значение счетчика >= 3 
  same => n,ODBCFinish                                                                                              ; устанавливаем статус noanswer
  same => n,EndWhile
[sub-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=answer)
;exten => s,n,System(asterisk -rx 'channel  originate Local/s@autodial application queue queuename1')
; или
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))
  same => n,return
[no-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=noanswer)
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))

Активация

originate Local/s@autodial application queue <queuename>

или

originate Local/s@autodial application playback <playback_name>

и т.д.

originate Local/s@autodial application confbridge <conference_name>

и т.п.

Spoiler

БД после завершения автообзвона

> select * from autodial;
+------+--------+----------+-------+
| id   | number | status   | count |
+------+--------+----------+-------+
| 1    | 2666   | noanswer | 3     |
| 2    | 2667   | answer   | 2     |
| 3    | 2668   | answer   | 1     |
+------+--------+----------+-------+

см. также

Команды диалплана Asterisk


Asterisk func_odbc

$
0
0

Asterisk func_odbc

SQLоперации func_odbc.conf,
как функции диалплана Asterisk.
Подробное руководство. Примеры.

Основы func_odbc

Имена функций (контекстов) рекомендуется задавать в верхнем регистре, но, тем не менее, имена чувствительны к регистру.

 [TEST]

Каждый созданный контекст становиться отдельной функцией, которая и вызывается в диалплане.
Т.е., если в этом файле определен контекст [TEST], то выполнив перезагрузку модуля
module reload func_odbc.soмы увидим созданную функцию: core show function ODBC <Tab>

CLI> core show function ODBC
ODBC        ODBC_FETCH  ODBC_TEST

Для соединения с хранилищем определяется категория DSNиз конфига Asterisk: odbc.conf

 dsn=mysql1

Переменные аргументов ${ARGn}

Вызывая функцию в диалплане, оператору SQLпередаются аргументы, перечисленные через запятую:

ODBC_FUNCTION_NAME(<arg1>, <arg2> … <argN>)

Которые затем получаются оператором SQLв переменных ${ARG1},${ARG2},…${ARGn}:

 exten => _555,1,Dial(Local/${ODBC_FUNCTION_NAME(${EXTEN})}@from-internal/n,30,tr)
 readsql => SELECT src FROM cdr WHERE dst='${ARG1}' ORDER BY calldate DESC LIMIT 1;

Переменные значений ${VARn}

ODBC_FUNCTION_NAME(<arg1>, <arg2> … <argN>)=<val1>,<val2>…<valN>

Дополнительно возможно получить значения для записи в переменных ${VAR1},${VAR2},…${VARn} :

exten => h,1,Set(ODBC_FUNCTION_NAME(${UNIQUEID})=/record/${UNIQUEID}.mp3)

где, VAR1=/record/${UNIQUEID}.mp3, а ARG1=${UNIQUEID}:

writesql=UPDATE cdr SET userfield='${VAL1}' WHERE uniqueid='${ARG1}'

Полная строка ${VALUE}

И наконец, чтобы получить полную строку из диалплана, без разбора, используется переменная ${VALUE}:

 exten => _2666,1,set(ODBC_COS1()=${SQL_ESC(INSERT INTO cos1 (master,slave) VALUE (2666,3999))})

[COS1]
dsn=mysql2
writesql=${VALUE}

Чтобы экранировать данные, в которых могут использоваться одинарные кавычки « ' »
(иначе используются для выделения данных в SQLзапросе),
используется функция диалплана SQL_ESC().

Функция ODBC_FETCHобрабатывает много-строчные SQLзапросы и зависит от параметра mode=multirow:

Set(_i=${ODBC_FETCH(${ODBC_FOO(${foo})})})

general func_odbc.conf

single_db_connection

Asterisk использует отдельные соединения для каждой операции с базой данных.
Если 'single_db_connection' включена, то func_odbc будет использовать общее
подключение к базе данных по одному DSN.
Эта означает, что второй вызов func_odbc работает по тому же соединению.
Обратите внимание, что потребуются дополнительные действия в диалплане, чтобы это работало.
Вместо этого можно использовать хранимые процедуры (набор SQL-инструкций) на сервере SQL.
Эта опция по умолчанию отключена.

 [general]
 single_db_connection=no

Параметры функций func_odbc.conf

readhandle

Разделенный запятыми список DSN (из конфига res_odbc.conf.
Каждый DSNиз списка испытывается пока не удастся успешная операция 'readsql'.
Можно указать до 5-ти DSNдля каждого класса функций. По умолчанию не задано.

 readhandle=mysql1,mysql2

writehandle

Разделенный запятыми список DSN (из конфига res_odbc.conf.
Каждый DSNиз списка испытывается пока не удастся успешная операция 'writesql'.
Можно указать до 5-ти DSNдля каждого класса функций. Параметр 'dsn' синоним 'writehandle'.
По умолчанию не задано.

 writehandle=pgsql1,pgsql2

readsql,writesql

  • readsql - операция класса функций для чтения данных.
  • writesql - операция класса функцийй для записи данных.
  • insertsql - Данный параметр указан в оригинальном конфиге Asterisk, но судя по всему, не поддерживается (Asterisk 14)

prefix "ODBC"

По умолчанию все имена классов функций начинаются с «ODBC»
Задав префикс, можно изменить стандартное «ODBC» на ваш префикс. По умолчанию не задано.

 prefix=DIALER

escapecommas

Отключить экранирование запятых. По умолчанию экранируются.

Пример func_odbc escapecommas=no

synopsis

Появится в описании функции вызываемом командой 'core show function <function name>'
в разделе synopsis:

 synopsis=def codes for spb mobile calls

mode=multirow

Этот параметр может быть установлен в 'multirow', чтобы разрешить функции возвращать множество строк.
Это меняет стандартный режим работы 'func_odbc'.
Вместо того, чтобы вернуть просто строку, он возвращает ID для функции ODBC_FETCH(),
которая, в свою очередь, возвращает уже каждую строку по отдельности.
Переменная ODBC_FETCH_STATUS возвращает значение SUCCESS или FAILURE, чтобы понять были ли получены какие-либо результаты.
По завершении должна быть выполнена команда ODBCFinish, чтобы очистить любые оставшиеся результаты.
Переменная ODBCROWS возвращает число полученных строк.

rowlimit

Задает предельное число строк, которое может быть сохранено для этого запроса.
В режиме 'multirow' функция может получить большое количество строк и переполнить память до предела.
Чтобы избежать этого задается лимит.

; ODBC_SQL - Allow an SQL statement to be built entirely in the dialplan
[SQL]
dsn=mysql1
readsql=${ARG1}

; ODBC_ANTIGF - A blacklist.
[ANTIGF]
dsn=mysql1,mysql2   ; Use mysql1 as the primary handle, but fall back to mysql2
                    ; if mysql1 is down.  Supports up to 5 comma-separated
                    ; DSNs.  "dsn" may also be specified as "readhandle" and
                    ; "writehandle", if it is important to separate reads and
                    ; writes to different databases.
readsql=SELECT COUNT(*) FROM exgirlfriends WHERE callerid='${SQL_ESC(${ARG1})}'
syntax=<callerid>
synopsis=Check if a specified callerid is contained in the ex-gf database

; ODBC_PRESENCE - Retrieve and update presence
[PRESENCE]
dsn=mysql1
readsql=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}'
writesql=UPDATE presence SET location='${SQL_ESC(${VAL1})}' WHERE id='${SQL_ESC(${ARG1})}'

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

Spoiler

Asterisk pjsip.conf

$
0
0

Asterisk pjsip.conf

Описание параметров настройки pjsip в Asterisk. Подробное руководство на русском. Примеры и сравнения. pjsip vs chan_sip. pjsip cli.

PJSIP - драйвер канала SIP в Asterisk 12.

Что такое PJSIP

PJSIP мультимедийная библиотека с открытым кодом, для реализации протоколов SIP, SDP, RTP, STUN, TURNи ICE. Она сочетает лучшие возможности SIPсигнализации, хорошую проходимость NATи высокий уровень взаимодействия с приложениями. Подходит практически для любого типа систем, начиная от компьютеров и заканчивая встраиваемыми системами (embedded systems) и мобильными телефонами.

Формат файла pjsip.conf

Pjsip.conf обычный текстовый файл, как и все конфигурационные файлы Asterisk, состоит из секций. Каждая секция (раздел) определяет конфигурацию объекта res_pjsip.

Секции отделены друг от друга именами, заключенными в квадратные скобки [какая неожиданность]

и содержат одну или более конфигурационную опцию и её значение отделенное знаком равно.

[ SectionName ] 
ConfigOption = Value 
ConfigOption = Value

Имена секций pjsip.conf

В большинстве случаев имена секций могут быть произвольными, однако в случае с типами ENDPOINT и AORимена должны

совпадать со заголовком SIPURI«To» для идентификации входящих SIPзапросов.

Каждая секция имеет обязательную опцию type=, которой определяется назначение секции в конфигурации объектов res_pjsip.

Типы секций pjsip.conf

Ниже перечислены типы секций res_pjsipи простейшие примеры конфигурации.

Варианты и значения по умолчанию

Как узнать возможные варианты значений и параметры по умолчанию?

В этом поможет встроенная справка интерфейса командной строки (CLI).

«config show help res_pjsip <configobject> <configoption>»

config show help res_pjsip aor

ENDPOINT

Модуль ENDPOINT определяет многочисленные параметры SIP, а также связь с другими модулями - AUTH, AORи TRANSPORT.
Секция ENDPOINT должна быть обязательно связана с одной или несколькими секциями AOR.
По сути дела, ENDPOINT является основным профилем SIPтелефона или SIPтранка в res_pjsip, аналогично пиру в sip.conf.
Только если там определялись почти все параметры, то здесь часть ключевых свойств вынесены в специальные секции (модули), которые и будут рассмотрены ниже.

config show help res_pjsip endpoint
Простой пример конфигурации секции ENDPOINT

[777]
type=endpoint
context=from-internal
disallow=all
allow=alaw
transport=udp-transport
auth=auth777
aors=777
В данном примере мы видим тип секции: type=endpoint
контекст, разрешенные кодеки и также ассоциацию с другими секциями
transport=udp-transport, auth=auth777и aors=777.
Насколько я понимаю, опции typeи aorsявляются обязательными для работоспособности точки.
Для назначения Caller ID этому пиру(ENDPOINT), потребуется задать следующие параметры:
trust_id_outbound=yes
callerid=V Pupkin <777>

TRANSPORT

Настройка транспортного уровня res_pjsip. Используются протоколы UDP, TCP, WebSockets и методы шифрования TLS/SSL. Можно настроить одну транспортную секцию для использования множеством точек (ENDPOINT), или создать уникальный транспортный уровень для конкретной точки. Условно, можно сравнить TRANSPORT, с секцией [general] sip.conf.

config show help res_pjsip transport

По умолчанию, для применения настроек транспортного уровня недостаточно перечитать конфиги. Потребуется рестартовать Asterisk, если не задано allow_reload=true (по умолчанию - false)

простой пример конфигурации секции TRANSPORT

[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

или TLS транспорт:

[tls-transport]
type=transport
protocol=tls
bind=0.0.0.0
;various TLS specific options below:
cert_file=
privkey_file=
ca_list_file=
cipher=
method=
Каждый транспорт в вашей системе должен иметь уникальный порт (также как и в sip_profilesво FreeSWITCH)

localhost*CLI> pjsip show transports

Transport:  <TransportId........>  <Type>  <cos>  <tos>  <BindAddress....................>
 =========================================================================================

Transport:  udp-transport             udp      0      0  0.0.0.0:5080
Transport:  udp-transport-infra       udp      0      0  192.168.1.110:5081
Transport:  udp-transport-megafon     udp      0      0  0.0.0.0:5060

AUTH

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

config show help res_pjsip auth
Простой пример секции AUTH

[auth777]
type=auth
auth_type=userpass
password=password
username=777
с использованием MD5
[auth6001]
type=auth
auth_type=md5
md5_cred=5f4dcc3b5aa765d61d8327deb882cf99
username=777

AOR

Главная функция AoR (Address of Record) указать Asterisk, как связаться с ENDPOINT. Без соответствующей AORсекции, точка ENDPOINT будет недоступна для вызова. Здесь также задаются соответствия голосовой почте, MWI, продолжительность действия регистрации -expiration и настройки qualify (периодической отправки SIPсообщений OPTONS для мониторинга состояния устройств)

Когда Asterisk получает запрос на регистрацию от устройства, он в первую очередь ищет соответствующую SIPзаголовку To: «777»<sip:777@192.168.1.21;transport=UDP> запись в именах секций AOR– в нашем прмере [777]

config show help res_pjsip aor
Простейший пример секции AOR

[777]
type=aor
max_contacts=1
Опция max_contact=1 значит, что только один SIP User Agent может быть одновременно зарегистрирован через эту запись AOR,
можно указать и 10, если потребуется.
[777]
type=aor
contact=sip:777@192.168.1.21:5060
Во втором примере мы не ожидаем запроса на регистрацию от SIP UA,
а указываем вручную постоянный контакт для этой записи.
Можно не беспокоится о кол-ве подключений, адрес все равно один.
[siptrunk]
type=aor
contact=sip:123.123.1.1:5060
В последнем примере пропущен username, что позволяет использовать данную запись для исходящей связи,
определяя вызываемый номер при помощи диалплана «Dial(PJSIP/${EXTEN}@siptrunk)».

REGISTRATION

Секция регистраций отвечает за исходящие регистрации. Используется для регистрации в удаленных системах, будь то другой Asterisk или транк от провайдера.

config show help res_pjsip_outbound_registration registration
Пример секции REGISTRATION

[siptrunk]
type=registration
transport=udp-transport
outbound_auth=siptrunk
server_uri=sip:123.123.1.1:5060
client_uri=sip:username@192.168.1.1:5060
retry_interval=60
Для регистрации понадобится определить используемый транспорт и секцию аутентификации.
Помимо этого, наверняка, потребуется указать контакт для входящих вызовов.

[providertrunk]
type=registration
transport=udp-transport
outbound_auth=providertrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60
Пример регистрации транка провайдера.

DOMAIN_ALIAS

Псевдоним домена. [Имя] данной секции является псевдонимом, а конфигурационная опция domain=, доменным именем, которому сопоставлен псевдоним.

config show help res_pjsip domain_alias
Пример секции DOMAIN_ALIAS

[example2.com]
type=domain_alias
domain=example.com

ACL

Модуль не привязан к какой-либо точке ENDPOINTs и управляет всеми входящими SIPкоммуникациями с использованием res_pjsip. Установки ACl (Access Control Lis) могут быть назначены в самой секции, или в файле acl.confна который будет ссылаться секция.

config show help res_pjsip_acl acl
Простые примеры ACL

Asterisk 12 res_pjsip_acl

Настройки берутся из файла acl.conf:

[acl]
type=acl
acl=example_named_acl1
Настройки непосредственно в секции:
[acl]
type=acl
deny=0.0.0.0/0.0.0.0
permit=123.12.123.0
permit=123.12.123.1
Конфиг разрешающий регистрацию на основе SIPзаголовка, а не IP адреса.
[acl]
type=acl
contactdeny=0.0.0.0/0.0.0.0
contactpermit=123.12.123.0
contactpermit=123.12.123.1

IDENTIFY

Определяет конечные точки с помощью IP-адреса источника.

config show help res_pjsip_endpoint_identifier_ip identify
Пример identity

[777]
type=identify
endpoint=777
match=123.0.112.1

CONTACT

Контакты являются одним из способов не указывать явно SIPURIв плане набора (диалплане).

config show help res_pjsip contact

Отношения объектов конфигурации pjsip.conf

ENDPOINT

  • Множество ENDPOINTs связываются с множеством AORs
  • Ноль или больше ENDPOINTs связаны с ноль или одной AUTHs
  • Ноль или больше ENDPOINTs связаны с как минимум одним TRANSPORT
  • Ноль или одна ENDPOINTs связана с определенной IDENTIFY

REGISTRATION

  • Ноль или больше REGISTRATIONs связаны с ноль или одной AUTHs
  • Ноль или больше REGISTRATIONs связаны с как минимум одним TRANSPORT

AOR

  • Множество ENDPOINTs связываются с множеством AORs
  • Множество AORs связаны с множеством CONTACTs

CONTACT

  • Множество CONTACTs связываются с множеством AORs

IDENTIFY

  • Ноль или больше ENDPOINTs связаны с определенным IDENTIFY объектом.

ACL, DOMAIN_ALIAS

  • Эти объекты не имеют направленных связей с другими объектами.

Примеры диалплана для вызова PJSIP пиров и екстеншенов.

 exten => _6XXX,1,Dial(PJSIP/${EXTEN})
 exten => _9NXXNXXXXXX,1,Dial(PJSIP/mytrunk/sip:${EXTEN:1}@203.0.113.1:5060)
 exten => _9NXXNXXXXXX,1,Dial(PJSIP/${EXTEN:1}@mytrunk)

Примеры

Пример ENDPOINT для одного SIP телефона с регистрацией на Asterisk.

;===============TRANSPORT
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0
;===============EXTENSION 777
[777]
type=endpoint
context=from-internal
disallow=all
allow=alaw
transport=udp-transport
auth=auth777
aors=777
[auth777]
type=auth
auth_type=userpass
password=777
username=777
[777]
type=aor
max_contacts=1
  • auth= используется для входящей аутентификации
  • max_contacts= установите кол-во регистраций, одну или более, разрешенных для этой учетной записи.
Пример SIP транка с исходящей регистрацией

;==============TRANSPORTS
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0
;===============TRUNK
[siptrunk]
type=registration
transport=udp-transport
outbound_auth=siptrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60
[siptrunk]
type=auth
auth_type=userpass
password=1234567890
username=1234567890
[siptrunk]
type=aor
contact=sip:123.0.112.1:5060
[siptrunk]
type=endpoint
transport=udp-transport
context=from-trunk
disallow=all
allow=alaw,ulaw
outbound_auth=siptrunk
aors=siptrunk
[siptrunk]
type=identify
endpoint=siptrunk
match=123.0.112.1
Пример регистрации множественных ENDPOINTs с использованием шаблонов

;===============TRANSPORT
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0
;===============ENDPOINT TEMPLATES
[endpoint-basic](!)
type=endpoint
transport=udp-transport
context=from-internal
disallow=all
allow=alaw
[auth-userpass](!)
type=auth
auth_type=userpass
[aor-single-reg](!)
type=aor
max_contacts=1
;===============EXTENSION 777
[777](endpoint-basic)
auth=auth777
aors=777
[auth777](auth-userpass)
password=777
username=777
[777](aor-single-reg)
;===============EXTENSION 778
[778](endpoint-basic)
auth=auth778
aors=778
[auth778](auth-userpass)
password=778
username=778
[778](aor-single-reg)
;===============EXTENSION 779
[779](endpoint-basic)
auth=auth779
aors=779
[auth779](auth-userpass)
password=779
username=779
[779](aor-single-reg) 

От старого к новому - sip.conf к pjsip.conf сравнение примеров.

Сравнение конфигурации ENDPOINT

  • Два SIPтелефона должны звонить и принимать вызовы через Asterisk.
  • В обоих случаях для аутентификации используются username и password.
  • 777 регистрируется с динамического IP, 778 со статического IP адреса.

1

sip.confpjsip.conf
[general]
udpbindaddr=0.0.0.0
[777]
type=friend
host=dynamic
disallow=all
allow=alaw
context=from-internal
secret=1234
[778]
type=friend
host=192.168.1.2
disallow=all
allow=alaw
context=from-internal
secret=1234
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0
[777]
type = endpoint
transport = udp-transport
context = from-internal
disallow = all
allow = alaw
aors = 777
auth = auth777
[777]
type = aor
max_contacts = 1
[auth777]
type=auth
auth_type=userpass
password=1234
username=777
[778]
type = endpoint
transport = udp-transport
context = from-internal
disallow = all
allow = alaw
aors = 778
auth = auth778
[778]
type = aor
contact = sip:778@192.168.1.2:5060
[auth778]
type=auth
auth_type=userpass
password=1234
username=778

Сравнение конфигурации trunk

sip.confpjsip.conf
[general]
udpbindaddr=0.0.0.0
register => myaccountname:1234567890@203.0.113.1:5060

[mytrunk]
type=friend
secret=1234567890
username=myaccountname
host=123.0.112.1
disallow=all
allow=alaw
context=from-trunk
[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0 
[mytrunk]
type=registration
transport=simpletrans
outbound_auth=mytrunk
server_uri=sip:@123.0.112.1:5060
client_uri=sip:myaccountname@123.0.112.1:5060
[mytrunk]
type=auth
auth_type=userpass
password=1234567890
username=myaccountname
[mytrunk]
type=aor
contact=sip:123.0.112.1:5060
[mytrunk]
type=endpoint
transport=simpletrans
context=from-trunk
disallow=all
allow=alaw
outbound_auth=mytrunk
aors=mytrunk
[mytrunk]
type=identify
endpoint=mytrunk
match=123.0.112.1

PJSIP CLI

Connected to Asterisk 13.9.1 currently running on aster2 (pid = 17401)
asterisk*CLI> core show help pjsip
pjsip dump endpt               -- Dump the res_pjsip endpt internals
pjsip export config_wizard primitives [to] -- Export config wizard primitives
pjsip list aors                -- List PJSIP Aors
pjsip list auths               -- List PJSIP Auths
pjsip list channels            -- List PJSIP Channels
pjsip list ciphers             -- List available OpenSSL cipher names
pjsip list contacts            -- List PJSIP Contacts
pjsip list endpoints           -- List PJSIP Endpoints
pjsip list identifies          -- List PJSIP Identifies
pjsip list registrations       -- List PJSIP Registrations
pjsip list transports          -- List PJSIP Transports
pjsip qualify                  -- Send an OPTIONS request to a PJSIP endpoint
pjsip send register            -- Registers an outbound registration target
pjsip send unregister          -- Unregisters outbound registration target
pjsip set history {on|off|clear} -- Enable/Disable PJSIP History
pjsip set logger {on|off|host} -- Enable/Disable PJSIP Logger Output
pjsip show aors                -- Show PJSIP Aors
pjsip show aor                 -- Show PJSIP Aor
pjsip show auths               -- Show PJSIP Auths
pjsip show auth                -- Show PJSIP Auth
pjsip show channels            -- Show PJSIP Channels
pjsip show channel             -- Show PJSIP Channel
pjsip show channelstats        -- Show PJSIP Channel Stats
pjsip show contacts            -- Show PJSIP Contacts
pjsip show contact             -- Show PJSIP Contact
pjsip show endpoints           -- Show PJSIP Endpoints
pjsip show endpoint            -- Show PJSIP Endpoint
pjsip show history             -- Display PJSIP History
pjsip show identifiers         -- List registered endpoint identifiers
pjsip show identifies          -- Show PJSIP Identifies
pjsip show identify            -- Show PJSIP Identify
pjsip show registrations       -- Show PJSIP Registrations
pjsip show registration        -- Show PJSIP Registration
pjsip show settings            -- Show global and system configuration options
pjsip show transports          -- Show PJSIP Transports
pjsip show transport           -- Show PJSIP Transport
pjsip show version             -- Show the version of pjproject in use

Asterisk: Настройка

Asterisk: res_odbc.conf

$
0
0

Asterisk: res_odbc.conf

Файл настроек соединений c БД через unixODBC. MySQL, PostgreSQL, MSSQL, SQLite.

Параметры ODBC соединений

[ENV] - Глобальные переменные

В Секции с встроенным названием [ENV] назначаются глобальные переменные окружения, которые можно использовать для любых подключений, заданных в данном файле.

[ENV]
INFORMIXSERVER => my_special_database
INFORMIXDIR => /opt/informix
ORACLE_HOME => /home/oracle

Имена контекстов (подключений)

Остальные секции имеют произвольные имена. Эти имена, в дальнейшем, используются в других конфигах, таких как extconfig.confи func_odbc.confдля связи с этими соединениями.

 [asterisk]

enabled

Позволяет отключать секцию, без использования комментария:

 enabled => no

Если явно не выключено, категория (секция) считается включенной.

dsn

Это значение должно совпадать с записью в /etc/odbc.ini (или /usr/local/etc/odbc.ini во FreeBSD и подобных системах).

 dsn => asterisk

username

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

 username => myuser

password

Пароль для аутентификации в базе данных. По умолчанию не задан.

 password => mypass

pre-connect

Подключаться при старте Asterisk?

 pre-connect => yes

sanitysql

Как определить, что соединение живое? Должно возвращаться не нулевое значение в первом поле, первой записи. По умолчанию «select 1».

 sanitysql => select 1

max_connections

Максимальное кол-во подключений в момент времени. Значение по умолчанию =1 и очень хорошая идея увеличить это значение, если версия unuxODBC 2.3.1 и выше.

 max_connections => 20

forcecommit

Если канал закрыт, должны ли какие-либо незавершенные транзакции, продолжать выполнение.

 forcecommit => no

isolation

Отношения с другими транзакциями в базе данных.
Возможные значения: read_uncommitted, read_committed, repeatable_read и serializable. По умолчанию read_committed.

 isolation => repeatable_read

backslash_is_escape

Обратный слэш '\' знак комментария. По умолчанию = yes, но для MS SQL Server, установите = no.

  backslash_is_escape => yes

connect_timeout

Как долго (в секундах), пытаться подключиться, прежде чем считать соединение мертвым? Значение по умолчанию составляет 10 секунд, но можно уменьшить его, чтобы повысить скорость реакции.

 connect_timeout => 10

negative_connection_cache

Если соединение упало, как долго (в секундах), кэшировать информацию, прежде чем предпринять попытку нового соединения?

 negative_connection_cache => 300

примеры

MySQL, MS SQLи PostgreSQL

MySQL

[mysql2]
enabled => no
dsn => MySQL-asterisk
username => myuser
password => mypass
pre-connect => yes

MS SQL

Некоторые сервера, такие как MS SQLи Sybase использующие TDS, ограничивают кол-во запросов для одного подключения до 1. Если запретить общее использование соединений (share_connections ⇒ no) Asterisk может с ними работать.

[sqlserver]
enabled => no
dsn => mickeysoft
share_connections => no
limit => 5
username => oscar
password => thegrouch
pre-connect => yes
sanitysql => select count(*) from systables
; forcecommit => no            ; Default to committing uncommitted transactions?
                               ; Note:  this is NOT the autocommit flag; this
                               ; determines the end result of transactions which
                               ; are not explicitly committed or rolled back.  By
                               ; default, such transactions are rolled back if the
                               ; call ends without an explicit commit.
; isolation => read_committed  ; Isolation level; supported levels are:
                               ; read_uncommitted, read_committed, repeatable_read,
                               ; serializable.  Note that not all databases support
                               ; all isolation levels (e.g. Postgres only supports
                               ; repeatable_read and serializable).  See database
                               ; documentation for further information.
;
; Many databases have a default of '\' to escape special characters.  MS SQL
; Server does not.
backslash_is_escape => no

;
; If you are having problems with concurrency, please read this note from the
; mailing lists, regarding UnixODBC:
;
; http://lists.digium.com/pipermail/asterisk-dev/2009-February/036539.html
;
; In summary, try setting "Threading=2" in the relevant section within your
; odbcinst.ini.
;

pgsql

PostgreSQL

[postgres]
enabled => yes
dsn => testing
pre-connect => yes

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

Команда Asterisk Dial

$
0
0

Команда Asterisk Dial

Важнейшее приложение плана набора Asterisk - Dial. Полное описание. Примеры использования опций.

Команда диалплана Asterisk "Dial"

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

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

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

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

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

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

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

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

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

Синтаксис

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

Аргументы

Technology/Resource

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

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

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

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

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

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

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

[icoming]
exten => _9981138,1,Dial(SIP/666&PJSIP/89219981138@siptrunk,,b(option-b,s,1))

[option-b]
exten => s,1,Verbose(*option b*)
exten => s,n,return
  • B([[context^]exten^]priority[(arg1[^...][^argN])]): Выполнить переход, аналогичный GoSub до того, как будет вызван канал указанный в Technology/Resource

[sub-4555]
exten => s,1,playback(${ARG1})
exten => s,n,return
[from-4555]
exten => _4555,1,Answer
exten => _4555,n,Dial(PJSIP/2829@fs_pjsip,60,B(sub-4555,s,1(demo-congrats)))

Таким образом, опция 'b' работает для нескольких каналов, перечисленных в Technology/Resource, 'B' - для одного.

  • C: Не создавать запись детализированного отчета о звонках (CDR) для этого вызова.
  • c: Если приложение Dial() отменяет этот вызов, всегда устанавливать HANGUPCAUSE в 'answered elsewhere'
  • d: Позволяет вызывающему абоненту набрать одну цифру, во время ожидания ответа. Расширение должно быть назначено в текущем контексте или в контексте определенном переменной EXITCONTEXT.
  • D([called][:calling[:progress]]): Отправить DTMFстроку набора, после ответа на вызов, но до того как каналы будут соединены.

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

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

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

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

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

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

[macro-testM]
exten = s,1,verbose(${ARG1})
    same => n,verbose(${ARG2})
	same => n,set(MACRO_RESULT=BUSY)
вывод консоли для приведенного выше диалплана
  • n(delete) - Mодификатор экранного/конфиденциального режима (screen/privacy mode). Определяет, что вступления (introductions) не должны сохраняться в папке priv-callerintros.
    • delete - удалить группу если не указано или установлено - 0, записанное представление не будет удалено, если вызывающий абонент повесит трубку до ответа. если установлено 1 - вступление всегда удаляется.
  • N - This option is a modifier for the call screening/privacy mode. It specifies that if Caller*ID is present, do not screen the call.
  • o(x) - Использует Caller ID входящего вызова,в качестве Caller ID для исходящего вызова. Это полезно, если вы переадресовали вызов и хотите, чтобы адресат трансфера видел callerid внешнего абонента. Если o(${CALLERID(all)})аналогично oбез параметра.
  • O(x) - Включает режим оператора услуг. Эта опция работает только при вызове каналом DAHDI, другого DAHDIканала. Если используется не DAHDIинтерфейс опция буден проигнорирована. Когда оператор ответил, вызывающий канал теряет контроль над линией и не может, например, прервать вызов, пока это не сделает оператор.
    • mode:
      • 1 - если звонящий повесит трубку, раньше оператора, то будет немедленно вызван снова.
      • 2 - вернет вызов оператору, если он повесит трубку.
  • p - Включает режим экрана( screening mode). Это основной privacy mode без запоминания.
  • P(x) - Включает частный режим (privacy mode). Использует параметр x, как family/key в AstDB. Если (x) не задан, в качестве ДБ family/key используется текущий екстеншен.
  • r(tone) - По умолчанию: Генерирует КПВ вызывающей стороне, даже если вызываемая сторона на самом деле не звонит. Аудио канал не подключается, пока вызываемая сторона не ответит.
    • tone - генерирует КПВ тон, назначенный в indications.confдля текущей зоны.
  • R - Тоже, что и r, но разрешает заменить КПВ, если early media получен для данного канала.
  • S(x) - Повесить трубку через (x) секунд после ответа.
  • s(x) - принудительно подставить (х) callerid для исходящего вызова. Работает с опцией f
  • t - Разрешает вызываемойстороне, переадресовать вызов DTMFкодом, назначенным в features.conf.
  • T - Разрешает вызывающейстороне, переадресовать вызов DTMFкодом, назначенным в features.conf.

Будьте осторожны с назначением опции (T). При некоторых условиях, она может быть использована для взлома Asterisk.

  • U(x[^arg[^…]]): - Выполнить GoSubмаршрут, после ответа вызываемой стороны. синтаксис: U(sub^ARG1^ARG2). После выполнения возвращает переменную ${GOSUB_RESULT}:
    • GOSUB_RESULT
      • ABORT - Всем отбой.
      • CONGESTION - Канал переполнен.
      • BUSY - Канал занят.
      • CONTINUE - Выполнить следующий приоритет. если вызываемая сторона положила трубку.
      • GOTO:[[<CONTEXT>^]<EXTEN>^]<PRIORITY> - перейти на указанный контекст.
    • x - имя контекста GoSub.
    • arg - аргументы GoSub

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

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

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

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

см. также

Asterisk Dialplan - extensions.conf

Команды диалплана Asterisk

MacroIf

$
0
0

MacroIf

[Synopsis]

Conditional Macro implementation.

[Description]

Executes macro defined in <macroiftrue> if <expr> is true (otherwise <mac roiffalse> if provided) Arguments and return values as in application Macro() 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.

[Syntax]

MacroIf(expr?macroiftrue[,arg1[,...]][:macroiffalse[,arg1[,...]]])

[Arguments] Not available

[See Also]GotoIf(), Asterisk app:GosubIf(), Функция Asterisk IF

Команды диалплана Asterisk

Функция Asterisk IF

$
0
0

Функция Asterisk IF

Функция диалплана Asterisk - IF, проверяет правильность выражения.

Описание

Проверяет выражение (expresion) и возвращает данные, указанные после «?», если выражение правдиво (true) или данные после «:» если выражение ложно (false)

Синтаксис

Call Center на Asterisk

$
0
0

Call Center на Asterisk

Колл-Центр обработки входящих вызовов. Русскоязычный Веб-интерфейс. Статистика работы агентов и очередей в режиме реального времени. Недорогой, эффективный, легко настраиваемый call центр.

Базовые функции:

  • голосовое меню (IVR);
  • маршрутизация вызовов по времени;
  • очередь центра обработки вызовов
  • группы приема вызовов;
  • переадресации на внутренних или внешних абонентов;
  • голосовые конференции;
  • запись переговоров;
  • статистика звонков (CDR);
  • статистика работы очереди;

ПО

  • Asterisk 13.xx
  • FreePBX 13 - Русифицированный, интуитивно понятный веб-интерфейс для настройки Asterisk.
    • Asterisk CDR viewer - Детализированный отчет о звонках, прослушивание записанных разговоров
  • Call Center Stats - Статистика очередей колл-центра
  • FOP2 - Панель оператора

Работы:

  • Инсталляция и базовые наcтройки безопасности.
  • Настройка по согласованному ТЗ.

Колл Центр или Центр Обработки Вызовов (ЦОВ)

Asterisk прекрасно справляется с организацией как небольших колл центров, так и более мощных систем.
Приложение queue обеспечивает постановку абонента в очередь по принципу FIFO (первый вошел, первый вышел).

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

Реализацию функционала колл-центра в Asterisk можно условно разделить на уровень АТС, уровень приложений АТС и уровень приложений 3-й стороны (3rd party) :

Базовые функции маршрутизации и обработки вызовов реализованы непосредственно в Asterisk:

  • Организация очереди (обработка вызовов в порядке поступления).
  • Маршрутизация вызова по номеру абонента.
  • Интерактивные Голосовые Сообщения / IVR.
  • Распределение вызовов среди агентов по занятости или по порядку.

asterisk freepbx queue

Гибкое распределение вызовов между агентами колл центра в соответствии с заданной политикой.

  • Звонят все агенты
  • Звонят наименее занятые
  • Вызываются по кругу с последнего ответившего.
  • Линейно (в порядке перечисления)
  • Случайным образом

asterisk freepbx queue strategy

Параметры времени и операторов

Так же «очередь» имеет множество опций обработки вызова и работы агентов:

  • Приветствие оператору — проигрывается агенту прежде чем, тот соединиться с позвонившим из очереди

(например: «звонок из очереди «Продажи» - при обработке одним агентом звонков из нескольких очередей).

  • Приветствие позвонившему — проигрывается один раз при попадании в очередь.
  • Музыка на удержании — проигрывается при ожидании в очереди, можно заменить на рекламную информацию.
  • Максимальное время ожидания в очереди или неограниченно.
  • Максимальная длина очереди - максимальное количество позвонивших или неограниченно.
  • Стратегия дозвона (смотри выше: тип выбора свободного агента)
  • Таймаут — время вызова свободного оператора или неограниченно
  • Повтор — время повторения вызова операторов.
  • Передышка — пауза для оператора завершившего разговор вызов.
  • Сообщение о позиции в очереди
  • Сообщение о среднем времени ожидания в очереди.
  • Вставка сообщения авто-секретаря с возможностями прямого набора номера или системы голосовых меню.

asterisk freepbx timers

Рассчитывается среднее время ожидания в очереди и ожидающий абонент информируется о номере в очереди и оставшемся времени ожидания.

Параметры ёмкости очереди

Все разговоры могут быть записаны в формате wav или gsm, с возможностью последующего поиска и скачивания записи в детализированном отчете о звонках (CDR) Детализированный отчет о звонках (CDR) храниться в базе данных MySQL. Доступ к отчетам осуществляется через веб-интерфейс и предоставляет возможности для поиска, сортировки и сравнения вызовов за разные периоды времени.

В информации о входящем вызове сохраняются

  • Дата и время звонка
  • Продолжительность вызова
  • Номер позвонившего
  • Номер оператора или агента.
  • Номер очереди
  • Ссылка на запись разговора.

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

  • Регистрация всех входящих и исходящих вызовов
  • Запись переговоров
  • Статус оператора (свободен, занят, пауза)

Веб-интерфейс для статистики очередей и агентов.

  • Количество принятых вызовов за указанный период времени
  • Количество отвеченных вызовов
  • Количество не отвеченных вызовов
  • Среднее время разговора

Следующие отчеты интегрированы в Asternic Call Center Stats :

Распределение: по очередям, по месяцам, по неделям, по дням, по часам.

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

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

Текущее состояние агентов: продолжительность работы или простоя, состояние текущего вызова, текущее кол-во вызовов в очереди)

Приложения использующие информацию о вызовах сохраненную в БД и логах (CDRстатистика, Статистика очереди ):

  • Приложения для создания отчетов о входящих/исходящих вызовах и поиска записей.
  • Приложения для создания отчетов о качестве работы операторов(качество обслуживания.

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

  • Real Time статус операторов, очередей и каналов.

FOP2 - Flash Operator Panel

Приложения контроля интеллектуального набора. Хотя набор номеров и маршрутизацию осуществляет сам Asterisk, для интеллектуального дозвона требуется приложение которое инициировало бы вызовы по заданному списку и управляло алгоритмом набора.

  • Автоматизированный набор номера (predictive dialer)

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

  • Визуализация данных о клиенте (карточка клиента) на основании номера абонента (CallerID)

Услуги по установке и настройке IP АТС Asterisk.

 

Команда Asterisk Gosub

$
0
0

Команда Asterisk Gosub

Приложение диалплана Asterisk - GoSub выполняет указанный контекст и возвращает вызов в исходный.

Описание

GoSub действует подобно Macro, но в отличии от него может вызывать любой екстеншен, а не только s, как в Macro.

Синтаксис

Gosub([[context,]exten,]priority[(arg1[,...][,argN])])

Перенаправить выполнение диалплана в <sub контекст, на расширение exten и указанный приоритет, передав заданные аргументы,
с последующим возвращением в исходный контекст.

См. также

примеры

Запись вызова .

[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

FreePBX совместимая запись разговоров.

[from-internal]
include => record

[record]
exten => _X.,1,Gosub(sub-record-check-custom1,s,1(out,${EXTEN},))
exten => _X.,n,Dial(DAHDI/g0/${EXTEN}

[sub-record-check-custom1]
exten => s,1,Set(REC_POLICY_MODE_SAVE=${REC_POLICY_MODE})
exten => s,n,GotoIf($["${BLINDTRANSFER}" = ""]?check)
exten => s,n,ResetCDR()
exten => s,n,GotoIf($["${REC_STATUS}" != "RECORDING"]?check)
exten => s,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => s,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},a,${MIXMON_POST})
exten => s,n(check),Set(__MON_FMT=${IF($["${MIXMON_FORMAT}"="wav49"]?WAV:${MIXMON_FORMAT})})
exten => s,n,GotoIf($["${REC_STATUS}"!="RECORDING"]?next)
exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => s,n,Return()
exten => s,n(next),ExecIf($[!${LEN(${ARG1})}]?Return())
exten => s,n,ExecIf($["${REC_POLICY_MODE}"="" & "${ARG3}"!=""]?Set(__REC_POLICY_MODE=${ARG3}))
exten => s,n,GotoIf($["${REC_STATUS}"!=""]?${ARG1},1)
exten => s,n,Set(__REC_STATUS=INITIALIZED)
exten => s,n,Set(NOW=${EPOCH})
exten => s,n,Set(__DAY=${STRFTIME(${NOW},,%d)})
exten => s,n,Set(__MONTH=${STRFTIME(${NOW},,%m)})
exten => s,n,Set(__YEAR=${STRFTIME(${NOW},,%Y)})
exten => s,n,Set(__TIMESTR=${YEAR}${MONTH}${DAY}-${STRFTIME(${NOW},,%H%M%S)})
;exten => s,n,Set(__FROMEXTEN=${IF($[${LEN(${AMPUSER})}]?${AMPUSER}:${IF($[${LEN(${REALCALLERIDNUM})}]?${REALCALLERIDNUM}:unknown)})})
exten => s,n,Set(__FROMEXTEN=${CALLERID(name)})
exten => s,n,Set(__CALLFILENAME=${ARG1}-${ARG2}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID})
exten => s,n,Goto(${ARG1},1)



;exten => out,1,ExecIf($["${REC_POLICY_MODE}"=""]?Set(__REC_POLICY_MODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)}))
;статус записи вкл
exten => out,1,ExecIf($["${REC_POLICY_MODE}"=""]?Set(__REC_POLICY_MODE=always))
exten => out,n,GosubIf($["${REC_POLICY_MODE}"="always"]?record,1(exten,${ARG2},${FROMEXTEN}))
exten => out,n,Return()


exten => record,1,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
exten => record,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MIXMON_FORMAT},,${MIXMON_POST})
exten => record,n,Set(__REC_STATUS=RECORDING)
exten => record,n,Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT})
exten => record,n,Return()

Команды диалплана Asterisk

Asterisk: confbridge.conf

$
0
0

Asterisk: confbridge.conf

Confbridge.conf - файл конфигурации конференций в Asterisk. Содержит категории профилей пользователей конференции и профилей конференц-мостов, а также настройки меню управления конференциями.

Профили телеконференций по умолчанию

'default_user' и 'default_bridge' секции применяются автоматически для всех Конференц-Мостов (ConfBridge) вызываемых без явного указания пользователя или моста (см. Asterisk app: ConfBridge ) Свойства меню для мостов по умолчанию отсутствуют. Если профили по умолчанию 'default_user' или 'default_bridge' удалены они будут снова добавлены при загрузке модуля.

Профиль пользователя конференц-моста

ConfBridge User Profile Options

[default_user]

 [default_user]
type

Пользовательская категория (профиль).

  type=user
admin

Предоставить права администратора или нет. Выкл по умолчанию.

 admin=yes
marked

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

 marked=yes
startmuted

Выключить микрофон участника при подключении к телеконференции. По умолчанию параметр выкл.

 startmuted=yes
music_on_hold_when_empty

Проигрывать Музыку на Удержании одинокому участнику конференции.
Или участнику конференции ожидающему маркированного пользователя.
Выкл по умолчанию.

 music_on_hold_when_empty=yes
music_on_hold_class

Класс MOH (Музыки на Удержании) для данного профиля пользователя.

 music_on_hold_class=default
quiet

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

 quiet=yes
announce_user_count

Сообщить кол-во участников новому пользователю конференции. По умолчанию выкл.

 announce_user_count=yes
announce_user_count_all

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

 announce_user_count_all=yes
announce_only_user

Сообщить пользователю о входе в пустую конференцию. Включено по умолчанию.

 announce_only_user=yes
wait_marked

Пользователь не становиться участником конференции, до подключения промаркированного пользователя (см. также music_on_hold_when_empty=yes). выкл по умолчанию.

  wait_marked=yes
end_marked

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

 end_marked=yes
dsp_drop_silence

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

 dsp_drop_silence=yes
dsp_talking_threshold

Временной порог распознавания голосовой активности (в миллисекундах),
за которым считается, что участник держит речь.
Этот параметр влияет на разные аспекты конференции
и не должен изменяться, без явного понимания последствий для качества звука.
Как это может повлиять:

  1. Аудио только тогда передается пользователям,

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

  1. Если речь распознается для отображения в событиях AMI,

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

  1. Параметр 'dsp_drop_silence' использует это значение,

когда определяет начало речи после периода тишины. Если значение слишком расплывчатое, начало речи будет обрезаться детектором молчания.

По умолчанию значение 160 ms. Возможные значения от 1 до 2^31 (2147483648).

 dsp_talking_threshold=128
dsp_silence_threshold

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

Какое влияние может оказывать:
'dsp_drop_silence' параметр, напрямую зависит от данной опции. Если значение слишком низкое, речь, ведущего в данный момент участника, может звучать прерывистой для остальных слушателей. Это вызвано тем, что DSP будет считать молчанием малейшую паузу, обрывая оратора на полуслове

Лучше всего установить данное значение, исходя из максимальной продолжительности пауз в естественной речи

Значение по умолчанию 2500ms. Возможные значения от 1 до 2^31

 dsp_silence_threshold=2000
talk_detection_events

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

 talk_detection_events=yes
denoise

Использовать или нет фильтр шума. по умолчанию выкл. func_speex должна быть скомпилирована и установлена. не путайте эту опцию с drop_silence. Denoise используется для фильтрации фонового шума в канале говорящего участника.

 denoise=yes 
jitterbuffer

Включает jitterbuffer (Jitter) аудио потока перед микшированием конференции.
Включение этой опции может привести к небольшим задержкам.
Данная опция использует функцию диалплана JITTERBUFFER
Для более точной настройки используйте функцию JITTERBUFFERв диалплане,
непосредственно перед вызовом команды ConfBridge.

 jitterbuffer=yes  
pin

Установить пин-код для входа в конференцию. О вводе пин-кода будет объявлено.

 pin=1234
announce_join_leave

Если включено, новому пользователю будет предложено назвать свое имя при входе в конференцию. Записанное имя будет объявлено участникам конференции Выкл по умолчанию.

 announce_join_leave=yes
announce_join_leave_review

Похоже на опцию announce_join_leave, перезаписать или подтвердить его, при помощи голосовых подсказок. Выкл по умолчанию

 announce_join_leave_review=yes
dtmf_passthrough

Принимать или нет DTMFсигналы в конференции. Sets whether or not DTMF should pass through the conference. Выкл по умолчанию.

dtmf_passthrough=yes
announcement

Проиграть указанный файл пользователю входящему в конференцию.

 announcement=</path/to/file>
timeout

Когда значение больше нуля, указывает через какое время в секундах, участник конференции будет автоматически выдворен из комнаты. Когда пользователь удаляется, переменной CONFBRIDGE_RESULT в его канале присваивается значение 'timeout'. По умолчанию: 0

 timeout=3600 

Профиль конференц-моста

ConfBridge Bridge Profile Options

[default_bridge]
type=bridge
;max_members=50                ; Данный параметр устанавливает лимит участников конференции
                               ; Когда предел достигнут, новые пользователи отвергаются
                               ; Пользователь с правами администратора, может подключаться независимо от
                               ; состояния лимита. По умолчанию кол-во участников конференции не ограничено. 
                               ; 
;record_conference=yes         ; Записывать конференцию, когда подключается первый участник и
                               ; завершать запись, когда конференцию покидает последний участник.
                               ; Имя файла по умолчанию:
                               ; 'confbridge-<name of conference bridge>-<start time>.wav
                               ; Файл сохраняется в директории заданной для записи в конфиге 
                               ; [[asterisk:cf:asterisk.conf]] 
                               ; astspooldir => /var/spool/asterisk - spool/monitor

;record_file=</path/to/file>   ; Если запись конференции включена, задать специфический путь и имя файла
                               ; записи конференции. В случае если несколько 
                               ; конференций используют один и тот же профиль,
                               ; это может привести к проблемам в зависимости от настроек.
                               ; Поэтому, рекомендуется использовать, только для динамических конференций
                               ; созданных при помощи функции диалплана CONFBRIDGE
например:
exten => _7XX,1,Set(dynamic_conf=dconf-${EXTEN}-${STRFTIME(${EPOCH},,%d.%m.%Y-%H:%M:%S)})
exten => _7XX,n,Set(CONFBRIDGE(bridge,record_conference)=yes)
exten => _7XX,n,Set(CONFBRIDGE(bridge,record_file)=/home/asterisk/mconf/${dynamic_conf}.wav)
exten => _7XX,n,ConfBridge(${EXTEN})
;record_file_append=yes        ; Продолжать запись в тот же файл конференции
; (не совсем понятно при каких условиях это может быть выполнено, на практике не удалось).

;record_options=               ; Дополнительные опции MixMonitor.
;record_command=</path/to/command> ; Could not find option suitable for category 'dialplan' named 'record_command'.
                                   ; опция не поддерживается в Asterisk13

;internal_sample_rate=auto     ; Установить частоту дискретизации для микширования аудио в конференции.
                               ; по умолчанию - автоматически
                               ; возможная частота от 8000-192000.
                               ;
;mixing_interval=40     ; Устанавливает внутренний интервал микширования в миллисекундах для конференц-моста. 
                        ; Это число задает, как плотно или свободно микшируется аудио для конференции. 
                        ; Для  улучшения производительности устанавливается больший интервал.
                        ; Использование большего интервала, увеличивает кол-во задержек в конференц-мосте.
                        ; Допустимые значения 10, 20, 40 или 80. По умолчанию 20мс.
                        ;
Настройки Видео-конференции

Настройка обработки и распределения видео в конференции.

;video_mode = follow_talker; Данная опция устанавливает режим распределения видео от участников конференц-моста
                           ; Примечание: участники моста, передающие и принимающие видео, 
                           ; должны использовать один и тот же видео кодек. 
                           ; (т.к. видео поддерживается только в режиме passthrough)
                           ; Jitterbuffer рекомендуется выключать.
                           ; В отличии от полноценной видео конференции, 
                           ; когда все участники могут видеть друг друга в многочисленных окнах
                           ; в Asterisk возможно наблюдать только одного.
                           ; Что, однако, позволяет использовать стандартные софтфоны 
                           ; и IP телефоны с поддержкой видео.
                           ; Собственно, от кого транслируется видео и описывают доступные режимы. 
                           ;
                           ; --- РЕЖИМЫ ---
                           ; none: Видео не транслируется, но можно включить командой меню в любой момент.
                           ;
                           ; follow_talker: Видео передается от говорящего участника, если он его транслирует.
                           ;
                           ; last_marked: Видео от вошедшего последним маркированного участника конференции
                           ;  транслируется всем остальным.
                           ;
                           ; first_marked: Видео от первого вошедшего маркированного участника конференции
                           ; транслируется всем остальным. Если он покидает очередь, то от следующего.
;language=en               ; Язык сообщений конференции, для данного профиля.
                           ; по умолчанию (English).

;regcontext=conferences    ; Контекст в котором регистрируется имя конференции, как расширение диалплана.
Звуковые файлы профиля конференции

Все звуковые файлы используемые в конференции,
могут быть заданы индивидуально для каждого профиля.
Используемый формат: имя_опции = <имя файла или полный путь к файлу>.
Если указано только имя файла, оно должно быть расположено
в директории по умолчанию, например: /var/lib/asterisk/sounds .

;sound_join  ; Сообщение о входе в конференцию. 
;sound_leave ; Сообщение о выходе из конференции.
;sound_has_joined ; Представление присоединившегося пользователя, с именем записанным при входе:
                  ; Example "_____ has joined the conference"
;sound_has_left ; Представление покидающего конференцию пользователя по имени:
                ; Example "_____ has left the conference"
;sound_kicked ; Сообщение пользователю, который будет выкинут из конференции.
;sound_muted  ; Сообщение о отключении микрофона.
;sound_unmuted  ; Сообщение о включении микрофона.
;sound_only_person ; Воспроизводится, когда пользователь является единственным человеком в конференции.
;sound_only_one ; Сообщение что остались только два участника тет-а-тет.
;sound_there_are  ; Сколько пользователей в конференции.
;sound_other_in_party; ; Используется совместно с sound_there_are 
                       ; "sound_there_are" <кол-во участников> "sound_other_in_party"
;sound_place_into_conference ;(устарело) Сообщение, когда к конференции присоединяется участник ожидавший маркированного пользователя.
                             
;sound_wait_for_leader  ; Сообщение проигрывается участнику ожидающему лидера (маркированного участника).
;sound_leader_has_left  ; Сообщение, что лидер покинул конференцию.
;sound_get_pin ; Приглашение ввести пин-код.
;sound_invalid_pin ; Сообщение о неверном пин-коде.
;sound_locked ; Сообщение пользователя, который пытается подключиться к заблокированной конференции.
;sound_locked_now ; Сообщение админу о блокировке конференции.
;sound_unlocked_now; Сообщение о разблокировке конференции.
;sound_error_menu ; Сообщение о неверном вводе опции меню.
;sound_begin ; Сообщение о первом маркированном пользователе присоединившимся к конференции.

Опции меню конференц-моста

ConfBridge Menu Options
Приложение ConfBridge, также имеет возможность, создания кастомизированных DTMFменю
для каждого канала использующего его. Как и профили пользователей и мостов,
меню указывается как аргумент команды ConfBridgeв диалплане Asterisk.

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

Если в качестве первого символа DTMFкода используется решетка '#',
вы должны экранировать ее, иначе она будет интерпретирована как #инклюд.

 \#1=toggle_mute

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

 5=reset_talking_volume, reset_listening_volume 

; playback(<name of audio file>&<name of audio file>)
                                       ; Воспроизвести звуковой файл в канал 
                                       ; и немедленно вернуться в конференцию.
                                       ; Этот файл не может быть прерван DTMF
                                       ; Несколько файлов могут быть заданы через амперсанд '&'
; playback_and_continue(<name of playback prompt>&<name of playback prompt>)
                                       ; Воспроизвести звуковой файл
                                       ; с возможность DTMF ввода во время воспроизведения.
                                       ; Можно использовать, например,
                                       ; для описания пунктов DTMF меню.
                                       ; Как только DTMF сигнал будет обработан,
                                       ; воспроизведение прервется
                                       ; и будет выполнено указанное действие. 
                                       ; Несколько файлов могут быть заданы через амперсанд '&'
; toggle_mute      ; Вкл/Выкл микрофон.

; no_op ; Ничего (No Operation). Its only real purpose exists for
        ; being able to reserve a sequence in the config as a menu exit sequence.
; decrease_listening_volume ; Уменьшить громкость слышимости канала.
; increase_listening_volume ; Увеличить громкость слышимости канала.
; reset_listening_volume    ; Сбросить громкость по умолчанию.
; decrease_talking_volume ; Уменьшить громкость речи.
; increase_talking_volume ; Увеличить громкость речи.
; reset_talking_volume    ; Сбросить громкость речи.
                          ;
; dialplan_exec(context,exten,priority)  ; Покинуть конференцию и выполнить команду диалплана.
; leave_conference ; Покинуть конференцию и продолжить выполнение диаплана.
                   ;
; admin_kick_last  ; Выкинуть последнего участника из конференции.
                   ; Это действие может выполнить только админ использующей одно и тоже меню с пользователем.
                   ;
; admin_toggle_conference_lock ; Заблокировать/Разблокировать вход в конференцию.
                               ; только для админов
; set_as_single_video_src   ; Позволяет любому участнику установить себя источником видео, 
                            ; независимо от режима распределения видео.
; release_as_single_video_src ; Позволяет  участнику отменить трансляцию своего видео.
                              ; Возвращает трансляцию видео согласно режиму заданному
                              ; для профиля конференц-моста.
; admin_toggle_mute_participants ; Выключить микрофон (лишить права голоса)
                                 ; всех участников без прав администратора.
                                 ;
; participant_count        ; Огласить кол-во участников конференции.

Примеры меню конференц-моста

[sample_user_menu]
type=menu
*=playback_and_continue(conf-usermenu)
*1=toggle_mute
1=toggle_mute
*4=decrease_listening_volume
4=decrease_listening_volume
*6=increase_listening_volume
6=increase_listening_volume
*7=decrease_talking_volume
7=decrease_talking_volume
*8=leave_conference
8=leave_conference
*9=increase_talking_volume
9=increase_talking_volume

[sample_admin_menu]
type=menu
*=playback_and_continue(conf-adminmenu)
*1=toggle_mute
1=toggle_mute
*2=admin_toggle_conference_lock ; only applied to admin users
2=admin_toggle_conference_lock  ; only applied to admin users
*3=admin_kick_last       ; only applied to admin users
3=admin_kick_last        ; only applied to admin users
*4=decrease_listening_volume
4=decrease_listening_volume
*6=increase_listening_volume
6=increase_listening_volume
*7=decrease_talking_volume
7=decrease_talking_volume
*8=no_op
8=no_op
*9=increase_talking_volume
9=increase_talking_volume

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

Asterisk app: ConfBridge

Asterisk sip.conf General SIP Options

$
0
0

Asterisk sip.conf General SIP Options

Общие SIP Параметры

Следующие параметры используются в общей [general] секции sip.conf:

allowexternalinvites

Если установлено 'no', запрещает INVITE и REFER от внешних (не из localnet) доменов. См domain

 allowexternalinvites=yes|no
allowguest

Если 'no', запрещает гостевые(без аутентификации) подключения. По умолчанию sipguest подключения разрешены.

 allowguest=no|yes
allowoverlap

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

 allowoverlap=no|yes
allowsubscribe

Разрешить ли внешним устройствам подписку (SUBSCRIBE) на информацию о статусе екстеншена. По умолчанию - 'yes':

 allowsubscribe=yes|no
allowtransfers

Когда установлено 'no', запрещает любые трансферы, если не переопределено в настройках пира.

 allowtransfers=no|yes
alwaysauthreject

Если включено, всегда отвечает на INVITE и REGISTER, SIP сообщением 401 Unauthorized, вместо того чтобы сообщить вызывающему о существовании запрашиваемого user или peer. Важная настройка безопасности

alwaysauthreject=no|yes
autodomain

Установите эту опцию 'yes', чтобы добавить локальное HOSTNAME и локальный IP адрес в список доменов:

 autodomain=yes|no
bindaddr and bindport

Эти параметры определяют IP адрес и порт на которых Asterisk будет слушать SIP запросы. Для драйвера канала SIP Asterisk 'chan_sip' можно назначить только один адрес и порт для всех подключений для UDP и один порт для TCP транспорта, в отличии от нового драйвера PJSIP. По умолчанию адрес не задан и лучше так и оставить. Некоторые рекомендуют изменять порт по умолчанию 5060, на другой, в целях безопасности. Но помните, что это только одна из мер безопасности, не самая важная, и не гарантирует вам полной защиты от злоумышленников.

bindaddr=0.0.0.0
bindport=5060

Вы можете задать независимые для UDP, TCP и TLS транспорта значения udpbindadd, tcpbindaddrи tlsbindaddr

buggymwi

Вкл. эту опцию, чтобы избежать ошибок при сообщении с некоторыми ip телефонами при отправке MWI сообщений.

buggymwi=no|yes
callevents

Установите 'yes', если хотите генерировать информацию о SIP событиях для AMI (asterisk manager interface)

 callevents=yes
checkmwi

Время в секундах, между проверками голосовой почты :

 checkmwi=30
compactheaders

Использовать или нет компактные SIP заголовки.

 compactheaders=yes|no
defaultexpiry

Срок действия регистрации в секундах для входящих и исходящих регистраций. При входящей регистрации, этот параметр задается клиентской стороной, и заданное здесь значение используется, только если клиент не сообщил свое занчение. Для исходящих регистраций этот параметр сообщается удаленной стороне UAS (user agent server)

 defaultexpiry=300
directrtpsetup

Данная опция позволяет управлять RTP соединением между двумя оконечными точками без re-INVITE(экспериментальная опция, используйте на свой страх и риск).

 directrtpsetup=yes|no
domain

Задает имя домена сервера Asterisk по умолчанию. Командой CLI 'sip show domains' выводится список локальных доменов.

 domain=example.com
dumphistory

Вкл. или Выкл. отчет в завершении SIP диалога. SIP history выводится в DEBUG лог канала.

 dumphistory=yes|no
externhost

Когда Asterisk находится за NAT, SIP заголовок обычно использует IP адрес сервера. Если включить данную опцию, Asterisk будет производить периодические DNSопросы для определения имени хоста и заменять IP адрес на 'externhost'.

 externhost=my.hostname.tld

Используйте externip.

externip

externip содержит IP адрес в качестве аргумента. Если Asterisk находится за NAT, SIP заголовок Contact: содержит внутренний IP адрес сервера, тогда удаленная сторона не знает куда отправлять ответы. Параметр externip вкупе с параметром nat=force_rport модифицирует SIP заголовок, сообщая удаленному SIP серверу адрес на который надо слать ответы:

 externip=123.123.123.123
externrefresh

Если все же используется 'externhost', указывает промежуток времени в секундах между запросами DNS.

 externrefresh=30
g726nonstandard

Значения: yes/no, по умолчанию: no. Если клиент собирается для сеанса связи «договориться» использовать звуковой кодек G726-32, с использованием компрессии AAL2, вместо RFC3551 (что требуется для аппаратов фирмы Sipura и шлюзов от Grandstream, и может другим). То это противоречит спецификации RFC3551, клиент должен вместо этого «договориться» использовать AAL2-G726-32

 g726nonstandard=yes
ignoreregexpire (global)

Если ignoreregexpire установлен 'yes', Asterisk сделает одно из двух, в зависимости от настроек пиров: 1)Non-realtime peer Когда регистрация истекает, информация не удаляется из памяти или БД Asterisk и вызовы будут разрешены несмотря на то, что время регистрации истекло.

2)Realtime peers Когда peer сконфигурирован в режиме реального времени, информация о регистрации используется независимо от defaultexpiry

 ignoreregexpire=yes|no
jbenable

Вкл. поддержку RTP jitter buffer на принимающей стороне канала SIP. По умолчанию 'no'. Будет работать, только если удаленная сторона поддерживает эту функцию. подробнее о Джиттер

 jbenable=yes|no
jbforce

Принудительное использование jitter buffer принимающей стороной SIP канала.

 jbforce=yes|no
jbimpl

Использовать фиксированный или подстраиваемый (адаптивный) jitter buffer. fixed jitter buffer всегда использует значение из jbmaxsize adaptive может принимать значение больше jbmaxsize По умолчанию 'fixed':

 jbimpl=fixed|adaptive

Из личного опыта, вкл. 'adaptive' может приводить к весьма плачевным результатам.

jblog

Вкл./выкл jitter buffer frame лог. По умолчанию 'no':

 jblog=yes|no
jbmaxsize

Установите максимальную длину буфера в миллисекундах:

 jbmaxsize=200
jbresyncthreshold

Джиттер буфер порог синхронизации. По умолчанию 1000:

 jbresyncthreshold=1000
icesupport

Использовать Interactive Connectivity Establishment (ICE) в Asterisk

 icesupport=no
limitonpeers

Применять call-limit только для type=peer Это улучшит использование call-limit для устройств настроенных, как type=friend, отделив ограничение call-limit от входящих вызовов.

 limitonpeers=yes|no
localnet

укажет серверу Asterisk какие подсети являются локальными, прозрачными для использования IP адресов сервера, SIP запросы к которым не требуют модификации поля Contact: c использованием externipили externhost

 localnet=192.168.1.0/24
 localnet=172.16.0.0/16
matchexterniplocally

Сверять 'externip' с 'localnet' и производить подстановку, только если 'externip' из локальной подсети. Не совсем ясно, зачем это может понадобиться? Возможно при очень нестандартной топологии сети.

 matchexterniplocally=yes|no
maxexpiry

Максимальная продолжительность регистрации в секундах.

 maxexpiry=3600
minexpiry

Минимальная продолжительность регистрации в секундах.

 minexpiry=60
notifymimetype

Указывает MIME тип используемый для message-waiting indication (MWI) в SIP NOTIFY сообщении.

 notifymimetype=text/plain
notifyringing

Сообщать подписчикам о состоянии вызов (RINGING):

 notifyringing=yes|no
notifyhold

Сообщать подписчикам (subscribers) о состоянии удержание (HOLD):

 notifyhold=yes|no
pedantic

Скурпулезная проверка SIP сообщений. Устанавливает более строгую проверку по стандартам SIP RFC.

 pedantic=yes
realm

Данная установка используется для аутентификации в SIP. Задайте realm полное доменное имя вашего сервера. Имя должно быть совершенно уникальным.

 realm=mybox.example.com
recordhistory

Вкл. или Выкл историю sip для всех каналов.

 recordhistory=yes|no
registerattempts

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

 registerattempts=0
registertimeout

Таймаут между попытками регистрации на другом устройстве.

 registertimeout=30
relaxdtmf

Если плохо распознаются DTMF сигналы, включите данную опцию.

 relaxdtmf=yes|no
rtautoclear

(global)Конфигурация Realtime Peers Указывает должен ли Asterisk обнулять созданные на лету friends по истечении времени регистрации. Если установлено 'yes', по истечении срока регистрации, удалять friends до нового запроса. Если задано число, то оно используется вместо обычного времени регистрации.

rtautoclear=yes|no|seconds
rtcachefriends

(global)

Если rtcachefriends включен, Asterisk будет кэшировать friends(реалтайм пиры), которые приходят из realtime engine, так же, как если бы они сконфигурированы в «sip.conf».

 rtcachefriends=yes|no
rtsavesysname

(global) Определяет, должен ли Asterisk сохранить SystemName в базе данных в режиме реального времени во время регистрации:

 rtsavesysname=yes|no
rtupdate

(global) Если установлено 'yes' Asterisk будет обновлять IP-адрес, порт и период регистрации пиров при регистрации. По умолчанию 'yes':

 rtupdate=yes|no
sipdebug

Указывает, должен или нет Asterisk включать SIP debug сразу при загрузке драйвера канала SIP.

 sipdebug=yes|no
sendrpid

ОТправлять или нет Remote-Party-ID header:

 sendrpid=yes|no
srvlookup

Записи DNS SRV являются одним из способов указания адреса для связи сервером. Используя записи SRV, вы получаете многие преимущества DNS, в то время как отключения SRV DNSлишает вас возможности принимать SIP вызовы на основании доменных имен. В настоящее время поддержка записей SRV в Asterisk несколько хромает. Если несколько записей SRV возвращаются, Asterisk будет использовать только первую запись. Чтобы включить, установите srvlookup = yes в секции [general] файла sip.conf:

 srvlookup=yes
transport

Задает транспорт по умолчанию. По умолчанию 'udp', но может быть 'tcp', 'tls', 'ws' или 'wss'.Если задано TCP а tcpenable=no будет использован UDP транспорт.

transport=udp
tcpenable

Включить поддержку TCP транспорта chan_sip Asterisk.

 tcpenable=yes
tcpbindaddr

Адрес на котором Asterisk «слушает» TCP подключения.

  IPv4 example: bindaddr=0.0.0.0:5062
  IPv6 example: bindaddr=[::]:5062
tcpauthtimeout

tcpauthtimeout указывает максимальное время в секундах данное клиенту на аутентификацию. Если за заданное время клиент не прошел проверку он отключается. (По умолчаннию 30 секунд)

 tcpauthtimeout = 30
tcpauthlimit

Максимальное кол-во неаутентифицированных сессий в момент любой времени.

 tcpauthlimit = 100
t1min

Минимальная задержка туда-обратно (minimum round-trip) для сообщения контролируемого хоста. По умолчанию 100 миллисеунд:

 t1min=100
subscribecontext

Ограничить запросы SUBSCRIBE только указанным контекстом, если не переопределено в настройках пира.

 subscribecontext=internal
t38pt_udptl

Установка t38pt_udptl 'yes' вкл. T.38 fax (UDPTL) насквозь (passthrough) для SIP-to-SIP вызовов с поддержкой T.38. Эта настройка включается глобально для всех устройств, но вы можете отключить её для конкретного устройства.

 t38pt_udptl=yes|no

T.38 fax passthrough работает только для SIP-to-SIP вызовов, любые local или agent каналы не могут быть использованы.

tos_sip, tos_audio, andtos_video

Asterisk может установить TOS bits в IP заголовках для помощи маршрутизаторам приотеризации трафика. tos_sip, tos_audio, и tos_video установки управляют TOS битами для SIP сообщений, RTP аудио и RTP видео, соответственно. Поддерживаются: CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43. Можно также использовать цифровые значения для TOS битов.

trustrpid

Доверять или нет Remote-Party-ID header: Asterisk SIP trustrpid

 trustrpid=yes|no
useragent

Значение поля useragent в SIP заголовке. По умолчанию версия Asterisk:

 useragent=Asterisk PBX v12.4.0

Если вы не желаете сообщать, что используете Asterisk, напишите Cisco или Avaya, или abyrvalg v2.0.

usereqphone

usereqphone опция говорит Asterisk добавить «user=phone» в SIP URIs которые содержат действующий номер телефона:

usereqphone 
videosupport

Настройка SIP в Asterisk 13 sip.conf

$
0
0

Настройка SIP в Asterisk 13 sip.conf

Файл конфигурации 'sip.conf' отвечает за настройку внутренних и внешних каналов SIP.

Asterisk не делает различий между внутренними и внешними линиями, любой вызов совершается через какой-либо канал.

Конфигурация пиров осуществляется при помощи текстовых блоков, отделенных друг от друга квадратными скобками. Имя в квадратных скобках, как правило совпадает с параметром 'username', но не обязательно.

[имя_пира]
type=peer, user или friend
параметр1=значение
параметр2=значение

Где имя_пира - это произвольное имя SIP устройства, на которое можно ссылаться из других конфигурационных файлов. Параметр type может принимать одно из трех значений: type = value

* peer: SIP пир, который Asterisk может использовать для совершения исходящих вызовов.

* user: SIP пир, для входящих вызовов Asterisk .

* friend: Запись, которая одновременно и user и peer. Этот тип наиболее подходит для телефонов и других устройств. Для SIP пользователей этого типа Asterisk создаст два объекта, один типа peer и один типа user, с одинаковыми именами.

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

Регистрация на сервере ITSP - провайдера VoIP телефонии

В файле конфигурации sip.conf в секции [general] добавьте определение register:

Формат:

register => user [:secret[:authuser]] @host [:port] [/extension]

Пример:

Зарегистрировать 3216111 у sip провайдера, как номер 1234567 на Asterisk.

   register => 3216111:userID:PASSWORD@sipppnet.ru/1234567
  • user - идентификатор пользователя, используемый для SIP сервера (например, 3216111)
  • authuser - не обязательное имя пользователя для авторизации на SIP сервере
  • secret - пароль пользователя
  • host - имя домена или хоста SIP сервера. Этот SIP сервер должен быть определен в своей секции файла sip.conf, где должны быть заданы его параметры (sipnet.ru).
  • port - на какой номер порта посылать запросы на регистрацию на сервере host. По умолчанию - 5060
  • /1234567 - номер екстеншена для приема вызовов в Вашем Asterisk. 1234567 - вставляется в SIP заголовок contact, SIP запроса на регистрацию. Этот екстеншен используется удаленным SIP сервером, когда ему необходимо совершить вызов в сторону Вашего Asterisk. Смотри примеры, приведенные ниже. По умолчанию, используется контекстный «s».

Вам необходимо регистрироваться, только если:

  • Если должна быть возможность позвонить к Вам.
  • Если одна из сторон имеет динамический IP адрес.

Наиболее используемые CLI команды для проверки:

  • sip show peers Отобразить все пиры ( включая friends)
  • sip show registry Отобразить статус регистраций на удаленном UAS.
  • sip set debug on Показывать все SIP сообщения.
  • sip reload Перечитать конфигурационный файл.
  • sip show settings Показать текущую конфигурацию chan_sip.

Для получения подробной информации о командах CLI Asterisk 13смотрите Asterisk CLI - интерфейс командной строки.

Пример конфигурации транка, для совершения исходящих вызовов:

[sipppnet-out]
host=sipppnet.ru
username=userID
secret=PASSWORD
fromuser=userID
fromdomain=sipppnet.ru
type=peer
disallow=all
allow=alaw
allow=ulaw
allow=g729
nat=force_rport
directmedia=nonat
insecure=port,invite
dtmfmode=info
context=from-sipppnet

В диалплане (extensions.conf) можно использовать разнообразный синтаксис для вызова (набора) SIP устройств.

   * SIP/devicename
   * SIP/username@domain   (SIP uri)
   * SIP/username[:password[:md5secret[:authname[:transport]]]]@host[:port]
   * SIP/devicename/extension
   * SIP/devicename/extension/IPorHost
   * SIP/username@domain//IPorHost

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

exten => _9.,1,Dial(SIP/${EXTEN:1}@sipppnet-out,30,r)

Переменная ${EXTEN:1} получает номер екстеншена и удаляет первую цифру- '9'. Подробная информация приведена в Asterisk Dialplan - extensions.conf.

Пример контекста для входящих вызовов в файле 'extensions.conf':

[from-sipppnet]
exten => 3216111,1,Dial(SIP/100&SIP101,180,tr)

Настройка SIP пира для регистрации абонентов на Asterisk 13

Как уже отмечалось Asterisk не делает особых различий между транками и абонентами, поэтому конфиг телефона будет похож на SIP транк, но все же немного другой.

[777]
host=dynamic
type=friend
secret=**password**
qualify=yes
nat=no
port=5061
directmedia=no
context=from-internal
disallow=all
allow-alaw
allow=ulaw
alow=gsm
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
username=777
fromuser=777
dial=SIP/777
mailbox=777@device
call-limit=2
callcounter=yes
faxdetect=no
callgroup=1
pickupgroup=1

Рассмотрим некоторые опции:

  • host - dynamic или ip адрес с которого подключается абонент.
  • type - для абонентского пира это обычно friend
  • secret - пароль, использование сложных паролей убережет вас от многих неприятностей, даже если вы считаете сеть безопасной, в дальнейшем все может измениться и ваша предусмотрительность окажется очень кстати.
  • qualify - посылать SIP запросы OPTIONS для проверки доступности устройства (возможно это является избыточным, т.к. большинство устройств сами обновляют регистрацию, через заданный в настройках интервал)
  • nat - если телефон находится в локальной сети то 'no', если регистрируется из интернет или другой интра сети, то 'force_rport'
    • nat = no - без NAT RFC3581
    • nat = force_rport - использовать rport, даже если его нет
    • nat = comedia - отправить медиа поток на порт Asterisk 12, независимо от указаний SDP.
    • nat = auto_force_rport - установить 'force_rport' параметр если Asterisk обнаружил NAT (по умолчанию)
    • nat = auto_comedia - установить 'comedia' параметр если Asterisk обнаружил NAT
  • directmedia - направлять медиа поток (RTP трафик) через сервер или напрямую между каналами (пирами).

см. также по теме:NAT, SIP и Asterisk

  • port - порт SIP сигнализации устройства (не путайте c bindport asterisk, который для данного драйвера SIP в Asterisk может быть только один, 5060 по умолчанию, но для нового драйвера Asterisk pjsip.conf, может, или даже должен, быть назначен уникальный порт для каждого транспорта)
  • deny - сети из которых запрещено подключение
  • permit - сети из которых разрешено подключение (если абонент находится в локальной сети, назначьте ему параметр permit=192.168.1.0/255.255.255.0 и регистрация на этом пире будет разрешена только из этой подсети. ACLочень действенная мера безопасноcти. См. также Asterisk:acl.conf
  • call-limit -сколько одновременных вызовов (concurrent calls) может производится через данный канал. Хорошая идея, как для локальных так и для удаленных абонентов. Если пир взломан, злоумышленники не смогут пропустить через канал больше указанного кол-ва вызовов зараз(ы).

'call-limit' опция признана устаревшей и заменена на 'callcounter'. Установить ограничение одновременных вызовов теперь можно переменной канала function 'GROUP_COUNT'
пример использования данного метода можно помотреть здесь: Ограничение количества одновременных вызовов по набранному номеру.

Настройка нескольких SIP пиров по шаблону

Если у вас множество SIP пиров, которые имеют общие настройки и отличаются например, только 'username' и 'secret', можно создать шаблон.
Для этого надо создать шаблонный пир, а рядом с его именем в квадратных скобках, написать восклицательный знак в круглых скобках и задать общие настройки:

[local_pattern](!)
host=dynamic
type=friend
context=from-internal
nat=no
disallow=all
allow=ulaw
allow=alaw

А затем определить уникальные свойства пиров, добавив рядом с именем каждого пира, имя общего шаблона в круглых скобках:

[776](local_pattern)
username=776
secret=super_puper_secret_1
callerid=8123216111
[777](local_pattern)
username=777
secret=super_puper_secret_2
callerid=8121234567

Asterisk sip.conf General SIP Options

Общие SIP Параметры

Следующие параметры используются в общей [general] секции sip.conf:

allowexternalinvites

Если установлено 'no', запрещает INVITE и REFER от внешних (не из localnet) доменов. См domain

 allowexternalinvites=yes|no
allowguest

Если 'no', запрещает гостевые(без аутентификации) подключения. По умолчанию sipguest подключения разрешены.

 allowguest=no|yes
allowoverlap

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

 allowoverlap=no|yes
allowsubscribe

Разрешить ли внешним устройствам подписку (SUBSCRIBE) на информацию о статусе екстеншена. По умолчанию - 'yes':

 allowsubscribe=yes|no
allowtransfers

Когда установлено 'no', запрещает любые трансферы, если не переопределено в настройках пира.

 allowtransfers=no|yes
alwaysauthreject

Если включено, всегда отвечает на INVITE и REGISTER, SIP сообщением 401 Unauthorized, вместо того чтобы сообщить вызывающему о существовании запрашиваемого user или peer. Важная настройка безопасности

alwaysauthreject=no|yes
autodomain

Установите эту опцию 'yes', чтобы добавить локальное HOSTNAME и локальный IP адрес в список доменов:

 autodomain=yes|no
bindaddr and bindport

Эти параметры определяют IP адрес и порт на которых Asterisk будет слушать SIP запросы. Для драйвера канала SIP Asterisk 'chan_sip' можно назначить только один адрес и порт для всех подключений для UDP и один порт для TCP транспорта, в отличии от нового драйвера PJSIP. По умолчанию адрес не задан и лучше так и оставить. Некоторые рекомендуют изменять порт по умолчанию 5060, на другой, в целях безопасности. Но помните, что это только одна из мер безопасности, не самая важная, и не гарантирует вам полной защиты от злоумышленников.

bindaddr=0.0.0.0
bindport=5060

Вы можете задать независимые для UDP, TCP и TLS транспорта значения udpbindadd, tcpbindaddrи tlsbindaddr

buggymwi

Вкл. эту опцию, чтобы избежать ошибок при сообщении с некоторыми ip телефонами при отправке MWI сообщений.

buggymwi=no|yes
callevents

Установите 'yes', если хотите генерировать информацию о SIP событиях для AMI (asterisk manager interface)

 callevents=yes
checkmwi

Время в секундах, между проверками голосовой почты :

 checkmwi=30
compactheaders

Использовать или нет компактные SIP заголовки.

 compactheaders=yes|no
defaultexpiry

Срок действия регистрации в секундах для входящих и исходящих регистраций. При входящей регистрации, этот параметр задается клиентской стороной, и заданное здесь значение используется, только если клиент не сообщил свое занчение. Для исходящих регистраций этот параметр сообщается удаленной стороне UAS (user agent server)

 defaultexpiry=300
directrtpsetup

Данная опция позволяет управлять RTP соединением между двумя оконечными точками без re-INVITE(экспериментальная опция, используйте на свой страх и риск).

 directrtpsetup=yes|no
domain

Задает имя домена сервера Asterisk по умолчанию. Командой CLI 'sip show domains' выводится список локальных доменов.

 domain=example.com
dumphistory

Вкл. или Выкл. отчет в завершении SIP диалога. SIP history выводится в DEBUG лог канала.

 dumphistory=yes|no
externhost

Когда Asterisk находится за NAT, SIP заголовок обычно использует IP адрес сервера. Если включить данную опцию, Asterisk будет производить периодические DNSопросы для определения имени хоста и заменять IP адрес на 'externhost'.

 externhost=my.hostname.tld

Используйте externip.

externip

externip содержит IP адрес в качестве аргумента. Если Asterisk находится за NAT, SIP заголовок Contact: содержит внутренний IP адрес сервера, тогда удаленная сторона не знает куда отправлять ответы. Параметр externip вкупе с параметром nat=force_rport модифицирует SIP заголовок, сообщая удаленному SIP серверу адрес на который надо слать ответы:

 externip=123.123.123.123
externrefresh

Если все же используется 'externhost', указывает промежуток времени в секундах между запросами DNS.

 externrefresh=30
g726nonstandard

Значения: yes/no, по умолчанию: no. Если клиент собирается для сеанса связи «договориться» использовать звуковой кодек G726-32, с использованием компрессии AAL2, вместо RFC3551 (что требуется для аппаратов фирмы Sipura и шлюзов от Grandstream, и может другим). То это противоречит спецификации RFC3551, клиент должен вместо этого «договориться» использовать AAL2-G726-32

 g726nonstandard=yes
ignoreregexpire (global)

Если ignoreregexpire установлен 'yes', Asterisk сделает одно из двух, в зависимости от настроек пиров: 1)Non-realtime peer Когда регистрация истекает, информация не удаляется из памяти или БД Asterisk и вызовы будут разрешены несмотря на то, что время регистрации истекло.

2)Realtime peers Когда peer сконфигурирован в режиме реального времени, информация о регистрации используется независимо от defaultexpiry

 ignoreregexpire=yes|no
jbenable

Вкл. поддержку RTP jitter buffer на принимающей стороне канала SIP. По умолчанию 'no'. Будет работать, только если удаленная сторона поддерживает эту функцию. подробнее о Джиттер

 jbenable=yes|no
jbforce

Принудительное использование jitter buffer принимающей стороной SIP канала.

 jbforce=yes|no
jbimpl

Использовать фиксированный или подстраиваемый (адаптивный) jitter buffer. fixed jitter buffer всегда использует значение из jbmaxsize adaptive может принимать значение больше jbmaxsize По умолчанию 'fixed':

 jbimpl=fixed|adaptive

Из личного опыта, вкл. 'adaptive' может приводить к весьма плачевным результатам.

jblog

Вкл./выкл jitter buffer frame лог. По умолчанию 'no':

 jblog=yes|no
jbmaxsize

Установите максимальную длину буфера в миллисекундах:

 jbmaxsize=200
jbresyncthreshold

Джиттер буфер порог синхронизации. По умолчанию 1000:

 jbresyncthreshold=1000
icesupport

Использовать Interactive Connectivity Establishment (ICE) в Asterisk

 icesupport=no
limitonpeers

Применять call-limit только для type=peer Это улучшит использование call-limit для устройств настроенных, как type=friend, отделив ограничение call-limit от входящих вызовов.

 limitonpeers=yes|no
localnet

укажет серверу Asterisk какие подсети являются локальными, прозрачными для использования IP адресов сервера, SIP запросы к которым не требуют модификации поля Contact: c использованием externipили externhost

 localnet=192.168.1.0/24
 localnet=172.16.0.0/16
matchexterniplocally

Сверять 'externip' с 'localnet' и производить подстановку, только если 'externip' из локальной подсети. Не совсем ясно, зачем это может понадобиться? Возможно при очень нестандартной топологии сети.

 matchexterniplocally=yes|no
maxexpiry

Максимальная продолжительность регистрации в секундах.

 maxexpiry=3600
minexpiry

Минимальная продолжительность регистрации в секундах.

 minexpiry=60
notifymimetype

Указывает MIME тип используемый для message-waiting indication (MWI) в SIP NOTIFY сообщении.

 notifymimetype=text/plain
notifyringing

Сообщать подписчикам о состоянии вызов (RINGING):

 notifyringing=yes|no
notifyhold

Сообщать подписчикам (subscribers) о состоянии удержание (HOLD):

 notifyhold=yes|no
pedantic

Скурпулезная проверка SIP сообщений. Устанавливает более строгую проверку по стандартам SIP RFC.

 pedantic=yes
realm

Данная установка используется для аутентификации в SIP. Задайте realm полное доменное имя вашего сервера. Имя должно быть совершенно уникальным.

 realm=mybox.example.com
recordhistory

Вкл. или Выкл историю sip для всех каналов.

 recordhistory=yes|no
registerattempts

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

 registerattempts=0
registertimeout

Таймаут между попытками регистрации на другом устройстве.

 registertimeout=30
relaxdtmf

Если плохо распознаются DTMF сигналы, включите данную опцию.

 relaxdtmf=yes|no
rtautoclear

(global)Конфигурация Realtime Peers Указывает должен ли Asterisk обнулять созданные на лету friends по истечении времени регистрации. Если установлено 'yes', по истечении срока регистрации, удалять friends до нового запроса. Если задано число, то оно используется вместо обычного времени регистрации.

rtautoclear=yes|no|seconds
rtcachefriends

(global)

Если rtcachefriends включен, Asterisk будет кэшировать friends(реалтайм пиры), которые приходят из realtime engine, так же, как если бы они сконфигурированы в «sip.conf».

 rtcachefriends=yes|no
rtsavesysname

(global) Определяет, должен ли Asterisk сохранить SystemName в базе данных в режиме реального времени во время регистрации:

 rtsavesysname=yes|no
rtupdate

(global) Если установлено 'yes' Asterisk будет обновлять IP-адрес, порт и период регистрации пиров при регистрации. По умолчанию 'yes':

 rtupdate=yes|no
sipdebug

Указывает, должен или нет Asterisk включать SIP debug сразу при загрузке драйвера канала SIP.

 sipdebug=yes|no
sendrpid

ОТправлять или нет Remote-Party-ID header:

 sendrpid=yes|no
srvlookup

Записи DNS SRV являются одним из способов указания адреса для связи сервером. Используя записи SRV, вы получаете многие преимущества DNS, в то время как отключения SRV DNSлишает вас возможности принимать SIP вызовы на основании доменных имен. В настоящее время поддержка записей SRV в Asterisk несколько хромает. Если несколько записей SRV возвращаются, Asterisk будет использовать только первую запись. Чтобы включить, установите srvlookup = yes в секции [general] файла sip.conf:

 srvlookup=yes
transport

Задает транспорт по умолчанию. По умолчанию 'udp', но может быть 'tcp', 'tls', 'ws' или 'wss'.Если задано TCP а tcpenable=no будет использован UDP транспорт.

transport=udp
tcpenable

Включить поддержку TCP транспорта chan_sip Asterisk.

 tcpenable=yes
tcpbindaddr

Адрес на котором Asterisk «слушает» TCP подключения.

  IPv4 example: bindaddr=0.0.0.0:5062
  IPv6 example: bindaddr=[::]:5062
tcpauthtimeout

tcpauthtimeout указывает максимальное время в секундах данное клиенту на аутентификацию. Если за заданное время клиент не прошел проверку он отключается. (По умолчаннию 30 секунд)

 tcpauthtimeout = 30
tcpauthlimit

Максимальное кол-во неаутентифицированных сессий в момент любой времени.

 tcpauthlimit = 100
t1min

Минимальная задержка туда-обратно (minimum round-trip) для сообщения контролируемого хоста. По умолчанию 100 миллисеунд:

 t1min=100
subscribecontext

Ограничить запросы SUBSCRIBE только указанным контекстом, если не переопределено в настройках пира.

 subscribecontext=internal
t38pt_udptl

Установка t38pt_udptl 'yes' вкл. T.38 fax (UDPTL) насквозь (passthrough) для SIP-to-SIP вызовов с поддержкой T.38. Эта настройка включается глобально для всех устройств, но вы можете отключить её для конкретного устройства.

 t38pt_udptl=yes|no

T.38 fax passthrough работает только для SIP-to-SIP вызовов, любые local или agent каналы не могут быть использованы.

tos_sip, tos_audio, andtos_video

Asterisk может установить TOS bits в IP заголовках для помощи маршрутизаторам приотеризации трафика. tos_sip, tos_audio, и tos_video установки управляют TOS битами для SIP сообщений, RTP аудио и RTP видео, соответственно. Поддерживаются: CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43. Можно также использовать цифровые значения для TOS битов.

trustrpid

Доверять или нет Remote-Party-ID header: Asterisk SIP trustrpid

 trustrpid=yes|no
useragent

Значение поля useragent в SIP заголовке. По умолчанию версия Asterisk:

 useragent=Asterisk PBX v12.4.0

Если вы не желаете сообщать, что используете Asterisk, напишите Cisco или Avaya, или abyrvalg v2.0.

usereqphone

usereqphone опция говорит Asterisk добавить «user=phone» в SIP URIs которые содержат действующий номер телефона:

usereqphone 
videosupport
2016/11/26

Reload failed because retrieve_conf encountered an error: 1

$
0
0

Reload failed because retrieve_conf encountered an error: 1

При подключении к FreePBX появляется страница FallBack.

freepbx fallback page

При нажатии apply configпоявляется сообщение о ошибке:

Reload failed because retrieve_conf encountered an error: 1

в информации о ошибке видим источник проблем: (в данном случае это модуль voicemail, но возможны и другие варианты)

[FATAL] SELECT value FROM voicemail_admin WHERE variable…….

Идем в Admin>Module Adminи устанавливаем модули Voicemailи System Dashboard.

Troubleshooting

Asterisk: queues.conf

$
0
0

Asterisk: queues.conf

Настройка очереди входящих вызовов колл центра. Конфигурация очереди осуществляется в файле /etc/asterisk/queues.conf.

Базовые настройки и операции очереди

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

/etc/asterisk/queues.conf

[queue_01]
strategy = ringall

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

 exten => s,1,Queue(queue_01)

Для применения параметров очередей и управления ими, могут быть использованы команды консоли Asterisk:

*CLI> queue
add   reload   remove   reset    set      show     pause    unpause

queue reload

*CLI> queue reload
members     parameters  rules       all

Выполните queue reload allдля инициации новой очереди и queue show <имя очереди>для её отображения в консоли Asterisk:

*CLI> queue show queue_01
queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
   No Members
   No Callers

В данном случае очередь пуста, принимать вызовы некому. Агенты принимающие вызовы в очереди могут быть статическими, т.е. назначены в конфиге очереди - queues.conf:

/etc/asterisk/queues.conf

[queue_01]
strategy = ringall
member = PJSIP/2777

Теперь у очереди есть members, пользователи для обработки входящих вызовов:

*CLI> queue show queue_01
queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
   Members:
      PJSIP/2777 (ringinuse enabled) (Not in use) has taken no calls yet
   No Callers

Или же, агенты могут быть динамическими, т.е. добавляться при помощи интерфейсов Asterisk - CLI, AMI или AGI.

Пример конфигурации очереди

Комментарии даны относительно заданного в примере значения.

  • [queue_01] ;имя очереди, все параметры заданные после него и до следующих […] скобок, будут относится к данной очереди.
  • announce-frequency=45 ;объявление каждые 45 секунд
  • announce-holdtime=yes ;объявлять среднее время ожидания
  • announce-position=yes ;объявлять позицию в очереди
  • autofill=yes ;включить автозаполнение очереди
  • autopause=no ;не вкл. автопаузу если оператор не ответил на вызов
  • autopausebusy=no ; не вкл. автопаузу, если оператор не ответил на вызов когда был занят.
  • autopausedelay=0 ; таймаут автопаузы =0 (выкл.)
  • autopauseunavail=yes ;вкл. автопаузу, если оператор недоступен.
  • joinempty=paused,penalty,inuse,ringing ;присоединиться к очереди, даже если все операторы имеет один из перечисленных статусов.
  • leavewhenempty=no ;не покидать очередь из-за если все недоступны
  • maxlen=11 ;максимально кол-во ожидающих в очереди = 11
  • memberdelay=0 ; пауза между перед соединением агента и вызывающего абонента = 0
  • monitor-type=mixmonitor ; приложение записи - mixmonitor
  • penaltymemberslimit=5 ;если очередь обслуживают 5 или меньше операторов, не использовать пенальти
  • periodic-announce-frequency=0 ;не делать объявление: все операторы заняты (по умолч.)
  • queue-callswaiting=queue-callswaiting ;файлы объявлений в очереди.
  • queue-thankyou=queue-thankyou
  • queue-thereare=queue-thereare
  • queue-youarenext=queue-youarenext
  • reportholdtime=no ; не объявлять агенту время, которое абонент провел в очереди
  • retry=5 ;пауза перед повторным вызовом оператора 5 секунд.
  • ringinuse=no ; не вызывать операторов со статусом 'in use' (вызывается очередью).
  • servicelevel=20 ; считать процент вызовов отвеченных в течении 20 секунд.
  • setqueuevar=yes ; задать переменные очереди
  • setinterfacevar=yes ;задать переменные интерфейсов (операторов очереди)
  • setqueueentryvar=yes ;задать переменные сред. время ожидания и позиция абонента.
  • strategy=ringall ; стратегия - звонят все операторы
  • timeout=15 ; время вызова операторов, перед retry
  • timeoutpriority=app ; приоритет таймаута приложения
  • timeoutrestart=yes ; сбросить таймаут оператора, если он CONGESTION
  • weight=0 ;вес очереди = 0
  • wrapuptime=0 ;время отдыха оператора после вызова = 0
  • member=PJSIP/2777 ;пользователь очереди.

Рассмотрим подробно параметры очередей (queues) Asterisk

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

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

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

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

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

 autofill = yes

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

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

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

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

 updatecdr = yes
shared_lastcall (общий последний вызов)

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

 shared_lastcall=no
Negative_penalty_invalid

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

 negative_penalty_invalid = no
log_membername_as_agent

Регистрировать агентов с именем, а не номером интерфейса. параметр для обратной совместимости, поведение как при работе с модулем chan_agents.

 log_membername_as_agent = no

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

 [queuename]
Musicclass

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

 musicclass = default
announce

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

 announce = file_to_play
strategy

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

  • ringall - вызываются все пользователи одновременно, пока кто-нибудь не ответит (по умолчанию)
  • leastrecent - вызвать оператора дольше всех не принимавшего вызовы.
  • fewestcalls - вызвать оператора принявшего меньше всего вызовов.
  • random - распределить вызовы случайным образом.
  • rrmemory - по кругу, после агента отвечавшего крайним.
  • rrordered - тоже самое, что и rrmemory, но пользователи вызываются в порядке перечисления в конфиге очереди.
  • linear - вызывать начиная с первого в порядке перечисления. Динамические агенты, будут вызываться в порядке добавления.
  • wrandom - звонит случайный интерфейс, но использует штраф этого участника в качестве веса (weight) при расчете метрики.

Таким образом, оператор с пенальти 0 будет иметь метрику в диапазоне от 0 до 1000,
оператор с пенальти 1 от 0 до 2000,
а оператор с пенальти 2 будет иметь метрику между 0 и 3000.
Обратите внимание, что при использовании этой стратегии, пенальти оператора не такой же,
как при использовании других стратегий очереди.
Он используется ТОЛЬКО в качестве весового коэффициента для вычисления метрики.

 strategy = ringall
servicelevel

Параметр статистики. Задает диапазон от 0 до servicelevel=в секундах. Приложение app_queueвысчитает процент вызовов, отвеченных за указанный период. Например, если servicelevel=30 ожидавших в очереди не более 30-ти секунд.

 servicelevel=30

Ниже приведен пример, где мы видим, что 89.4% процента вызовов в очереди q1были отвечены в течении 30 секунд (SL:89.4% within 30s).

*CLI> queue show q1
q1 has 0 calls (max unlimited) in 'leastrescent' strategy (6s holdtime, 120s talktime), W:0, C:5156, A:584, SL:89.4% within 30s
   Members:
      SIP/4886 (ringinuse disabled) (Not in use) has taken no calls yet
      SIP/4887 (ringinuse disabled) (Not in use) has taken no calls yet
      PJSIP/4889 (ringinuse disabled) (Unavailable) has taken no calls yet
   No Callers
context

Указывает на контекст диалплана, в который ожидающий в очереди абонент может попасть набором одной цифры в DTMF. В контексте должен быть определен екстеншен для обработки этой цифры. Например, можно использовать для интерактивного меню.

 context = context_name
penaltymemberslimit

не использовать penalty, если очередь обслуживают кол-во операторов меньшее или равное тому, что указано:

 penaltymemberslimit = 5

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

 Queue(queuename,t,,,45)

queue timing options

Очередь имеет два разных «таймаута» связанных с ней. Один из них назначается в queue.conf. Этот таймаут указывает в течении какого промежутка времени, в секундах, будет вызываться телефон пользователя, прежде чем будет считаться, что он не ответил. Второй таймаут, это аргумент приложения Queue(). Это абсолютный таймаут, по истечении которого, вызов выходит из очереди и переходит на следующий приоритет в контексте. В некоторых ситуациях, эти таймауты сталкиваются. Например, если таймаут в queue.confустановлен 5 секунд, retry = 4 секунды, а таймаут приложения Queue()задан 10 секунд
произойдет следующее:

  • вызов попадает в очередь
  • очередь выбирает оператора и вызывает его в течении 5 секунд
  • затем выдерживается время retry - 4 секунды
  • очередь выбирает второго оператора.

Как долго будет вызываться второй оператор? Осталась 1 секунда до истечения абсолютного таймаута приложения Queue(). Будет ли второй оператор вызываться 1 секунду или 5 как задано в таймауте queue.conf?

Эту коллизию призван разрешить параметр timeoutpriority: если timeoutpriority=conf, то второй оператор будет вызваться в течении 5-ти секунд. Если timeoutpriority=app, то в течении 1-й секунды.

Существуют и некоторые исключения и приведенных выше правил:
предположим timeoutpriority=app, в queues.confтаймаут равен 0, а аргумент приложения Queueзадан 10 сек.
Тогда timeoutpriorityигнорируется, а таймаут приложенияиспользуется как таймаут вызова операторов queues/conf.
И наоборот, если таймаут приложенияне задан, тогда timeoutpriorityигнорируется и таймаут конф. файлаqueues.confвсегда используется.

Несмотря на то, что timeoutpriority=confтаймаут конфигурационного файлаqueues.confимеет приоритет над таймаутом приложения,
если таймаут конф. файларавен 0, каждый участник очереди будет вызываться в течении неопределенного времени, а таймаут приложениябудет проверяться после этих попыток.

По умолчанию: timeoutpriority=app

timeout = 15
retry = 5
timeoutpriority = app|conf
weight

Чем выше вес (weight) очереди, тем выше приоритет для вызова оператора обслуживающего больше одной очереди.
по умолч. 0

 weight=0
wrapuptime

После завершения успешного вызова, время отдыха оператора, прежде чем он снова сможет принимать вызовы. по умолч. 0

 wrapuptime=0
autofill

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

 autofill=yes|no
autopause

Поставить оператора на паузу, если он не ответил на вызов. см. также PauseQueueMember

  • no: Не использовать автопаузу для данной очереди.
  • yes: Поставить на паузу, только в данной очереди.
  • all: Поставить на паузу во всех очередях, которые обслуживает оператор.
 autopause=no|yes|all
Autopausedelay

Отложить постановку на паузу оператора на время, с момента завершения последнего неудачного вызова.

 autopausedelay=60
Autopausebusy

Ставить или нет оператора на паузу, если он занят (BUSY).

autopausebusy=no
Autopauseunavail

Ставить или нет оператора на паузу, если он недоступен (UNAVAILABEL).

 autopauseunavail=no
maxlen

Максимально кол-во ожидающих в очереди. Если превышено, последующие вызовы будут отвергаться.
0 - неограниченно.

maxlen=0
variables

Примечание для рассматриваемых ниже параметров очереди - setinterfacevar, setqueueentryvar, setqueuevar. Если канал оператора (member channel) определен как Local, то для установки переменных он должен быть оптимизирован при помощи опции /n. Например:

 Local/2666@from-queue/n

Если setinterfacevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:

  • MEMBERINTERFACE - наименование интерфейса оператора(например. Local/1234)
  • MEMBERNAME - имя оператора (например. O.Agentova)
  • MEMBERCALLS - кол-во вызовов принятых данным интерфейсом оператора.
  • MEMBERLASTCALL - Время последнего вызова (UNIX-time).
  • MEMBERPENALTY - штраф (penalty) оператора.
  • MEMBERDYNAMIC - указывает динамический пользователь или нет.
  • MEMBERREALTIME - указывает realtime конфигурация оператора или нет.
 setinterfacevar=no

пример

пример

мы видим что интерфейс SIP/4887 динамический и время последнего вызова в UNIX-time.

exten => s,1,Queue(q1,cF,,,30)
   same => n,verbose(${MEMBERLASTCALL})
   same => n,verbose(${MEMBERDYNAMIC})
   same => n,verbose(${MEMBERINTERFACE})
-- Executing [s@from-fs-pjsip:1] Queue("PJSIP/fs_pjsip-0000003b", "q1,cF,,,30")
-- Called SIP/4887
-- SIP/4887-00000041 is ringing
-- SIP/4887-00000041 answered PJSIP/fs_pjsip-0000003b
-- Stopped music on hold on PJSIP/fs_pjsip-0000003b
-- Executing [s@from-fs-pjsip:2] Verbose("PJSIP/fs_pjsip-0000003d", "1476870427") 
-- Executing [s@from-fs-pjsip:3] Verbose("PJSIP/fs_pjsip-0000003b", "1") 
-- Executing [s@from-fs-pjsip:4] Verbose("PJSIP/fs_pjsip-0000003b", "SIP/4887")
setqueueentryvar

Если setqueueentryvar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:

  • QEHOLDTIME - время ожидания вызывающего абонента.
  • QEORIGINALPOS - позиция в очереди.
 setqueueentryvar=no
setqueuevar

Если setqueuevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди, при соединении или когда вызывающий абонент покидает очередь:

  • QUEUENAME - имя очереди.
  • QUEUEMAX - максимальное кол-во вызовов разр. в очереди;
  • QUEUESTRATEGY - стратегия очереди;
  • QUEUECALLS - текущее кол-во вызовов в очереди;
  • QUEUEHOLDTIME - среднее время ожидания в очереди на данный момент;
  • QUEUECOMPLETED - кол-во обработанных вызовов;
  • QUEUEABANDONED - кол-во отвергнутых (неотвеченных) вызовов;
  • QUEUESRVLEVEL - уровень обслуживания очереди;
  • QUEUESRVLEVELPERF - процент вызовов отвечающих условию servicelevelна данный момент;
 setqueuevar=no
membermacro

Если установлено, выполнить Macro, когда соединение с оператором установлено.
Эта опция может быть перекрыта параметром macroприложения Queue()

 membermacro=macro_name[,arg1[,...][,argN]]
membergosub

Если установлено, выполнить GoSub, когда соединение с оператором установлено.
Эта опция может быть перекрыта параметром gosubприложения Queue()

 membergosub=gosub_context_name[,arg1[,...][,argN]]
announce-frequency

Как часто анонсировать позицию в очереди и среднее время ожидания. Если 0 то не анонсировать. Примечание: этот параметр игнорируется при изменении позиции абонента в очереди (см. min-announce-frequency)

 announce-frequency = 90
min-announce-frequency

Минимальный интервал между моментом перехода на следующую позицию и анонсом среднего времени удержания. Это полезно для избежания постоянных объявлений когда позиция в очереди абонента часто меняется. т.е., если позиция в очереди изменилась, то не оповещать, даже если подошло время announce-frequency. (см. announce-frequency)

 min-announce-frequency = 15
periodic-announce-frequency

Как часто делать periodic-announce.

 periodic-announce-frequency=60
random-periodic-announce

Производить периодическое оповещение в случайном порядке? По умолчанию - no.

 random-periodic-announce=no
relative-periodic-announce

Отсчитывать время для periodic-announceс момента завершения предыдущего анонса, а не от его начала. по умолчанию выключено.

 relative-periodic-announce=no
announce-holdtime

Включать объявление о среднем времени ожидания в объявление о позиции в очереди?
Можно указать yes, noили once (один раз).

 announce-holdtime = yes|no|once
announce-position

Объявлять позицию в очереди?
Возможные значения: «yes», «no», «limit», или «more».

  • yes - оповещать о позиции ожидающего абонента;
  • more - если кол-во ожидающих в очереди больше чем задано в announce-position-limit.

т.е., если announce-position-limit=5объявлять, что в очереди ожидают больше 5-ти абонентов.

  • limit - только ожидающие абоненты в пределах announce-position-limitуслышат объявление.
  • no - не объявлять позицию.
 announce-position = yes
announce-to-first-user

Если включено, то объявления будут проигрываться первому в очереди. Это может привести к ситуации, когда агент готов принять вызов, но соединени откладывается из-за объявления и приведет к задержкам в очереди. по умолчанию выключено.

 announce-to-first-user = no
announce-position-limit

Если назначено «limit» или «more» в announce-positionбудет задействован этот параметр.

 announce-position-limit = 5
announce-round-seconds

Округлять тайминги объявлений до заданного значения, если не = 0 Возможные значения 0, 5, 10, 15, 20, and 30.

announce-round-seconds = 10
Аудио файлы используемые для объявлений

Если не заданы другие, используются файлы перечисленные ниже:

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-minute = queue-minute ; («minute.»)

queue-minutes = queue-minutes ; («minutes.»)

queue-seconds = queue-seconds ; («seconds.»)

queue-thankyou = queue-thankyou ; («Thank you for your patience.»)

queue-reporthold = queue-reporthold ; («Hold time»)

periodic-announce = queue-periodic-announce ; («All reps busy / wait for next»)

queue-less-than

queue-quantity1

queue-quantity2

periodic-announce

Можно установить несколько звуковых файлов для основного объявления через запятую. Файлы будут воспроизведены в порядке перечисления.
Например:

 periodic-announce = queue-periodic-announce,your-call-is-important,please-wait
monitor-format

Для включения записи вызовов, требуется задать «monitor-format»,
если monitor-formatне задан, запись разговоров считается выключенной.
Вызовы будут записаны только с момента поднятию трубки оператором.

 monitor-format = gsm|wav|wav49
Queue Empty Options(параметры заполнения очереди)

Параметры очереди Asterisk «joinempty» и «leavewhenempty» регламентируют условия при которых абонент может встать в очередь и покинуть ее, соответственно.
Параметры «joinempty» и «leavewhenempty» могут принимать несколько значений, перечисленных через запятые.
Ниже приведем список факторов влияющих на эти параметры:

  • paused: считать недоступным, если оператор на паузе;
  • penalty: считать недоступным, если пенальти оператора меньше чем QUEUE_MAX_PENALTY;
  • inuse: считать недоступным, если телефон оператора в данный момент вызывается (звонит);
  • ringing: a member is not considered available if his phone is currently ringing
  • unavailable: Касается в основном каналов Agent (заданных в agents.conf). если агент назначен в agent.conf, но не зарегистрировался(каналы Agent можно считать устаревшими)
  • invalid: Интерфейсы имеющие статус «invalid».
  • unknown: Не имеющий явного статуса оператор.
  • wrapup: Оператор на таймауте wrapuptimeпосле вызова.

Пример, не подключаться к очереди,если все операторы имеют один из перечисленных статусов:

 joinempty = paused,inuse,invalid

Покинуть очередь, если все операторы имеют один из указанных статусов:

 leavewhenempty = inuse,ringing

; Устаревшие значения, могут быть указаны для обратной совместимости:

  • yes - (empty) for joinempty; penalty,paused,invalid for leavewhenempty
  • no - penalty,paused,invalid for joinempty; (empty) for leavewhenempty
  • strict - penalty,paused,invalid,unavailable
  • loose - penalty,invalid
reportholdtime

Если нужно оповестить оператора о том сколько абонент ожидал в очереди.

 reportholdtime = no
ringinuse

Чтобы избежать посылки вызова на оператора, чей интерфейс находится с состоянии 'in use', установите = no. Помимо общего значения очереди, можно установить этот параметр для отдельных пользователей очереди через команду QUEUE_MEMBER, поле 'ringinuse' реалтайм пользователей и CLI/AMI:

*CLI> queue set ringinuse no on SIP/4887 in queue1

 SIP/4887 (ringinuse disabled) (dynamic) (Not in use)

*CLI> queue set ringinuse yes on SIP/4887 in queue1

 SIP/4887 (ringinuse enabled) (dynamic) (Not in use)

только драйверы каналов SIP и PJSIP поддерживают в данный момент статус 'in use'

 ringinuse = no
memberdelay

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

  memberdelay = 0
timeoutrestart

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

 timeoutrestart = no
defaultrule

назначить правила по умолчанию. Конфигурация находится в queuerules.conf

 defaultrule = myrule
Members

Каждый пользователь очереди перечисляется в отдельной строке
в виде технология/строка набора. Под пользователем понимается оператор очереди.
Дополнительный параметр 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.

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

После второй запятой назначается имя.
Использование имени может быть удобно для представления в логах очереди.
Разные интерфейсы могут использовать одно имя.

Дополнительное описание интерфейса указывается после третьей запятой.
На этот интерфейс будут посылаться уведомления app_queue,
но для вызова будет всегда использоваться указанный первым интерфейс.

 member => interface [,penalty][,membername][,state_interface][,ringinuse]
member => DAHDI/1
member => DAHDI/2,10
member => DAHDI/3,10,Stev Morrissev
member => Local/1000@default,0,Patty Smithoff,SIP/1000
member => Local/2000@default,0,Syd Buratinov,SIP/2000,no

Страницы с тегом 'queue':

Команда Asterisk: AddQueueMember

Asterisk: PauseQueueMember

Команда Asterisk: Queue

Asterisk: QueueLog

Asterisk: RemoveQueueMember

Asterisk: UnpauseQueueMember

Asterisk queuerules.conf

function 'QUEUE_EXISTS'

function 'QUEUE_MEMBER'

function 'QUEUE_MEMBER_LIST'

Функция диалплана Asterisk: QUEUE_VARIABLES

function 'QUEUE_WAITING_COUNT'

Asterisk: queue_log в MySQL через unixODBC

FreePBX Queues

Asterisk Call Center Stats

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в MySQL - 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

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

Asternic Call Center Stats Веб интерфейс статистики очереди (queue). Парсит лог очереди (var/log/asterisk/queue_log) и выводит информацию о количестве отвеченных/неотвеченных вызовов, о среднем времени ожидания и разговора по очередям и агентам. Существует бесплатная версия с урезанным функционалом. Отличное решение для бюджетного колл-центра.

Веб-интерфейс для статистики очередей и агентов.

  • Количество принятых вызовов за указанный период времени
  • Количество отвеченных вызовов
  • Количество не отвеченных вызовов
  • Среднее время разговора

Следующие отчеты интегрированы в Asternic Call Center Stats :

Распределение: по очередям, по месяцам, по неделям, по дням, по часам.

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

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

Текущее состояние агентов: продолжительность работы или простоя, состояние текущего вызова, текущее кол-во вызовов в очереди)

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

http://www.asternic.net/downloads/

Приложения


Страницы с тегом 'queue':

Команда Asterisk: AddQueueMember

Asterisk: PauseQueueMember

Команда Asterisk: Queue

Asterisk: QueueLog

Asterisk: RemoveQueueMember

Asterisk: UnpauseQueueMember

Asterisk queuerules.conf

Asterisk: queues.conf

function 'QUEUE_EXISTS'

function 'QUEUE_MEMBER'

function 'QUEUE_MEMBER_LIST'

Функция диалплана Asterisk: QUEUE_VARIABLES

function 'QUEUE_WAITING_COUNT'

Asterisk: queue_log в MySQL через unixODBC

FreePBX Queues


AMI - Originate

$
0
0

AMI - Originate

manager show command Originate

Action: Originate
[ActionID:] <value>
Channel: <value>
[Exten:] <value>
[Context:] <value>
[Priority:] <value>
[Application:] <value>
[Data:] <value>
[Timeout:] <value>
[CallerID:] <value>
[Variable:] <value>
[Account:] <value>
[EarlyMedia:] <value>
[Async:] <value>
[Codecs:] <value>
[ChannelId:] <value>
[OtherChannelId:] <value>

Описание команды

Инициирует вызов на <Extension>/<Context>/<Priority>или <Appl ication>/<Data>

Аргументы

  • ActionID - Идентификатор для этого действия(транзакции).
  • Channel - Имя канала с которым будет соединен вызываемый номер (например SIP/1000 или Local/s@context.
  • Exten - Вызываемый номер (используется совместно 'Context' и 'Priority')
  • Context - Контекст используемый для вызова номера Exten ('Exten' и 'Priority' должны быть заданы)
  • Priority - Приоритет в используемом контексте (требует 'Exten' и 'Context')
  • ApplicationИсполняемое приложение .
  • Data - Данные для 'Application'.
  • Timeout - Сколько ждать ответа (in ms.).
  • CallerID - Caller ID назначается
  • Variable - Channel variable to set, multiple Variable: headers are allowed.
  • Account - Account code.
  • EarlyMedia - Set to 'true' to force call bridge on early media..
  • Async - Set to 'true' for fast origination.
  • Codecs - Comma-separated list of codecs to use for this call.
  • ChannelId - Channel UniqueId to be set on the channel.
  • OtherChannelId - Channel UniqueId to be set on the second local channel.

Пример использования команды "Originate" для инициации вызова из 1С 7.7

ТекстКоманды=
	 "Action: Originate"+CRLF
            +"Channel: Local/"+СокрЛП(Источник)+"@outbound-context"+CRLF
            +"CallerIDNum: "+СокрЛП("+78123216111")+CRLF
	    +"Context: "+СокрЛП(АМИКонтекст)+CRLF
	    +"Exten: " +СокрЛП(СтрЗаменить(Приемник,"+",""))+CRLF
	    +"Dialstring: Local/"+СокрЛП(СтрЗаменить(Приемник,"+",""))+CRLF
	    +"Priority: 1"+CRLF
	    +"Callerid: " +СокрЛП(СтрЗаменить(Приемник,"+",""))+CRLF
	    +"Variable: _SIPADDHEADER51=Call-Info: answer-after=1"+CRLF
	    +"Variable: timeout1=30"+CRLF // в секундах
	    +"Async: true"+CRLF+CRLF;

Пример использования команды Originate из CLI Asterisk

 channel originate SIP/1000 extension 3216111@from-internal
 channel originate Local/1000@from-internal  extension *43@from-internal
asterisk*CLI> core show help channel originate
  There are two ways to use this command. A call can be originated between a
channel and a specific application, or between a channel and an extension in
the dialplan. This is similar to call files or the manager originate action.
Calls originated with this command are given a timeout of 30 seconds.

Usage1: channel originate <tech/data> application <appname> [appdata]
  This will originate a call between the specified channel tech/data and the
given application. Arguments to the application are optional. If the given
arguments to the application include spaces, all of the arguments to the
application need to be placed in quotation marks.

Asterisk Manager Interface (AMI)

Команда Asterisk: While

$
0
0

Команда Asterisk: While

Команда плана набора Asterisk While - Повторять цикл (loop) пока условие верно.

Описание

Петля создается между приложениями While() и EndWhile() и выполняется, пока условие заданное в While(условие) верно. Условие вычисляется один раз за цикл, в самом начале.
примечания:

  • Цикл While/EndWhile может параллельно выполнять множество наборов за раз.
  • Если условие неверно, выполнение диалплана продолжается после EndWhile
  • Модификатор цикла, приложение ContunueWhile
Синтаксис

While(expr)

Пример 1
exten => _4881,1,Answer
exten => _4881,n,Set(i=1)
exten => _4881,n,While($[${i} < 5])
exten => _4881,n,SayNumber(${i})
exten => _4881,n,Set(i=$[${i} + 1])
exten => _4881,n,EndWhile
пример 2

Сбор конференц-моста из БД, средствами диалплана, при помощи команды While()

БД:

+------+--------+
| id   | number |
+------+--------+
| 1    | 2666   |
| 2    | 2667   |
| 3    | 2668   |
+------+--------+

extconfig.conf:

 autoconfbridge = odbc,category(res_odbc.conf),autoconfbridge 
exten => _4884,1,Answer
 same => n,Set(i=1)
 same => n,While($[${i} <= 3]) ; макс кол-во участников.
 same => n,originate(SIP/${REALTIME_FIELD(autoconfbridge,id,${i},number)},app,confbridge,<conf_name>)
 same => n,Set(i=$[${i} + 1])
 same => n,EndWhile
пример predictive dialer

Автообзвон абонентов из базы данных средствами диалплана.

extconfig.conf

 autodial=>odbc,sql2,autodial

БД

> select * from autodial;
+------+--------+--------+-------+
| id   | number | status | count |
+------+--------+--------+-------+
| 1    | 2666   | new    | 0     |
| 2    | 2667   | new    | 0     |
| 3    | 2668   | new    | 0     |
+------+--------+--------+-------+

func_odbc.conf

[SQL]
dsn=sql2
mode=multirow
readsql=SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}

extensions.conf

[autodial]
exten => s,1,Noop
same => n,Set(_i=${ODBC_FETCH(${ODBC_SQL(1)})})  ;получаем id = SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}
  same => n,While($[${REALTIME_FIELD(autodial,id,${i},count)} <= 3])                            ; старт цикла
  same => n,Set(REALTIME(autodial,id,${i},status)=inuse)                                        ; статус вызова
  same => n,Dial(PJSIP/${REALTIME_FIELD(autodial,id,${i},number)}@fs_pjsip,5,U(sub-answer^s^1)) ; набор номера, с подпрограммой диалплана
                                                                                                ; sub-answer, выполняется, если вызываемый номер
                                                                                                ; ответил на вызов.
																								; ответил.
  same => n,Goto(s-${DIALSTATUS}) ; определяем действия в зависимости от статуса вызова
same => n(s-ANSWER),hangup  
same => n(s-NOANSWER),goto(s,loop) ; направим неотвеченные вызовы на приоритет loop
same => n(s-BUSY),goto(s,loop) 
same => n(s-CANCEL),Set(REALTIME(autodial,id,${i},status)=cancel)
same => n(s-CANCEL),hangup
  same => n(loop),set(count=${REALTIME_FIELD(autodial,id,${i},count)})                          ; приоритет для неотвеченных вызовов
  same => n,Set(REALTIME(autodial,id,${i},count)=$[${count} + 1])                               ; счетчик неотвеченных вызовов
  same => n,GotoIf($[${REALTIME_FIELD(autodial,id,${i},count)} >= 3]?no-answer,s,1)             ; если значение счетчика >= 3 
  same => n,ODBCFinish                                                                                              ; устанавливаем статус noanswer
  same => n,EndWhile
[sub-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=answer)
;exten => s,n,System(asterisk -rx 'channel  originate Local/s@autodial application queue queuename1')
; или
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))
  same => n,return
[no-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=noanswer)
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))

Активация

originate Local/s@autodial application queue <queuename>

или

originate Local/s@autodial application playback <playback_name>

и т.д.

originate Local/s@autodial application confbridge <conference_name>

и т.п.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

<?php
$strHost = "127.0.0.1";
$strUser = "AMI User";
$strSecret = "AMI password";
$strChannel = "Local/s@autodial";
$strWaitTime = "60000";
$strApplication = $_POST['app'];
$strData = $_POST['data'];
$strVariable = "dst1=$strData";
$timeout1 = $_POST['timeout1'];
$strVariable = "timeout1=$timeout1";
$length = strlen($strData);

if ($length == 4 && is_numeric($strData))
{
$oSocket = fsockopen($strHost, 5038, $errnum, $errdesc) or die("Connection to host failed");
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Events: on\r\n");
fputs($oSocket, "Username: $strUser\r\n");
fputs($oSocket, "Secret: $strSecret\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $strChannel\r\n");
fputs($oSocket, "Timeout: $strWaitTime\r\n");
fputs($oSocket, "Application: $strApplication\r\n");
fputs($oSocket, "Data: $strData\r\n");
fputs($oSocket, "Variable: $strVariable\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep (1);
fclose($oSocket,128);

?><p><table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"><tr><td><font size="2" face="verdana,georgia" color="#630000">Кампания активирована!<br><a href="<?php echo $_SERVER['PHP_SELF'] ?>">Ещё раз</a></td></tr></table></p><?php
}
else
{
?><p><table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"><tr><td><font size="2" face="verdana,arial,georgia" color="#630000">Таймаут, Приложение и имя</font><form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"><input type="text" size="20" maxlength="12" name="timeout1" Value="sec"><p></p><input type="text" size="20" maxlength="12" name="app" Value="application"><p></p><input type="text" size="20" maxlength="12" name="data" Value="data"><p></p><input type="submit" value="Start"></form></td></tr></table></p><?php
}
?>

БД после завершения автообзвона

> select * from autodial;
+------+--------+----------+-------+
| id   | number | status   | count |
+------+--------+----------+-------+
| 1    | 2666   | noanswer | 3     |
| 2    | 2667   | answer   | 2     |
| 3    | 2668   | answer   | 1     |
+------+--------+----------+-------+
см. также

Asterisk Автообзвон - Autodialer

$
0
0

Asterisk Автообзвон - Autodialer

Примеры реализации автообзвона (autodialer) на Asterisk.

Автообзвон при помощи Call File

Реализация автоматического обзвона абонентов (автодозвона) при помощи Asterisk и call файлов. Bash скрипт генерирует 'Call File' на основании списка номеров из текстового файла и копирует в директорию /var/spool/asterisk/outgoing. Asterisk вызывает номер на основании информации из 'call file' и отправляет на обработку в заданный контекст или приложение плана набора.
Все очень просто и эффективно.

Синтаксис Call File:

Логика 'Call File' такая же, как и команды originate.
Сначала инициируется 'Channel', если заданный в данном параметре номер отвечает,
вызывается 'Extension' или 'Application' и соединяются с 'Channel'.
Если 'Channel' не отвечает в течении 'WaitTime', а параметр 'MaxRetries' больше нуля,
предпринимается заданное кол-во попыток 'MaxRetries' с интервалом 'RetryTime'.

Параметры канала
  • Channel: <channel>: инициируемый канал (например Local/${number}/from-autodial )
  • CallerID: «name» <number> Caller ID, требуемый формат: CallerID: «Имя» <1234>
  • MaxRetries: <number> Кол-во попыток набора на каждый номер в списке (По умолчанию 0. Если установлено '0', будет совершена одна попытка, если '1' то две)
  • RetryTime: <number> Время в секундах между попытками. (Seconds between retries, Don't hammer an unavailable phone. По умолчанию 300 (5 min).)
  • WaitTime: <number> Время посылки вызова. (По умолчанию 45.)
  • Account: Аккаунт для вызова.
Параметры расширения:
  • Context: <context-name> Контекст для приема вызова, когда абонент ответил (extensions.conf)
  • Extension: <ext> Extension (расширение например:exten⇒ s,…) в контексте (extensions.conf)
  • Priority: <priority> Приоритет в контексте.
  • Set: Установить переменную канала для вызова (example: file1=/tmp/to );
  • Application: Приложение Asterisk (используется вместо context, extension, priority)
  • Data: Данные приложения (например: PlayBack(data))
  • AlwaysDelete: Yes/No - Удалять файлы по завершении.
  • Archive: Yes/No - Перемещать выполненные файлы в директорию outgoing_doneс указанием статуса с которым завершилось задание «Status: value», где возможны значения
    • Completed - Успешно.
    • Expired - Просрочено.
    • Failed - Неудачно.

Expired или Failed отличаются по статусу вызова. Если вызов удался, но на него не ответили в заданное время вызова и кол-во попыток, то Expired. Если вызов не удалось инициировать вообще, то Failed.

пример архивного файла

пример архивного файла

Channel: Local/00089XXXXXXXXX@from-fs-alarm
Callerid:
MaxRetries: 0
RetryTime: 20
WaitTime: 30
Context: alert_mob
Extension: s
Priority: 1
Archive: yes

StartRetry: 3426 1 (1479384177)

DelayedRetry: 3426 0 (1479384177)
Status: Completed

Autodial: пример 1

Вызываются номера по списку и проигрывается сообщение из контекста [outboundmsg1].

dialplan

/etc/asterisk/extensions.conf

/etc/asterisk/extensions.conf

[outboundmsg1]
exten => s,1,Wait(2)
exten => s,n,Playback(/var/lib/asterisk/sounds/custom/you_call_your_friends_are_collectors)
exten => s,n,Hangup
bash script

/var/spool/asterisk/call_list.sh

/var/spool/asterisk/call_list.sh

#!/bin/sh

while read number; do

cat <<EOF  >  /var/spool/asterisk/$number

Channel: SIP/voip_trunk/$number
Callerid: $number
MaxRetries: 200
RetryTime: 20
WaitTime: 30
Context: outboundmsg1
Extension: s
Priority: 1

EOF

    chown asterisk:asterisk /var/spool/asterisk/$number
    mv /var/spool/asterisk/$number  /var/spool/asterisk/outgoing

    echo "$number"

    number=`expr $number + 1`

    while [ "$?" -eq "0" ]

    do
count_files ()

{

    count_f=`ls /var/spool/asterisk/outgoing | wc -l`

        if [ "$count_f" -eq "30" ]; then

            sleep 10

            return 0

        else

            return 1

        fi

}

    count_files

    done

done < /var/spool/asterisk/list.txt

exit 0

Примечания к скрипту:

  • Channel: SIP/voip_trunk/$number - voip_trunkтранк через который совершаются вызовы.
  • if [ «$count_f» -eq «30» ]; then - 30кол-во одновременных вызовов. (фактически это кол-во файлов создаваемых скриптом за один раз, следующие по списку файлы, будут созданы, только по завершению обработки первой группы)

/var/spool/asterisk/list.txt - список обзвона, каждый номер в новой строке.

   101
   102
пример predictive dialer

Автообзвон абонентов из базы данных средствами диалплана.

extconfig.conf

 autodial=>odbc,sql2,autodial

БД

> select * from autodial;
+------+--------+--------+-------+
| id   | number | status | count |
+------+--------+--------+-------+
| 1    | 2666   | new    | 0     |
| 2    | 2667   | new    | 0     |
| 3    | 2668   | new    | 0     |
+------+--------+--------+-------+

func_odbc.conf

[SQL]
dsn=sql2
mode=multirow
readsql=SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}

extensions.conf

[autodial]
exten => s,1,Noop
same => n,Set(_i=${ODBC_FETCH(${ODBC_SQL(1)})})  ;получаем id = SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}
  same => n,While($[${REALTIME_FIELD(autodial,id,${i},count)} <= 3])                            ; старт цикла
  same => n,Set(REALTIME(autodial,id,${i},status)=inuse)                                        ; статус вызова
  same => n,Dial(PJSIP/${REALTIME_FIELD(autodial,id,${i},number)}@fs_pjsip,5,U(sub-answer^s^1)) ; набор номера, с подпрограммой диалплана
                                                                                                ; sub-answer, выполняется, если вызываемый номер
                                                                                                ; ответил на вызов.
																								; ответил.
  same => n,Goto(s-${DIALSTATUS}) ; определяем действия в зависимости от статуса вызова
same => n(s-ANSWER),hangup  
same => n(s-NOANSWER),goto(s,loop) ; направим неотвеченные вызовы на приоритет loop
same => n(s-BUSY),goto(s,loop) 
same => n(s-CANCEL),Set(REALTIME(autodial,id,${i},status)=cancel)
same => n(s-CANCEL),hangup
  same => n(loop),set(count=${REALTIME_FIELD(autodial,id,${i},count)})                          ; приоритет для неотвеченных вызовов
  same => n,Set(REALTIME(autodial,id,${i},count)=$[${count} + 1])                               ; счетчик неотвеченных вызовов
  same => n,GotoIf($[${REALTIME_FIELD(autodial,id,${i},count)} >= 3]?no-answer,s,1)             ; если значение счетчика >= 3 
  same => n,ODBCFinish                                                                                              ; устанавливаем статус noanswer
  same => n,EndWhile
[sub-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=answer)
;exten => s,n,System(asterisk -rx 'channel  originate Local/s@autodial application queue queuename1')
; или
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))
  same => n,return
[no-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=noanswer)
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))

Активация

originate Local/s@autodial application queue <queuename>

или

originate Local/s@autodial application playback <playback_name>

и т.д.

originate Local/s@autodial application confbridge <conference_name>

и т.п.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

<?php
$strHost = "127.0.0.1";
$strUser = "AMI User";
$strSecret = "AMI password";
$strChannel = "Local/s@autodial";
$strWaitTime = "60000";
$strApplication = $_POST['app'];
$strData = $_POST['data'];
$strVariable = "dst1=$strData";
$timeout1 = $_POST['timeout1'];
$strVariable = "timeout1=$timeout1";
$length = strlen($strData);

if ($length == 4 && is_numeric($strData))
{
$oSocket = fsockopen($strHost, 5038, $errnum, $errdesc) or die("Connection to host failed");
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Events: on\r\n");
fputs($oSocket, "Username: $strUser\r\n");
fputs($oSocket, "Secret: $strSecret\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $strChannel\r\n");
fputs($oSocket, "Timeout: $strWaitTime\r\n");
fputs($oSocket, "Application: $strApplication\r\n");
fputs($oSocket, "Data: $strData\r\n");
fputs($oSocket, "Variable: $strVariable\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep (1);
fclose($oSocket,128);

?><p><table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"><tr><td><font size="2" face="verdana,georgia" color="#630000">Кампания активирована!<br><a href="<?php echo $_SERVER['PHP_SELF'] ?>">Ещё раз</a></td></tr></table></p><?php
}
else
{
?><p><table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"><tr><td><font size="2" face="verdana,arial,georgia" color="#630000">Таймаут, Приложение и имя</font><form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"><input type="text" size="20" maxlength="12" name="timeout1" Value="sec"><p></p><input type="text" size="20" maxlength="12" name="app" Value="application"><p></p><input type="text" size="20" maxlength="12" name="data" Value="data"><p></p><input type="submit" value="Start"></form></td></tr></table></p><?php
}
?>

БД после завершения автообзвона

> select * from autodial;
+------+--------+----------+-------+
| id   | number | status   | count |
+------+--------+----------+-------+
| 1    | 2666   | noanswer | 3     |
| 2    | 2667   | answer   | 2     |
| 3    | 2668   | answer   | 1     |
+------+--------+----------+-------+
2016/11/26

Tips&Tricks

Если установить параметры файла atimeи mtime (access time и modifity time соответственно) в будущем, файл помещенный в директорию outgoingбудет выполнен только по наступлении заданного времени.

Изменение меток времени файла командой touch

Изменение меток времени файла командой touch

Модификация time stamp при помощи опций -t и -d

The format for specifying -t is [[CC]YY]MMDDhhmm[.SS]

 $ touch -t [[CC]YY]MMDDhhmm[.SS]

формат:

  • CC – Первые две цифры года.
  • YY – Последние две цифры года CC - 19, YY -16 = 2016
  • MM – Месяц
  • DD – День
  • hh – Часы
  • mm – Минуты
  • SS – Секунды

пример:

 $ touch -a -m -t 203801181205.09 tgs.txt

NAT, SIP и Asterisk

$
0
0

NAT, SIP и Asterisk

Трансляция сетевых адресов (NAT) является обычной практикой в сети и нередко мешает прохождению голосовых пакетов (нет звука) и инициализации соединений (нет соединения). Решение этой проблемы требует понимания принципов работы NAT и VoIP. В этой статье рассматривается протокол SIP и Asterisk, но проблемы и решения применимы и к большинству других приложений и протоколов.

NAT используется, чтобы скрыть многочисленные локальные адреса, за каким-то внешним узлом, обеспечивая безопасность и структуризацию сети.
Когда пакет проходит шлюз (gateway), IP-адрес локального источника заменяется на внешний IP-адрес. При ответе шлюз направляет пакет на исходный локальный адрес. Также шлюз блокирует внешние запросы не имеющие явных внутренних источников, но возможно пробросить пакеты пришедшие на определенные порты, на заранее заданные IP адреса внутри сети.

Если у вас нет звука, нет звука в одну сторону, нет слышимости, прочтите внимательно эту инструкцию.

Reinvite

Первый абонент запрашивает соединение у второго , сообщая свой IP адрес. Второй отвечает, сообщая свой IP. Голосовые пакеты направляются напрямую абонентам, минуя SIP сервер. Передача голосовых пакетов напрямую абонентам, минуя Asterisk, называется RE-INVITE или Native Bridge.

NAT может вызвать проблемы в нескольких местах.

  • Если одна из АТС находится за NAT, другая АТС не сможет связаться с ней, без проброса портов.
  • Если телефон находится за NAT, голосовые пакеты могут быть направлены на немаршрутизируемый адрес в сети, что приведет к потере звука.

Клиент за NAT

В простейшей ситуации SIP клиент находясь за NAT, обращается к внешнему интерфейсу Asterisk. SIP клиент при регистрации на сервере создает запись в таблице трансляций, которая сохраняется, пока проходит хотя бы один пакет в минуту. В файле sip.conf требуется определить параметры сети и свойства удаленного пира.


[general]
localnet=192.168.0.0/255.255.255.0 ; локальная сеть
externip=x.x.x.x                   ; внешний ip адрес

[sip_phone]             
nat=yes
qualify=300                    ; проверять соединение каждые 300 мс.

Начиная с версии Asterisk 11: 'nat=yes' устарело, используйте 'nat=force_rport,comedia'
nat=force_rport,comedia

nat=force_rport,comedia
directmedia=nonat

При такой конфигурации Asterisk использует внешний IP адрес externipдля вызовов клиентов с параметром nat=yes . Дополнительно параметр qualify=yesподдерживает соединение, не позволяя удалять запись из таблицы трансляций.

SIP клиенты и Asterisk за NAT

Все усложняется если и Asterisk, и клиенты, находятся за NAT. Клиенты с внешней стороны не смогут получать SIP сообщения и принимать звонки. Или в SIP сообщении будет указан локальный IP адрес телефона, что приведет к потере звука.

Чтобы избежать потери звука запретите re-inviteв файле sip.conf

[general]
canreinvite => no

Опция canreinvite устарела. Используйте 'directmedia'.

  • directmedia=yes
  • directmedia=nonat
  • directmedia=update
  • directmedia=outgoing

Но клиенты находящиеся за NAT, все равно не смогут инициировать соединение с Asterisk и направить голосовые пакеты RTP на требуемый екстеншен. Для того чтобы это работало, надо пробросить требуемые порты через брандмауер на Asterisk. Диапазон RTP портов используемых Asterisk, назначается в файле rtp.conf.

[general]
rtpstart=10000 
rtpend=10100                  

По умолчанию задан диапазон от 10000 до 20000. Измените диапазон в соответсвии с вашими потребностями (3 порта на каждый конкурирующий вызов).

Для нормальной работы за NAT, потребуется пробросить диапазон RTP портов в соответсвии с настройками в файле rtp.conf и порт SIP(обычно 5060). В iptablesэто будет выглядеть так:

iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp --dport 10000:10100 -j DNAT \
--to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp --dport 5060 -j DNAT \
--to-destination 192.168.1.10

Где eth0 - внешний интерфейс, а 192.168.1.10 - IP адрес Asterisk.

Основные параметры конфигурации NAT для Asterisk

sip.conf

Поддержка NAT в Asterisk 12

localnet

параметр 'localnet' список сетевых адресов, которые считаются «внутренними».

 localnet=192.168.0.0/255.255.0.0 - RFC 1918 адреса
 localnet=10.0.0.0/255.0.0.0      - Также RFC1918
 localnet=172.16.0.0/12           - Другое RFC1918 с CIDR обозначением
 localnet=169.254.0.0/255.255.0.0 - Zeroconf локальная сеть
externaddr

Внешний адрес щлюза (маршрутизатора) во внешнюю сеть. «externaddr = hostname[:port]» указывает статический адрес[:port] который будет использован в SIP и SDP сообщениях. Имя хоста (hostname) поднимается каждый раз, когда [пере]загружается sip.conf. Если порт не назначен, используется значение указанное в параметре «udpbindaddr». примеры:

 externaddr = 123.34.56.78:         - использовать этот адрес.
 externaddr = 123.34.56.78:9900     - использовать этот адрес и порт.
 externtcpport = 9900    - отображаемый наружу tcp порт
 externtlsport = 12600   - отображаемый наружу tcp порт;  'externtlsport' по рекомендации RFC назначенный порт 5061.	
externhost

«externhost = hostname[:port]» то же что и «externaddr» только это 'hostname' обновляемое через «externrefresh» секунд (по умолчанию 10сек.).

 externhost=foo.dyndns.net       - обновлять периодически
 externrefresh=180               - задать интервал обновления

В дополнение к вышесказанному Asterisk имеет дополнительный параметр «NAT» для разрешения вопросов, связанных со входящими SIP или медиа сессиями. В частности, в зависимости от настроек 'NAT =' как описано ниже, Asterisk может переопределить адрес / порт информацию, указанную в SIP / SDP сообщениях.

 nat = no                - без NAT RFC3581
 nat = force_rport       - использовать rport, даже если его нет 
 nat = comedia           - отправить медиа поток на порт ASterisk, независимо от указаний SDP.
 nat = auto_force_rport  - установить 'force_rport' параметр если  Asterisk обнаружил NAT (по умолчанию)
 nat = auto_comedia      - установить  'comedia' параметр если Asterisk обнаружил NAT

настройки могут совмещаться:

nat=force_rport,comedia

RFC 3581 определяет что 'rport' позволяет клиенту запросить, чтобы Asterisk отправлял SIP ответы на него через исходный IP и порт, с которого был направлен запрос, вместо адреса / порта из самого верхнего Via заголовка.

Установка force_rport принуждает Asterisk всегда передавать ответы обратно на адрес / порт, с которых он получил запросы, даже если другая сторона не поддерживает добавления параметра 'rport'.

media_address

IP адрес используемый для медиа (аудио, видео и текста) в SDP может быть переназначен параметром 'media_address'. Данный параметр может быть использован только в секции [general].

 media_address = 172.16.42.1
icesupport

ICE/STUN/TURN использование может быть включено глобально или для конкретного пира с помощью 'icesupport' опции.

 icesupport = yes
directmedia

Для отключения прямых RTP потоков (peer-to-peer) используйте опцию:

 directmedia=nonat

<spoiler|устаревшие настройки sip.conf>port= Порт используемый SIP протоколом для сигнализации (default=5060)

bindaddr= IP адрес Asterisk, если указано 0.0.0.0, то любой адрес.

externip= Этот параметр задается в секции [general] файла sip.confи указывает внешний IP адрес, или имя хоста на вашем устройстве NAT.

externip=123.123.123.123

Этот адрес будет использован для общения с устройствами с установленным параметром nat=force_rport.

localnet= Этот параметр задается в секции [general] файла sip.confи указывает на локальную сеть и используется для обращения к устройствам с параметром nat=no.

localnet=192.168.0.0/255.255.255.0
NAT

Возможные значения:

NAT= yes, no, never, route

NAT=route

Начиная с версии Asterisk 11: nat=yes is deprecated, use nat=force_rport,comedia instead

  • nat = no - без NAT RFC3581
  • nat = force_rport - использовать rport, даже если его нет
  • nat = comedia - отправить медиа поток на порт Asterisk, независимо от указаний SDP.
  • nat = auto_force_rport - установить 'force_rport' параметр если Asterisk обнаружил NAT (по умолчанию)
  • nat = auto_comedia - установить 'comedia' параметр если Asterisk обнаружил NAT

Asterisk будет отправлять голосовые пакеты на порт и IP адрес с которого их получает а не указанные в SIP и SDP сообщениях.

Это будет работать только, если телефоны за NAT будут использовать для одинаковый порт для голосовых пакетов RTP и одинаковый (но отличный от голосового) для сигнализации RTCP.

directmedia
  • directmedia=yes
  • directmedia=nonat
  • directmedia=update
  • directmedia=outgoing

qualify= Эта опция имеет два назначения.Первое - поддерживать запись в таблице трансляций NAT и контролировать регистрацию телефона.

Возможные значения:

qualify=yes 

Этот параметр задает проверку по умолчанию каждые 2 секунды.

qualify=no

Это выключает проверку.

qualify=300

Включает проверку через заданное время в 300 ms.

rtp.conf

 rtpstart=10000

Задает первый порт диапазона для приема и оправки голосовых пакетов RTP.

 rtpend=10100

Задает последний порт диапазона для приема и оправки голосовых пакетов RTP.

 stunaddr=sip.stun.tld

В Asterisk начиная с версии 11 появилась поддержка stun. icesupportдолжно быть включено.



Настройка res_pjsip для работы через NAT

В данной статье приведены примеры рабочей конфигурации драйвера канала PjSIP, когда Asterisk находится за NAT (Network Address Translation). Asterisk подключается через NAT к провайдеру IP телефонии (ITCP).
Этот пример подходит для большинства простых сценариев NAT при следующих условиях: Asterisk и телефоны находятся в частной сети. Маршрутизатор имеет локальный и публичный интерфейсы. Маршрутизатор реализует функции Трансляции Сетевых Адресов (NAT) и файерволла. На маршрутизаторе настроен проброс SIP и RTP портов на локальный IP адрес сервера Asterisk. В данном примере проброшены порты 5060 TCP/UDP и UDP 10000-10100 на LAN 10.10.2.10.

Устройства используемые в примере:

УстройствоIP адрес в примере
VOIP телефон(7777)10.10.2.77
PC/Asterisk10.10.2.10
МаршрутизаторLAN: 10.10.2.1
WAN: 123.123.123.123
ITSP SIP шлюз203.0.113.1(gw1.example.com)
203.0.113.2(gw2.example.com)

Для полной ясности, в примере использованы фальшивые детали:

ITSP номер аккаунта : 123456789 и DID номер входящий от провайдера IP телефонии (ITSP): 3216111

Читать дальше...

2016/11/26

145 Table './asterisk/kvstore' is marked as crashed and should be repaired

$
0
0

145 Table './asterisk/kvstore' is marked as crashed and should be repaired

При подключении к FreePBX появляется ошибка:

FATAL ERROR

FreePBX is Unable to Continue

SQLSTATE[HY000]: General error: 145 Table './asterisk/kvstore' is marked as crashed and should be repaired

Trace Back

/var/www/html/admin/config.php:302 die_freepbx()
  [0]: FreePBX is Unable to Continue
  [1]: SQLSTATE[HY000]: General error: 145 Table './asterisk/kvstore' is marked as crashed and should be repaired

Проверяем БД

 mysqlcheck -u root -p<password> --check asterisk

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

asterisk.admin
warning  : 5 clients are using or haven't closed the table properly
status   : OK
asterisk.ampusers                                  OK
asterisk.announcement                              OK
asterisk.arimanager                                OK
asterisk.backup                                    OK
asterisk.backup_cache
warning  : 2 clients are using or haven't closed the table properly
status   : OK
asterisk.backup_details                            OK
asterisk.backup_items                              OK
asterisk.backup_server_details                     OK
asterisk.backup_servers                            OK
asterisk.backup_template_details                   OK
asterisk.backup_templates                          OK
asterisk.callback                                  OK
asterisk.callrecording                             OK
asterisk.callrecording_module                      OK
asterisk.certman_cas                               OK
asterisk.certman_certs                             OK
asterisk.certman_mapping                           OK
asterisk.cidlookup                                 OK
asterisk.cidlookup_incoming                        OK
asterisk.cronmanager
warning  : 4 clients are using or haven't closed the table properly
status   : OK
asterisk.custom_destinations                       OK
asterisk.custom_extensions                         OK
asterisk.cxpanel_conference_rooms                  OK
asterisk.cxpanel_email                             OK
asterisk.cxpanel_phone_number                      OK
asterisk.cxpanel_queues                            OK
asterisk.cxpanel_recording_agent                   OK
asterisk.cxpanel_server                            OK
asterisk.cxpanel_users                             OK
asterisk.cxpanel_voicemail_agent                   OK
asterisk.dahdi                                     OK
asterisk.dahdi_advanced                            OK
asterisk.dahdi_advanced_modules                    OK
asterisk.dahdi_analog                              OK
asterisk.dahdi_configured_locations                OK
asterisk.dahdi_modules                             OK
asterisk.dahdi_spans                               OK
asterisk.dahdichandids                             OK
asterisk.daynight                                  OK
asterisk.devices
warning  : 2 clients are using or haven't closed the table properly
status   : OK
asterisk.digium_phones_alerts                      OK
asterisk.digium_phones_customapp_settings          OK
asterisk.digium_phones_customapps                  OK
asterisk.digium_phones_device_alerts               OK
asterisk.digium_phones_device_customapps           OK
asterisk.digium_phones_device_externallines        OK
asterisk.digium_phones_device_logos                OK
asterisk.digium_phones_device_networks             OK
asterisk.digium_phones_device_phonebooks           OK
asterisk.digium_phones_device_settings             OK
asterisk.digium_phones_device_statuses             OK
asterisk.digium_phones_devices                     OK
asterisk.digium_phones_extension_settings          OK
asterisk.digium_phones_externalline_settings       OK
asterisk.digium_phones_externallines               OK
asterisk.digium_phones_firmware                    OK
asterisk.digium_phones_firmware_packages           OK
asterisk.digium_phones_general                     OK
asterisk.digium_phones_lines                       OK
asterisk.digium_phones_logos                       OK
asterisk.digium_phones_network_settings            OK
asterisk.digium_phones_networks                    OK
asterisk.digium_phones_phonebook_entries           OK
asterisk.digium_phones_phonebook_entry_settings    OK
asterisk.digium_phones_phonebooks                  OK
asterisk.digium_phones_queues                      OK
asterisk.digium_phones_ringtones                   OK
asterisk.digium_phones_status_entries              OK
asterisk.digium_phones_status_settings             OK
asterisk.digium_phones_statuses                    OK
asterisk.digium_phones_voicemail_translations      OK
asterisk.directory_details                         OK
asterisk.directory_entries                         OK
asterisk.disa                                      OK
asterisk.events                                    OK
asterisk.extensions                                OK
asterisk.fax_details                               OK
asterisk.fax_incoming                              OK
asterisk.fax_users                                 OK
asterisk.featurecodes                              OK
asterisk.findmefollow                              OK
asterisk.freepbx_log                               OK
asterisk.freepbx_settings                          OK
asterisk.freepbx_users
warning  : 1 client is using or hasn't closed the table properly
status   : OK
asterisk.freepbx_users_settings
warning  : 1 client is using or hasn't closed the table properly
status   : OK
asterisk.globals                                   OK
asterisk.hotelwakeup                               OK
asterisk.hotelwakeup_calls                         OK
asterisk.iax                                       OK
asterisk.iaxsettings                               OK
asterisk.incoming                                  OK
asterisk.indications_zonelist                      OK
asterisk.ivr_details                               OK
asterisk.ivr_entries                               OK
asterisk.kvstore
warning  : Table is marked as crashed
warning  : 1 client is using or hasn't closed the table properly
error    : Record at pos: 880864 is not remove-marked
error    : record delete-link-chain corrupted
error    : Corrupt
asterisk.language_incoming                         OK
asterisk.languages                                 OK
asterisk.logfile_logfiles                          OK
asterisk.logfile_settings                          OK
asterisk.manager                                   OK
asterisk.meetme                                    OK
asterisk.miscapps                                  OK
asterisk.miscdests                                 OK
asterisk.module_xml
warning  : 4 clients are using or haven't closed the table properly
status   : OK
asterisk.modules                                   OK
asterisk.notifications
warning  : 4 clients are using or haven't closed the table properly
status   : OK
asterisk.outbound_route_patterns                   OK
asterisk.outbound_route_sequence                   OK
asterisk.outbound_route_trunks                     OK
asterisk.outbound_routes                           OK
asterisk.outroutemsg                               OK
asterisk.paging_autoanswer                         OK
asterisk.paging_config                             OK
asterisk.paging_groups                             OK
asterisk.parkplus                                  OK
asterisk.pbook                                     OK
asterisk.pbook_directory                           OK
asterisk.phpagiconf                                OK
asterisk.pinset_usage                              OK
asterisk.pinsets                                   OK
asterisk.pjsip                                     OK
asterisk.presencestate_list                        OK
asterisk.presencestate_prefs                       OK
asterisk.queuemetrics_options                      OK
asterisk.queueprio                                 OK
asterisk.queues_config                             OK
asterisk.queues_details                            OK
asterisk.recordings                                OK
asterisk.ringgroups                                OK
asterisk.setcid                                    OK
asterisk.sip                                       OK
asterisk.sipsettings                               OK
asterisk.superfecta_mf                             OK
asterisk.superfecta_mf_child                       OK
asterisk.superfecta_to_incoming                    OK
asterisk.superfectacache                           OK
asterisk.superfectaconfig                          OK
asterisk.timeconditions                            OK
asterisk.timegroups_details                        OK
asterisk.timegroups_groups                         OK
asterisk.trunk_dialpatterns                        OK
asterisk.trunks                                    OK
asterisk.ucp_sessions
warning  : 1 client is using or hasn't closed the table properly
status   : OK
asterisk.users
warning  : 3 clients are using or haven't closed the table properly
status   : OK
asterisk.vmblast                                   OK
asterisk.vmblast_groups                            OK
asterisk.voicemail_admin                           OK
asterisk.webrtc_clients                            OK

Исправляем SQL таблицу

  mysql -b -u root -p<password> -D asterisk -e "REPAIR TABLE kvstore" -u root
+------------------+--------+----------+----------+
| Table            | Op     | Msg_type | Msg_text |
+------------------+--------+----------+----------+
| asterisk.kvstore | repair | status   | OK       |
+------------------+--------+----------+----------+

Troubleshooting

Viewing all 1041 articles
Browse latest View live


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