首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ESL客户端DTMF的发送与接收

ESL客户端DTMF的发送与接收
EN

Stack Overflow用户
提问于 2013-10-31 12:22:08
回答 1查看 2.9K关注 0票数 2

我正在使用Freeswitch客户端,我致力于发起呼叫和建立两个应用程序之间的连接,并使它们相互通信。我试过在一端播放声音,在另一端录音,现在工作正常,我的要求是在一端发送dtmf,在另一端接收,我已经尝试了如下

代码语言:javascript
复制
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-------------------------");
    }
 }

但是无法得到任何结果,我是否需要在拨号计划中配置任何东西,或者我的总体方法是错误的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-05 16:50:40

您需要附加一个事件侦听器并等待"CHANNEL_EXECUTE_COMPLETE“命令。我们需要两件事。1)订阅连接上的事件,2)添加一个事件侦听器,并返回您正在设置为dtmf的响应变量的值。

假设client对象是连接。

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19706440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档