Учет операторского трафика для Radius
Тарификация оператора по отдельном Radius-запросу
Для учета операторского трафика по протоколу Radius создается отдельный договор для оператора и нем создается аккаунт.
Тут возможно 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.