我希望我的ColdFusion应用程序能够通过Management API记录从Asterisk主机通过telnet流式传输的事件。 ColdFusion事件网关可以侦听特定端口但无法自行启动连接,因此我需要一个可以启动到Asterisk主机(在指定端口上)的telnet连接的网关,并将流式事件推送到ColdFusion服务器(在指定的端口)。我真的不想重新发明轮子所以有没有可以做到这一点的实用工具?
我的术语可能不正确,因为我不是那种技术,但我希望我已经足够解释了这个要求! '实用程序'可以驻留在Linux或Windows平台上。
编辑: 要连接到Asterisk主机telnet流并通过其进行身份验证,必须发送以下内容:
Action: login<CRLF>
Username: usr<CRLF>
Secret: abc123<CRLF>
<CRLF>
我知道上一个问题与此类似(但没有回答),但我对ColdFusion以外的解决方案感到高兴
由于
答案 0 :(得分:1)
我开始怀疑我是否理解你的要求。您希望您的应用程序“启动连接以收听”。 CF套接字网关可能不会“启动”连接,但它“有一个连接来监听”。为什么要发起你已有的东西?为什么这个词“启动”如此重要?
在任何情况下,我都会解释您的要求,“使用特定端口启动到主机的telnet连接”,实质上意味着“连接到另一台服务器上的套接字”。你不需要一个完整的网关/重定向机器。您可以在Coldfusion Socket Gateway的CFC中执行此操作。它只需要2或3行代码(在网上搜索“读取和写入套接字”)。
因此,在最终设计中,您将在两个插座之间建立连接。一个在Coldfusion服务器上,另一个在主机服务器上。连接中的通信是双向的。然后,任意数量的客户端(例如10 000)都可以在CF套接字上侦听来自主机服务器的所有消息。
答案 1 :(得分:1)
如果您需要做的只是从Asterisk服务器捕获事件,我建议采用不同的方法。
您似乎正在使用Asterisk AMI,请查看Asterisk-Java。根据我的阅读,它是一个java库,为您处理低级套接字通信和解析,并提供更高级别的接口,用于与Asterisk服务器交互。因此它能够启动连接,捕获事件等等。
理论上,您可以打开连接并注册以在应用程序启动时接收事件。只要连接保持打开,应用程序就会收到Asterisk的事件。当应用程序结束时,只需关闭连接即可暂停事件。
初始化连接
要简单地捕获事件,首先要创建与Asterisk服务器的连接。只需提供适当的主机和凭据:
managerFactory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
connection = managerFactory.init( hostNameOrIP
, portNum
, userName
, theSecret ).createManagerConnection();
注册活动
要接收事件,您必须先注册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");
连接打开后,您将看到写入演示日志文件的事件(假设存在服务器活动)。对于一次性测试,让页面sleep()
持续几秒钟以允许某些事件流动。然后关闭连接并停止事件:
sleep(4000);
connection.logoff()
在实际应用程序中,您可能会打开一次连接并将其存储在持久范围内,例如应用程序。然后仅在应用程序关闭时关闭它。
查看API,您可以使用它做更多的事情。但是,上面应该提供一个基本的POC示例,以帮助您开始捕获事件。
答案 2 :(得分:0)
使用Coldfusion的套接字网关。它是内置的,是Coldfusion中的事实上功能,用于使用基于TCP / IP的协议(如Telnet)发送和响应消息,
答案 3 :(得分:0)
我以通常的方式创建了Coldfusion Socket Gateway的一个实例。例如,请参阅https://www.bennadel.com/blog/2173-using-socket-gateways-to-communicate-between-coldfusion-and-node-js.htm。
我得到了以下设置:
1)监听器CFC的内容(SocketGatewayListener.cfc):
<cfcomponent>
<cffunction name="onIncomingMessage" returntype="struct" output="false">
<cfargument name="cfevent" >
<cfset var msg = {} >
<cfscript>
/* The code within this cfscript represents the proof of concept. 'xxx.xxx.xxx.xxx' is an IP, 1226 an arbitrary port, so the next line connects to an external socket. Make sure it is listening. */
var socket = createobject("java","java.net.Socket").init('xxx.xxx.xxx.xxx',1226);
var out = createobject("java","java.io.PrintWriter").init(socket.getOutputStream(), true);
var bufferedWriter = createobject("java","java.io.BufferedWriter").init(out);
/*Send data to external socket */
bufferedWriter.write("Authentication data at #now()#");
bufferedWriter.flush();
</cfscript>
<cfset msg["message"] = cfevent.data.message>
<cfreturn msg>
</cffunction>
</cfcomponent>
2)配置文件的内容(socketGateway.cfg):
# The port the socket server listens on.
port=9093
3)我的系统: Coldfusion 2016 Windows 7旗舰版
Netcat的: 您可以使用可执行文件nc.exe来侦听或向套接字网关发送消息。网关运行后,使用DOS命令(如
)进行侦听nc 127.0.0.1 9093
使用
等命令发送消息echo 'my test message' | nc 127.0.0.1 9093
赫拉克勒斯(http://www.hw-group.com/products/hercules/index_en.html): 您可以使用Hercules GUI实用程序进行测试。使用其“TCP客户端”向套接字网关发送消息,并使用其“TCP服务器”模拟从不同主机收听网关的套接字(代码中的IP和端口:xxx.xxx.xxx.xxx, 1226)。
不幸的是,Adobe Coldfusion的套接字网关无法正常播放所有正在侦听的套接字。您只能通过它来回复邮件的发件人。显然,这是设计的。这是令人惊讶的。您希望所有侦听套接字默认接收消息。我将向Coldfusion团队提出一个功能请求。
我在网上找到了这两个解决方案,它们似乎提供了广播到所有功能以及更多功能:
https://github.com/nmische/cf-websocket-gateway/tree/java-websocket
https://github.com/softwarezman/cf-socketiogateway
然而,当我在Coldfusion 2016上测试它时,我遇到了很多错误。在接下来的几天里,我将为Coldfusion附带的SocketGateway Java代码添加广播到所有功能。