我希望我的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/