Торнадо на малине Pi использовать веб-порты, а также последовательный порт последовательного порта Arduino - программирование
Подтвердить что ты не робот

Торнадо на малине Pi использовать веб-порты, а также последовательный порт последовательного порта Arduino

По сути, я надеюсь, что это веб-интерфейс на основе холста, чтобы управлять 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 по тому, что оно может понять, как следующий?

  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()
4b9b3361

Ответ 1

Я выяснил решение, которое включает в себя использование библиотеки многопроцессорности Python. Я просто написал подробное сообщение в блоге об этом:

Малина Pi + Торнадо + Ардуино

Надеюсь, что другие считают это полезным...

Ответ 2

Вот мои 2 цента. Я буду выступать за маршрут Python → websockets-client. Серверное программное обеспечение Tornado создано и настроено для обработки запросов веб-клиентов. Пусть это сделает работу. Любая попытка привязать его к другой роли (например, мониторинг локального оборудования) приведет к увеличению накладных расходов, чем то, что либо (а) предназначено для выполнения такого задания (например, программы на C/С++), либо (б) достаточно гибкое для обработки такая задача с довольно небольшими накладными расходами (например, Python script).

Соответствующий опыт: запрограммирован как для малины Pi, так и для Arduino. Офицер в местном клубе робототехники.