Писериальное чтение последовательного порта в колбе (возможно, с использованием Gevent)
я создаю веб-сервер, который должен будет читать (и продолжать читать) последовательный порт компьютерапродолжается.
Цель состоит в том, чтобы иметь возможность читать сканер штрих-кода и использовать отправленные сервером события, чтобы обновить браузер с прочитанным штрих-кодом.
м, используя колбу, чтобы сделать это. Я'Мы просмотрели и некоторые реализации требуют только колбу, некоторые говорят, что мне понадобится асинхронная библиотека, как Gevent, а некоторые даже говорят, что я 'мне нужен Gevent и какая-то очередь, такая как Redis или RabbitMQ.I '
я попытался основать свой код на очень простом примере, который я нашел в stackoverflowВот, У меня это в основном работает, но я застрял с некоторыми вопросами;
В Chrome есть ошибка кросс-источника, добавив заголовок Access-Control-Allow-Origin, я могу заставить его работать в FireFox, но Chrome все еще не 'т работа. Правильно ли, что только FF поддерживает SSE перекрестного происхождения? Мне нужно это для поддержки CORS, потому что браузер должен будет загрузить данные штрих-кода с отдельной машины.После каждого сообщения браузер отображает штрих-код в консоли, но затем закрывает соединение и открывает его снова примерно через 3 секунды. Кажется, это происходит из Flask, он дает мне данные, а затем просто останавливается.Также я'Мне интересно, как это будет работать под нагрузкой. Я имею в виду, что flask поддерживает соединение открытым для mimetype text / event-stream. Если несколько клиентов подключаются, выигралне блокирует ли колбу через некоторое время, потому что все соединения будут насыщены?Мой код следующий (сокращен для ясности)
Серверный:
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)
Сторона клиента:
TEST
$(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.');
}
});
Вот еще некоторая информация, на которую я смотрел:http://www.socketubs.net/2012/10/28/Websocket_with_flask_and_gevent/ http://sdiehl.github.com/gevent-tutorial/#chat-server
Я надеюсь, что кто-то может прояснить мои вопросы и, возможно, указать мне на некоторые решения для перекрестного источника и проблемы 3-секундной задержки.
Благодарю.