По сути, я надеюсь, что это веб-интерфейс на основе холста, чтобы управлять Arduino через Малина Pi. пример использования заключается в том, что пользователь переходит к raspberrypi:8080
, который отображает холст. Затем при перемещении слайдера на сервере Tornado отправляется сообщение websocket. Затем Tornado отправляет серийное сообщение в Arduino, которое изменяет значение RGB LED. До сих пор так хорошо, что я смог сделать это с помощью документации разработчика, Raspberry Pi Android HTML5 Realtime Servo Control.
Однако, сообщение только одностороннее от Малины Пи до Ардуино. Я бы хотел, чтобы Tornado также следил за последовательным портом, чтобы вернуть данные датчика обратно в интерфейс. Здесь, где я не уверен, как действовать. Я смог выполнить что-то подобное, используя Node.js, который асинхронно отслеживает как сообщения веб-маз, так и последовательные сообщения.
Должен ли возникать асинхронный процесс, который постоянно контролирует порт? Я видел пару вариантов такого решения.
- Некоторые люди предлагают
tornado.gen.Task
, но для отдельных HTTP-запросов, а не для постоянных последовательных данных. -
tornado.ioloop.PeriodicCallback
, который я мог бы настроить для проверки последовательных данных каждые миллисекунды, но это звучит как много накладных расходов. -
Я также видел отдельные инструменты, такие как Swirl.(Swirl устарел в соответствии с это Github repo)
Или мне нужно настроить отдельное приложение 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()