• 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:待后续完善 

  • 相关阅读:
    macOS 上如何写自定义命令行工具?
    如何给图片降噪?看完你就学会了
    1824. 最少侧跳次数-动态规划算法实现
    第十三届蓝桥杯大赛软件赛省赛第二场(Java 大学A组)
    webpack原理篇(五十六):webpack流程:模块构建和chunk生成阶段
    SVC服务的发现
    注册 ,登录, 注销功能实现 springBoot集成redis实现token ——yml配置逻辑删除
    AI:64-基于深度学习的口罩佩戴检测
    【python爬虫】闲鱼爬虫,可以爬取商品
    【opencv】dnn示例-scene_text_detection.cpp 场景文本区域检测
  • 原文地址:https://blog.csdn.net/zy08403/article/details/134270321