基本的に、私が達成したいと思っているのは、 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 メッセージとシリアル メッセージの両方を非同期的に監視します。
ポートを常に監視する非同期プロセスを生成する必要がありますか? この種のソリューションのいくつかのオプションを見てきました。
- を提案する人も
tornado.gen.Task
いますが、一定のシリアル データではなく、単一の HTTP リクエストに対してです。 tornado.ioloop.PeriodicCallback
ミリ秒ごとにシリアル データをチェックするように設定することもできますが、それは多くのオーバーヘッドのように思えます。Swirlなどの別のツールも見てきました。(Swirl はGithub リポジトリによると古くなっています)
または、シリアルを監視し、次のように理解できるもので Tornado アプリケーションと通信する別のPythonアプリケーションをセットアップする必要がありますか?
- 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()