Учет операторского трафика для Radius

Тарификация оператора по отдельном Radius-запросу

Для учета операторского трафика по протоколу Radius создается отдельный договор для оператора и нем создается аккаунт.

images/download/attachments/96960527/voice_account_list_radius_operator.jpg

images/download/attachments/96960527/voice_account_edit_radius_operator.jpg

Тут возможно 2 варианта поиска акаунта:

  • Поиск с оператора как клиентского аккаунта

  • Поиск оператора с помощью скрипта

А первом случае случае оператор это обычный клиентский account, поиск его может быть настроен например по логину.

Во втором случае в настройках NAS-должны быть настроен обработчик процессора протокола в котором мы выставляем опцию VoiceNas.OPERATOR_ACCOUNT - id аккаунта.

Пример обработчика

package ru.bitel;
import java.util.Iterator;
import java.util.List;
import bitel.billing.server.radius.CiscoVendor;
import bitel.billing.server.radius.Vendors;
import ru.bitel.bgbilling.kernel.network.radius.RadiusAttribute;
import ru.bitel.bgbilling.kernel.network.radius.RadiusAttribute.RadiusAttributeString;
import ru.bitel.bgbilling.kernel.network.radius.RadiusPacket;
import ru.bitel.bgbilling.modules.voice.access.om.ProtocolHandler;
import ru.bitel.bgbilling.modules.voice.api.common.bean.VoiceDevice;
import ru.bitel.bgbilling.modules.voice.api.common.bean.VoiceDeviceType;
import ru.bitel.bgbilling.modules.voice.radius.VoiceNas;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.sql.ConnectionSet;
public class Prot3
implements ProtocolHandler
{
@Override
public void preprocessAccessRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws Exception
{
String prefix = "remote-media-address";
List<RadiusAttribute<?>> attributes = request.getAttributes( Vendors.CISCO, CiscoVendor.Cisco_AVPair );
if( attributes != null )
for( Iterator<RadiusAttribute<?>> it = attributes.iterator(); it.hasNext(); )
{
RadiusAttributeString ra = (RadiusAttributeString) it.next();
String value = ra.getValue();
if( value.startsWith( prefix ) )
{
if( value.endsWith( "77.82.17.33" ) )
{
request.setOption( VoiceNas.OPERATOR_ACCOUNT, 1 );
break;
}
else if( value.endsWith( "172.36.104.61" ) )
{
request.setOption( VoiceNas.OPERATOR_ACCOUNT, 2 );
break;
}
}
}
}
@Override
public void init( Setup setup1, int int2, VoiceDevice voiceDevice3, VoiceDeviceType voiceDeviceType4, ParameterMap parameterMap5 )
throws Exception
{
}
@Override
public void postprocessAccountingRequest( RadiusPacket radiusPacket1, RadiusPacket radiusPacket2, ConnectionSet connectionSet3 )
throws Exception
{
}
@Override
public void postprocessAccessRequest( RadiusPacket radiusPacket1, RadiusPacket radiusPacket2, ConnectionSet connectionSet3 )
throws Exception
{
}
@Override
public void preprocessAccountingRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws Exception
{
}
}

Остальные настройки(тариф и т.п) как при тарификации абонента.

В результате на этом договоре мы получаем отчет с сессиями оператора.

Тарификация оператора по Radius-запросу абонента

По одному Radius-запросу можно тарифицировать как абонента, так и оператора. В этом случае access запрос проверяется только для абонента( баланс, статус и т.п). При обработке accounring-а если мы нашли звонок как клиентский и скрипт проставил оператора, то мы создаем дополнительную сессию на операторе.

В этом случае настройка происходит аналогично предыдущему пункту, но на самом аккаунте не указывается никаких данных( нет логина), которые бы помогли его найти и скриптом в обработчике процессора протокола аналогично ставится VoiceNas.OPERATOR_ACCOUNT.