1

我们的新电话系统正在使用 Asterisk 管理器 API,它允许通过 TCP/IP 流读取事件和发出命令。我的问题是.. 有没有办法使用 ColdFusion 来读取(并依次处理)事件流?到目前为止,我可以通过 telnet 查看电话事件(来电、转接、挂断等),我想知道是否可以使用 ColdFusion 事件网关在这些事件到来时对其进行处理?

一旦建立了初始连接(通过 telnet),我必须提交以下键:值以便在流开始之前验证连接。

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

只是想说明这一点,因为我不确定以这种方式使用 Web 服务是否会破坏交易。另请注意,我们使用的是 ColdFusion 10 Enterprise。

4

3 回答 3

0

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

于 2013-05-21T21:06:48.640 回答
0

是的——你想使用一个套接字网关。Ben Nadel 有一篇关于如何做到这一点的精彩文章:Using Socket Gateways To Communicate Between ColdFusion And Node.js

尽管他在示例中使用了 Node.js,但您应该能够使用他的指南来设置 Socket Gateway,然后按照您认为合适的方式处理传递给它的数据。

于 2013-05-21T20:31:54.507 回答
0

我意识到这是一个旧线程,但我发布这个以防万一它有助于下一个人....

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

... 能够发送 [actions] 并接收 [responses] 和 [events]。它没有添加任何进一步的功能,而是为 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. 使用一点动态代理魔法,将 CFC 注册到连接中:

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

    connection.login("on");
    
  6. 运行一个简单的“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();
    
  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,....]"
    

注意:在实际应用程序中,连接可能会在 OnApplicationStart 中打开一次,并存储在持久范围中。只要连接保持打开状态,事件就会继续流式传输。只有在应用程序结束时才应关闭连接,以停止事件流。

于 2016-10-15T02:58:12.430 回答