16

基本的に、私が達成したいと思っているのは、 Raspberry Piを介してArduinoを制御するためのキャンバス ベースの Web インターフェイスです。使用は、ユーザーがキャンバスを表示する場所に移動することです。次に、スライダーを動かすと、websocket メッセージがRaspberry PiのTornadoサーバーに送信されます。次に Tornado は、 LEDのRGB値を変更するシリアル メッセージを Arduino に送信します。これまでのところ、開発者Raspberry Pi Android HTML5 Realtime Servo Controlによるドキュメントの助けを借りてこれを行うことができました。raspberrypi:8080

ただし、通信は Raspberry Pi から Arduino への一方向のみです。Tornado でシリアル ポートも監視して、センサー データをフロントエンドに戻してほしいと思います。ここで、どう進めていくか迷っています。Node.jsを使用して、このようなことを達成できました。Node.js は、WebSocket メッセージとシリアル メッセージの両方を非同期的に監視します。

ポートを常に監視する非同期プロセスを生成する必要がありますか? この種のソリューションのいくつかのオプションを見てきました。

  1. を提案する人もtornado.gen.Taskいますが、一定のシリアル データではなく、単一の HTTP リクエストに対してです。
  2. tornado.ioloop.PeriodicCallbackミリ秒ごとにシリアル データをチェックするように設定することもできますが、それは多くのオーバーヘッドのように思えます。
  3. Swirlなどの別のツールも見てきました。(Swirl はGithub リポジトリによると古くなっています)

または、シリアルを監視し、次のように理解できるもので Tornado アプリケーションと通信する別のPythonアプリケーションをセットアップする必要がありますか?

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

1 に答える 1

0

これが私の2セントです。Python->websockets-clientルートを提唱します。Tornadoサーバーソフトウェアは、Webクライアント要求を処理するように作成および調整されています。それをやらせてください。それを別の役割(ローカルハードウェアの監視など)に押し込もうとすると、(a)そのようなジョブを実行するように設計されている(C / C ++プログラムなど)または(b)処理するのに十分な柔軟性があるものよりもオーバーヘッドが大きくなりますオーバーヘッドがかなり少ないこのようなタスク(Pythonスクリプトなど)。

関連する経験:RaspberryPiとArduinoの両方にプログラムしました。地元のロボティクスクラブの役員。

于 2013-01-31T01:03:45.323 に答える