BiTel

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

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




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

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Здравствуйте!
Необходимо чтобы клиентский VoIP трафик делился в зависимости от того, на какого оператора он уходит. Звонки на каждого оператора идут с префиксом определённым. Реализую так:

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

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

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

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

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


Последний раз редактировалось Akhmat 21 окт 2008, 17:20, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 окт 2008, 17:09 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Одним словом как правильно поделить наработку VoIP трафика?
Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 окт 2008, 17:29 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
http://bgbilling.ru/v4.5/doc/ch08s05.html
Там в конце.. Можно service ставить скриптом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 окт 2008, 20:37 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Сервисы:
6 - Исходящий звонок
34 - Опер Х

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


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

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
В 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 13:16 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
request.setOption( "service", 34 );

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 13:25 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 13:31 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Администратор писал(а):
Скрипт целиком покажите. Или там так и есть многоточия?

)))

Код:
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, они работают, а фрагмент со сменой кода сервиса, незнаю.

Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 13:46 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Цитата:
java.lang.NullPointerException: Attempt to invoke method get on null value

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 13:55 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Да. Так и повторяется. Но не всегда когда я провожу тестовый звонок. иногда звоню, не бывает ошибок, вообще думаю что эта ошибка возникает не когда я звоню. Т.е. на какието пакеты он так пишет, кажется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 14:42 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Код:
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(). Но в логах нет ничего, а ошибка повторяется иногда. Правильно дебагю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 17:40 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Нашёл причину ошибки. Был заведён телефон у которого не отсылался атрбибут Asterisk-Src.

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


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 17:45 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Снова сформулирую вопрос.
Akhmat писал(а):
request.setOption( "service", 34 );

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 окт 2008, 18:58 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Добавил
Код:
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 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Боюсь, что в 4.4 радиусе этого функционала нету просто (
Мы его в 4.5 добавили, см. http://bgbilling.ru/v4.5/download/kernel/changes.txt


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 23 окт 2008, 20:40 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Спасибо!
На изменения не обратил внимания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 24 окт 2008, 08:27 
Не в сети

Зарегистрирован: 05 окт 2007, 13:36
Сообщения: 1073
Карма: 46
Обновил до 4.5. Всё прекрасно работает! Спасибо большое! Ура))


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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 1


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

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