Интеграция c Cisco Call Manager Express (CME)

Материал из BiTel WiKi

Перейти к: навигация, поиск

Cisco Call Manager Express (CME)

Происходит тарификация исходящих звонков по внутенему номеру

Прежде всего нужно в конфиге модуля задать новые режимы поиска. Режим поиска по имени пользователя (User-Name), скорее всего он у вас уже есть.

findmode.1.title=Поиск по User-Name=ALIAS
findmode.1.value=User-Name=ALIAS

создать новый тип логина. у нас он называется "для корпоративной телефонии". На закладке типы логинов нажать плюсик. И для нового типа логина выбрать режим поиска для всего по User-Name=ALIAS тарификацию звонков по вызываемому номеру и обсчет баланса по желанию.

Изображение:cme_login_type.png

создать новый нас. На закладке "Редактор NASов" нажать плюсик. И для нового насса указать имя, тип Cisco, ип адрес, секрет радиуса. Создать конфигурацию НАСа где указать

acct.out=voip/originate;telephony/originate
service=<sid>
find.order=1

1 это номер findmode который мы указали в конфиге модуля

<sid> это код услуги из модуля VoIP

и добавить следущий скрипт пред обработки

import bitel.billing.server.radius.*;

// Имя пользоателя, куда сыпать внутренние звонки и тп.
String rejectedusername = "corp-inner-calls";

username = null;
numberto = null;

attributes = request.getVendorAttributes( Vendors.CISCO, 1 ); // <attribute add="no" name="cisco-avpair" type="string" code="1"/>
nasport = request.getVendorAttributes( Vendors.CISCO, 2 ); // <attribute name="cisco-NAS-Port" type="string" code="2"/>
callorigin = request.getVendorAttributes( Vendors.CISCO, 26 ); // <attribute name="h323-call-origin" type="string" code="26"/>
calltype =  request.getVendorAttributes( Vendors.CISCO, 27 ); // <attribute name="h323-call-type" type="string" code="27/>
calledid = request.getStringAttribute( RadiusStandartAttributes.Called_Station_Id ); // <attribute name="Called-Station-Id" type="string" code="30"/>

if ( nasport != null ) { nasports = nasport.toString(); }
if ( callorigin != null ) { callorigins = callorigin.toString(); }
if ( calltype != null ) { calltypes = calltype.toString(); }

if( attributes != null )
{
    for( it = attributes.iterator(); it.hasNext(); )
    {
        ra = (RadiusAttribute)it.next();
        value = ra.getStringValue();
        // Определяем был ли Transfer/Conference, выносим короткий номер "крайнего" в User-Name
        if ( value.indexOf("feature-vsa") >= 0 && value.indexOf("fwder:") > 0 )
        {
            username = value.substring((value.indexOf("fwder:")+6),value.length());
            username = username.substring(0,username.indexOf(","));
            break;
        }
        // Выносим короткий номер в User-Name, если не было Transfer/Conference
        if ( value.indexOf("gw-rxd-cgn") >= 0 )
        {
            username = value.substring((value.indexOf("#:")+2),value.length());
            break;
        }
    }
}

if ( callorigin != null && calltype != null )
{
    if ( nasport != null && callorigins.indexOf("originate") >= 0 && calltypes.indexOf("Telephony") >= 0 )
    {
        // "Убираем" внутренние звонки (локальный - локальный)
        if ( nasports.indexOf("EFXS") >= 0  )
        {
            username = rejectedusername;
        }
        // Если звонок вышел через FXO порты, приводим номер к E.164
        if ( nasports.indexOf("FXO") >= 0  )
        {
            if ( calledid.startsWith("9810") ) { numberto = calledid.substring(4); }
            else if ( calledid.startsWith("98") ) { numberto = "7" + calledid.substring(2); }
            else if ( calledid.startsWith("9") ) { numberto = "73952" + calledid.substring(1); }
            else if ( calledid.matches("8[0-5]") ) { numberto = "000000" + calledid;} 
        }
    }
    // "Убираем" звонки в голосовую почту
    else if ( callorigins.indexOf("originate") >= 0 && calltypes.indexOf("VoIP") >= 0 )
    {
        if ( calledid.matches("88100") ) { username = rejectedusername; }
    }
}

if ( numberto != null )
{
    request.setStringAttribute( RadiusStandartAttributes.Called_Station_Id, numberto); 
}

if ( username != null )
{
    request.setStringAttribute( RadiusStandartAttributes.User_Name, username); 
}

в этом скрипте нужно поправить преобразование набраного номера в e.164 в районе строчек calledid.startsWith("xxx")

Изображение:cme_nas.png

после этого можно добавлять клиентов. Добавте к договору услуги из модуля VOIP, выбирете модуль VOIP, нажмите плюсик что бы добавить новый логин. В поле alias укажите внутрений номери в поле тип выберете "для корпоративной телефонии".

Изображение:cme_user.png

все готово.

конфиг на CME

aaa new-model
aaa accounting exec h323 start-stop group radius
aaa accounting connection h323 start-stop group radius
!
aaa session-id common
!
radius-server host xx.xx.xx.xx auth-port xxx acct-port xxxx non-standard timeout 4 retransmit 2 key xxxx
radius-server vsa send cisco-nas-port
radius-server vsa send accounting
radius-server vsa send authentication

--Blib 17:28, 9 мая 2008 (UTC)

Личные инструменты