Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk
Материал из BiTel WiKi
Начиная с версии 1.4.2 Asterisk поддерживает интеграцию с системами биллинга, базирующимися на протоколе Radius AAA. Из "трех китов" Radius'a (Authentication, Authorization, Accounting) на данный момент Asterisk может отправлять только пакеты Accounting при завершении сессии (Acct-Status-Type=Stop). При этом Asterisk использует несколько отличные от используемых в повсеместной практике VoIP атрибуты Radius (вместо привычных атрибутов Cisco используются собственные атрибуты Digium). В связи с этим возникают некоторые сложности при интеграции Asterisk'а с BGBilling'ом, поскольку последний для обсчета сессий VoIP использует атрибуты Cisco.
Интеграцию Asterisk'а с BGBilling'ом можно осуществить двумя путями:
- Используя скрипты предобработки RADIUS запросов, заменить получаемые от Asterisk'а атрибуты Digium на атрибуты Cisco. Положительной стороной данного решения можно считать отсутствие необходимости изменения программного кода Asterisk'а. Отрицательной - сложность совмещения Asterisk'а с другими системами биллинга, базирующимися на протоколе Radius (если возникнет такая необходимость). Этот вариант интеграции рассматривается в статье Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius
- Посредством изменения программного кода Asterisk'а, реализовать возможность отправки им атрибутов Cisco. Преимущества данного решения - более простая интеграция с BGBilling'ом за счет использования de facto стандартных атрибутов Cisco. К отрицательным сторонам можно отнести необходимость изменения программного кода Asterisk'а, которое требует несколько углубленных знаний. В данной статье рассматривается именно этот вариант интеграции.
В статье мы не будем подробно касаться вопросов, связанных с общими настройками Linux, Asterisk и BGBilling, описанными в документации, а только рассмотрим те дополнительные действия, которые необходимо будет предпринять для интеграции Asterisk'а с BGBilling'ом. Изложенное ниже описание решения работает у автора данной статьи в тестовом режиме и может содержать некоторые ошибки, поэтому не рекомендуется использовать эти рекомендации при предоставлении коммерческих услуг без полного понимания принципов и алгоритмов работы всех частей системы.
В общих чертах, описанный ниже патч делает следующее:
- Заменяются атрибуты вендора Digium (22736) на аналогичные атрибуты вендора Cisco (9)
- Если в поле accountcode стандартной статистики Астериска (CDR) присутствует какое-либо значение, то оно подставляется в атрибут User-Name, если значения нет, то User-Name не выдается
- Если в поле userfield стандартной статистики Астериска (CDR) присутствует значение "answer", то оно подставляется в атрибут h323-call-origin, при ином значении или отсутствии значения в поле userfield, в h323-call-origin будет установлено значение originate.
Итак, подразумевается, что у нас имеется:
- Установленная и настроенная ОС Linux, на которой будет установлен Asterisk
- Исходный дистрибутив Asterisk (asterisk-1.4.хх.tar.gz)
- Исходный дистрибутив radiusclient-ng (radiusclient-ng-0.5.6.tar.gz)
- Установленный и настроенный BGBilling
Установка:
1. Разворачиваем дистрибутив Asterisk и radiusclient-ng:
cd /usr/local/src tar zxvf asterisk-1.4.хх.tar.gz tar zxvf radiusclient-ng-0.5.6.tar.gz
2. Собираем radiusclient-ng
cd ./radiusclient-ng-0.5.6 ./configure make install
3. Собираем asterisk
cd ../asterisk-1.4.хх ./configure make menuconfig
На данном этапе необходимо проверить и при необходимости включить использование cdr_radius (находится в разделе [2. Call Detail Recording]). Если указанная опция недоступна, то необходимо проверить корректность установки radiusclient-ng.
В следующем шаге необходимо применить патч к файлу ./cdr/cdr_radius.c. Приложенный патч был создан для Asterisk версии 1.4.13, и в случае применения его к другим версиям, возможно возникновение ошибок.
cdr_radius.patch
--- cdr_radius.c.orig 2007-06-15 03:50:40.000000000 +0600
+++ cdr_radius.c 2008-04-16 01:15:23.000000000 +0600
@@ -52,27 +52,17 @@
/*! ISO 8601 standard format */
#define DATE_FORMAT "%Y-%m-%d %T %z"
-#define VENDOR_CODE 22736
+#define VENDOR_CODE 9
enum {
- PW_AST_ACCT_CODE = 101,
- PW_AST_SRC = 102,
- PW_AST_DST = 103,
- PW_AST_DST_CTX = 104,
- PW_AST_CLID = 105,
- PW_AST_CHAN = 106,
- PW_AST_DST_CHAN = 107,
- PW_AST_LAST_APP = 108,
- PW_AST_LAST_DATA = 109,
- PW_AST_START_TIME = 110,
- PW_AST_ANSWER_TIME = 111,
- PW_AST_END_TIME = 112,
- PW_AST_DURATION = 113,
- PW_AST_BILL_SEC = 114,
- PW_AST_DISPOSITION = 115,
- PW_AST_AMA_FLAGS = 116,
- PW_AST_UNIQUE_ID = 117,
- PW_AST_USER_FIELD = 118
+ PW_H323_REMOTE_ADDRESS = 23,
+ PW_H323_CONF_ID = 24,
+ PW_H323_SETUP_TIME = 25,
+ PW_H323_CALL_ORIGIN = 26,
+ PW_H323_CALL_TYPE = 27,
+ PW_H323_CONNECT_TIME = 28,
+ PW_H323_DISCONNECT_TIME = 29,
+ PW_H323_DISCONNECT_CAUSE = 30
};
enum {
@@ -105,49 +95,26 @@
return -1;
/* Account code */
- if (!rc_avpair_add(rh, send, PW_AST_ACCT_CODE, &cdr->accountcode, strlen(cdr->accountcode), VENDOR_CODE))
- return -1;
+ if (strlen(cdr->accountcode))
+ if (!rc_avpair_add(rh, send, PW_USER_NAME, &cdr->accountcode, strlen(cdr->accountcode), 0))
+ return -1;
+
/* Source */
- if (!rc_avpair_add(rh, send, PW_AST_SRC, &cdr->src, strlen(cdr->src), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_CALLING_STATION_ID, &cdr->src, strlen(cdr->src), 0))
return -1;
/* Destination */
- if (!rc_avpair_add(rh, send, PW_AST_DST, &cdr->dst, strlen(cdr->dst), VENDOR_CODE))
- return -1;
-
- /* Destination context */
- if (!rc_avpair_add(rh, send, PW_AST_DST_CTX, &cdr->dcontext, strlen(cdr->dcontext), VENDOR_CODE))
- return -1;
-
- /* Caller ID */
- if (!rc_avpair_add(rh, send, PW_AST_CLID, &cdr->clid, strlen(cdr->clid), VENDOR_CODE))
- return -1;
-
- /* Channel */
- if (!rc_avpair_add(rh, send, PW_AST_CHAN, &cdr->channel, strlen(cdr->channel), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_CALLED_STATION_ID, &cdr->dst, strlen(cdr->dst), 0))
return -1;
- /* Destination Channel */
- if (!rc_avpair_add(rh, send, PW_AST_DST_CHAN, &cdr->dstchannel, strlen(cdr->dstchannel), VENDOR_CODE))
- return -1;
-
- /* Last Application */
- if (!rc_avpair_add(rh, send, PW_AST_LAST_APP, &cdr->lastapp, strlen(cdr->lastapp), VENDOR_CODE))
- return -1;
-
- /* Last Data */
- if (!rc_avpair_add(rh, send, PW_AST_LAST_DATA, &cdr->lastdata, strlen(cdr->lastdata), VENDOR_CODE))
- return -1;
-
-
/* Start Time */
if (ast_test_flag(&global_flags, RADIUS_FLAG_USEGMTIME))
gmtime_r(&(cdr->start.tv_sec), &tm);
else
ast_localtime(&(cdr->start.tv_sec), &tm, NULL);
strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
- if (!rc_avpair_add(rh, send, PW_AST_START_TIME, timestr, strlen(timestr), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_H323_SETUP_TIME, timestr, strlen(timestr), VENDOR_CODE))
return -1;
/* Answer Time */
@@ -156,7 +123,7 @@
else
ast_localtime(&(cdr->answer.tv_sec), &tm, NULL);
strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
- if (!rc_avpair_add(rh, send, PW_AST_ANSWER_TIME, timestr, strlen(timestr), VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_H323_CONNECT_TIME, timestr, strlen(timestr), VENDOR_CODE))
return -1;
/* End Time */
@@ -165,47 +132,58 @@
else
ast_localtime(&(cdr->end.tv_sec), &tm, NULL);
strftime(timestr, sizeof(timestr), DATE_FORMAT, &tm);
- if (!rc_avpair_add(rh, send, PW_AST_END_TIME, timestr, strlen(timestr), VENDOR_CODE))
- return -1;
-
- /* Duration */
- if (!rc_avpair_add(rh, send, PW_AST_DURATION, &cdr->duration, 0, VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_H323_DISCONNECT_TIME, timestr, strlen(timestr), VENDOR_CODE))
return -1;
/* Billable seconds */
- if (!rc_avpair_add(rh, send, PW_AST_BILL_SEC, &cdr->billsec, 0, VENDOR_CODE))
+ if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_TIME, &cdr->billsec, 0, 0))
return -1;
/* Disposition */
- tmp = ast_cdr_disp2str(cdr->disposition);
- if (!rc_avpair_add(rh, send, PW_AST_DISPOSITION, tmp, strlen(tmp), VENDOR_CODE))
+ switch (cdr->disposition) {
+ case AST_CDR_ANSWERED:
+ tmp = "0";
+ break;
+ case AST_CDR_NOANSWER:
+ tmp = "5";
+ break;
+ case AST_CDR_BUSY:
+ tmp = "17";
+ break;
+ case AST_CDR_FAILED:
+ tmp = "22";
+ break;
+ case AST_CDR_NULL:
+ tmp = "22";
+ break;
+ default:
+ tmp = "22";
+ break;
+ }
+
+ if (!rc_avpair_add(rh, send, PW_H323_DISCONNECT_CAUSE, tmp, strlen(tmp), VENDOR_CODE))
return -1;
- /* AMA Flags */
- tmp = ast_cdr_flags2str(cdr->amaflags);
- if (!rc_avpair_add(rh, send, PW_AST_AMA_FLAGS, tmp, strlen(tmp), VENDOR_CODE))
+ /* Setting Acct-Session-Id attribute for proper generation
+ of Acct-Unique-Session-Id on server side */
+ /* Unique ID */
+ if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_ID, &cdr->uniqueid, strlen(cdr->uniqueid), 0))
+ return -1;
+ if (!rc_avpair_add(rh, send, PW_H323_CONF_ID, &cdr->uniqueid, strlen(cdr->uniqueid), VENDOR_CODE))
return -1;
- if (ast_test_flag(&global_flags, RADIUS_FLAG_LOGUNIQUEID)) {
- /* Unique ID */
- if (!rc_avpair_add(rh, send, PW_AST_UNIQUE_ID, &cdr->uniqueid, strlen(cdr->uniqueid), VENDOR_CODE))
- return -1;
- }
-
- if (ast_test_flag(&global_flags, RADIUS_FLAG_LOGUSERFIELD)) {
- /* append the user field */
- if (!rc_avpair_add(rh, send, PW_AST_USER_FIELD, &cdr->userfield, strlen(cdr->userfield), VENDOR_CODE))
- return -1;
- }
- /* Setting Acct-Session-Id & User-Name attributes for proper generation
- of Acct-Unique-Session-Id on server side */
- /* Channel */
- if (!rc_avpair_add(rh, send, PW_USER_NAME, &cdr->channel, strlen(cdr->channel), 0))
+ /* Call Type */
+ if (!rc_avpair_add(rh, send, PW_H323_CALL_TYPE, "voip", 4, VENDOR_CODE))
return -1;
- /* Unique ID */
- if (!rc_avpair_add(rh, send, PW_ACCT_SESSION_ID, &cdr->uniqueid, strlen(cdr->uniqueid), 0))
+ /* Call Origin */
+ if (strcmp(cdr->userfield, "answer"))
+ tmp = "originate";
+ else
+ tmp = "answer";
+
+ if (!rc_avpair_add(rh, send, PW_H323_CALL_ORIGIN, tmp, strlen(tmp), VENDOR_CODE))
return -1;
return 0;
Данный файл момещаем в директорию ./cdr и применяем его с помощью команды
patch -p0 < cdr_radius.patch
После выпонения команды, оригинальный файл сохраняется по именем cdr_radius.c.orig, а в cdr_radius.c будет находиться измененный код.
cd ../asterisk-1.4.хх make install
На этом установку можно считать оконченной. Приступаем к настройке.
Настройка:
1. Настраиваем radiusclient-ng в соотвествии с документацией. По умолчанию, файлы конфигурации radiusclient-ng располагаются в директории /usr/local/etc/radiusclient-ng. Для корректной работы программы, возможно прийдется создать символьную ссылку на эту директорию с помощью команды
ln -s /usr/local/etc/radiusclient-ng /etc
В файле /usr/local/etc/radiusclient-ng/radiusclient.conf изменяем следующие настройки:
auth_order radius authserver address:port # Здесь подставляем адрес сервера BGBilling и порт, указанный в auth.port BGRadiusVoip/radius.properties acctserver address:port # Здесь подставляем адрес сервера BGBilling и порт, указанный в acct.port BGRadiusVoip/radius.properties
В файле /usr/local/etc/radiusclient-ng/radiusclient.conf добавляем строку для нашего сервера BGRadiusVoip, содержащую адрес сервера и пароль, который в дальнейшем будет указан в конфигурации NAS'а в BGRadiusVoip.
Для работы radiusclient-ng с атрибутами Cisco, необходимо добавить словарь атрибутов. Приложенный файл необходимо поместить в /usr/local/etc/radiusclient-ng/dictionary.cisco
# -*- text -*- # # dictionary.cisco # # Accounting VSAs originally by # "Marcelo M. Sosa Lugones" <marcelo@sosa.com.ar> # # Version: $Id: dictionary.cisco,v 1.12.4.1 2005/11/30 22:17:21 aland Exp $ # # For documentation on Cisco RADIUS attributes, see: # # http://www.cisco.com/univercd/cc/td/doc/product/access/acs_serv/vapp_dev/vsaig3.htm # VENDOR Cisco 9 # # Standard attribute # BEGIN-VENDOR Cisco ATTRIBUTE Cisco-AVPair 1 string vendor=Cisco ATTRIBUTE Cisco-NAS-Port 2 string vendor=Cisco # # T.37 Store-and-Forward attributes. # ATTRIBUTE Cisco-Fax-Account-Id-Origin 3 string vendor=Cisco ATTRIBUTE Cisco-Fax-Msg-Id 4 string vendor=Cisco ATTRIBUTE Cisco-Fax-Pages 5 string vendor=Cisco ATTRIBUTE Cisco-Fax-Coverpage-Flag 6 string vendor=Cisco ATTRIBUTE Cisco-Fax-Modem-Time 7 string vendor=Cisco ATTRIBUTE Cisco-Fax-Connect-Speed 8 string vendor=Cisco ATTRIBUTE Cisco-Fax-Recipient-Count 9 string vendor=Cisco ATTRIBUTE Cisco-Fax-Process-Abort-Flag 10 string vendor=Cisco ATTRIBUTE Cisco-Fax-Dsn-Address 11 string vendor=Cisco ATTRIBUTE Cisco-Fax-Dsn-Flag 12 string vendor=Cisco ATTRIBUTE Cisco-Fax-Mdn-Address 13 string vendor=Cisco ATTRIBUTE Cisco-Fax-Mdn-Flag 14 string vendor=Cisco ATTRIBUTE Cisco-Fax-Auth-Status 15 string vendor=Cisco ATTRIBUTE Cisco-Email-Server-Address 16 string vendor=Cisco ATTRIBUTE Cisco-Email-Server-Ack-Flag 17 string vendor=Cisco ATTRIBUTE Cisco-Gateway-Id 18 string vendor=Cisco ATTRIBUTE Cisco-Call-Type 19 string vendor=Cisco ATTRIBUTE Cisco-Port-Used 20 string vendor=Cisco ATTRIBUTE Cisco-Abort-Cause 21 string vendor=Cisco # # Voice over IP attributes. # ATTRIBUTE h323-remote-address 23 string vendor=Cisco ATTRIBUTE h323-conf-id 24 string vendor=Cisco ATTRIBUTE h323-setup-time 25 string vendor=Cisco ATTRIBUTE h323-call-origin 26 string vendor=Cisco ATTRIBUTE h323-call-type 27 string vendor=Cisco ATTRIBUTE h323-connect-time 28 string vendor=Cisco ATTRIBUTE h323-disconnect-time 29 string vendor=Cisco ATTRIBUTE h323-disconnect-cause 30 string vendor=Cisco ATTRIBUTE h323-voice-quality 31 string vendor=Cisco ATTRIBUTE h323-ivr-out 32 string vendor=Cisco ATTRIBUTE h323-gw-id 33 string vendor=Cisco ATTRIBUTE h323-incoming-conf-id 35 string vendor=Cisco ATTRIBUTE h323-credit-amount 101 string vendor=Cisco ATTRIBUTE h323-credit-time 102 string vendor=Cisco ATTRIBUTE h323-return-code 103 string vendor=Cisco ATTRIBUTE h323-prompt-id 104 string vendor=Cisco ATTRIBUTE h323-time-and-day 105 string vendor=Cisco ATTRIBUTE h323-redirect-number 106 string vendor=Cisco ATTRIBUTE h323-preferred-lang 107 string vendor=Cisco ATTRIBUTE h323-redirect-ip-address 108 string vendor=Cisco ATTRIBUTE h323-billing-model 109 string vendor=Cisco ATTRIBUTE h323-currency 110 string vendor=Cisco ATTRIBUTE subscriber 111 string vendor=Cisco ATTRIBUTE gw-rxd-cdn 112 string vendor=Cisco ATTRIBUTE gw-final-xlated-cdn 113 string vendor=Cisco ATTRIBUTE remote-media-address 114 string vendor=Cisco ATTRIBUTE release-source 115 string vendor=Cisco ATTRIBUTE gw-rxd-cgn 116 string vendor=Cisco ATTRIBUTE gw-final-xlated-cgn 117 string vendor=Cisco # SIP Attributes ATTRIBUTE call-id 141 string vendor=Cisco ATTRIBUTE session-protocol 142 string vendor=Cisco ATTRIBUTE method 143 string vendor=Cisco ATTRIBUTE prev-hop-via 144 string vendor=Cisco ATTRIBUTE prev-hop-ip 145 string vendor=Cisco ATTRIBUTE incoming-req-uri 146 string vendor=Cisco ATTRIBUTE outgoing-req-uri 147 string vendor=Cisco ATTRIBUTE next-hop-ip 148 string vendor=Cisco ATTRIBUTE next-hop-dn 149 string vendor=Cisco ATTRIBUTE sip-hdr 150 string vendor=Cisco # # Extra attributes sent by the Cisco, if you configure # "radius-server vsa accounting" (requires IOS11.2+). # ATTRIBUTE Cisco-Multilink-ID 187 integer vendor=Cisco ATTRIBUTE Cisco-Num-In-Multilink 188 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Input-Octets 190 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Output-Octets 191 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Input-Packets 192 integer vendor=Cisco ATTRIBUTE Cisco-Pre-Output-Packets 193 integer vendor=Cisco ATTRIBUTE Cisco-Maximum-Time 194 integer vendor=Cisco ATTRIBUTE Cisco-Disconnect-Cause 195 integer vendor=Cisco ATTRIBUTE Cisco-Data-Rate 197 integer vendor=Cisco ATTRIBUTE Cisco-PreSession-Time 198 integer vendor=Cisco ATTRIBUTE Cisco-PW-Lifetime 208 integer vendor=Cisco ATTRIBUTE Cisco-IP-Direct 209 integer vendor=Cisco ATTRIBUTE Cisco-PPP-VJ-Slot-Comp 210 integer vendor=Cisco ATTRIBUTE Cisco-PPP-Async-Map 212 integer vendor=Cisco ATTRIBUTE Cisco-IP-Pool-Definition 217 string vendor=Cisco ATTRIBUTE Cisco-Assign-IP-Pool 218 integer vendor=Cisco ATTRIBUTE Cisco-Route-IP 228 integer vendor=Cisco ATTRIBUTE Cisco-Link-Compression 233 integer vendor=Cisco ATTRIBUTE Cisco-Target-Util 234 integer vendor=Cisco ATTRIBUTE Cisco-Maximum-Channels 235 integer vendor=Cisco ATTRIBUTE Cisco-Data-Filter 242 integer vendor=Cisco ATTRIBUTE Cisco-Call-Filter 243 integer vendor=Cisco ATTRIBUTE Cisco-Idle-Limit 244 integer vendor=Cisco ATTRIBUTE Cisco-Account-Info 250 string vendor=Cisco ATTRIBUTE Cisco-Service-Info 251 string vendor=Cisco ATTRIBUTE Cisco-Command-Code 252 string vendor=Cisco ATTRIBUTE Cisco-Control-Info 253 string vendor=Cisco ATTRIBUTE Cisco-Xmit-Rate 255 integer vendor=Cisco VALUE Cisco-Disconnect-Cause Unknown 2 VALUE Cisco-Disconnect-Cause CLID-Authentication-Failure 4 VALUE Cisco-Disconnect-Cause No-Carrier 10 VALUE Cisco-Disconnect-Cause Lost-Carrier 11 VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 12 VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 13 VALUE Cisco-Disconnect-Cause User-Ends-Session 20 VALUE Cisco-Disconnect-Cause Idle-Timeout 21 VALUE Cisco-Disconnect-Cause Exit-Telnet-Session 22 VALUE Cisco-Disconnect-Cause No-Remote-IP-Addr 23 VALUE Cisco-Disconnect-Cause Exit-Raw-TCP 24 VALUE Cisco-Disconnect-Cause Password-Fail 25 VALUE Cisco-Disconnect-Cause Raw-TCP-Disabled 26 VALUE Cisco-Disconnect-Cause Control-C-Detected 27 VALUE Cisco-Disconnect-Cause EXEC-Program-Destroyed 28 VALUE Cisco-Disconnect-Cause Timeout-PPP-LCP 40 VALUE Cisco-Disconnect-Cause Failed-PPP-LCP-Negotiation 41 VALUE Cisco-Disconnect-Cause Failed-PPP-PAP-Auth-Fail 42 VALUE Cisco-Disconnect-Cause Failed-PPP-CHAP-Auth 43 VALUE Cisco-Disconnect-Cause Failed-PPP-Remote-Auth 44 VALUE Cisco-Disconnect-Cause PPP-Remote-Terminate 45 VALUE Cisco-Disconnect-Cause PPP-Closed-Event 46 VALUE Cisco-Disconnect-Cause Session-Timeout 100 VALUE Cisco-Disconnect-Cause Session-Failed-Security 101 VALUE Cisco-Disconnect-Cause Session-End-Callback 102 VALUE Cisco-Disconnect-Cause Invalid-Protocol 120 END-VENDOR Cisco
В файле /usr/local/etc/radiusclient-ng/dictionary необходимо добавить строку:
$INCLUDE dictionary.cisco
2. Настраиваем BGRadiusVoip. Настройка сводится к описанному в документации добавлению NAS'а в модуле IP-телефония. Указываем имя NAS'а, адрес IP, пароль. Устанавливаем Вендор Cisco (он должен присутствовать в конфигурации модуля). Создаем конфигурацию NAS'а и помимо параметра service, указываем:
auth.in=voip/answer auth.out=voip/originate acct.in=voip/answer acct.out=voip/originate
3. Настраиваем Asterisk в соотвествии с документацией. Чтобы задействовать Radius Accounting, в файл /etc/asterisk/cdr.conf раскомментируем или добавим следующие строки:
[radius] usegmtime=no ; 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
На этом основную настройку связки Asterisk'a с BGBilling'ом можно считать оконченной. В итоге, BGBilling должен получать примерно такие пакеты:
15 22:20:57 Type=ACCOUNTING_REQUEST Attributes: User-Name=pbxpress NAS-IP-Address=x.x.x.x NAS-Port=0 Acct-Status-Type=2 Acct-Delay-Time=0 Acct-Session-Time=699 Acct-Session-Id=1208274330.136 Calling-Station-Id=10027341003 Called-Station-Id=73512545454 h323-disconnect-cause=0 h323-connect-time=2008-04-15 21:45:46 +0000 h323-disconnect-time=2008-04-15 21:57:25 +0000 h323-conf-id=1208274330.136 h323-setup-time=2008-04-15 21:45:30 +0000 h323-call-origin=originate h323-call-type=voip
Остановимся на некоторых ньюансах определения типа звонка.
Поскольку Asterisk не является шлюзом в том понимании, которое используется при характеристике оборудования, стоящего на границе между ТФОП и сетью IP, однозначно определить средствами BGBilling'а, какие звонки являются исходящими, а какие входящими не всегда возможно, в частности в тех случаях, когда Asterisk выполняет функции транзитного софтсвича. Поэтому для реализации алгоритма определения типа звонка можно использовать следующее решение - прописывать тип звонка средствами Asterisk'a в CDR userfield. Предложенный выше измененный модуль cdr_radius будет извлекать эти данные и передавать их BGBilling'у внутри атрибутов Radius'a. Записать информацию о типе звонка в Asterisk'е можно средствами dialplan'а, к примеру:
/etc/asterisk/extensions.ael
...
macro ael-answer( ext , dev ) {
Set(CDR(userfield)="answer");
Dial(${dev}/${ext},120);
Hangup;
};
macro ael-originate( ext , dev ) {
Set(CDR(userfield)="originate");
Dial(${dev}/${ext},120);
Hangup;
};
context ael-default {
_7XXXXXXXXXX => {
&ael-originate(${EXTEN},SIP/sipnet);
};
_10027340XXX => &ael-answer(${EXTEN},SIP/pbxpress);
_10027343XXX => &ael-answer(${EXTEN},SIP/cgp);
}
...
Как видно из данного примера, при описании каждого маршрута, мы используем макрос, записывающий требуемую информацию о типе звонка.
Еще одной востребованной функцией измененного модуля cdr_radius может оказаться возможность поместить в передаваемый биллингу атрибут User-Name значение, которое можно указать для каждого peer в файлах конфигурации каналов Asterisk'a (sip.conf, iax.conf и т.д.) с помощью параметра accountcode. В этом случае, если на пользователя маршрутизируется не один или несколько номеров, а целый префикс, возможна тарификация трафика не по номерам, а по пользователям (с использованием "Поиск по User-Name=ALIAS"), при этом в ALIAS надо указывать то значение, которое вы будете помещать в accountcode.
Пример в /etc/asterisk/sip.conf
... [pbxpress] type=peer context=default ; Context for incoming calls from this user host=x.x.x.x accountcode=pbxpress ...
Архив с cdr_radius.patch и dictionary.cisco: Медиа:asterisk_files.zip
--ArtKZ 16:06, 19 апреля 2008 (UTC)
