Page tree
Skip to end of metadata
Go to start of metadata

Тарификация оператора по отдельном 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.

 

  • No labels