1

我有一个串行硬件设备,我想与多个应用程序共享,它可能驻留在多个网络内或跨越多个网络的不同机器上。一个关键要求是系统必须支持双向通信,以便客户端/串行设备可以存在于防火墙后面和/或不同的网络上,并且仍然通过中央服务器相互通信(发送和接收)。系统的另一个要求是客户端必须能够确定网关/串行设备是否离线/在线。

该串行设备能够接收和发送数据包到无线网络。与串行设备通信的软件是用 Java 编写的,如果可能的话,我希望它保持 100% Java 解决方案。

我目前正在研究 XMPP,使用 Jive 软件的 Openfire 服务器和 Smack API。使用此解决方案,来自串行设备的数据包通过 XMPP 传递给客户端。类似地,任何客户端应用程序都可以通过 Smack API 向串行设备发送数据包。数据包只是字节数组,大小限制在 100 字节左右,因此可以将它们转换为十六进制字符串并作为消息正文中的文本发送。系统应该容忍客户端/串口设备离线,这意味着当它们再次可用时它们会自动重新连接,但如果客户端离线,数据包将被丢弃。数据包必须近乎实时地发送和接收,因此不希望离线传递。安全性应由消息传递系统和提供的客户端 API 提供。

我想听听其他可能的解决方案。我想过使用 JMS,但它似乎有点过于重量级,我不确定它是否支持了解客户端和/或网关/串行设备是否离线的要求。

4

3 回答 3

1

你真的需要提供更多细节......客户需要保证交货吗?线下配送呢?这是更大系统的一部分吗?你需要加密吗?安全?

如果你想要尽可能少的占用空间,那么应该使用 SocketServer、Sockets 和序列化来传输数据。但是,您将失去您提到的第 3 方解决方案的所有优势,通常包括可靠性、交付保证、安全性、管理等。

我个人会使用 JMS,但那是因为我熟悉它。有许多独立服务器可以开箱即用地部署,几乎无需配置。它们都提供有保证的交付、一些安全性、加密和许多其他易于使用的功能。编写 JMS 发布者或订阅者非常容易。


更新:如果您想要最轻松的编码,那么我会考虑第三方解决方案。查看 Smack/XMPP,对于您要求的功能,API 似乎比 JMS 更容易一些。您仍然必须设置/配置服务器等。

Smack API 也有很多你也不需要的额外包袱,但它的“概念”更直观一点,因为它都是聊天/IM 概念。

我仍然会看OpenJMSActiveMQ。我认为与了解 XMPP 相比,了解 JMS 在未来会更有价值。查看他们的入门文档或Sun 教程,了解其中涉及多少编码。用 JMS 的说法,您将需要一个受管理的“主题”和一个“队列”,串行端口应用程序将分别在其中接收和发送消息。您的所有客户都将打开对该主题的订阅并将其出站消息发送到队列。当您发送消息时,它们的传递模式应该是非持久的。

于 2008-09-19T15:45:09.997 回答
1

Jini 可能适合这份工作。它在多播可用的分布式环境中工作得非常好,但它也可以在单播中工作,而且速度非常快。它不仅提供远程服务,还提供远程事件和分布式事务(如果需要)。缺点是它仅适用于 Java。

在我工作的地方,Jini 用于拥有 1000 多台机器的基础架构中,每台机器都提供远程服务,用于访问连接到机器串行端口的设备。

于 2008-10-03T10:25:15.703 回答
0

我最终通过 Smack API 使用了 XMPP。导致我做出这个决定的原因是它对状态的原生支持(客户端在线/离线)和强大的连接处理(如果底层连接中断,它会自动重新连接)。XMPP 的另一个好处是它与 Google Talk 兼容,所以我不需要设置服务器。感谢您的建议。如果有人感兴趣,我已经在 Google Code http://code.google.com/p/xbee-xmpp/上发布了代码

于 2009-02-03T19:36:28.287 回答