BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 20 июн 2025, 03:00

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: BGRadius + BGBilling
СообщениеДобавлено: 18 авг 2010, 12:12 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Настроил тестовый биллинг 5.1, затем радиус. На радиус-сервер попадает CDR с астериска. Как теперь узнать обрабатывает ли биллинг данные с радиус-сервера? У меня есть подозрения, что дальше логов на радиусе информация о звонках не уходит.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 19 авг 2010, 18:38 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Ну если "обработает", звонки должны появится. Выложите, что в логах радиуса приходит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 19 авг 2010, 19:44 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Администратор писал(а):
Ну если "обработает", звонки должны появится. Выложите, что в логах радиуса приходит.

Код:
08-19/18:27:12  INFO [radiusListener-p-4-t-8] status - REQUEST:
Packet type: Accounting-Request
Identifier: 238
Authenticator: {5A CB 48 17 74 64 CC FC 84 BD EF 1A 49 25 7C E8}
Attributes:
  User-Name=SIP/100-00000432
  NAS-IP-Address=127.0.0.1
  NAS-Port=0
  Acct-Status-Type=2
  Acct-Delay-Time=0
  Acct-Session-Id=1282220694.1074
  Asterisk-Src=100
  Asterisk-Dst=73812XXXXXX
  Asterisk-Acc-Code=100
  Asterisk-Start-Time=2010-08-19 18:24:54 +0600
  Asterisk-Answer-Time=2010-08-19 18:24:56 +0600
  Asterisk-Last-App=Dial
  Asterisk-Last-Data=SIP/73812XXXXXX@ix-cisco
  Asterisk-Chan=SIP/100-00000432
  Asterisk-Dst-Chan=SIP/ix-cisco-00000433
  Asterisk-Dst-Ctx=tele-in
  Asterisk-Clid="Operator" <100>
  Asterisk-User-Field="originate"
  Asterisk-Unique-ID=1282220694.1074
  Asterisk-AMA-Flags=DOCUMENTATION
  Asterisk-Disposition=ANSWERED
  Asterisk-Bill-Sec=136
  Asterisk-Duration=138
  Asterisk-End-Time=2010-08-19 18:27:12 +0600

08-19/18:27:12  INFO [radiusListener-p-4-t-8] status - RESPONSE:
Packet type: Accounting-Response
Identifier: 238
Authenticator: {5A CB 48 17 74 64 CC FC 84 BD EF 1A 49 25 7C E8}
Attributes:

Process time stop: 1


еще приходит вот такой error
Код:
script 08-19/17:26:09 ERROR [radiusListener-p-4-t-5] NasScript - Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*;  if (request.getIntAttribute(RadiusStandar . . . '' : Error in method invocation: Method setVendorStringAttribute( int, java.lang.String ) not found in class'ru.bitel.bgbilling.kernel.network.radius.RadiusPacket'
Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*;  if (request.getIntAttribute(RadiusStandar . . . '' : Error in method invocation: Method setVendorStringAttribute( int, java.lang.String ) not found in class'ru.bitel.bgbilling.kernel.network.radius.RadiusPacket' : at Line: 27 : in file: inline evaluation of: ``import bitel.billing.server.radius.*;  if (request.getIntAttribute(RadiusStandar . . . '' : request .setVendorStringAttribute ( 26 , "originate" )

        at bsh.BSHMethodInvocation.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHBlock.evalBlock(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHIfStatement.eval(Unknown Source)
        at bsh.BSHBlock.evalBlock(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHIfStatement.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at ru.bitel.bgbilling.kernel.network.radius.nas.NasScript.processRequestImpl(NasScript.java:42)
        at ru.bitel.bgbilling.kernel.network.radius.nas.NasScript.processRequest(NasScript.java:58)
        at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.preprocessAccountingRequest(RadiusProcessor.java:264)
        at ru.bitel.bgbilling.modules.voiceip.radius.VoiceIpRadiusProcessor.preprocessAccountingRequest(VoiceIpRadiusProcessor.java:220)
        at ru.bitel.bgbilling.modules.voiceip.radius.VoiceIpRadiusProcessor.preprocessAccountingRequest(VoiceIpRadiusProcessor.java:1)
        at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accountingRequest(RadiusProcessor.java:396)
        at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:218)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40)


Использую Asterisk и скрипт переработки запросов.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 20 авг 2010, 13:59 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Да, скрипт взял из wiki. Сижу, разбираюсь.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 22 авг 2010, 21:59 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Скрипт предобработки какой сейчас, выложите. И что он делать должен, вы в курсе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 22 авг 2010, 22:06 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Администратор писал(а):
Скрипт предобработки какой сейчас, выложите. И что он делать должен, вы в курсе?


Как я уже и говорил, скрипт из wiki:
Код:
import bitel.billing.server.radius.*;

if (request.getIntAttribute(RadiusStandartAttributes.Acct_Status_Type) == 2) {
// Устанавливаем Calling-Station-Id = Asterisk-Src
CallingStationId = request.getVendorAttributes(22736, 102).get(0).getStringValue();
request.setStringAttribute(RadiusStandartAttributes.Calling_Station_Id, CallingStationId);

// Проверяем наличие Asterisk-Acc-Code, и если он существует,
// то устанавливаем User-Name = Asterisk-Acc-Code, если не существует,
// то устанавливаем User-Name = Calling-Station-Id
UserName = request.getVendorAttributes(22736, 101);
if (UserName != null)
   request.setStringAttribute(RadiusStandartAttributes.User_Name, UserName.get(0).getStringValue());
else
   request.setStringAttribute(RadiusStandartAttributes.User_Name, CallingStationId);

// Устанавливаем Called-Station-Id = Asterisk-Dst
request.setStringAttribute(RadiusStandartAttributes.Called_Station_Id, request.getVendorAttributes( 22736, 103 ).get(0).getStringValue());

// Проверяем наличие Asterisk-User-Field, и если такой существует,
// то на основании его значения устанавливаем h323-call-origin
CallType = request.getVendorAttributes(22736, 118);
if (CallType != null && CallType.get(0).getStringValue() .equals("answer")) {
   request.setVendorStringAttribute(26, "answer");
   request.setFlag(2); }
else {
   request.setVendorStringAttribute(26, "originate");
   request.setFlag(1); }

// Устанавливаем h323-call-type = VOIP
request.setVendorStringAttribute(27, "VOIP");

// Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec
request.setIntAttribute(RadiusStandartAttributes.Acct_Session_Time, request.getVendorAttributes( 22736, 114 ).get(0).getIntValue());

// Устанавливаем h323-setup-time = Asterisk-Start-Time
request.setVendorStringAttribute(25, request.getVendorAttributes( 22736, 110 ).get(0).getStringValue());

// Устанавливаем h323-connect-time = Asterisk-Answer-Time
request.setVendorStringAttribute(28, request.getVendorAttributes( 22736, 111 ).get(0).getStringValue());

// Устанавливаем h323-disconnect-time = Asterisk-End-Time
request.setVendorStringAttribute(29, request.getVendorAttributes( 22736, 112 ).get(0).getStringValue());

// Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition
AsteriskDisposition = request.getVendorAttributes( 22736, 115 ).get(0).getStringValue();
if (AsteriskDisposition .equals("ANSWERED"))
   request.setVendorStringAttribute(30, "0");
else if (AsteriskDisposition .equals("NO ANSWER"))
   request.setVendorStringAttribute(30, "5");
else if (AsteriskDisposition .equals("BUSY"))
   request.setVendorStringAttribute(30, "17");
else
   request.setVendorStringAttribute(30, "22");

// Устанавливаем h323-conf-id = Acct-Session-Id
request.setVendorStringAttribute(24, request.getStringAttribute(RadiusStandartAttributes.Acct_Session_Id));

} // Конец if (Acct_Status_Type == 2)


Принцип действия я понимаю так: на радиус приходит CDR с астериска; далее из радиуса приходит информация о звонке в биллинг и перед обработкой звонка он проходит некоторую модификацию скриптом предобработки. В данном скрипте есть комментарии какой параметр на какой меняется.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 12:22 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Скрипт нужно поправить под новое RADIUS API.
См. здесь: http://www.bgbilling.ru/v5.1/javadoc/index.html, класс RadiusAttributeSet.

Вызовы вида:
Код:
request.setStringAttribute(RadiusStandartAttributes.Calling_Station_Id, CallingStationId);

заменить на:
Код:
request.setStringAttribute(-1, RadiusStandartAttributes.Calling_Station_Id, CallingStationId);


Вызовы вида:
Код:
request.setVendorStringAttribute(27, "VOIP");

заменить на (9 - вендор циско, указывать явно):
Код:
request.setStringAttribute(9, 27, "VOIP");


В новом API всё стало более единообразно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 13:09 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Администратор писал(а):
Скрипт нужно поправить под новое RADIUS API.
См. здесь: http://www.bgbilling.ru/v5.1/javadoc/index.html, класс RadiusAttributeSet.
В новом API всё стало более единообразно.


Код:
Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*;  if (request.getIntAttribute(22736, Radius . . . '' : Error in method invocation: Method getIntAttribute( int, int ) not found in class'ru.bitel.bgbilling.kernel.network.radius.RadiusPacket' : at Line: 3 : in file: inline evaluation of: ``import bitel.billing.server.radius.*;  if (request.getIntAttribute(22736, Radius . . . '' : request .getIntAttribute ( 22736 , RadiusStandartAttributes .Acct_Status_Type )


:facepalm:

Как я понял, ругается на
Код:
request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type)


Но, судя по документации, этот метод есть, правда в ru.bitel.bgbilling.kernel.network.radius.RadiusAttributeSet

Модифицированный скрипт выглядит так:
Код:
import bitel.billing.server.radius.*;

if (request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2) {
   // Устанавливаем Calling-Station-Id = Asterisk-Src
   CallingStationId = request.getStringAttribute(22736, 102);
   request.setStringAttribute(-1, RadiusStandartAttributes.Calling_Station_Id, CallingStationId);

   // Проверяем наличие Asterisk-Acc-Code, и если он существует,
   // то устанавливаем User-Name = Asterisk-Acc-Code, если не существует,
   // то устанавливаем User-Name = Calling-Station-Id
   UserName = request.getStringAttribute(22736, 101);
   if (UserName != null)
      request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName.get(0).getStringValue());
   else
      request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, CallingStationId);

   // Устанавливаем Called-Station-Id = Asterisk-Dst
   request.setStringAttribute(-1, RadiusStandartAttributes.Called_Station_Id, request.getStringAttribute(22736, 103));

   // Проверяем наличие Asterisk-User-Field, и если такой существует,
   // то на основании его значения устанавливаем h323-call-origin
   CallType = request.getStringAttribute(22736, 118);
   if (CallType != null && CallType.get(0).getStringValue() .equals("answer")) {
      request.setStringAttribute(22736, 26, "answer");
      request.setFlag(2);
   }
   else {
      request.setStringAttribute(22736, 26, "originate");
      request.setFlag(1);
   }

   // Устанавливаем h323-call-type = VOIP
   request.setStringAttribute(22736, 27, "VOIP");

   // Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec
   request.setIntAttribute(22736, RadiusStandartAttributes.Acct_Session_Time, request.getStringAttribute(22736, 114));

   // Устанавливаем h323-setup-time = Asterisk-Start-Time
   request.setStringAttribute(22736, 25, request.getStringAttribute(22736, 110));

   // Устанавливаем h323-connect-time = Asterisk-Answer-Time
   request.setStringAttribute(22736, 28, request.getStringAttributes(22736, 111 ));

   // Устанавливаем h323-disconnect-time = Asterisk-End-Time
   request.setStringAttribute(22736, 29, request.getStringAttribute(22736, 112));

   // Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition
   AsteriskDisposition = request.getStringAttribute(22736, 115);
   if (AsteriskDisposition .equals("ANSWERED"))
      request.setStringAttribute(22736, 30, "0");
   else if (AsteriskDisposition .equals("NO ANSWER"))
      request.setStringAttribute(22736, 30, "5");
   else if (AsteriskDisposition .equals("BUSY"))
      request.setStringAttribute(22736, 30, "17");
   else
      request.setStringAttribute(22736, 30, "22");

   // Устанавливаем h323-conf-id = Acct-Session-Id
   request.setStringAttribute(22736, 24, request.getStringAttribute(RadiusStandartAttributes.Acct_Session_Id));

} // Конец if (Acct_Status_Type == 2)


Что я делаю не так?

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 13:48 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Так, увидел что должны передаваться три параметра int. Причем третий, как я понял, будет "по-умолчанию"? Подскажите как должен выглядеть правильный метод get.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 14:57 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Код:
request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2)

А вот 22736 тут что символизирует?
Правильно, третий параметр - значение, возвращаемое, если атрибута нет.

Код:
request.getIntAttribute(-1, RadiusStandartAttributes.Acct_Status_Type, -1)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 14:58 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Администратор писал(а):
Код:
request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2)

А вот 22736 тут что символизирует?


Ну как, VendorID. В моём случае это Digium (Asterisk).

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 14:59 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
А.. Ну тогда третий параметр добавьте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 15:08 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Администратор писал(а):
А.. Ну тогда третий параметр добавьте.


Благодарю.
Еще вопрос, как можно в скрипте вывести в консоль или в лог интересующие меня параметры, например RadiusStandartAttributes.Acct_Status_Type? У меня появилось подозрение, что условие не срабатывает даже если в CDR Acct-Status-Type=2.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 17:32 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Ky6uk писал(а):
У меня появилось подозрение, что условие не срабатывает даже если в CDR Acct-Status-Type=2.


Вроде разобрался. Для методов, описанных в классе RadiusStandartAttributes необходимо ставить Vendor в -1, верно? Или я не так понял.

Насчет логирования актуально.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 18:17 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Да, -1 - для стандартных атрибутов. А что по логированию?
Как скрипт отладите - статейку поправьте, версию для 5.1 добавьте, плз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 23 авг 2010, 19:41 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Администратор писал(а):
А что по логированию?

Ну, допустим, у меня в скрипте есть параметр, значение которого я хочу проверить. Как мне это сделать? Я вижу только решение записать в лог, но не знаю как это сделать.

Администратор писал(а):
Как скрипт отладите - статейку поправьте, версию для 5.1 добавьте, плз.

Добавлю, угу.

Еще не совсем понятный нюанс: как быть со строками по умолчанию. Нормально будет если я везде буду ставить null?

Модифицированный скрипт выглядит примерно так:
Код:
import bitel.billing.server.radius.*;

if (request.getIntAttribute(-1, RadiusStandartAttributes.Acct_Status_Type, -1) == 2) {
   // Устанавливаем Calling-Station-Id = Asterisk-Src
   CallingStationId = request.getStringAttribute(22736, 102, null);
   request.setStringAttribute(-1, RadiusStandartAttributes.Calling_Station_Id, CallingStationId);

   // Проверяем наличие Asterisk-Acc-Code, и если он существует,
   // то устанавливаем User-Name = Asterisk-Acc-Code, если не существует,
   // то устанавливаем User-Name = Calling-Station-Id
   UserName = request.getStringAttribute(22736, 101, null);
   if (UserName != null)
      request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName);
   else
      request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, CallingStationId);

   // Устанавливаем Called-Station-Id = Asterisk-Dst
   request.setStringAttribute(-1, RadiusStandartAttributes.Called_Station_Id, request.getStringAttribute(22736, 103, null));

   // Проверяем наличие Asterisk-User-Field, и если такой существует,
   // то на основании его значения устанавливаем h323-call-origin
   CallType = request.getStringAttribute(22736, 118, null);
   if (CallType != null && CallType.equals("answer")) {
      request.setStringAttribute(-1, 26, "answer");
      request.setFlag(2);
   }
   else {
      request.setStringAttribute(-1, 26, "originate");
      request.setFlag(1);
   }

   // Устанавливаем h323-call-type = VOIP
   request.setStringAttribute(-1, 27, "VOIP");

   // Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec
   request.setIntAttribute(-1, RadiusStandartAttributes.Acct_Session_Time, request.getIntAttribute(22736, 114, null));

   // Устанавливаем h323-setup-time = Asterisk-Start-Time
   request.setStringAttribute(-1, 25, request.getStringAttribute(22736, 110, null));

   // Устанавливаем h323-connect-time = Asterisk-Answer-Time
   request.setStringAttribute(-1, 28, request.getStringAttribute(22736, 111, null));

   // Устанавливаем h323-disconnect-time = Asterisk-End-Time
   request.setStringAttribute(-1, 29, request.getStringAttribute(22736, 112, null));

   // Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition
   AsteriskDisposition = request.getStringAttribute(22736, 115, null);
   if (AsteriskDisposition.equals("ANSWERED"))
      request.setStringAttribute(-1, 30, "0");
   else if (AsteriskDisposition.equals("NO ANSWER"))
      request.setStringAttribute(-1, 30, "5");
   else if (AsteriskDisposition.equals("BUSY"))
      request.setStringAttribute(-1, 30, "17");
   else
      request.setStringAttribute(-1, 30, "22");

   // Устанавливаем h323-conf-id = Acct-Session-Id
   request.setStringAttribute(-1, 24, request.getStringAttribute(-1, RadiusStandartAttributes.Acct_Session_Id, null));

} // Конец if (Acct_Status_Type == 2)


Но теперь выскакивает уже ошибка базы данных:
Код:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'h323_id' cannot be null


Кажется, я запутался в атрибутах. Где-то стандартные, а где-то из Asterisk. Причем атрибуты, которые в скрипте меньше 100 не описаны в dictionary радиуса для астериска, по-этому я заменил первый параметр на -1, но это не правильно. Например, в старом скрипте, видимо, были такие атрибуты как h323-disconnect-cause с номером 30, но если брать стандартные атрибуты, то 30 соответствует Called_Station_Id и получается, что Called_Station_Id ставится в 0 и возникает ошибка базы. Если же оставлять VendorID как Digium, то получаем ошибку NPE при помещении значения в несуществующий атрибут. Нужно или знать куда помещать значения в биллинг, или добавить эти атрибуты h323_* в dictionary для астериска. Надеюсь понятно объяснил. :facepalm:

Если коротко, то я вижу проблему так:
1. Asterisk не передает атрибуты h323_*.
2. Эти атрибуты используются биллингом для учета статистики.

Решения вижу следующие:
1. Добавить недостающие атрибуты в словарь радиуса.
2. Передать значения из существующих атрибутов астериска непосредственно в биллинг с помощью скрипта. (только я не знаю куда передавать)

Поправьте меня если что не так.

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 25 авг 2010, 12:12 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июн 2010, 11:13
Сообщения: 25
Откуда: Россия, Уфа
Карма: 0
Я не совсем уверен в правильности метода, но получилось сделать следующим образом.

Добавлять в dictionary атрибуты h323_* для астериска я не стал. Вместо этого я выставил в настройках NAS вендора Cisco и в соответствующих методах скрипта сменил VendoID на 9 (cisco). После этого обсчет в биллинге пошел.

Остался вопрос по поводу части скрипта:
Код:
// Проверяем наличие Asterisk-Acc-Code, и если он существует,
// то устанавливаем User-Name = Asterisk-Acc-Code, если не существует,
// то устанавливаем User-Name = Calling-Station-Id
UserName = request.getStringAttribute(22736, 101, null);
if (UserName != null)
   request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName);
else
   request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, request.getStringAttribute(22736, 102, null));


Если в Asterisk я оставляю атрибут Asterisk-Acc-Code пустым, то User-Name так же остается пустым. Т.е. условие не отрабатывает. В чем тут может быть дело?

Конечный вид CDR выглядит так:
Код:
Packet type: Accounting-Request
Identifier: 189
Authenticator: {69 1D E9 A1 18 38 E5 D8 70 DA 16 FF 64 DE BE 2E}
Attributes:
  User-Name=
  NAS-IP-Address=127.0.0.1
  NAS-Port=0
  Acct-Status-Type=2
  Acct-Delay-Time=0
  Acct-Session-Time=4
  Calling-Station-Id=100
  Acct-Session-Id=1282716117.169
  Called-Station-Id=73812660000
  h323-setup-time=2010-08-25 12:01:57 +0600
  h323-conf-id=1282716117.169
  h323-call-type=VOIP
  h323-call-origin=originate
  h323-disconnect-time=2010-08-25 12:02:02 +0600
  h323-connect-time=2010-08-25 12:01:58 +0600
  h323-disconnect-cause=0
  Asterisk-Src=100
  Asterisk-Dst=73812660000
  Asterisk-Acc-Code=
  Asterisk-Start-Time=2010-08-25 12:01:57 +0600
  Asterisk-Answer-Time=2010-08-25 12:01:58 +0600
  Asterisk-Last-App=Dial
  Asterisk-Last-Data=SIP/73812660000@artel-out
  Asterisk-Chan=SIP/100-000000a9
  Asterisk-Dst-Chan=SIP/artel-out-000000aa
  Asterisk-Dst-Ctx=tele-in
  Asterisk-Clid="Ky6uk" <100>
  Asterisk-User-Field="originate"
  Asterisk-Unique-ID=1282716117.169
  Asterisk-AMA-Flags=DOCUMENTATION
  Asterisk-Disposition=ANSWERED
  Asterisk-Bill-Sec=4
  Asterisk-Duration=5
  Asterisk-End-Time=2010-08-25 12:02:02 +0600

_________________
Меня можно всегда, но я иногда и не хочу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BGRadius + BGBilling
СообщениеДобавлено: 26 окт 2010, 10:05 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Пустая строка не есть null

Код:
UserName = request.getStringAttribute(22736, 101, null);
if (UserName != null && UserName.length() > 0 )
   request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName);
else
   request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, request.getStringAttribute(22736, 102, null));


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.056s | 52 Queries | GZIP : On ]