Tornado auf Himbeer-Pi zu verwenden, websockets sowie monitor serielle Schnittstelle Arduino-Kommunikation
Im wesentlichen, was ich mir erhoffe zu erreichen ist ein canvas-basiertes web-interface zur Steuerung einer Arduinoüber eine Raspberry Pi. Die Anwendungsfall ist, dass ein Benutzer navigiert zu raspberrypi:8080
zeigt eine Leinwand. Dann werden beim verschieben eines Schiebereglers, eine websocket-Nachricht wird gesendet, um die Tornado - server auf dem Raspberry Pi. Tornado dann schickt eine serielle Nachricht an den Arduino, die änderungen der RGB Wert eines LED. So weit So gut, ich habe in der Lage, dies zu tun mit Hilfe der Dokumentation, die von einem Entwickler, Raspberry Pi, Android-HTML5-Echtzeit-Servo Control.
Jedoch ist die Kommunikation nur in einer Richtung vom Raspberry Pi zum Arduino. Ich möchte den Tornado auch die überwachung der seriellen Schnittstelle um beliebige sensor Daten zurück an das front-end. Hier, wo ich bin unsicher, wie es weitergehen soll. Ich war in der Lage, etwas zu erreichen, wie dies mit Node.jsdie Monitore für beide websocket-Nachrichten sowie Nachrichten asynchron Seriell.
Sollte ein asynchroner Prozess hervorgebracht werden, die ständig überwacht den port? Ich habe gesehen, ein paar Optionen für diese Art von Lösung.
- Einige Leute vorschlagen
tornado.gen.Task
aber für die einzelnen HTTP-Anfragen, nicht für die ständige serielle Daten. tornado.ioloop.PeriodicCallback
was könnte ich überprüfen, serielle Daten jede Millisekunde, aber das klingt nach einer Menge Aufwand.- ich habe auch gesehen, separate tools wie Swirl. (Swirl ist überholt, nach es ist Github repo)
Oder sollte ich eine separate Python Anwendung, die Monitore, die serielle und dann kommuniziert der Tornado-Anwendung auf etwas, das Sie verstehen können, wie die folgenden?
- websocket-Nachrichten mithilfe eines der websocket-client
- ZeroMQ (Beispiel: pyzmq /Beispiele /eventloop /web.py)
So gibt es viele Optionen..., Was sind einige Empfehlungen und einige Gründe zu versuchen, oder vermeiden Sie eine der oben aufgeführten Optionen?
Hier ist, was ich habe und ich muss hinzufügen, serielle überwachung von:
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()
InformationsquelleAutor der Frage niltoid | 2013-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich herausgefunden, eine Lösung, die umfasst die Verwendung von Python-multiprocessing-Bibliothek. Nur ich schrieb einen ausführlichen blog-post darüber:
Raspberry Pi + Tornado + Arduino
Hoffe, dass andere es nützlich finden...
InformationsquelleAutor der Antwort niltoid
Hier sind meine 2 cents. Ich würde es befürworten für die Python -> websockets-client route. Der Tornado-server-software ist gemacht und abgestimmt, um die Handhabung des web-client-Anfragen. Lassen Sie es nicht sein job. Jeder Versuch, Schuhlöffel in eine andere Rolle (wie die überwachung lokaler hardware) ist, verursachen mehr Aufwand als etwas, das entweder (a) entworfen, um zu tun so einen job (wie ein C/C++ - Programm) oder (b) flexibel genug, um eine solche Aufgabe mit relativ wenig Aufwand (wie ein Python-Skript).
Relevante Erfahrung: programmiert Habe für beide Raspberry Pi und Arduino. Officer in der lokalen robotics club.
InformationsquelleAutor der Antwort Joshua Whitley