硬件和Web组件之间的实时通信协议是什么?

时间:2011-06-01 02:51:35

标签: node.js real-time redis microcontroller data-collection

我不完全确定如何在标题中说出我的问题,如果它令人困惑,请道歉。

我想建立一个系统,作为我家的一种信息仪表板。它将由许多硬件和软件组成,最终将形成一个简单,干净的网站,可以实时显示许多模拟传感器,如温度,风速和风向等。

我已经知道我要为硬件做什么,以及显示信息;我的问题与硬件和网络服务器之间的通信有关。

我希望硬件以相当快的速度触发消息,所以我不认为HTTP POST就足够了。我也不是非常关心收到100%的邮件,但收到尽可能多的邮件肯定是一个加分。数据将来自硬件,填充某种数据库(可能是Redis)。

到目前为止,我已经研究过几件事,但我不确定自己是否朝着正确的方向前进。我已经研究了面向消息的中间件,例如RabbitMQ,但我不相信我需要开销。我也研究了Redis Pub/Sub这似乎是一个更合适的解决方案,因为我希望网络应用程序能够说出最后5分钟的数据,但即便如此我也不确定。我可以将UDP数据包发送到定制的侦听器吗?

我非常肯定硬件将分为两个阶段(uC为一台小型嵌入式Linux机器供电),所以你甚至可以将其比作桌面软件,尽可能快地向网络服务器发送消息。

我冒险进入一个我完全不了解的领域,因此非常感谢任何指导。

3 个答案:

答案 0 :(得分:1)

要在数据采集器和收集器之间进行通信,您可以考虑采用行业标准Modbus TCP协议。 (在以前的生活中,我为可编程控制器编写了网络代码。)

我确信大多数微控制器都有可用的库,虽然它们可能不是开源的,但是我怀疑存在一个JS版本的Modbus,所以你需要自己编写服务器端的lib。我记得Modbus并不是特别复杂,特别是如果你不使用它的一些更深奥的功能。当然,写这个让我想到我是怎么写这样的东西而且看,它是{{ {3}}! (我喜欢nodejs社区的众多原因之一!)

这就是简单的答案......现在,我的黑客帽子已牢固地存在......

你提到你的硬件将提供一个或多个“小型嵌入式Linux机器”。

您是否考虑过在每个数据收集器上运行nodejs?如果nodejs的可执行文件的大小是问题,我确信它的开箱即用功能的很大一部分可以删除或移动到模块中。

我意识到我所推荐的并不是一件小事 - 将nodejs / V8的大小和复杂性移植到一个新平台当然具有挑战性 - 但我强烈怀疑nodejs的事件驱动设计将是一个非常适合数据采集,离散制造,过程控制和其他制造应用。

答案 1 :(得分:0)

http post有什么问题?如果您使用node.js作为您的Web服务器,它应该足够快。您已经在节点中对表示层进行编码,因此您将不得不使用一个较少的工具,在这种情况下,它非常适合。保持简单并坚持使用节点。

答案 2 :(得分:0)

与上面提到的其他海报一样,你不会遇到http post的问题。 Node的http实现是为高并发而构建的。

我个人认为我会选择:

  1. 硬件设备输出 - >
  2. Linux框会将http帖子直接发送到您的中央服务器(node.js) - >
  3. 进行更改并立即通过socket.io将其发布到您的Web客户端(浏览器的实时传输)。 https://github.com/LearnBoost/Socket.IO/
  4. Socket.io可能是node.js< ==>的最佳开箱即用实时传输。浏览器

    如果你想要持久化,redis并不坏(加上你得到免费的pub / sub)如果你的数据适合那个模型,它可能就是这样。

    没有理由你也不能使用基于reglar tcp的连接(网络模块),如果这是你的包。除非您希望数据不可靠,否则我不会去udp。这是更有损流媒体导向。

    我真的怀疑你是否会有足够的消息来担心专用的消息队列。 Rabbitmq引入了诸如队列持久性之类的功能,并且具有令人难以置信的高吞吐量。可能比您追求的数量多出几个数量级。

    您可能会看到像zeromq这样的库,其中有节点绑定:https://github.com/JustinTulloss/zeromq.node。它像rabbitmq中的主题/其他类型的交换,但没有中央消息队列节点(一个称为无代理)。这样你就可以直接与你的linux / hardware节点对话,但仍然得到像界面一样的消息队列 - 你在'通道'上发布你的硬件更新,你的服务器节点就会监听这些更新。