Pyserial Reading Serial Port im Kolben (evtl. mit gevent)

Ich baue einen Webserver auf, der die serielle Schnittstelle des Computers, auf dem er ausgeführt wird, lesen muss (und weiterlesen muss).
Der Zweck besteht darin, einen Barcodescanner lesen zu können und mithilfe von vom Server gesendeten Ereignissen einen Browser mit dem gelesenen Barcode zu aktualisieren.

Ich benutze Flasche, um das zu tun. Ich habe mich umgesehen und einige Implementierungen erfordern nur flask, einige sagen, ich bräuchte eine asynchrone Bibliothek wie Gevent, und andere sagen sogar, ich bräuchte Gevent und eine Art Warteschlange wie Redis oder RabbitMQ.

Ich habe versucht, meinen Code auf ein sehr einfaches Beispiel zu stützen, das ich auf stackoverflow gefunden habeHier. Ich habe es meistens funktioniert, aber ich bin mit einigen Fragen fest;

In Chrome gibt es einen ursprungsübergreifenden Fehler. Durch Hinzufügen eines Access-Control-Allow-Origin-Headers kann ich dafür sorgen, dass es in FireFox funktioniert, aber Chrome funktioniert immer noch nicht. Stimmt es, dass nur FF SSE Cross-Origin unterstützt? Ich brauche es, um CORS zu unterstützen, da der Browser die Barcode-Daten von einem separaten Computer laden muss.Nach jeder Meldung zeigt der Browser den Barcode in der Konsole an, beendet dann aber die Verbindung und öffnet sie erst nach ca. 3 Sekunden wieder. Es scheint, dass dies in Flask entsteht, es gibt mir die Daten und hört dann einfach auf.Außerdem frage ich mich, wie sich dies unter Last verhält. Ich meine, flask hält eine Verbindung für den Mimetyp text / event-stream offen. Wenn mehrere Clients eine Verbindung herstellen, blockiert er dann nicht nach einiger Zeit die Flasche, da alle Verbindungen gesättigt sind?

Mein Code ist wie folgt (aus Gründen der Übersichtlichkeit gekürzt)

Serverseitig:

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)

Client-Seite:

    <!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>

Es gibt einige weitere Informationen, die ich mir hier angesehen habe:http://www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server

Ich hoffe, jemand kann meine Fragen klären und mich vielleicht auf einige Lösungen für das Kreuzherkunfts- und das 3-Sekunden-Verspätungsproblem hinweisen.

Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage