Raspberry Pi上的龙卷风使用websockets以及监控串口Arduino通信

nil*_*oid 16 arduino tornado websocket raspberry-pi

基本上,我希望实现的是基于画布的Web界面,通过Raspberry Pi控制Arduino.的使用情况下是用户导航到其显示画布.然后在移动滑块时,将websocket消息发送到Raspberry Pi上的Tornado服务器.Tornado然后向Arduino发送一条串行消息,改变LEDRGB值.到目前为止,我已经能够在开发人员Raspberry Pi Android HTML5实时伺服控制的文档的帮助下做到这一点.raspberrypi:8080

但是,通信只是从Raspberry Pi到Arduino的单向通信.我希望Tornado能够监控串口以将任何传感器数据恢复到前端.这是我不确定如何继续的地方.我能够使用Node.js来完成这样的事情,Node.js同时监视websocket消息和串行消息.

是否应该生成一个不断监视端口的异步进程?我已经看到了这种解决方案的几种选择.

  1. 有人建议tornado.gen.Task,但对于单个HTTP请求,不是针对常量串行数据.
  2. tornado.ioloop.PeriodicCallback 我可以设置每毫秒检查一次串行数据,但这听起来像很多开销.
  3. 我也看过像Swirl这样的独立工具.(根据它的Github回购, Swirl已经过时了)

或者我应该设置一个单独的Python应用程序来监视串行,然后与Tornado应用程序通信,它可以理解如下所示的内容?

  1. websocket消息使用websocket客户端
  2. 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()
Run Code Online (Sandbox Code Playgroud)

nil*_*oid 10

我找到了一个涉及使用Python的多处理库的解决方案.我刚刚写了一篇关于它的详细博客文章:

Raspberry Pi + Tornado + Arduino

希望别人觉得有用......


Jos*_*ley 0

这是我的 2 美分。我提倡使用 Python -> websockets-client 路线。Tornado 服务器软件是为了处理 Web 客户端请求而制作和调整的。让它完成它的工作。任何将其硬塞到另一个角色(如监视本地硬件)的尝试都将导致比 (a) 设计用于完成此类工作(如 C/C++ 程序)或 (b) 足够灵活以处理的任务更多的开销这样的任务开销相当小(就像 Python 脚本)。

相关经验: 曾为 Raspberry Pi 和 Arduino 编程过。当地机器人俱乐部的官员。