我建立一個Web服務器,將需要閱讀(繼續閱讀)運行它的計算機的串行端口。
的目的是爲了能夠讀取條形碼掃描儀,以及使用服務器發送的事件來更新與讀取條形碼的瀏覽器。pyserial閱讀瓶串行端口(可能使用GEVENT)
我使用燒瓶做到這一點。我周圍的瀏覽,而且一些實現只需要燒瓶,有人說我需要一個異步庫像GEVENT,有的人甚至說我需要GEVENT和某種類似的Redis或RabbitMQ的隊列。
我試圖立足於一個非常簡單的例子,我在計算器here找到我的代碼。我主要工作,但我堅持一些問題;
- 在Chrome中有一個跨域錯誤,通過添加 訪問控制允許來源標題我可以得到它在Firefox中, 工作,而Chrome仍然無法正常工作。是否只有FF支持 SSE跨源?我需要它,因爲瀏覽器將 需要從一個單獨的機器加載條碼數據支持CORS。
- 在每封郵件後,瀏覽器在控制檯中顯示條形碼,但是 它會關閉連接,並且僅在約3秒鐘後再次打開它。看起來這起源於Flask,它給了我數據 ,然後就停止。
- 此外,我想知道這將如何執行負載。我的意思是,燒瓶 保持連接爲文本/事件流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秒延遲問題。
謝謝。
因爲您使用完整的url客戶端,它讓我想知道你是否在同一個主機和端口上託管客戶端的東西?它是否工作,如果你這樣做(並通過相對網址連接)? –
爲什麼不關閉連接?你給燒瓶一個只能產生一個結果的發生器。 event_barcode()中不應該有某種循環嗎? –
謝謝,Janus;我需要它在不同的主機上運行,因爲我需要從公共網站訪問串行端口。我在客戶端(localhost:8080)上運行本地網絡服務器,並通過公共頁面與JavaScript連接。這使我們能夠從瀏覽器訪問本地硬件。這個概念已經可以使用JSONP了,但是使用SSE我不知道如何規避跨源的策略(至少在Chrome中) –