forum.bitel.ru
http://forum.bitel.ru/

BGRadius + BGBilling
http://forum.bitel.ru/viewtopic.php?f=6&t=4444
Страница 1 из 1

Автор:  Ky6uk [ 18 авг 2010, 12:12 ]
Заголовок сообщения:  BGRadius + BGBilling

Настроил тестовый биллинг 5.1, затем радиус. На радиус-сервер попадает CDR с астериска. Как теперь узнать обрабатывает ли биллинг данные с радиус-сервера? У меня есть подозрения, что дальше логов на радиусе информация о звонках не уходит.

Автор:  Администратор [ 19 авг 2010, 18:38 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Ну если "обработает", звонки должны появится. Выложите, что в логах радиуса приходит.

Автор:  Ky6uk [ 19 авг 2010, 19:44 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Администратор писал(а):
Ну если "обработает", звонки должны появится. Выложите, что в логах радиуса приходит.

Код:
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 и скрипт переработки запросов.

Автор:  Ky6uk [ 20 авг 2010, 13:59 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Да, скрипт взял из wiki. Сижу, разбираюсь.

Автор:  Администратор [ 22 авг 2010, 21:59 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Скрипт предобработки какой сейчас, выложите. И что он делать должен, вы в курсе?

Автор:  Ky6uk [ 22 авг 2010, 22:06 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Администратор писал(а):
Скрипт предобработки какой сейчас, выложите. И что он делать должен, вы в курсе?


Как я уже и говорил, скрипт из 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 с астериска; далее из радиуса приходит информация о звонке в биллинг и перед обработкой звонка он проходит некоторую модификацию скриптом предобработки. В данном скрипте есть комментарии какой параметр на какой меняется.

Автор:  Администратор [ 23 авг 2010, 12:22 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Скрипт нужно поправить под новое 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 всё стало более единообразно.

Автор:  Ky6uk [ 23 авг 2010, 13:09 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Администратор писал(а):
Скрипт нужно поправить под новое 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)


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

Автор:  Ky6uk [ 23 авг 2010, 13:48 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Так, увидел что должны передаваться три параметра int. Причем третий, как я понял, будет "по-умолчанию"? Подскажите как должен выглядеть правильный метод get.

Автор:  Администратор [ 23 авг 2010, 14:57 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Код:
request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2)

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

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

Автор:  Ky6uk [ 23 авг 2010, 14:58 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Администратор писал(а):
Код:
request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2)

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


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

Автор:  Администратор [ 23 авг 2010, 14:59 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

А.. Ну тогда третий параметр добавьте.

Автор:  Ky6uk [ 23 авг 2010, 15:08 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Администратор писал(а):
А.. Ну тогда третий параметр добавьте.


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

Автор:  Ky6uk [ 23 авг 2010, 17:32 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Ky6uk писал(а):
У меня появилось подозрение, что условие не срабатывает даже если в CDR Acct-Status-Type=2.


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

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

Автор:  Администратор [ 23 авг 2010, 18:17 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Да, -1 - для стандартных атрибутов. А что по логированию?
Как скрипт отладите - статейку поправьте, версию для 5.1 добавьте, плз.

Автор:  Ky6uk [ 23 авг 2010, 19:41 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Администратор писал(а):
А что по логированию?

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

Администратор писал(а):
Как скрипт отладите - статейку поправьте, версию для 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. Передать значения из существующих атрибутов астериска непосредственно в биллинг с помощью скрипта. (только я не знаю куда передавать)

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

Автор:  Ky6uk [ 25 авг 2010, 12:12 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Я не совсем уверен в правильности метода, но получилось сделать следующим образом.

Добавлять в 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

Автор:  Администратор [ 26 окт 2010, 10:05 ]
Заголовок сообщения:  Re: BGRadius + BGBilling

Пустая строка не есть 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));

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/