...
Для учета операторского трафика по протоколу 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-запросу можно тарифицировать как абонента, так и оператора. В этом случае access запрос проверяется только для абонента( баланс, статус и т.п). А по accouning-запросу создаются сразу 2 сессии( одна на договоре абонента, вторая на договоре оператора). При обработке accounring-а если мы нашли звонок как клиентский и скрипт проставил оператора, то мы создаем дополнительную сессию на операторе.
В этом случае настройка происходит аналогично аналогично предыдущему пункту, но на самом аккаунте не указывается никаких данных( нет логина), которые бы помогли его найти и скриптом в обработчике процессора протокола аналогично ставится VoiceNas.OPERATOR_ACCOUNT.