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

На одном NAS-е несколько услуг
http://forum.bitel.ru/viewtopic.php?f=6&t=1529
Страница 1 из 1

Автор:  Akhmat [ 21 окт 2008, 17:01 ]
Заголовок сообщения:  На одном NAS-е несколько услуг

Здравствуйте!
Необходимо чтобы клиентский VoIP трафик делился в зависимости от того, на какого оператора он уходит. Звонки на каждого оператора идут с префиксом определённым. Реализую так:

1) На одном NAS-е указываю несколько услуг:
Код:
service=6,34

2) В клиентском тарифном плане указываю две услуги. В каждом одни и теже направления есть, но для услуги с кодом 34 указан префикс необходимый.
3) В договоре клиентском добавляю две услуги, и тарифный план этот.

Но эта схема не работает. Звонок вообще перестаёт попадать в данный договор, если у NAS-а указать услуги через запятую.

Можно ли реализовать как нибудь такой функционал в модуле VoIP?

Спасибо большое. Буду очень благодарен за скорый ответ :)

Автор:  Akhmat [ 21 окт 2008, 17:09 ]
Заголовок сообщения: 

Одним словом как правильно поделить наработку VoIP трафика?
Спасибо!

Автор:  Администратор [ 21 окт 2008, 17:29 ]
Заголовок сообщения: 

http://bgbilling.ru/v4.5/doc/ch08s05.html
Там в конце.. Можно service ставить скриптом.

Автор:  Akhmat [ 21 окт 2008, 20:37 ]
Заголовок сообщения: 

Сервисы:
6 - Исходящий звонок
34 - Опер Х

В скрипт предобработки добавил
Код:
...
if ( CalledStationId.startsWith("08"))
{
   request.setOption( "service", 34 );
}
...


Вложения:
Комментарий к файлу: Наработка. Нет наработки для "опер Х"
narabotka.JPG
narabotka.JPG [ 23.69 КБ | Просмотров: 9635 ]
Комментарий к файлу: Сессии. Не нашло направление 08961, хотя в Тарифном плане оно есть.
sess.JPG
sess.JPG [ 19 КБ | Просмотров: 9635 ]
Комментарий к файлу: Тарифный план. Выделяю направление 08961. Надо чтобы звонки по данному направлению группировались в наработку "опер Х".
tpo.JPG
tpo.JPG [ 8.78 КБ | Просмотров: 9635 ]

Автор:  Akhmat [ 21 окт 2008, 20:43 ]
Заголовок сообщения: 

В script.log ошибок нет.

В radius.out
Код:
java.lang.NullPointerException: Attempt to invoke method get on null value
        at bsh.Reflect.resolveJavaMethod(Unknown Source)
        at bsh.Reflect.invokeObjectMethod(Unknown Source)
        at bsh.BSHPrimarySuffix.doName(Unknown Source)
        at bsh.BSHPrimarySuffix.doSuffix(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHAssignment.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 bitel.billing.server.processor.DefaultNASInfo.processRequestWithScript(DefaultNASInfo.java:275)
        at bitel.billing.server.processor.voiceip.VoiceIpNASInfo.prepareAccountRequest(VoiceIpNASInfo.java:114)
        at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:135)
        at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:48)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)




Версия:
Код:
 bill вер. 4.4 сборка 66 от 04.03.2008 14:13:01
...
 voiceip вер. 4.4 сборка 43 от 07.03.2008 13:31:26

Автор:  Akhmat [ 22 окт 2008, 13:16 ]
Заголовок сообщения: 

request.setOption( "service", 34 );

В версии 4,4 работает эта опция?

Автор:  Администратор [ 22 окт 2008, 13:25 ]
Заголовок сообщения: 

Скрипт целиком покажите. Или там так и есть многоточия?

Автор:  Akhmat [ 22 окт 2008, 13:31 ]
Заголовок сообщения: 

Администратор писал(а):
Скрипт целиком покажите. Или там так и есть многоточия?

)))

Код:
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
CalledStationId = request.getVendorAttributes( 22736, 103 ).get(0).getStringValue() ;

if ( CalledStationId.startsWith("08"))
{
   request.setOption( "service", 34 );
}
if (CalledStationId.length() == 6 )
{
   CalledStationId = "78672" + CalledStationId ;
//   request.setStringAttribute( RadiusStandartAttributes.Called_Station_Id, CalledStationId ) ;
}
if (CalledStationId.length() < 6 )
{
   CalledStationId = "000" + CalledStationId ;
//   request.setStringAttribute( RadiusStandartAttributes.Called_Station_Id, CalledStationId ) ;
}
else if( CalledStationId.length() == 7 )
{
   CalledStationId = "7495" + CalledStationId ;
}
else if ( CalledStationId.startsWith("810") )
{
   CalledStationId = CalledStationId.substring(3) ;
}
else if ( CalledStationId.startsWith("8") )
{
   CalledStationId = "7" + CalledStationId.substring(1) ;
}

request.setStringAttribute(RadiusStandartAttributes.Called_Station_Id, CalledStationId);

// Проверяем наличие 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)


остальное для астериска код. и небольшие преобразования Called-Station-ID, они работают, а фрагмент со сменой кода сервиса, незнаю.

Спасибо!

Автор:  Amir [ 22 окт 2008, 13:46 ]
Заголовок сообщения: 

Цитата:
java.lang.NullPointerException: Attempt to invoke method get on null value

Ошибка так и повторяется?

Дословно "вызов метода get у null", т.е. похоже где-то
request.getVendorAttributes возвращает null (нет атрибута), но не проверяется на null.

Автор:  Akhmat [ 22 окт 2008, 13:55 ]
Заголовок сообщения: 

Да. Так и повторяется. Но не всегда когда я провожу тестовый звонок. иногда звоню, не бывает ошибок, вообще думаю что эта ошибка возникает не когда я звоню. Т.е. на какието пакеты он так пишет, кажется.

Автор:  Akhmat [ 22 окт 2008, 14:42 ]
Заголовок сообщения: 

Код:
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;

if (request.getIntAttribute(RadiusStandartAttributes.Acct_Status_Type) == 2) {
// Устанавливаем Calling-Station-Id = Asterisk-Src
CallingStationId = request.getVendorAttributes(22736, 102).get(0).getStringValue();
if (CallingStationId == null)
{
   error( "!!!Calling-Station-ID is NULL!!!") ;
}
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
CalledStationId = request.getVendorAttributes( 22736, 103 ).get(0).getStringValue() ;
if (CalledStationId == null)
{
   error( "!!!CalledStationId is NULL!!!") ;
}

if ( CalledStationId.startsWith("08"))
{
   request.setOption( "service", 34 );
}
if (CalledStationId.length() == 6 )
{
   CalledStationId = "78672" + CalledStationId ;
//   request.setStringAttribute( RadiusStandartAttributes.Called_Station_Id, CalledStationId ) ;
}
if (CalledStationId.length() < 6 )
{
   CalledStationId = "000" + CalledStationId ;
//   request.setStringAttribute( RadiusStandartAttributes.Called_Station_Id, CalledStationId ) ;
}
else if( CalledStationId.length() == 7 )
{
   CalledStationId = "7495" + CalledStationId ;
}
else if ( CalledStationId.startsWith("810") )
{
   CalledStationId = CalledStationId.substring(3) ;
}
else if ( CalledStationId.startsWith("8") )
{
   CalledStationId = "7" + CalledStationId.substring(1) ;
}

request.setStringAttribute(RadiusStandartAttributes.Called_Station_Id, CalledStationId);

// Проверяем наличие 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 == null)
{
   error( "!!!AsteriskDisposition is NULL!!!") ;
}

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)


Добавил код для дебага. Проверяю вернул ли null метод request.getVendorAttributes(). Но в логах нет ничего, а ошибка повторяется иногда. Правильно дебагю?

Автор:  Akhmat [ 22 окт 2008, 17:40 ]
Заголовок сообщения: 

Нашёл причину ошибки. Был заведён телефон у которого не отсылался атрбибут Asterisk-Src.

Код:
// Устанавливаем Calling-Station-Id = Asterisk-Src
CallingStationId = request.getVendorAttributes(22736, 102).get(0).getStringValue();


Но при этом
Код:
if (CallingStationId == null)
{
   error( "!!!Calling-Station-ID is NULL!!!") ;
}

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

Эта ошибка к делу отношения не имеет.

Автор:  Akhmat [ 22 окт 2008, 17:45 ]
Заголовок сообщения: 

Снова сформулирую вопрос.
Akhmat писал(а):
request.setOption( "service", 34 );

В версии 4,4 работает эта опция?


Подскажите пожалуйста, в чём неправ :) Спасибо.

Автор:  Akhmat [ 22 окт 2008, 18:58 ]
Заголовок сообщения: 

Добавил
Код:
if ( CalledStationId.startsWith("08"))
{
   error("!!!I'm here!!!") ;
   request.setOption( "service", 34 );
   error("!!!I'm here 2!!!") ;
}

в логах при звонке на номер 08961ХХХХХХХ
Код:
// Error: !!!I'm here!!!
// Error: !!!I'm here 2!!!

Значит метод отрабатывается. На договоре обе услуги заведены, и в тарифном плане тоже на двух услугах есть такие направления. Значит метод либо не меняет service, либо меняет, но логика работы биллинга не позволяет тарифицировать звонки таким образом, либо "либо"))... надо Ваш комментарий.


PS
По времени горит, потому прошу прощения за беспокойство частое :oops:

Автор:  Администратор [ 23 окт 2008, 19:52 ]
Заголовок сообщения: 

Боюсь, что в 4.4 радиусе этого функционала нету просто (
Мы его в 4.5 добавили, см. http://bgbilling.ru/v4.5/download/kernel/changes.txt

Автор:  Akhmat [ 23 окт 2008, 20:40 ]
Заголовок сообщения: 

Спасибо!
На изменения не обратил внимания.

Автор:  Akhmat [ 24 окт 2008, 08:27 ]
Заголовок сообщения: 

Обновил до 4.5. Всё прекрасно работает! Спасибо большое! Ура))

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