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

使用ColdFusion通过TCP/IP流读取事件,coldfusion,asterisk,coldfusion-10,Coldfusion,Asterisk,Coldfusion 10,我们的新电话系统使用Asterisk manager API,它允许通过TCP/IP流读取事件并发出命令。我的问题是。。是否有任何方法可以使用ColdFusion读取(并依次处理)事件流?现在我可以通过telnet查看电话事件(来电、转接、挂断等),我想知道是否可以使用ColdFusion事件网关来处理这些事件 一旦建立了初始连接(通过telnet),我必须提交以下密钥:值,以便在流开始之前对连接进行身份验证 Action: login<CRLF> Username: usr<

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

一旦建立了初始连接(通过telnet),我必须提交以下密钥:值,以便在流开始之前对连接进行身份验证

Action: login<CRLF>
Username: usr<CRLF>
Secret: abc123<CRLF>
<CRLF>
操作:登录
用户名:usr
秘密:abc123
我只是想具体说明一下,因为我不确定这是否是以这种方式使用web服务的交易破坏者。另外请注意,我们使用的是ColdFusion 10 Enterprise。

是的——您需要使用套接字网关。Ben Nadel有一本关于如何做到这一点的好书:


尽管他在示例中使用Node.js,但您应该能够使用他的指南设置套接字网关,然后根据需要处理传递给它的数据。

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

我意识到这是一个老帖子,但我现在发布这个帖子,以防对下一个家伙有所帮助

抱歉,这不能用标准的CF事件网关来完成。然而,一种可能性是使用。它是一个java库,允许与Asterisk服务器通信。更具体地说,it经理界面:

。。。能够发送[操作]和接收[响应]以及 [事件]。它没有添加任何进一步的功能,而是 为Asterisk的Manager API提供Java视图(将您从 TCP/IP连接和解析功能)

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

初学者示例:

  • 下载星号Java jar并通过Application.cfc中的this.javaSettings加载它

  • 使用星号服务器的设置创建一个

    factory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
    connection = factory.init( "hostNameOrIP"
                             , portNum
                             , "userName"
                             , "theSecret" ).createManagerConnection();
    
  • 创建一个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" );
        }
    }
    
  • 使用一位,将CFC注册到连接:

    proxyListener = createDynamicProxy("path.YourCFCListener"
                     , ["org.asteriskjava.manager.ManagerEventListener"]);
    connection.addEventListener( proxyListener );
    
  • 登录服务器以开始接收事件。设置适当的事件级别:“关闭”、“打开”或可用事件的csv列表-“系统”、“呼叫”和/或“日志”

  • 运行一个简单的“Ping”测试以验证一切正常。然后睡眠几秒钟,让一些事件流动。然后关闭连接

    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();
    
  • 检查演示日志文件。它应该包含一个或多个事件

    "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,....]"
    
  • NB:在实际应用程序中,连接可能会在OnApplicationStart中打开一次,并存储在持久作用域中。 只要连接保持打开状态,事件就会继续流。仅当应用程序启动时,才应关闭连接
    结束,以停止事件流。

    我不确定,但我认为ColdFusion事件网关不能这样使用。他们是听众。我认为他们无法建立联系。您可能可以使用
    cfexecute
    在服务器上调用telnet。Miguel,是的,我非常确定我可以使用cfexecute,但不幸的是连接无法保持打开状态以读取/处理流。但是ColdFusion网关是那篇文章中的侦听器。Node.js启动与ColdFusion服务器的通信。ColdFusion网关将如何启动与电话系统的telnet通信?啊,显然我误解了你的问题。我以为你希望CF处理请求,而不是发送请求。是的,我确实看到了Ben的文章,并开始使用他的演示创建一个粗略的脚本,直到我也意识到它是用于监听应用程序。
    "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,....]"