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