Raspberry Pi 上的 Tornado 使用 websockets 以及监控串行端口 Arduino 通信

Posted

技术标签:

【中文标题】Raspberry Pi 上的 Tornado 使用 websockets 以及监控串行端口 Arduino 通信【英文标题】:Tornado on Raspberry Pi to use websockets as well as monitor serial port Arduino communication 【发布时间】:2013-01-06 21:25:48 【问题描述】:

基本上,我希望实现的是一个基于画布的 Web 界面,通过 Raspberry Pi 控制 Arduino。 use case 是用户导航到显示画布的raspberrypi:8080。然后在移动滑块时,会向 Raspberry Pi 上的Tornado 服务器发送一条 websocket 消息。 Tornado 然后向 Arduino 发送一条串行消息,该消息会更改 LED 的 RGB 值。到目前为止一切顺利,在开发人员 Raspberry Pi android html5 Realtime Servo Control 的文档的帮助下,我已经能够做到这一点。

但是,从 Raspberry Pi 到 Arduino 的通信只有一种方式。我希望 Tornado 也可以监视串行端口,以将任何传感器数据返回到前端。这是我不确定如何进行的地方。我能够使用Node.js 完成类似的事情,它异步监控websocket 消息和串行消息。

是否应该生成一个持续监控端口的异步进程?我已经看到了这种解决方案的几个选项。

    有人建议tornado.gen.Task,但是对于单个HTTP请求,而不是对于恒定的串行数据。 tornado.ioloop.PeriodicCallback 我可以设置为每毫秒检查一次串行数据,但这听起来开销很大。 我还看到过单独的工具,例如Swirl。(根据it's Github repo,Swirl 已过时)

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

    使用websocket client 的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()

【问题讨论】:

我想出了一个涉及使用 Python 的多处理库的解决方案。我刚刚写了一篇关于它的详细博客文章:Raspberry Pi + Tornado + Arduino希望其他人觉得它有用... 【参考方案1】:

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

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

【讨论】:

感谢您的建议。我同意最好将串行 com 保存在单独的程序中。如果您好奇,请在答案中查看我的最终解决方案。

以上是关于Raspberry Pi 上的 Tornado 使用 websockets 以及监控串行端口 Arduino 通信的主要内容,如果未能解决你的问题,请参考以下文章

sh 修复了Raspberry Pi上的慢速鼠标

Raspberry pi 上的 Alsa 问题

Raspberry Pi 上的 Mono [关闭]

无法连接到 Raspberry Pi 上的 BLE 设备

Raspberry Pi 3(服务器)上的 Python 蓝牙错误

Raspberry Pi 上的 ssh 连接被拒绝 [关闭]