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.

questionAnswers(2)

yourAnswerToTheQuestion