pyserial odczytujący port szeregowy w kolbie (może przy użyciu gevent)
Buduję serwer WWW, który musiałby czytać (i czytać dalej) port szeregowy komputera, na którym działa.
Celem jest umożliwienie odczytu skanera kodów kreskowych i użycie zdarzeń wysyłanych z serwera w celu zaktualizowania przeglądarki za pomocą odczytanego kodu kreskowego.
Do tego używam kolby. Przeglądałem i niektóre implementacje wymagają tylko kolby, niektórzy twierdzą, że potrzebuję biblioteki asynchronicznej, takiej jak Gevent, a niektórzy mówią nawet, że potrzebuję Gevent i jakiejś kolejki, takiej jak Redis lub RabbitMQ.
Próbowałem oprzeć mój kod na bardzo prostym przykładzie znalezionym na stackoverflowtutaj. Mam to głównie działa, ale utknąłem z kilkoma pytaniami;
W Chrome występuje błąd pochodzenia, dodając nagłówek Access-Control-Allow-Origin. Mogę go uruchomić w FireFox, ale Chrome nadal nie działa. Czy to prawda, że tylko FF obsługuje krzyżowanie SSE? Potrzebuję go do obsługi CORS, ponieważ przeglądarka będzie musiała załadować dane kodu kreskowego z oddzielnego komputera.Po każdej wiadomości przeglądarka wyświetla kod kreskowy w konsoli, ale następnie zamyka połączenie i otwiera je ponownie dopiero po około 3 sekundach. Wygląda na to, że pochodzi z Flask, daje mi dane, a następnie po prostu zatrzymuje się.Zastanawiam się również, jak to będzie działać pod obciążeniem. Mam na myśli, że kolba utrzymuje połączenie otwarte dla typu MIME typu tekst / zdarzenie. Jeśli podłączonych jest wielu klientów, czy nie zablokuje to kolby po pewnym czasie, ponieważ wszystkie połączenia będą nasycone?Mój kod jest następujący (skrócony ze względu na przejrzystość)
Po stronie serwera:
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)
Strona klienta:
<!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>
Jest trochę więcej informacji, na które patrzyłem tutaj:http://www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server
Mam nadzieję, że ktoś może wyjaśnić moje pytania i może wskazać mi pewne rozwiązania, dotyczące problemu pochodzenia i opóźnienia 3 sekund.
Dzięki.