本质上,我希望实现的是一个基于画布的 Web 界面,通过Raspberry Pi来控制Arduino。用例是用户导航到显示画布的位置。然后在移动滑块时,会向 Raspberry Pi 上的Tornado服务器发送一条 websocket 消息。Tornado 然后向 Arduino 发送一条串行消息,改变LED的RGB值。到目前为止一切顺利,在开发人员Raspberry Pi Android HTML5 Realtime Servo Control的文档的帮助下,我已经能够做到这一点。raspberrypi:8080
但是,从 Raspberry Pi 到 Arduino 的通信只是单向的。我希望 Tornado 也可以监视串行端口,以将任何传感器数据返回到前端。这是我不确定如何进行的地方。我能够使用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()