2011-06-01 66 views
2

我并不完全确定如何在标题中说出我的问题,所以很抱歉,如果它很混乱。硬件和Web组件之间的哪种实时通信协议?

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

我已经了解我要为硬件做什么,以及如何显示信息;我的问题与硬件和Web服务器之间的通信有关。

我想硬件以相当快的速度发送消息,所以我不认为HTTP POST就足够了。我也不是非常关心接收100%的信息,但接收尽可能多的信息绝对是一个优点。数据将来自硬件,填充某种数据库(可能是Redis)。

到目前为止,我已经研究了几件事情,但我不确定我是否朝着正确的方向前进。我查看了面向消息的中间件,例如RabbitMQ,但我不相信我需要开销。我也研究过Redis Pub/Sub这似乎是一个更合适的解决方案,因为我希望网络应用程序能够说出最后5分钟的数据,但即使如此我也不确定。我可以将UDP数据包发送给定制的侦听器吗?我很肯定硬件将是两个阶段(一个uC喂小嵌入式linux机器),所以你甚至可以把这个比喻成桌面软件,尽可能快地将消息发送到web服务器。

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

+0

我正要编辑您的标签以添加“实时数据数据收集”以及与实时数据收集相关的其他任何事情,但这会超出推荐的标签限制。您可能会考虑删除redis,消息队列和rabbitmg,因为您的问题看起来确实如此:“我如何以易于与nodejs集成的方式从实时硬件设备收集数据?” – 2011-06-01 02:58:53

+0

我根据您的建议更新了标签,但我不确定它是否与我关注的nodejs集成有关; nodejs将用于呈现数据,不一定在数据收集过程中(尽管这是我最不确定的阶段,所以它可以)。 – 2011-06-01 03:21:09

回答

1

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

个人而言,我想我会去的:

  1. 硬件设备输出 - >
  2. Linux系统中直接触发一个HTTP POST到你的中央服务器(node.js中) - >
  3. 取您的更改并立即通过socket.io(浏览器的实时传输)将它们发布到您的Web客户端。 https://github.com/LearnBoost/Socket.IO/

Socket.io可能是最好的开箱即用的实时传输对node.js的< ==>浏览器

如果你想坚持,Redis的也不错(再加上你的自由pub/sub)如果你的数据适合那个模型,它可能会。

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

我真的怀疑你会有足够的消息去担心专用的消息队列。 Rabbitmq引入了诸如队列持久性之类的特性,并且其构建的吞吐量非常高。可能比你之后的数量多出几个数量级。

您可能会看到像zeromq那样的库,其中存在节点绑定:https://github.com/JustinTulloss/zeromq.node。它就像rabbitmq中的一个主题/其他类型的交换,但没有中央消息队列节点(一个叫做brokerless)。这样你就可以直接与你的linux /硬件节点交谈,但仍然可以得到像接口一样的消息队列 - 你可以在“通道”上发布你的硬件更新,你的服务器节点会监听这些更新。

+0

所以,因为我想持久性和图表超过设定的持续时间,你会去哪个模型?低级硬件(uC) - >高级硬件(嵌入式Linux设备) - > redis(pub/sub)< - nodejs(演示)**或**低级硬件(uC) - >高级硬件(嵌入式Linux设备) - > POST到nodejs,它立即反映在nodejs(presentation)中并发送到redis(归档)?第一个模型甚至可能(pub/sub和持久存储)? – 2011-06-01 15:37:05

+0

为了避免复杂性,我想我会使用后一种方法。将数据从嵌入式Linux设备直接推送到节点(使用您喜欢的任何传输方式),节点处理向连接的客户端分派新数据,为持久性和调用分派数据到redis(或其他),以及向新连接的客户端提供图表/演示文稿redis调用存储的数据)。 – Josh 2011-06-01 19:00:36

+0

涵盖HTML POST和redis PUBSUB几乎是相同的;它们都是基于ASCII字符的,基于TCP的面向行的协议,所以与使用POST相关的任何问题对于redis都是一样的。我唯一需要考虑的事情是使用面向事务的面向线程的协议,比如HTTP和PUBSUB,这对于为每个请求设置新的TCP会话都是巨大的代价。在长期的TCP连接上使用数据包或面向流的协议似乎更有意义。 – 2011-06-01 19:14:30

1

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

+0

我想没有什么不对,但是我的工程师只是觉得HTTP往返是很多开销,因为经常会有一点数据被触发。 – 2011-06-01 15:38:57

1

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

我确定有大多数微控制器可用的库,虽然它们可能不是开源的,但我怀疑JS版本的Modbus存在所以你需要自己编写服务器端lib。我记得Modbus并不是特别复杂,特别是如果你不使用一些更深奥的功能。当然,写这个让我想到我会怎么写这样的事情,你看,这是already been done for nodejs! (其中的原因有很多我喜欢社区的NodeJS!)

所以这就是简单的答案......现在,我的黑客的帽子牢牢地掌握在地方...

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

您是否考虑在每个数据收集器上运行nodejs?如果nodejs的可执行文件的大小是问题,我相信它的开箱即用功能有很大一部分可以被删除或移入模块中。我认识到我所推荐的不是一件小事 - 将nodejs/V8的大小和复杂性移植到新平台当然是具有挑战性的 - 但我强烈怀疑nodejs的事件驱动设计是数据采集​​,离散制造,过程控制和其他制造应用的绝佳匹配。

+0

节点最近在webOS(掌上设备)上运行。 – Josh 2011-06-01 18:55:04

+0

幸运的是(或者不幸的是,取决于你如何看待它),我只会使用一个只有少数传感器的uC(很少有足够使用该uC上的引脚),所以我将通过一个单一的直接串行连接。谢谢你的提示;也许是第二次迭代。 – 2011-06-02 02:16:02