Tornado在树莓派上使用websockets以及Arduino串口监控通信



基本上,我希望实现的是一个基于画布的web界面来控制Arduino,通过树莓派。用例是用户导航到显示画布的raspberrypi:8080。然后在移动滑块时,websocket消息被发送到树莓派上的Tornado服务器。然后Tornado向Arduino发送一个串行消息,改变LED的RGB值。到目前为止一切顺利,我已经能够做到这一点的帮助下,由一个开发人员的文档,树莓派Android HTML5实时伺服控制

然而,从树莓派到Arduino的通信只是单向的。我想龙卷风也监控串行端口得到任何传感器数据回到前端。这就是我不确定如何进行的地方。我能够使用Node.js完成类似的事情,它可以异步监控websocket消息和串行消息。

应该生成一个异步进程来持续监视端口吗?对于这种解决方案,我已经看到了几个选项。

  1. 有些人建议tornado.gen.Task,但对于单个HTTP请求,而不是常量串行数据。
  2. tornado.ioloop.PeriodicCallback,我可以设置为每毫秒检查串行数据,但这听起来像很多开销。
  3. 我也见过单独的工具,如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编程经验。本地机器人俱乐部干事

    相关内容

    • 没有找到相关文章

    最新更新