6

我想主动从服务器发送消息,例如使用 UDP/TCPIP 到使用 arduino 的客户端。众所周知,如果用户有端口将特定端口转发到本地网络上的设备,这是可能的。但是我不想让用户手动进行端口转发,也许使用其他协议,这可能吗?

4

2 回答 2

5

1 Arduino 侧

我认为最接近这一点的方法是从 arduino 打开与服务器的连接,然后使用available等待服务器将一些数据流式传输到 arduino。您的代码将轮询打开的连接,但您要避免所有来回通信以打开和关闭连接,来回传递标头等。

2 服务器端

这意味着大部分工作将在服务器端,您需要管理打开的连接,以便在用户触发某些需要将消息推送到 arduino 的事件时立即写入它们。如何做到这一点会有所不同,具体取决于您正在运行的服务器应用程序类型。

2.1 Node.js 主要问题的“演练”

例如,在 Node.js 中,您可以res.write()在不关闭连接的情况下建立连接 - 这应该会产生与 arduino 的开放串行连接类似的效果。这给您留下了管理连接的问题 - 服务器是否应该定期检查数据库以获取 arduino 的消息?这只是从轮询链接中删除了一个链接arduino -> server -> database,因此我们应该能够做得更好。

我们可以附加一个由消息添加到数据库的事件触发的函数。Node-orm2是 node.js 的数据库对象关系模型驱动程序,它提供了诸如afterSaveafterCreate之类的钩子,您可以将它们用于此类事情。根据您的应用程序,您最好不要使用数据库,而只使用 javascript 对象。

那么剩下的唯一问题是:一旦钩子被激活,我们如何将正确的连接放入范围以便我们可以写入它?好吧,您可以将请求中的所有相关数据保存到某个全局数据结构中,也许是一个以 arduino ID 作为索引的字典,然后在触发的函数中获取所有数据,即请求上下文并写入它!

请参阅此博客文章以获取一个很好的示例,包括管理打开连接、正确关闭它们以及在超时时从内存中清除等的 node.js 代码。

3 结论

我自己还没有对此进行测试——但我计划这样做,因为我已经有一个使用 arduino 和 node.js 的现有应用程序,该应用程序目前是使用普通轮询实现的。希望我能尽快解决它并带着结果返回这里。

通常在长轮询中(根据我的阅读),一旦数据被发送回客户端(arduino),连接就会关闭,尽管我不明白为什么这是必要的。我计划尝试为多条消息保持打开相同的连接,仅在固定时间间隔后关闭以重新建立连接 - 我希望将此间隔设置得相当高,可能是 5-15 分钟。

于 2013-04-03T20:25:44.173 回答
2

我们使用 Pubnub 向客户端 Web 浏览器发送通知,以便用户可以立即知道他们何时收到“消息”和类似的东西。它工作得很好。

这似乎与您正在查看的限制相同:没有静态 IP,没有端口转发。理论上,用户可以将其插入...

看起来 Pubnub 有一个 Arduino 库: https ://github.com/pubnub/arduino

于 2013-10-26T17:12:39.880 回答