BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 27 ноя 2021, 09:25

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: [7.2] Обработчик CDR для SMG1016M
СообщениеДобавлено: 21 май 2019, 18:13 
Не в сети
Клиент

Зарегистрирован: 04 авг 2007, 19:57
Сообщения: 157
Карма: 0
Добрый день.
Пытаемся интегрировать АТС Eltex SMG1016M с модулем Voice.
Подскажите есть ли готовые обработчики логов CDR для SMG1016?
В документации информации об этом практически нет - https://docs.bitel.ru/pages/viewpage.ac ... d=96960599
В вики по модулю Voice вообще нет ни одного примера.

_________________
Клиент: вер. 7.2.198 / 19.08.2019 19:30:12
Сервер: вер. 7.2.1061 / 19.08.2019 19:32:26
card: вер. 7.2.201 / 24.07.2019 03:56:11
dialup: вер. 7.2.303 / 04.07.2019 17:11:44
inet: вер. 7.2.639 / 19.08.2019 19:32:59
ipn: вер. 7.2.232 / 19.08.2019 19:32:53
mps: вер. 7.2.177 / 08.08.2019 16:32:31
npay: вер. 7.2.174 / 25.07.2019 19:48:57
phone: вер. 7.2.260 / 08.08.2019 16:32:32
reports: вер. 7.2.203 / 12.08.2019 21:56:13
trayinfo: вер. 7.2.160 / 25.06.2019 16:47:08
voice: вер. 7.2.63 / 19.08.2019 19:33:01
voiceip: вер. 7.2.176 / 25.06.2019 16:46:56


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [7.2] Обработчик CDR для SMG1016M
СообщениеДобавлено: 23 май 2019, 12:57 
Не в сети
Клиент

Зарегистрирован: 04 авг 2007, 19:57
Сообщения: 157
Карма: 0
Все оказалось гораздо проще, чем казалось, допилили имеющиеся обработчики.
Может кому-то пригодится наш обработчик:
Код:
package ru.clink.bgbilling.voice;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

import ru.bitel.bgbilling.modules.voice.accounting.mediation.Mediator;
import ru.bitel.bgbilling.modules.voice.accounting.mediation.VoiceRecord;
import ru.bitel.bgbilling.modules.voice.accounting.mediation.VoiceRecordProcessor;
import ru.bitel.bgbilling.modules.voice.api.common.bean.VoiceDevice;
import ru.bitel.bgbilling.modules.voice.api.common.bean.VoiceDeviceType;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.TimeUtils;
import ru.bitel.common.Utils;


public class smg1016Mediator

    implements Mediator

{
    private static final Logger logger = Logger.getLogger( smg1016Mediator.class );
    private static final String FILE_PREFIX = "cdr_log_";
    private static final String REGION_PREFIX = "7861";
   
    private VoiceDevice device;
    @Override
    public Object init( Setup setup, int moduleId, VoiceDevice device, VoiceDeviceType deviceType, ParameterMap config )
        throws Exception
    {
        this.device = device;
        return null;
    }

    @Override
    public void readHourDataLog( VoiceRecordProcessor processor, Date hour )
        throws Exception
    {
        InputStream is = null;
        BufferedReader reader = null;
       
         
        String path = device.getLogPath();
       
        Calendar calHour = TimeUtils.convertDateToCalendar( hour );
       
        //обрабаьываем запросы только на нулевой час
//        if ( calHour.get( Calendar.HOUR_OF_DAY ) != 0 )
//        {
//          logger.info("calHour: " + calHour.get( Calendar.HOUR_OF_DAY ));
//            return;
//        }
       
       
        try
        {
            String fullPath = path + "/" + TimeUtils.format( hour, "yyyyMMddHH" ) + "5959.cdr";
            logger.info("cdr: " + fullPath);
           
           
            //TODO переделать чтение на java.nio2
            File file = new File( fullPath );
           
           
            if ( file.exists() )
            {
               is = new FileInputStream( file );
            }
           
            if ( is == null )
            {
                logger.warn( "log for " + hour +  "is empty" );
                return;
            }
   
            reader = new BufferedReader( new InputStreamReader( is ), 128 * 1024 );

            //final Pattern pattern = Pattern.compile( "\\t" );

            String line;
            while( (line = reader.readLine()) != null )
            {
                String[] params = line.split( ";" );

                if( params.length > 11 )
                {
                    /*if( logger.isDebugEnabled() )
                    {
                        logger.debug( "LINE: " + line );
                    }*/
                    processLine( processor, params );
                }
                else
                {
                    logger.warn( "Skip line: " + line );
                }
            }
        }
       
        finally
        {
           
            if ( reader != null )
            {
                reader.close();
            }
           
            if ( is != null )
            {
                is.close();
            }
        }       
    }
   

    protected void processLine( final VoiceRecordProcessor processor, final String[] params )
        throws InterruptedException
    {
        String e164CallingStationId = params[13];
        String e164CalledStationId = params[15];
       
        String ansCode =  params[5];
       
        //отбрасывать можно звонки с кодом ответа 1
        if ( ansCode.equals( "1" ) || ansCode.equals( "27" ) || ansCode.equals( "34" ) ||  ansCode.equals( "134" ))
        {
            return;
        }
       
           
        /*//если исхоядщий порт начинается с A, номер вызываемого брать из вхоядщего порта( после буквы A)
        if ( trunkIncoming.startsWith( "A" ) && trunkOutgoing.startsWith( "A" ))
        {
            e164CalledStationId = trunkIncoming.substring( 1 );   
        }
        */
        e164CallingStationId = prepareNumber( e164CallingStationId );
        e164CalledStationId = prepareNumber( e164CalledStationId );
       
       
        if ( e164CallingStationId.equals( "-") || e164CalledStationId.equals( "-" )  )
        {
            //игнорируем такие звонки. АТС их не пропустила
            return;
        }
       
       
        final VoiceRecord record = processor.next();
       
        record.trunkIncoming = params[9];
        record.callingStationId = params[13];
        record.calledStationId = params[15];       
        record.trunkOutgoing = params[12];
        record.e164CallingStationId = e164CallingStationId;
        record.e164CalledStationId = e164CalledStationId;
        String dateTime = params[2];       
        record.sessionStart = TimeUtils.parseDate( dateTime, "yyyy-MM-dd HH:mm:ss" );       
        record.connectionDuration = Utils.parseInt( params[4], 0 );       
        record.duration = Utils.parseInt( params[4], 0 );
    }   

    @Override
    public void getLogExists( Date month, int [] data )
    {
        String path = device.getLogPath();
       
        File rootDir = new File( path );
        if ( !rootDir.exists() )
        {
            return;
        }
               
        /*File monthDir  = new File( path + File.separator + new SimpleDateFormat( "yyyy/MM" ).format( month ) );
       
        if ( monthDir == null || !monthDir.exists() )
        {
            return;
        }*/
       
        Calendar calMonth = Calendar.getInstance();
        calMonth.setTime( month );
       
       
        String mm = String.format( "%02d", calMonth.get( Calendar.MONTH ) + 1 );
        String yy = String.format( "%04d", calMonth.get( Calendar.YEAR ) );
       
        //mm и yyyy мы заменяем чуть нижие
        String pattern = FILE_PREFIX + "(\\d{2})_" + mm + "_" + yy + ".log";
       
        Pattern patternRegexp = Pattern.compile( pattern );
        //rootDir.listFiles( f -> PATTERN_FILE.matcher( logFile.getName() ). );
       
        for ( File  logFile : rootDir.listFiles() )
        {
            Matcher matcher = patternRegexp.matcher( logFile.getName() );
            if ( matcher.find() )
            {
                String dd = matcher.group( 1 );
               
                //TODO parseByte
                byte day = (byte) Utils.parseInt( dd, -1 );
               
                //помещаем данные в 0-вой час
                if ( day > 0 )
                {
                    data[day - 1] =  1;   
                }
               
            }
        }

    }
   
    private String prepareNumber( String number )
    {
        if ( number.length() == 10 )
        {
            return 7 + number;
        }
        else if ( number.length() == 7 )
        {
            return REGION_PREFIX + number;
        }
       
       
       
        return number;
    }

}

_________________
Клиент: вер. 7.2.198 / 19.08.2019 19:30:12
Сервер: вер. 7.2.1061 / 19.08.2019 19:32:26
card: вер. 7.2.201 / 24.07.2019 03:56:11
dialup: вер. 7.2.303 / 04.07.2019 17:11:44
inet: вер. 7.2.639 / 19.08.2019 19:32:59
ipn: вер. 7.2.232 / 19.08.2019 19:32:53
mps: вер. 7.2.177 / 08.08.2019 16:32:31
npay: вер. 7.2.174 / 25.07.2019 19:48:57
phone: вер. 7.2.260 / 08.08.2019 16:32:32
reports: вер. 7.2.203 / 12.08.2019 21:56:13
trayinfo: вер. 7.2.160 / 25.06.2019 16:47:08
voice: вер. 7.2.63 / 19.08.2019 19:33:01
voiceip: вер. 7.2.176 / 25.06.2019 16:46:56


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.050s | 24 Queries | GZIP : On ]