実行中のマシンのシリアルポートを読み取る(そして読み取り続ける)必要があるWebサーバーを構築しています。
目的は、バーコード スキャナーを読み取れるようにすることと、Server-Sent Events を使用して、読み取ったバーコードでブラウザーを更新することです。
これを行うためにフラスコを使用しています。私はブラウジングしましたが、一部の実装ではフラスコのみが必要であり、Gevent のような非同期ライブラリが必要であると言う人もいれば、Gevent と Redis や RabbitMQ のようなある種のキューが必要であると言う人もいます。
ここで、stackoverflow で見つけた非常に単純な例に基づいてコードを作成しようとしました。ほとんど機能していますが、いくつか質問があります。
- Chrome ではクロスオリジン エラーが発生します。Access-Control-Allow-Origin ヘッダーを追加することで、FireFox で動作させることができますが、Chrome はまだ動作しません。FF だけが SSE クロスオリジンをサポートするというのは正しいですか? ブラウザーは別のマシンからバーコード データを読み込む必要があるため、CORS をサポートする必要があります。
- 各メッセージの後、ブラウザーはコンソールにバーコードを表示しますが、その後接続を閉じ、約 3 秒後に再度開きます。これはFlaskに由来するようで、データを提供してから停止します。
- また、これが負荷の下でどのように機能するのか疑問に思っています。つまり、フラスコは text/event-stream mimetype に対して接続を開いたままにします。複数のクライアントが接続すると、すべての接続が飽和状態になるため、しばらくするとフラスコがブロックされませんか?
私のコードは次のとおりです(わかりやすくするために短縮されています)
サーバ側:
from flask import Flask
import flask
import serial
app = Flask(__name__)
app.debug = True
def event_barcode():
ser = serial.Serial()
ser.port = 0
ser.baudrate = 9600
ser.bytesize = 8
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.open()
s = ser.read(7)
yield 'data: %s\n\n' % s
@app.route('/barcode')
def barcode():
newresponse = flask.Response(event_barcode(), mimetype="text/event-stream")
newresponse.headers.add('Access-Control-Allow-Origin', '*')
return newresponse
if __name__ == '__main__':
app.run(port=8080, threaded=True)
クライアント側:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>TEST</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<script>
$(document).ready(function(){
if (!!window.EventSource) {
console.log('SSE supported.');
var source = new EventSource('http://localhost:8080/barcode');
source.addEventListener('message', function(e) {
console.log(e.data);
}, false);
source.addEventListener('open', function(e) {
console.log('Connection was opened.');
}, false);
source.addEventListener('error', function(e) {
if (e.readyState == EventSource.CLOSED) {
console.log('Connection was closed.');
}
}, false);
} else {
console.log('SSE notsupported.');
}
});
</script>
</head>
<body>
</body>
</html>
私がここで見ていた情報がいくつかあります: http://www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server
クロスオリジンと 3 秒の遅延の問題について、誰かが私の質問を解決し、いくつかの解決策を教えてくれることを願っています。
ありがとう。