• Freeswitch实现软电话功能


    1.话务步骤

    分机注册(需要查询分机状态来判断是否可用)->登录(接听呼入电话需要登录到指定queue)->拨打电话->就绪->未就绪-> 登出。

    根据相应事件产生自己需要的事件,之后根据dn关联坐席的websocket,之后把解析的信息推送到前端,做软电话按钮的展现。

    • 解析header获取信息

      

    String callUuid = event.get("Channel-Call-UUID");
    String eventDate = event.get("Event-Date-Local");
    String logicalDirection = event.get("Caller-Logical-Direction");
    String thisDn = event.get("variable_dialed_user");//被叫
    String otherDn = event.get("Caller-Caller-ID-Number");//主叫
    String answerState = event.get("Answer-State");//话务状态->ringing
    String switchName = event.get("FreeSWITCH-Switchname");
    String ani = event.get("Caller-Caller-ID-Number");
    String dnis = event.get("Caller-Callee-ID-Number");
    logger.info("【Fs EsEvent】->>> onEventDialing EsEvent callUuid:{},eventDate:{}, logicalDirection:{}, thisDn:{},otherDn:{},answerState:{},switchName:{}",
            callUuid, eventDate, logicalDirection, thisDn, otherDn, answerState, switchName);
    Integer referenceId = Integer.valueOf(event.get("Event-Sequence"));
    • 前端JSON返回消息体

    {
        "agentId": "21009",
        "ani": "0000000000",
        "callType": "outbound",
        "callUuid": "b85e2357-c85d-4eaf-be09-e08b48a2650e",
        "connId": "b85e2357-c85d-4eaf-be09-e08b48a2650e",
        "dnis": "1000",
        "eventType": "EVENT_DIALING",
        "mediaType": "voice",
        "messageType": "VoiceCallStateChangeMessage",
        "referenceId": 47755,
        "sessionId": "079dc84e-a643-4dd7-86fa-d9a991008c08",
        "thisDn": "1000"
    }

    2. sdk调用方式

    /*<--注册分机-->*/
    //EslMessage eslMessage1 =inboundClient.sendApiCommand("callcenter_config agent set contact", "21010@default user/1000");
    //System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());
    //System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"=&&="+eslMessage1.getBodyLines().get(0));
    
    /*<--查询分机状态-->*/
    // EslMessage eslMessage=inboundClient.sendApiCommand("list_users", "group default user 1000"); //System.out.println("#####eslMessage: "+eslMessage.getHeaders().toString()); //System.out.println("#####eslMessage: "+eslMessage.getBodyLines().get(0));
    
    
    /*<--播放欢迎语-->*/
    //inboundClient.sendBackgroundApiCommand("originate", "user/1000 &playback(/usr/local/freeswitch/sounds/huanying.wav)");
    //inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Available'");
    
    /*<--就绪-->*/
    //inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Available'");
    
    /*<--登出-->*/
    //inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Logged Out'");
    
    /*<--拨打电话异步(没有事件消息)-->*/
    //inboundClient.sendBackgroundApiCommand("originate", "user/1000 1001");
    
    /*<--拨打电话同步-->*/
    //EslMessage eslMessage1=inboundClient.sendApiCommand("originate", "user/1000 1001");
    //System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());
    //System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"&&"+eslMessage1.getBodyLines().get(0));
    
    /*<--登录到queue-->*/
    //inboundClient.sendBackgroundApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");
    //callcenter_config tier set [key(state|level|position)] [queue name] [agent name] [value] 
    
    //*<--登录到queue-->*/
    // inboundClient.sendBackgroundApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");
    
    //EslMessage eslMessage1=inboundClient.sendApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");;
    //#####dial eslMessage: [-ERR Tier already exist!]&&-ERR Tier already exist!
    //System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());
    //System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"&&"+eslMessage1.getBodyLines().get(0));
    
    /*<--这个queue未就绪-->*/
    // support@default 21009@default on break
    //inboundClient.sendBackgroundApiCommand("callcenter_config tier set state", "support@default 21009@default on break");
    System.out.println("###################Fs excuted start############");

    3.转换成软电话事件 

    PS:待后续完善 

  • 相关阅读:
    python
    uniapp同步将本地图片转换为base64,支持微信、H5、APP
    js数组去重
    js中事件委托和事件绑定之间的区别
    程序员眼中的中秋
    27、Flink 的SQL之SELECT (select、where、distinct、order by、limit、集合操作和去重)介绍及详细示例(1)
    上海亚商投顾:沪指冲高回落 短剧、地产股集体走强
    K8S基本概念+pod生命周期+容器重启策略+Init容器和边车容器+pod探针+postStart和preStop
    2023年【汽车驾驶员(高级)】考试试卷及汽车驾驶员(高级)理论考试
    开学季征文 | 一位开发实习生的真情流露
  • 原文地址:https://blog.csdn.net/zy08403/article/details/134270321