基本上,我希望实现的是一个基于画布的web界面来控制Arduino,通过树莓派。用例是用户导航到显示画布的raspberrypi:8080
。然后在移动滑块时,websocket消息被发送到树莓派上的Tornado服务器。然后Tornado向Arduino发送一个串行消息,改变LED的RGB值。到目前为止一切顺利,我已经能够做到这一点的帮助下,由一个开发人员的文档,树莓派Android HTML5实时伺服控制。
然而,从树莓派到Arduino的通信只是单向的。我想龙卷风也监控串行端口得到任何传感器数据回到前端。这就是我不确定如何进行的地方。我能够使用Node.js完成类似的事情,它可以异步监控websocket消息和串行消息。
应该生成一个异步进程来持续监视端口吗?对于这种解决方案,我已经看到了几个选项。
- 有些人建议
tornado.gen.Task
,但对于单个HTTP请求,而不是常量串行数据。 -
tornado.ioloop.PeriodicCallback
,我可以设置为每毫秒检查串行数据,但这听起来像很多开销。 -
我也见过单独的工具,如Swirl。(根据Github的repo, Swirl已经过时了)
或者我应该设置一个单独的Python应用程序来监视串行,然后以它可以理解的方式与Tornado应用程序通信,就像下面这样?
- 使用websocket客户端的websocket消息
- ZeroMQ(工作示例:pyzmq/examples/eventloop/web.py)
所以有很多选择…有什么建议和理由去尝试或避免上述任何一种选择?
下面是我需要添加串行监控的内容:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
from tornado.options import define, options
define("port", default=8080, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html')
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print 'new connection'
self.write_message("connected")
def on_message(self, message):
print 'message received %s' % message
self.write_message('message received %s' % message)
def on_close(self):
print 'connection closed'
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/", IndexHandler),
(r"/ws", WebSocketHandler)
]
)
httpServer = tornado.httpserver.HTTPServer(app)
httpServer.listen(options.port)
print "Listening on port:", options.port
tornado.ioloop.IOLoop.instance().start()
这是我的2美分。我建议使用Python -> websockets-client路由。龙卷风服务器软件是用来处理网络客户端请求的。让它完成它的工作。任何试图将其硬塞到另一个角色(如监视本地硬件)的尝试都会导致更多的开销,而不是(a)设计用于完成此类工作(如C/c++程序)或(b)足够灵活以相当少的开销处理此类任务(如Python脚本)。
相关经验:有Raspberry Pi和Arduino编程经验。本地机器人俱乐部干事