• Freeswitch代码


    1.引入依赖

     Freeswitch依赖版本

    
        org.freeswitch.esl.client
        esl-client
        0.10.1
    

    2.代码

    1. import org.freeswitch.esl.client.inbound.Client;
    2. import org.freeswitch.esl.client.inbound.IEslEventListener;
    3. import org.freeswitch.esl.client.internal.Context;
    4. import org.freeswitch.esl.client.internal.IModEslApi;
    5. import org.freeswitch.esl.client.transport.event.EslEvent;
    6. import org.freeswitch.esl.client.transport.message.EslMessage;
    7. import sun.management.resources.agent;
    8. import java.net.InetSocketAddress;
    9. import java.net.SocketAddress;
    10. import java.util.concurrent.ScheduledExecutorService;
    11. import java.util.concurrent.ScheduledThreadPoolExecutor;
    12. import java.util.concurrent.TimeUnit;
    13. public class ClientTest {
    14. private static class DemoEventListener implements IEslEventListener {
    15. // @Override
    16. public void eventReceived(EslEvent event) {
    17. System.out.println("eventReceived:" + event.getEventName());
    18. }
    19. // @Override
    20. public void backgroundJobResultReceived(EslEvent event) {
    21. System.out.println("backgroundJobResultReceived:" + event.getEventName());
    22. }
    23. @Override
    24. public void onEslEvent(Context ctx, EslEvent eslEvent) {
    25. System.out.println("eventReceived:" + eslEvent.getEventName());
    26. System.out.println("EventBody********:" + eslEvent.getEventHeaders().toString());
    27. String eventName = eslEvent.getEventName();
    28. //这里仅演示了CHANNEL_开头的几个常用事件
    29. if (eventName.startsWith("CHANNEL_")) {
    30. String calleeNumber = eslEvent.getEventHeaders().get("Caller-Callee-ID-Number");
    31. String callerNumber = eslEvent.getEventHeaders().get("Caller-Caller-ID-Number");
    32. switch (eventName) {
    33. case "CHANNEL_CREATE":
    34. System.out.println("发起呼叫, 主叫:" + callerNumber + " , 被叫:" + calleeNumber);
    35. break;
    36. case "CHANNEL_BRIDGE":
    37. System.out.println("用户转接, 主叫:" + callerNumber + " , 被叫:" + calleeNumber);
    38. break;
    39. case "CHANNEL_ANSWER":
    40. System.out.println("用户应答, 主叫:" + callerNumber + " , 被叫:" + calleeNumber);
    41. break;
    42. case "CHANNEL_HANGUP":
    43. String response = eslEvent.getEventHeaders().get("variable_current_application_response");
    44. String hangupCause = eslEvent.getEventHeaders().get("Hangup-Cause");
    45. System.out.println("用户挂断, 主叫:" + callerNumber + " , 被叫:" + calleeNumber + " , response:" + response + " ,hangup cause:" + hangupCause);
    46. break;
    47. default:
    48. break;
    49. }
    50. }
    51. }
    52. }
    53. public static void main(String[] args) throws InterruptedException {
    54. SocketAddress host = new InetSocketAddress("192.168.5.97", 8021);
    55. String password = "ClueCon";
    56. int timeoutSeconds = 10;
    57. Client inboundClient = new Client();
    58. try {
    59. inboundClient.connect(host, password, timeoutSeconds);
    60. inboundClient.addEventListener(new DemoEventListener());
    61. inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "all");
    62. /*<--注册分机-->*/
    63. EslMessage eslMessage1 =inboundClient.sendApiCommand("callcenter_config agent set contact", "21009@default user/1000");
    64. System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());
    65. System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"=&&="+eslMessage1.getBodyLines().get(0));
    66. /*<--查询分机状态-->*/
    67. // EslMessage eslMessage=inboundClient.sendApiCommand("list_users", "group default user 1000");
    68. //System.out.println("#####eslMessage: "+eslMessage.getHeaders().toString());
    69. //System.out.println("#####eslMessage: "+eslMessage.getBodyLines().get(0));
    70. /*<--播放欢迎语-->*/
    71. //inboundClient.sendBackgroundApiCommand("originate", "user/1000 &playback(/usr/local/freeswitch/sounds/huanying.wav)");
    72. //inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Available'");
    73. /*<--就绪-->*/
    74. //inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Available'");
    75. /*<--登出-->*/
    76. //inboundClient.sendBackgroundApiCommand("callcenter_config agent set status", "21009@default 'Logged Out'");
    77. /*<--拨打电话异步(没有事件消息)-->*/
    78. //inboundClient.sendBackgroundApiCommand("originate", "user/1000 1001");
    79. /*<--拨打电话同步-->*/
    80. //EslMessage eslMessage1=inboundClient.sendApiCommand("originate", "user/1000 1001");
    81. //System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());
    82. //System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"&&"+eslMessage1.getBodyLines().get(0));
    83. /*<--登录到queue-->*/
    84. //inboundClient.sendBackgroundApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");
    85. //callcenter_config tier set [key(state|level|position)] [queue name] [agent name] [value] //*<--登录到queue-->*/
    86. // inboundClient.sendBackgroundApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");
    87. //EslMessage eslMessage1=inboundClient.sendApiCommand("callcenter_config tier add", "support@default 21009@default 1 1");;
    88. //#####dial eslMessage: [-ERR Tier already exist!]&&-ERR Tier already exist!
    89. //System.out.println("#####dial eslMessage: "+eslMessage1.getHeaders().toString());
    90. //System.out.println("#####dial eslMessage: "+eslMessage1.getBodyLines().toString()+"&&"+eslMessage1.getBodyLines().get(0));
    91. /*<--这个queue未就绪-->*/
    92. // support@default 21009@default on break
    93. //inboundClient.sendBackgroundApiCommand("callcenter_config tier set state", "support@default 21009@default on break");
    94. System.out.println("###################Fs excuted start############");
    95. } catch (Exception e) {
    96. System.out.println("connect fail error: "+e);
    97. }
    98. //health-check
    99. ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);
    100. service.scheduleAtFixedRate(() -> {
    101. System.out.println(System.currentTimeMillis() + " " + inboundClient.canSend());
    102. if (!inboundClient.canSend()) {
    103. try {
    104. //重连
    105. inboundClient.connect(host, password, timeoutSeconds);
    106. inboundClient.cancelEventSubscriptions();
    107. inboundClient.setEventSubscriptions(IModEslApi.EventFormat.PLAIN, "all");
    108. } catch (Exception e) {
    109. System.out.println("connect fail");
    110. }
    111. }
    112. }, 1, 500000000, TimeUnit.MILLISECONDS);
    113. System.out.println("other process ...");
    114. }
    115. }

    3.模拟请求,包括异步和同步方法

    登录,查询分机状态用同步方法,就绪未就绪,拨打电话用异步方法

  • 相关阅读:
    程序员的护城河:技术深度、创新追求与软实力
    关于飞桨UIE等模型预测推理时间很久的问题分析以及解决,蒸馏剪枝部署问题解决
    文件安全传输系统,如何保障信创环境下数据的安全传输?
    [附源码]SSM计算机毕业设计大学生心理咨询网站JAVA
    一、VUE杂谈一
    android Studio 文件设置作者信息
    计算机组成原理【2022-10-24】
    javaweb论坛网站源码
    第7章 C语言的系统复习 (七)
    计算机毕业设计 SSM老年公寓管理系统 养老院公寓管理系统 公寓住宿信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  • 原文地址:https://blog.csdn.net/zy08403/article/details/134270507