Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

...

Блок кода
languageruby
radius.search.mode.pattern.<уникальный код>.rule=<Название Radius-атрибута>=<PHONE|LOGIN>

Где PHONE это номер телефона из аккаунта, а   LOGIN - логин.

...

Блок кода
#режим поиска при авторизации 
radius.auth.search.mode.order=exp[,exp]
#режим поиска при аккаунтинге
radius.accacct.search.mode.order=exp[,exp]

...

code - это код режима,поиск из конфигурации , описанный выше. type - тип звонка (1 - исходящий, 2 - входящий). Тип звонка не обязателен ( тогда он определяется другим образомпро него будет описано ниже).

Например:

Блок кода
languageruby
radius.auth.search.mode.order=3
radius.accacct.search.mode.order=1:1,2:2,3:1

Так же еще есть настройка, указывается в типе устройства По умолчанию происходит поиск аккаунтов на NAS, которые удовлетворяют заданным критериям. И так же на устройстве, которое является родительским для NAS - это позволяет сделать режим, когда вы не хотите указывать  NAS явно на абоненте, т.е абонент может выхожить с любого из NAS-ов, тогда имеет смысл объединить все NAS в отдельную папку в дереве устройств и указывать эту папку как  device.const в типе аккаунта

Отдельно можно указать чтобы аккаунты искались так же до дочерних устройствах(расположенные ниже в дереве устройств) данного NAS, это настройка указывается в типе устройства :

Блок кода
languagegroovy
#искать на дочерних устройствах. 1- включено, 0(по умолчанию) -выключено. 
radius.search.mode.device.deep=1

Она означает что надо искать аккаунт не только на устройстве NAS, но и сразу его потомков. 

Тут есть отличие как работает поиск в  access и accounting. Для access мы просто находим один аккаунт, который удовлетворяет первый совпадающему в списке режиму. Далее поиск прекращается, проверяется баланс и т.п для этого аккаунта чтобы выдать ему access или reject. 

Для accounting ищутся все аккаунты удовлетворяющие заданным в списке режимам и для каждого из низ создается отдельная  сессия. Это сделано  для того, когда в случае звонка абонент-абонент, создать исходящую сессию на одном абоненте и исходящую на другом(подробнее о определении типа звона написано ниже). 

Определение типа звонка

Типа звонка (входящий или исходящий) определяется в следующем порядке ( каждый способ может переопределить предыдущий):

  1. Определяем типа звонка на основе атрибутов.
  2. Скрипт обработки процессора протокола.
  3. Направление указанное в настройке поиска account-а.

1-ый способ. Для определения типа звонка (входящий или исходящий) есть вот такие на основе атрибутов  radius-запроса(1-ый способ) используются  такие настройки :

Блок кода
languageruby
#входящие  при авторизации
radius.auth.in=voip/originate
#исходящие при авторизации 
radius.auth.out=voip/answer
#входящие  при accounting-е
radius.acct.in=voip/originate
#исходящие  при accounting-е
radius.acct.out=voip/answer

...

Блок кода
languageruby
radius.auth.in=/incoming


2-ой способ. Так же тип звонка можно определить в обработчике протокола(ссылка!!!).

Все эти 3 способа  способа определения типа звонка направления комбинируются между собой(!!!). Следующим образом:

Для access:

  1. Определяем типа звонка на основе опций описанных выше( radius.auth.in, radius.auth.out, radius.acct.in, radius.acct.out).
  2. Если есть скрипт обработки процессора протокола, то он может установить тип звонка. 
  3. При поиске account-а если мы указали направление в опции, то они  используется.
    Тут есть небольшое отличие как работает обработка access и accounting. Для access мы просто находим первый режим, для которого прошла авторизация. Для accounting при нахождении нескольких режимов, для каждого из них создается отдельная сессия.
    Это сделано  для того, когда в случае звонка абонент-абонент, создать исходящую сессию на одном абоненте и исходящую на другом. 

 

В конфигурации устройства указываем 

с помощью установки опции  VoiceNas.CALL_TYPE. Пример обработчика, где все звонки делаются исходящими:

Блок кода
languageruby
collapsetrue
package ru.bitel;
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.api.common.bean.VoiceSession;
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
	{        
        //все звонки помечяем  исходящими
	    request.setOption( VoiceNas.CALL_TYPE, VoiceSession.CALL_TYPE_OUTGOING );        
	}
	@Override
    public void preprocessAccountingRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
        throws Exception
    {      
        //все звонки помечяем  исходящими
        request.setOption( VoiceNas.CALL_TYPE, VoiceSession.CALL_TYPE_OUTGOING );           
    }
	@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
	{
	}
}

3-тий способ. При указании режимов поиска на устройстве(описано выше) мы можем опционально задать тип звонка(1 - исходящий, 2 - входящий). В этом случае если аккаунт будет найден для указанной пары режим:тип звонка, то тип звонка возьмется из этой пары.

Блок кода
languageruby
radius.auth.in=/incoming
radius.auth.out=/outgoing
radius.acc.out=all/all

radius.auth.acct.search.mode.order=3
radius.acc.search.mode.order=1:1,2:2,3:1

В данном примере для 1-го режима поиcка звонок  помечается как исходящий, а для второго как входящий . При этом в конфигурации модуля эти режимы могут быть определены так:

Блок кода
languageruby
radius.search.mode.devicepattern.deep=11.rule=Calling-Station-id=PHONE
radius.messageAuthenticator.validate=0search.mode.pattern.2.rule=Called-Station-id=PHONE

Если происходит звонок от одного абонента провайдера к другому, то он найдет 2 разных аккаунта, на один  добавится исходящий звонок, на второй - входящий.