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 ); } ...
|
Автор: | 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 По времени горит, потому прошу прощения за беспокойство частое ![]() |
Автор: | Администратор [ 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/ |