我想主动从服务器发送消息,例如使用UDP / TCPIP到使用arduino的客户端。众所周知,如果用户端口将特定端口转发到本地网络上的设备,则这是可能的。但是,我不希望让用户手动移植,也许使用其他协议,这可能吗?
答案 0 :(得分:5)
我认为你最接近的是从arduino打开与服务器的连接,然后使用available等待服务器将一些数据流式传输到arduino。您的代码将轮询打开的连接,但是您要避免所有来回通信以打开和关闭连接,来回传递标头等。
这意味着大部分工作将在服务器端,您需要管理打开的连接,以便在用户触发某些需要将消息推送到arduino的事件时立即写入。如何执行此操作会有所不同,具体取决于您运行的服务器应用程序的类型。
例如,在Node.js中,您可以在连接上res.write()
而不关闭它 - 这应该具有与arduino的开放串行连接类似的效果。这会让你遇到管理连接的问题 - 服务器应该定期检查数据库中的arduino消息吗?这只是从arduino -> server -> database
轮询链接中删除了一个链接,因此我们应该能够做得更好。
我们可以附加由添加到数据库的消息的事件触发的功能。 Node-orm2是node.js的数据库对象关系模型驱动程序,它提供 hooks ,例如 afterSave 和 afterCreate ,你可以利用这种类型的东西。 根据您的应用程序,您最好不要使用数据库,只使用javascript对象。
然后唯一剩下的问题是:一旦挂钩被激活,我们如何获得正确的连接到范围,以便我们可以写入它?那么你可以将你对请求的所有相关数据保存到一些全局数据结构,也可以是一个arduino ID作为索引的字典,并在触发函数中获取所有数据,即请求 context 你写信给它!
请参阅this blog post以获取一个很好的示例,包括管理打开连接的node.js代码,正确关闭它们以及在超时时从内存中清除等。
我自己没有对此进行测试 - 但我计划使用arduino和node.js的现有应用程序,目前使用普通轮询实现。希望我很快就能解决这个问题并带着结果回到这里。
通常在长轮询中(从我读过的内容),一旦数据被发送回客户端(arduino),连接就会关闭,尽管我不明白为什么这是必要的。我计划尝试为多个消息保持相同的连接打开,仅在固定的时间间隔后关闭以重新建立连接 - 我希望将此间隔设置得相当高,可能需要5-15分钟。
答案 1 :(得分:2)
我们使用Pubnub向客户端Web浏览器发送通知,以便用户可以立即知道他们何时收到“消息”等类似内容。它很棒。
这似乎与您所看到的约束相同:没有静态IP,没有端口转发。理论上,用户可以将内容插入...
看起来Pubnub有一个Arduino库: https://github.com/pubnub/arduino