使用ColdFusion通过TCP / IP流读取事件

时间:2013-05-21 19:52:02

标签: coldfusion asterisk coldfusion-10

我们的新手机系统正在使用Asterisk管理器API,它允许通过TCP / IP流读取事件和发出命令。我的问题是..是否有任何方法可以使用ColdFusion来读取(并依次处理)事件流?截至目前,我能够通过telnet查看电话事件(来电,转接,挂断等),我想知道是否有可能使用ColdFusion事件网关来处理这些事件?

初始连接(通过telnet)后,我必须提交以下密钥:值,以便在流开始之前验证连接。

Action: login<CRLF>
Username: usr<CRLF>
Secret: abc123<CRLF>
<CRLF>

只是想指明一下,因为我不确定这是否是以这种方式可能使用Web服务的交易破坏者。另请注意,我们正在使用ColdFusion 10 Enterprise。

3 个答案:

答案 0 :(得分:0)

是的 - 您想要使用套接字网关。 Ben Nadel撰写了一篇关于如何执行此操作的精彩文章:Using Socket Gateways To Communicate Between ColdFusion And Node.js

虽然他在他的例子中使用了Node.js,你应该可以使用他的指南设置套接字网关,然后根据需要处理传递给它的数据。

答案 1 :(得分:0)

您想要的是服务器端TCP客户端。我建议easySocket,一个简单的UDF,它允许你通过利用Java套接字通过Coldfusion发送TCP消息。

答案 2 :(得分:0)

我意识到这是一个老线程,但我发布这个以防它帮助下一个人......

AFAIK,使用标准CF事件网关无法完成。但是,一种可能性是使用Asterisk-Java。它是一个允许与Asterisk服务器通信的java库。更具体地说,它是Manager界面:

  

...能够发送[动作]并接收[响应]和   [赛事]。它不会添加任何进一步的功能,而是   为Asterisk的Manager API提供了一个Java视图(让你从中解放出来   TCP / IP连接和解析东西)。

因此它可以用来向服务器发出命令,并接收事件,就像telnet一样。

初学者示例:

  1. 下载Asterisk-Java jar并通过Application.cfc中的this.javaSettings加载

  2. 使用Asterisk服务器的设置

    创建ManagerConnection
    factory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
    connection = factory.init( "hostNameOrIP"
                             , portNum
                             , "userName"
                             , "theSecret" ).createManagerConnection();
    
  3. 创建CFC以充当侦听器。它将接收和处理来自Asterisk的事件:

    component {
        public void function onManagerEvent(any managerEvent)
        {
            // For demo purposes, just output a summary of the event
            WriteLog( text=arguments.managerEvent.toString(), file="AsteriskLog" );
        }
    }
    
  4. 使用dynamic proxy magic位,使用连接注册CFC:

    proxyListener = createDynamicProxy("path.YourCFCListener"
                     , ["org.asteriskjava.manager.ManagerEventListener"]);
    connection.addEventListener( proxyListener );
    
  5. 登录服务器以开始接收活动。设置适当的事件级别:&#34; off&#34;,&#34; on&#34;或csv可用事件列表 - &#34; system&#34;,&#34; call&#34;和/或&#34; log&#34;。

    connection.login("on");
    
  6. 运行一个简单的&#34; Ping&#34;测试验证一切正常。然后睡几秒钟以允许一些事件流动。然后关闭连接。

    action = createObject("java", "org.asteriskjava.manager.action.PingAction").init();
    response = application.connection.sendAction(action);
    writeDump(response.getResponse());      
    
    // disconnect and stop events
    sleep(4000);
    connection.logoff();
    
  7. 检查演示日志文件。它应该包含一个或多个事件。

    "Information","http-bio-8500-exec-4","10/14/16","15:17:19","XXXXX","org.asteriskjava.manager.event.ConnectEvent[dateReceived=Fri Oct 14 15:17:19 CDT 2016,....]"
    
  8. NB:在实际应用程序中,连接可能会在OnApplicationStart中打开一次,并存储在持久范围内。 只要连接保持打开,事件就会继续流动。只应在应用程序时关闭连接 结束,停止事件流。