Về cơ bản, những gì tôi hy vọng đạt được là giao diện web dựa trên canvas để điều khiển một Arduino, thông qua số Raspberry Pi. use case là người dùng điều hướng đến raspberrypi:8080
hiển thị canvas. Sau đó, khi di chuyển một thanh trượt, một tin nhắn websocket được gửi đến máy chủ Tornado trên Raspberry Pi. Tornado sau đó gửi một tin nhắn nối tiếp đến Arduino thay đổi giá trị RGB của LED. Cho đến nay rất tốt, tôi đã có thể thực hiện việc này với sự trợ giúp của tài liệu của nhà phát triển, Raspberry Pi Android HTML5 Realtime Servo Control.Tornado trên Raspberry Pi để sử dụng websockets cũng như màn hình cổng nối tiếp Giao tiếp Arduino
Tuy nhiên, giao tiếp chỉ là một chiều từ Raspberry Pi đến Arduino. Tôi muốn Tornado cũng theo dõi cổng nối tiếp để lấy lại bất kỳ dữ liệu cảm biến nào về mặt trước. Đây là nơi tôi không chắc chắn về cách tiến hành. Tôi đã có thể thực hiện một cái gì đó như thế này bằng cách sử dụng Node.js, mà theo dõi cho cả tin nhắn websocket cũng như các thông điệp nối tiếp không đồng bộ.
Nếu một quá trình không đồng bộ được sinh ra thường xuyên giám sát cổng? Tôi đã nhìn thấy một vài lựa chọn cho loại giải pháp này.
- Một số người đề xuất
tornado.gen.Task
, nhưng đối với yêu cầu HTTP đơn, không phải cho dữ liệu nối tiếp liên tục. tornado.ioloop.PeriodicCallback
mà tôi có thể thiết lập để kiểm tra dữ liệu nối tiếp sau mỗi mili giây, nhưng có vẻ như rất nhiều chi phí.-
Tôi cũng đã thấy các công cụ riêng biệt như Swirl.(Swirl là lỗi thời theo it's Github repo)
Hoặc tôi nên thiết lập một ứng dụng riêng biệt Python mà màn hình nối tiếp và sau đó truyền đạt đến các ứng dụng Tornado trên một cái gì đó nó có thể hiểu như sau?
- điệp WebSocket sử dụng một websocket client
- ZeroMQ (làm việc Ví dụ: pyzmq/examples/eventloop/web.py)
Vì vậy, có rất nhiều lựa chọn ... một số kiến nghị là gì và một số lý do để thử hoặc tránh bất kỳ tùy chọn nào ở trên?
Dưới đây là những gì tôi có và cần phải bổ sung giám sát nối tiếp để:
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()
1 cho ý tưởng tốt đẹp! – Rafa