Avaya Communication Manager SIP Trunks + Asterisk
без использования Avaya SIP Enablement Services
...
Avaya Communication Manager SIP Trunks + Asterisk без использования Avaya SIP Enablement Services
В Avaya Communication Manager 4.0 введена поддержка TCP для SIP транков на C-LAN,
в то время как ранее поддерживалось только TLS.
Это усовершенствование позволяет прямое подключение SIP транков к SIP прокси других производителей,
без необходимости использования Avaya SIP Enablement Services (SES)
Avaya Software Version and Hardware Configuration List
Проверка лицензий Avaya Communication Manager
IP Node Names
IP-Codec-Set, and IP-Network-Region.
IP interface for C-LAN and IP Media Processor cards.
Avaya Signaling Group for the SIP Trunk to Asterisk
Avaya trunk group for the SIP trunk to Asterisk.
IP Codec Sets и Network Regions
Uniform DialPlan и Route Patterns
Avaya S8500 Software Version and Hardware Configuration List
list configuration software-versions
list configuration software-versions
SOFTWARE VERSIONS
SOFTWARE VERSION
Memory Resident: R015x.02.1.016.4
Disk Resident: R015x.02.1.016.4
TRANSLATION DATE
Memory Resident: 11:27 pm THU AUG 19. 2014
Disk Resident: 11:27 pm THU AUG 19. 2014
Disk Second Copy: good
list configuration carrier la Page 1
Board Assigned Ports
Number Board Type Code Vintage u=unassigned t=tti p=psa
01A00 POWER SUPPLY 655A
01A00 IP SERVER INTFC TN2312BP HW07 FW050 01 02 03 04 05 06 07 08
01A02 CONTROL-LAN TN799DP HW16 FW024 u u u u u u u u
u u u u u u u u
17
01A03 IP MEDIA PROCESSOR TN2302AP HW20 FW121 01 03 05 07
01A04 DIGITAL LINE TN2224CP HW01 FW015 01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16
17 18 u u u u u u
01A05 ANALOG LINE TN746B 000010 01 u u u u u u u
Проверка лицензий Avaya Communication Manager
display system-parameters customer-options Page 2 of 11
OPTIONAL FEATURES
IP PORT CAPACITIES USED
Maximum Administered H.323 Trunks: 5000 151
Maximum Concurrently Registered IP Stations: 5000 13
Maximum Administered Remote Office Trunks: 0 0
Maximum Concurrently Registered Remote Office Stations: 0 0
Maximum Concurrently Registered IP eCons: 0 0
Max Concur Registered Unauthenticated H.323 Stations: 10 0
Maximum Video Capable H.323 Stations: 0 0
Maximum Video Capable IP Softphones: 0 0
Maximum Administered SIP Trunks: 50 20
IP Node Names
change node-names Page 1 of 1
NODE NAMES
Type Name IP Address
IP clan 172.16.1.101
IP asterisk 172.16.1.253
IP FS-NVB 172.16.21.253
IP FS-MSK 172.16.45.28
IP CCM-LA 172.16.78.34
IP CM-NL 172.16.57.253
IP ACM-NY 172.16.24.253
IP IPO-BJ 172.16.67.23
IP interface for C-LAN and IP Media Processor cards
add ip-interface 2a02 Page 1 of 1
IP INTERFACES
Type: C-LAN
Slot: 02A02
Code/Suffix: TN799 D
Node Name: clan
IP Address: 172.16.1.101
Subnet Mask: 255.255.255.0 Link:
Gateway Address: 172.16.1.1Enable Ethernet Port? y Allow H.323 Endpoints? y
Network Region: 1 Allow H.248 Gateways? y
VLAN: n Gatekeeper Priority: 5
Target socket load and Warning level: 400
Receive Buffer TCP Window Size: 8320
ETHERNET OPTIONS
Auto? y
Avaya Signaling Group for the SIP Trunk to asterisk
add signaling-group 9 Page 1 of 1
SIGNALING GROUP
Group Number: 9 Group Type: sipTransport Method: tcp
IMS Enabled? n
Near-end Node Name: clan Far-end Node Name: asterisk
Near-end Listen Port: 5061 Far-end Listen Port: 5061
Far-end Network Region: 1
Far-end Domain: 172.16.1.253
Bypass If IP Threshold Exceeded? n
Incoming Dialog Loopbacks: Eliminate RFC 3389 Comfort Noise? n
DTMF over IP: rtp-payload Direct IP-IP Audio Connections? y
Session Establishment Timer(min): 3 IP Audio Hairpinning? Y
Enable Layer 3 Test? no Direct IP-IP Early Media? no
H.323 Station Outgoing Direct Media? no Alternate Route Timer(sec): 6
Avaya trunk group for the SIP trunk to Asterisk.
add trunk-group 9 Page 1 of 21
TRUNK GROUP
Group Number: 9 Group Type: sip CDR Reports: y
Group Name: SIP Trunk to Asterisk COR: 1 TN: 1 TAC: 815
Direction: two-way Outgoing Display? y
Dial Access? n Night Service:
Queue Length: 0
Service Type: public-ntwrk Auth Code? n
Signaling Group: 9
Number of Members: 2
add trunk-group 9 Page 2 of 21
Group Type: sip
TRUNK PARAMETERS
Unicode Name? y
Redirect On OPTIM Failure: 5000
SCCAN? n Digital Loss Group: 18
Preferred Minimum Session Refresh Interval(sec): 600
Disconnect Supervision - In? y Out? y
add trunk-group 9 Page 3 of 21
TRUNK FEATURES
ACA Assignment? n Measured: none
Maintenance Tests? y
Numbering Format: unknown
UUi Treatment: service-provider
Replace Restricted Numbers? n
Replace Unavailable Numbers? n
add trunk-group 9 Page 5 of 21
TRUNK GROUP
Administered Members (min/max): 1/2
GROUP MEMBER ASSIGNMENTS Total Administered Memebers: 2
Port NAMES
1: T00080 Asterisk SIP
2: T00081 Asterisk SIP
3:
4:
5:
6:
7:
IP Codec Sets и Network Regions
change ip-codec-set 1 1 Page 1 of 2
IP Codec Set
Codec Set: 1
Audio Silence Frames Packet
Codec Suppression Per Pkt Size(ms)
1: G.711A n 2 20
2: G.711MU n 2 20
3: G.729A n 2 20
4: G.729 n 2 20
5:
6:
7:
Media Encryption
1: none
2:
3:
change ip-codec-set 1 1 Page 1 of 2
IP Codec Set
Allow Direct-IP Multimedia? y
Maximum Call Rate for Direct-IP Multimedia: 15360:Kbits
Maximum Call Rate for Priority Direct-IP Multimedia: 15360:Kbits
Mode Redundancy
FAX t-38-standart 0
Modem off 0
TOD/TTY US 3
Clear-channel n 0
display ip-network-region 1 Page 1 of 19
IP NETWORK REGION
Region: 1
Location: 1 Authoritative Domain: 172.16.1.253
Name: Asterisk
Intra-region IP-IP Direct Audio: yes
AUDIO PARAMETERS Inter-region IP-IP Direct Audio: yes
Codec Set: 1 IP Audio Hairpinnig? y
UDP Port Min: 2048
UDP port Max: 65531 RTCP Reporting Enabled? y
RTCP MONITOR SERVER PARAMETERS
DIFFSERV/TOS PARAMETERS Use Default Server Parameters? y
Call Control PHB Value: 34
Audio PHB Value: 46
Video PHB Value: 26
802.1P/Q PARAMETERS
Call Control 802.1p Priority: 7
Audio 802.1p Priority: 6 AUDIO RESOURCE RESERVATION PARAMETERS
H.323 IP ENDPOINTS RVSP Enabled? n
H.323 Link Bounce recovery? y
Idle Traffic Interval (sec): 20
Keep-Alive Interval (sec): 5
Keep-Alive Count: 5
change ip-network-region 1 Page 3 of 19
Inter Network Region Connection Management
src dst codec direct Total Video Dyn
rgn rgn set WAN WAN-BW-limits WAN-BW-limits Intervening-regions CAC IGAR
1 1 1
Uniform DialPlan и Route Patterns
Route Patterns
change route-pattern 9 Page 1 of 3
Pattern Number: 9 Pattern Name: to Asterisk
SCCAN? n Secure SIP? n
Grp FRL NPA Pfx Hop Toll No. Inserted DCS/ IXC
No Mrk Lmt List Del Digits QSIG
Dgts Intw
1: 9 0 n user
2: n user
3: n user
4: n user
5: n user
6: n user
BCC VALUE TSC CA-TSC ITC BCIE Service/Feature PARM No. Numbering LAR
0 1 2 3 4 W Request Dgts Format
Subaddress
1: y y y y y n n rest none
Public Unknown Numbering
change public-unknown-numbering 0 Page 1 of 2
NUMBERING - PUBLIC/UNKNOWN FORMAT
Total Total
Ext Ext Trk CPN CPN Ext Ext Trk CPN CPN
Len Code Grp(s) Prefix Len Len Code Grp(s) Prefix Len
4 3 9 4
Uniform Dial Plan and AAR Analysis
change uniform-dialplan 0 Page 1 of 2
UNIFORM DIAL PLAN TABLE
Percent Full: 0
Matching Insert Node Matching Insert Node
Pattern Len Del Digits Net Conv Num Pattern Len Del Digits Net Conv Num
3 4 0 aar n n
change aar analysis 0 Page 1 of 2
AAR DIGIT ANALYSIS TABLE
Percent Full: 2
Dialed Total Route Call Node ANI
String Min Max Pattern Type Num Reqd
3 4 4 9 aar n
;
; Asterisk CLI configuration
;
[startup_commands]
;
; Any commands listed in this section will get automatically executed
; when Asterisk starts as a daemon or foreground process (-c).
;
;sip set debug on = yes
;core set verbose 3 = yes
;core set debug 1 = yes
Эта возможность работает, если опция Asterisk Advanced Settings - Enable Remote Unlocking (REMOTEUNLOCK) = true. В версии FreePBX 2.11 - true по умолчанию. Начиная с версии FreePBX 12 - по умолчанию - false
При помощи команды amportal a u xxxxxxxxxxxxxxxx-можно войти во FreePBX без ввода имени пользователя и пароля. xxxxxxxxxxxxxxxx-требуется заменить на PHP ID сессии. Выполните следующие действия:
Существуют две точки входа в Диалплан FreePBX. Это контексты [from-trunk] и [from-internal].
Когда вызов направляется в контекст [from-trunk],
он обрабатывается как DIDи рассматривается как внешний вызов.
Если же вызов направляется в контекст [from-internal] он рассматривается
как внутренний вызов от SIP, IAXили DAHDIекстеншена Вашей АТС.
Далее будет рассмотрен пример объединения двух FreePBX с созданием общего
Диалплана, так, чтобы для конечного пользователя две машины работали как одна.
FreePBX «офис1» выходит через '9' на внешние линии и имеет внутреннюю нумерацию
от 110 до 149.
FreePBX «офис2» выходит через '0' на внешние линии и имеет внутреннюю нумерацию в диапазоне от 200 до 249.
Первым делом создадим IAXтранк между двумя сторонами.
Для FreePBX «офис1»
Trunks
Trunk Name
office2
PEER Details
deny=all запрещает использование всех аудио кодеков.
allow=g729&alaw разрешает использование кодеков g729 и g711 alaw.
type=friend может совершать и принимать звонки
host=IP'office2' может совершать и принимать звонки с хоста 'office2'.
qualify=yes регулярно поддерживать связь с удаленной машиной.
context=from-internal обрабатывать входящие звонки из 'office2'в контексте [from-internal]
Для FreePBX «офис2» создается такой же транк. Только изменяем host на IP'office1'.
Trunk Name
cdr.conf - Общие (глобальные) настройки детализированного отчета о звонках и настройки cdr-csv и radius бэкендов.
Asterisk Call Detail Record engine configuration
CDRили Детализированный Отчет Вызовов - сервис обеспечивающий сохранение информации
о совершенных вызовах. Информация может быть записана в базы данных, файлы
и другие формы хранения данных. Используется для биллинга, предотвращения мошенничества
Системы Оперативно Розыскных Мероприятий (СОРМ), оценки качества обслуживания и тд
[general]
Использовать или нет сохранение CDR. Если установлено 'no', перекрывает любые параметры загрузки
CDRмодулей. По умолчанию 'yes
enable=yes
Указывает сохранять или нет информацию о неотвеченных вызовах.
Если установлено 'yes', то информация о вызове будет сохранена, независимо от того
ответила сторона B или нет. Если установлено 'no', то информация о вызове сохранена не будет.
Это не касается вызовов через внешние исходящие линии (транки).
Эти вызовы всегда будут сохраняться, независимо от статуса. Это нормальное поведение.
unanswered = no
Сохранять или нет информацию о вызовах отвергнутых из-за перегрузки каналов (congestion).
по умолчанию 'no'
congestion = no
Обычно запись не сохраняется пока все расширения канала не будут выполнены.
Включение данной опции позволит закрыть CDRдо выполнения расширения 'h',
и момента когда положили трубку. Однако параметры CDR - 'end' и 'billsec'
будут заданы на момент выполнения расширения 'h' (требует уточнения)
По умолчанию 'no'.
endbeforehexten=no
По умолчанию 'billsec' вычисляется, просто как разница 'end' минус 'answer' в секундах.
Включение опции initiatedseconds=yes, укажет Asterisk использовать точные значения до микросекунд.
В случае если часть в микросекундах 'end', больше чем часть в микросекундах 'answer',
разница округлится до секунды в большую сторону и наоборот.
По умолчанию «no».
initiatedseconds=no
Групповой режим CDRсохраняет данные в буфер, чтобы потом залить в хранилище группой,
что уменьшает нагрузку на сервер. Но может привести к потере данных при внезапной перезагрузке.
По умолчанию «no».
batch=no
Укажите максимальное кол-во значений в буфере, прежде чем данные будут залиты в хранилище.
Работает если 'batch=yes'. По умолчанию 100.
size=100
Укажите максимальную продолжительность времени, в миллисекундах, до освобождения буфера.
Будет выполнено по истечению заданного времени, несмотря на значение 'size'.
По умолчанию 300 (5 минут).
time=300
Постить все в едином потоке планировщика Asterisk (scheduleronly=yes) или для каждой партии
создавать новый поток (scheduleronly=no). Для небольших партий (до size=10)
используйте только планировщик. Для больших новые потоки - scheduleronly=no.
По умолчанию 'no'.
scheduleronly=no
Блокировать выключение Asterisk до освобождения буфера.
По умолчанию «yes».
safeshutdown=yes
CDR "BACKEND"
Вы можете выбрать любой из нескольких бакендов для соранения данных.
Возможно, также использовать все бакенды одновременно.
В конфигурационных файлах, поставляемых с Asterisk, для примера,
выбран только cdr-csv формат.
Для компиляции модулей, требуется чтобы их зависимости были установлены
до выполнения команды configure. Воспользуйтесь командой make menuselectи в разделе «2. Call Detail Recording» убедитесь, что требуемые вам модули имеют
свои зависимости и будут скомпилированы. В приведенном ниже примере видно,
что для cdr_pgsql условия не выполнены, и модуль не может быть установлен.
To get CDRs to be logged to the plain-jane /var/log/asterisk/cdr-csv/Master.csv
file, define the [csv] category in this file. No database necessary. The example
config files are set up to provide this kind of output by default.
To get custom csv CDR records, make sure the cdr_custom.conf file
is present, and contains the proper [mappings] section. The advantage to
using this backend, is that you can define which fields to output, and in
what order. By default, the example configs are set up to mimic the cdr-csv
output. If you don't make any changes to the mappings, you are basically generating
the same thing as cdr-csv, but expending more CPU cycles to do so!
To get manager events generated, make sure the cdr_manager.conf file exists,
and the [general] section is defined, with the single variable 'enabled = yes'.
For odbc, make sure all the proper libs are installed, that «make menuselect»
shows that the modules are available, and the cdr_odbc.conf file exists, and
has a [global] section with the proper variables defined.
For pgsql, make sure all the proper libs are installed, that «make menuselect»
shows that the modules are available, and the cdr_pgsql.conf file exists, and
has a [global] section with the proper variables defined.
For logging to radius databases, make sure all the proper libs are installed, that
«make menuselect» shows that the modules are available, and the [radius]
category is defined in this file, and in that section, make sure the 'radiuscfg'
variable is properly pointing to an existing radiusclient.conf file.
For logging to sqlite databases, make sure the 'cdr.db' file exists in the log directory,
which is usually /var/log/asterisk. Of course, the proper libraries should be available
during the 'configure' operation.
For tds logging, make sure the proper libraries are available during the 'configure'
phase, and that cdr_tds.conf exists and is properly set up with a [global] category.
Also, remember, that if you wish to log CDR info to a database, you will have to define
a specific table in that databse to make things work! See the doc directory for more details
on how to create this table in each database.
[csv]
usegmtime=yes log date/time in GMT. Default is "no"
loguniqueid=yes log uniqueid. Default is "no"
loguserfield=yes log user field. Default is "no"
accountlogs=yes create separate log file for each account code. Default is "yes"
newcdrcolumns=yes Enable logging of post-1.8 CDR columns (peeraccount, linkedid, sequence).
Default is "no".
[radius]
usegmtime=yes log date/time in GMT
loguniqueid=yes log uniqueid
loguserfield=yes log user field
Set this to the location of the radiusclient-ng configuration file
The default is /etc/radiusclient-ng/radiusclient.conf
radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf
cdr_custom.conf - тонкая настройка вывода полей CDRв csv файл.
Обычно находится в директории /var/log/asterisk/cdr-custom/…)
;
; Mappings for custom config file
;
; To get your CSV output in a format tailored to your liking, uncomment the
; following lines and look for the output in the cdr-custom directory (usually
; in /var/log/asterisk). Depending on which mapping you uncomment, you may see
; Master.csv, Simple.csv, or both.
;
;[mappings]
;Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})},${CDR(sequence)}
;
; High Resolution Time for billsec and duration fields
;Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration,f)})},${CSV_QUOTE(${CDR(billsec,f)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})},${CDR(sequence)}
;Simple.csv => ${CSV_QUOTE(${EPOCH})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})}
Конфигурационные файлы Asterisk отвечают за настройку модулей, приложений, пиров, практически, всех аспектов работы программного комплекса IP АТС Asterisk.
Asterisk:acl.conf - Access Control List - Списки контроля доступа. Используется для создания списков ip адресов или подсетей, для разрешения или запрещения SIPрегистраций.
Команда плана набора Asterisk While - Повторять цикл (loop) пока условие верно.
Описание
Петля создается между приложениями While() и EndWhile() и выполняется,
пока условие заданное в While(условие) верно.
Условие вычисляется один раз за цикл, в самом начале. примечания:
Цикл While/EndWhile может параллельно выполнять множество наборов за раз.
Если условие неверно, выполнение диалплана продолжается после EndWhile
Еще один модификатор цикла, приложение ContunueWhile
-- Executing [4881@from-fs-pjsip:1] Goto("PJSIP/fs_pjsip-00000089", "from-test-2,4881,1") in new stack
-- Goto (from-test-2,4881,1)
-- Executing [4881@from-test-2:1] Answer("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:2] Set("PJSIP/fs_pjsip-00000089", "i=1") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "1") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/1.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=2") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "2") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/2.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=3") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "3") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/3.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=4") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "4") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/4.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=5") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "0") in new stack
-- Auto fallthrough, channel 'PJSIP/fs_pjsip-00000089' status is 'UNKNOWN'
Команда диалплана Asterisk - при получении входящего генерирует специальный тональный сигнал,
который блокирует вызов системы обзвона абонентов (телемаркетинга).
Возвращает переменную ${ZAPATELLERSTATUS} с одним из следующих значений:
NOTHING
ANSWERED
ZAPPED
синтаксис
Zapateller(options)
==аргументы
options - опции разделенные запятой.
answer: Ответить на вызов, перед генерацией тонального сигнала.
nocallerid - генерировать тон, только при отсутствии callerid.
[Synopsis]
Block telemarketers with SIT (Special information tones).
[Description]
Generates special information tone (SIT) to block telemarketers from calling you.
This application will set the following channel variable upon completion:
${ZAPATELLERSTATUS}: This will contain the last action accomplished by the
Zapateller application. Possible values include:
NOTHING
ANSWERED
ZAPPED
[Syntax]
Zapateller(options)[Arguments]
options
Comma delimited list of options.
answer: Causes the line to be answered before playing the tone.
nocallerid: Causes Zapateller to only play the tone if there is no
callerid information available.
[See Also]
Not available
Команда динамически добавляет интерфейс в существующую очередь вызовов, для обработки поступающих в нее вызовов (интерфейс как бы регистрируется в очереди вызовов, так же как агент, с использованием команды AgentCallbackLogin).
Аргументы
queuename - имя очереди вызовов, в которую необходимо добавить интерфейс.
interface - Название интерфейса для добавления в очередь, если не указано, используется текущий интерфейс.
penalty - Целое число большее или равное нулю, доступные участники, обрабатывающие очередь, с меньшим значением пенальти получают вызовы в первую очередь.
options: (версии 1.2+)
j - Если заданный интерфейс уже обрабатывает поступающие вызовы данной очереди и существует команда с приоритетом n+101, тогда с нее продолжиться выполнение команд плана набора. Иначе, команда выйдет с кодом ошибки.
В версии 1.6+ нет значений для поля «options», т.к. параметр «j» был удален, но, если необходимо указать остальные параметры, то этот аргумент должен быть указан как пустой параметр: ,,
membername - имя для участника обработки очереди, под которым он будет добавлен.
stateinterface - альтернативный интерфейс, который будет использоваться для определения состояния участника обработки очереди.
Код возврата
При возникновении ошибки возвращает -1.
По завершению выполнения, команда также установит переменную AQMSTATUS в одно из значений:
ADDED
MEMBERALREADY
NOSUCHQUEUE
Пример:
AddQueueMember(sales,PJSIP/2666)
Используя вариант этой команды: AddQueueMember(<queuename>), вы добавите интерфейс, который совершает вызов, в список участников, которые обрабатывают очередь.
<queuename> - это имя очереди вызовов, описанной в файле queues.conf
пример2:
exten => _101,1,Noop(agent logged on)
same => n,Set(queueN=q${EXTEN:0:1})
same => n,AddQueueMember(${queueN},Local/${CALLERID(num)}@from-queue/n)
same => n,PlayBack(ru/agent-loginok)
*CLI> queue show q1
q1 has 0 calls (max 11) in 'random' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
Local/4887@from-queue/n (ringinuse disabled) (dynamic) (Not in use) has taken no calls yet
No Callers
В данном документе приведен список команд, которые Вы можете использовать в плане набора (extensions.conf). Получить список и описание приложений, доступных на вашем сервере Asterisk Вы можете командами CLI: core show applicationsи core show application <name>.
MinivmMWI: Send Message Waiting Notification to subscriber(s) of mailbox.
MinivmNotify: Notify voicemail owner about new messages.
MinivmRecord: Receive Mini-Voicemail and forward via e-mail.
Asterisk: MixMonitor: Record a call and mix the audio during the recording. Use of StopMixMonitor is required to guarantee the audio file is available for processing during dialplan execution.
Организация очередей входящих вызовов для создания колл центра. Конфигурация очереди осуществляется в файле /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] ;имя очереди, все параметры заданные после него и до следующих […] скобок, будут относится к данной очереди.
Сохранять каждого динамического пользователя во внутренней БД Asterisk (astdb),
чтобы после перезагрузки, все пользователи были восстановлены из записей очереди в astdb. см. также RemoveQueueMember По умолчанию:
persistentmembers = no
AutoFill Behavior (Автозаполнение очереди)
Старое, по умолчанию, поведение очереди (autofill=no) подразумевало последовательный тип подключения, при котором ожидающий абонент, подключался к пользователю, только с первой позиции в очереди.
Новое поведение по умолчанию, (autofill=yes) позволяет ожидающему абоненту, подключится к пользователю (агенту) очереди, с любой позиции, если есть свободные агенты, не дожидаясь, пока он займет головную позицию.
Такое поведение позволяет быстрее обрабатывать вызовы и является предпочтительным.
autofill = yes
Monitor Type (Приложение для записи разговоров )
Приложение MixMonitorзаписывает разговор непосредственно в один файл, в отличии от устаревшего Monitor,
раздельно записывающего вх. исх. голосовые потоки.
monitor-type = MixMonitor
UpdateCDR behavior(Изменить поведение CDR)
Записать в поле CDRdstchannelимя агента, которое вы можете установить
во время входа в систему с параметром 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 - среднее время ожидания в очереди на данный момент;
Как часто анонсировать позицию в очереди и среднее время ожидания.
Если 0 то не анонсировать.
Примечание: этот параметр игнорируется при изменении позиции абонента в очереди (см. min-announce-frequency)
announce-frequency = 90
min-announce-frequency
Минимальный интервал между моментом перехода на следующую позицию и анонсом среднего времени удержания.
Это полезно для избежания постоянных объявлений когда позиция в очереди абонента часто меняется.
т.е., если позиция в очереди изменилась, то не оповещать, даже если подошло время announce-frequency.
(см. announce-frequency)
Если включено, то объявления будут проигрываться первому в очереди. Это может привести к ситуации, когда агент готов принять вызов, но соединени откладывается из-за объявления и приведет к задержкам в очереди. по умолчанию выключено.
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.»)
Для включения записи вызовов, требуется задать «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>]
Пользователи с большим значением пенальти имеют, более низкий приоритет для вызовов.
После второй запятой назначается имя. Использование имени может быть удобно для представления в логах очереди. Разные интерфейсы могут использовать одно имя.
Дополнительное описание интерфейса указывается после третьей запятой. На этот интерфейс будут посылаться уведомления 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
Установка, настройка и обслуживание IP АТС Asterisk и FreeSWITCH.
Мы предлагаем услуги по установке,
настройке и обслуживанию IP АТС Aterisk и FreeSWITCH.
За годы работы, мы накопили внушительный опыт внедрения открытых
и проприетарных телекоммуникационных платформ,
что позволяет, предлагать нашим клиентам самые оптимальные решения.
Для внедрения IP АТС небольшой емкости (до 100 абонентов), прекрасно подходит
программная АТС Asterisk с веб интерфейсом FreePBX.
Русскоязычный, простой и интуитивно понятный веб интерфейс
позволит вам, в дальнейшем, обслуживать АТС без дополнительных затрат.
Все используемое ПО является свободно распространяемым
и вы платите только за пусконаладку (от 10 000 рублей).
Приобретая базовую установку Asterisk вы гарантировано получаете:
Программное обеспечение и функционал:
Asterisk 13
FreePBX 13 - веб интерфейс настройки Asterisk
CDR-viewer - веб интерфейс записи и детализации вызовов
ARI (RESTful) и AMI - интерфейсы приложений.
Протоколы связи: SIP, IAX2, h323, DAHDI
Функции: Очереди, Группы приема вызовов, Телеконференции, Автосекретарь, Маршрутизация вызовов, Переадресация вызовов, Факс-на-ЕМайл.
Операционная система: Centos 7 (Centos 6, Ubuntu или Debian - по требованию)
Базовую настройку IP АТС Asterisk:
Создание требуемого кол-ва IP абонентов
Подключение требуемого кол-ва SIP (или h323) транков к провайдеру IP телефонии.
Подключение потоков ISDN PRI E1.
Настройку входящей/исходящей маршрутизации по вашему ТЗ.
Настройку дневного/ночного режима
Настройка голосового меню (IVR)
Настройка групп приема вызовов.
Базовые настройки безопасности (IPtables и fail2ban)
Настройка приобретенного у нас оборудования (VoIPшлюзов, IP телефонов).
Консультации по настройке вашего оборудования.
Базовое обучение использования FreePBX для настройки Asterisk (Подключение IP абонентов, IP транков; создание очередей, телеконференций, голосовых меню, групп приема вызовов; использование сервисных кодов и отчетов о звонках.)
Бесплатную тех. поддержку в течении месяца с момента ввода в эксплуатацию.
Варианты установки:
Продажа сервера с установкой и настройкой системы.
Установка на сервере заказчика.
Удаленная установка/настройка на сервере заказчика.
Установка на VPS хостинге
Установка на embedded устройства (например роутеры поддерживающие работу с OpenWRT, функционал может быть ограничен)
Модуль cdr_adaptive_odbcпозволяет добавлять собственные переменные в CDR, создавать псевдонимы (alias) и фильтровать данные. Добавлять альтернативные таблицы CDR, с уникальным содержанием.
Как и следует из названия, модуль cdr_adaptive_odbc сохраняет CDRв базу данных через ODBC. «adaptive» в данном случае означает, что она пытается приспособиться к структуре таблицы: нет статической структуры таблиц, которые должны быть использованы с этим модулем. Когда модуль загружен (или при перезагрузке), он читает структуру таблицы. Он ищет имя столбца, которому соответствует переменная CDR. Это относится как к встроенным CDRпеременным, так и к пользовательским переменным. Например, чтобы передавать данные из встроенной (builtin) переменной CDRchannel, в таблице базы данных должен быть столбец channel.
пример:
Добавим в кастомную CDRпеременную useragentзначение равное номеру SIPтелефона.
Чтобы данные переменной useragentбыли занесены через cdr_adaptive_odbc, надо создать столбец useragentв БД.
В файле конфигурации cdr_adaptive_odbc можно создать множество таблиц. Имя секции может быть любым, модуль не использует его. Вот пример простой конфигурации таблицы:
; The point of this module is to allow you log whatever you like in terms of
; the CDR variables. Do you want to log uniqueid? Then simply ensure that
; your table has that column. If you don't want the column, ensure that it
; does not exist in the table structure. If you'd like to call uniqueid
; something else in your table, simply provide an alias in the configuration
; file that maps the standard CDR field name (uniqueid) to whatever column
; name you like.
; Perhaps you'd like some extra CDR values logged that aren't
; in the standard repertoire of CDR variables (some that come to mind are
; certain values used for LCR: route, per_minute_cost, and per_minute_price).
; Simply set those CDR variables in your dialplan, i.e. Set(CDR(route)=27),
; ensure that a corresponding column exists in your table, and cdr_adaptive_odbc
; will do the rest.
;
; This configuration defines the connections and tables for which CDRs may
; be populated. Each context specifies a different CDR table to be used.
;
; The columns in the tables should match up word-for-word (case-insensitive)
; to the CDR variables set in the dialplan. The natural advantage to this
; system is that beyond setting up the configuration file to tell you what
; tables to look at, there isn't anything more to do beyond creating the
; columns for the fields that you want, and populating the corresponding
; CDR variables in the dialplan. For the builtin variables only, you may
; create aliases for the real column name.
;
; Please note that after adding columns to the database, it is necessary to
; reload this module to get the new column names and types read.
;
; Warning: if you specify two contexts with exactly the same connection and
; table names, you will get duplicate records in that table. So be careful.
;
;[first]
;connection=mysql1
;table=cdr
;[second]
;connection=mysql1
;table=extracdr
;[third]
;connection=sqlserver
;table=AsteriskCDR
;schema=public ; for databases which support schemas
;usegmtime=yes ; defaults to no
;alias src => source
;alias channel => source_channel
;alias dst => dest
;alias dstchannel => dest_channel
;
; Any filter specified MUST match exactly or the CDR will be discarded
;filter accountcode => somename
;filter src => 123
; Negative filters are also now available
;filter src != 456
;
; Additionally, we now support setting static values per column. The reason
; for this is to allow different sections to specify different values for
; a certain named column, presumably separated by filters.
;static "Some Special Value" => identifier_code
;
; Add quoted indentifiers for table and columns names.
;quoted_identifiers=" ; Default to null
;
; Asterisk Call Management CDR
;
[general]
enabled = no
; The "mappings" category can be used to define additional "key: value" pairs
; that will be included in the manager event. (after AccountCode, Source, etc).
;
; Each line like "varname => label" will include a "label: ${CDR(varname)}"
; in the generated event where ${CDR(varname)} its replaced with its value
;
;[mappings]
;rate => Rate
;carrier => Carrier