我希望我的ColdFusion应用程序能够记录通过telnet从Asterisk主机通过Management API通过telnet流式传输的事件。 ColdFusion Event网关可以监听特定端口,但无法自行启动连接,因此我需要一个网关,该网关可以启动与Asterisk主机(在指定端口上)的telnet连接,并将流事件推送到ColdFusion服务器(在服务器上)。指定的端口)。我真的不想重新发明轮子,所以有没有实用工具可以做到这一点?

我的术语可能不正确,因为我不是技术人员,但我希望我已经对要求做了足够的解释! “实用程序”可以驻留在Linux或Windows平台上。

编辑:
要连接到Asterisk主机telnet流并由其进行身份验证,必须发送以下内容:

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

我知道之前发布了与此类似的问题(但未回答),但是我很高兴在ColdFusion之外获得解决方案

谢谢

最佳答案

如果您需要做的只是捕获来自Asterisk服务器的事件,我建议使用另一种方法。

当您似乎正在使用Asterisk AMI时,请看一下Asterisk-Java。根据我的阅读,这是一个Java库,可为您处理低级套接字通信和解析,并提供用于与Asterisk服务器进行交互的高级接口(interface)。因此,它能够启动连接,捕获事件等。

从理论上讲,您可以打开一个连接并注册以在应用程序启动时接收事件。只要连接保持打开状态,该应用程序就会从Asterisk接收事件。当应用程序结束时,只需关闭连接即可停止事件。

初始化连接

为了简单地捕获事件,请先创建与Asterisk服务器的连接。只需提供适当的主机和凭据即可:

managerFactory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
connection = managerFactory.init( hostNameOrIP
                                 , portNum
                                 , userName
                                 , theSecret ).createManagerConnection();

注册 Activity

为了接收事件,必须首先在连接中注册ManagerEventListener。通常,这需要编写一个实现适当的interface的自定义Java类。但是,只需一点dynamic proxy magic,您就可以改用标准CFC。来自Asterisk的任何事件都将直接路由到CFC,并可以使用CF代码进行处理。

要添加监听器,请使用一个名为onManagerEvent的函数创建一个CFC。只要在Asterisk服务器上发生注册事件,就会调用此函数。
// YourCFCListener.cfc
component {
    public void function onManagerEvent(any managerEvent)
    {
        // For demo purposes, just output a summary of the event to a log file
        WriteLog( text=arguments.managerEvent.toString(), file="AsteriskListenerLog" );
    }
}

接下来,创建一个代理并将其注册到连接中。
proxyListener = createDynamicProxy("path.YourCFCListener"
      , [ "org.asteriskjava.manager.ManagerEventListener"] );
connection.addEventListener( proxyListener );

接收事件:

要开始接收事件,请登录并连接到服务器。使用掩码指定要接收的事件:"off""on"或特定事件的逗号分隔列表(即"system,call,log")。
// receive ALL events
connection.login("on");

打开连接后,您将看到事件写入演示日志文件(假设有服务器 Activity )。对于一次性测试,让页面sleep()保持几秒钟,以允许一些事件进行。然后关闭连接并停止事件:
sleep(4000);
connection.logoff()

在实际的应用程序中,您可能会打开一次连接并将其存储在持久性作用域(如应用程序)中。然后仅在应用程序关闭时关闭它。

查看API,您可以使用它做更多的事情。但是,以上内容应提供一个基本的POC示例,以帮助您开始捕获事件。

关于linux - Telnet套接字网关到Coldfusion事件网关,以连接到Asterisk AMI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39930914/

10-11 22:47