Как отправлять и получать DTMF в клиенте Freeswitch ESL

Я работаю с клиентом Freeswitch ESL, я работал над инициированием вызова и установлением соединения между двумя приложениями и обеспечением их связи друг с другом. Я пробовал воспроизводить звук на одном конце и записывать на другом. Теперь он работает нормально, мое требование - отправлять dtmf на одном конце, получая на другом конце, я пробовал следовать

private void sendDtmf(Channel channel) {
    SendMsg senDtmf = new SendMsg();
    senDtmf.addCallCommand("execute");
    senDtmf.addExecuteAppName("send_dtmf");
    senDtmf.addExecuteAppArg("2174");
    EslMessage response = sendSyncMultiLineCommand( channel,senDtmf.getMsgLines() );
    if (response.getHeaderValue(Name.REPLY_TEXT).startsWith("+OK")) {
        System.out.println(this.getClass().getName() + " >> DTMF Send");
        System.out.println("Resp: " + response.toString());
        log.info(this.getClass().getName() + " >> DTMF Send");
    } else {
        log.error(this.getClass().getName() + " >> DTMF failed :"
                + response.getHeaderValue(Name.REPLY_TEXT));
        System.out.println(this.getClass().getName() + " >> DTMF failed :"
                + response.getHeaderValue(Name.REPLY_TEXT));
    }
}

private void getdtmf( Channel channel, VoxtaMsg voxmsg) 
{ 
    SendMsg getDtmf= new SendMsg(); 
    getDtmf.addCallCommand( "execute" );
    getDtmf.addExecuteAppName( "play_and_get_digits" );
    getDtmf.addExecuteAppArg("4 4 3 7000 # /tmp/sounds/test.wav /tmp/sounds/test1.wav dtmf \\d+");
    EslMessage response = sendSyncMultiLineCommand( channel,getDtmf.getMsgLines() ); 
    if ( response.getHeaderValue( Name.REPLY_TEXT).startsWith( "+OK" ) )
    {
        System.out.println(this.getClass().getName()+" >> DTMF Received");
        log.info( this.getClass().getName()+" >> DTMF Received" ); 
    } 
    else
    {
        log.error( this.getClass().getName() + " >> DTMF failed: [{}}" +
        response.getHeaderValue( Name.REPLY_TEXT ));
        System.out.println(this.getClass().getName() + " >> DTMF failed: [{}}" +
                response.getHeaderValue( Name.REPLY_TEXT ) ); 
        log.debug("----------------------done-------------------------");
    }
 }

но не смог получить никакого результата. Нужно ли мне что-то настраивать в абонентских группах, или мой общий подход неверен?


person Ravikiran Reddy    schedule 31.10.2013    source источник


Ответы (1)


Вам нужно подключить прослушиватель событий и дождаться команды «CHANNEL_EXECUTE_COMPLETE». Нужны две вещи. 1) Подпишитесь на события в соединении. 2) Добавьте прослушиватель событий и верните значение переменной ответа, которую вы устанавливаете как dtmf.

Предположим, что объект client является соединением.

client.connect(...);
client.setEventSubscriptions("plain", "CHANNEL_EXECUTE_COMPLETE");
client.addEventListener(new IEslEventListener() {
        @Override
        public void eventReceived(EslEvent event) {
            Map<String, String> vars = event.getEventHeaders();

            if (event.getEventName().equals("CHANNEL_EXECUTE_COMPLETE") && vars.get("Application").equals("play_and_get_digits")) {
                 PlayAndGetDigitsCallback(vars.get("dtmf"));
            }
        }

        @Override
        public void backgroundJobResultReceived(EslEvent event) {

        }
});

private void PlayAndGetDigitsCallback(String digits) {
    System.out.println("Digits received: " + digits);
}
person Danny G    schedule 05.11.2013
comment
Большое спасибо за ваш ответ, сэр, я вернусь к вам, если у меня возникнут какие-либо вопросы, связанные с этой проблемой. - person Ravikiran Reddy; 06.11.2013
comment
Сэр, мне жаль говорить, что это не работает. Я использовал тот же код при отправке приложения и код, который вы указали при приеме. Я ничего не получил, я получаю следующий результат - org.freeswitch.esl.client.transport.message .EslFrameDecoder ›› прочитать строку тела [{}]Application: send_dtmf — org.freeswitch.esl.client.transport.message.EslFrameDecoder ›› прочитать строку тела [{}]Application-Data: 2174, но dtmf не может быть извлечен в переменную - person Ravikiran Reddy; 06.11.2013
comment
Конечно, сэр. Если вы не возражаете, могу ли я узнать ваш адрес электронной почты, чтобы я мог отправить полный исходный код на ваш адрес - person Ravikiran Reddy; 07.11.2013
comment
Привет, сэр, я обновил DTMF в своем приложении, оно работает. Спасибо за ваши ценные предложения, мне нужна небольшая помощь от вас, то есть когда пользователь звонит, приложение будет воспроизводить, записывать и т. д. Мне нужно обновить музыку на удержании, когда система требуется некоторое время, чтобы ответить, т.е. когда в приложении не запускается событие, оно должно воспроизводиться noh, я попробовал его в режиме синхронизации, и moh постоянно воспроизводится, в асинхронном режиме moh работает, но запись не работает, пожалуйста, помогите мне, сэр. - person Ravikiran Reddy; 20.11.2013
comment
Можете ли вы проголосовать и принять это как решение? Вы должны начать новый вопрос для вашего другого пункта. - person Danny G; 20.11.2013
comment
Сэр, я проголосовал за ваше решение и начал новый вопрос. Пожалуйста, постарайтесь помочь мне как можно раньше. Мой вопрос находится по адресу stackoverflow.com/questions/20047623/ - person Ravikiran Reddy; 21.11.2013