forum.bitel.ru
http://forum.bitel.ru/

[7.2] Обработчик CDR для SMG1016M
http://forum.bitel.ru/viewtopic.php?f=58&t=13344
Страница 1 из 1

Автор:  Alex-XXI [ 21 май 2019, 18:13 ]
Заголовок сообщения:  [7.2] Обработчик CDR для SMG1016M

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

Автор:  Alex-XXI [ 23 май 2019, 12:57 ]
Заголовок сообщения:  Re: [7.2] Обработчик CDR для SMG1016M

Все оказалось гораздо проще, чем казалось, допилили имеющиеся обработчики.
Может кому-то пригодится наш обработчик:
Код:
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;
    }

}

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/