Tornado sur Raspberry Pi pour utiliser des websockets ainsi que le moniteur de communication port série Arduino

essentiellement, ce que j'espère réaliser est une interface Web basée sur la toile pour contrôler un Arduino, par Raspberry Pi. de cas d'utilisation c'est qu'un utilisateur accède à raspberrypi:8080 qui affiche une toile. Puis, en déplaçant un curseur, un message websocket est envoyé à Tornade le serveur sur le Raspberry Pi. Tornado envoie alors un message de série à L'Arduino qui change le RGB valeur LED. Jusqu'à présent, pour bon, j'ai été en mesure de le faire avec l'aide de la documentation par un développeur, Raspberry Pi Android HTML5 Real Time Servo Control.

cependant, la communication n'est qu'à Sens Unique, de Raspberry Pi à Arduino. J'aimerais que Tornado surveille aussi le port série pour ramener toutes les données des détecteurs à l'avant. Voici où je ne suis pas sûr de savoir comment procéder. J'ai été en mesure d'accomplir quelque chose comme ceci en utilisant noeud.js, qui surveille les messages websocket ainsi que les messages série sont asynchrones.

devrait-on déclencher un processus asynchrone qui surveille constamment le port? J'ai vu quelques options pour ce genre de solution.

  1. Certaines personnes suggèrent tornado.gen.Task, mais pour les requêtes HTTP uniques, pas pour les données série constantes.
  2. tornado.ioloop.PeriodicCallback que je pourrais mettre en place pour vérifier les données de série chaque milliseconde, mais cela ressemble à beaucoup de généraux.
  3. j'ai aussi vu des outils séparés tels que Tourbillon. (Swirl est périmé selon dépôt Github)

Ou dois-je mettre un Python application qui surveille serial puis communique à L'application Tornado sur quelque chose qu'elle peut comprendre comme ce qui suit?

  1. websocket des messages à l'aide d'un websocket client
  2. ZeroMQ (exemple de travail:pyzmq / exemples / eventloop / web.py)

il y a donc beaucoup d'options... Quelles sont les recommandations et les raisons d'essayer ou d'éviter l'une des options ci-dessus?

Voici ce que j'ai et de la nécessité d'ajouter un numéro de série de surveillance de:

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()
16
demandé sur niltoid 2013-01-07 01:25:48

2 réponses

j'ai trouvé une solution qui implique l'utilisation de la bibliothèque multiprocessing de Python. Je viens d'écrire un blog détaillée post à ce sujet:

Raspberry Pi + Tornado + Arduino

J'espère que d'autres le trouveront utile...

10
répondu niltoid 2013-02-27 23:18:56

Voici mes 2 cents. Je préconiserais la route Python -> websockets-client. Le logiciel Tornado server est conçu et mis au point pour traiter les requêtes des clients web. Laissez le faire son travail. Toute tentative de le projeter dans un autre rôle (comme surveiller le matériel local) va causer plus de frais généraux que quelque chose qui est soit (a) conçu pour faire un tel travail (comme un programme C / C++) ou (b) assez flexible pour gérer une telle tâche avec assez peu de frais généraux (comme un Python script.)

expérience pertinente: ont programmé pour Raspberry Pi et Arduino. Officier du club de robotique local.

0
répondu Joshua Whitley 2013-01-31 01:03:45