Flask веб-сервер и TCP-сервер работают одновременно - PullRequest
0 голосов
/ 03 апреля 2020

Я только что собрал WebServer с помощью Flask Framework. В этом проекте я создаю новый поток запуска TCP Server. этот TCP-сервер прослушивает порт 9999 для установления соединения для получения данных (значения температуры) от устройства IED. это мой код от Python

app = Flask(__name__)

BUFFER_SIZE = 1024
temp = 20
mutex = Lock()

def dbus_timer():
    print("Now Data Temp " + str(temp))

class WorkerSignals(QObject):
    finished = pyqtSignal(int)
    error = pyqtSignal(tuple)
    result = pyqtSignal(object)
    progress = pyqtSignal(int)

class Worker(QRunnable):
    def __init__(self, fn, *args, **kwargs):
        super(Worker, self).__init__()
        self.fn = fn
        self.args = args
        self.kwargs = kwargs
        self.signals = WorkerSignals()
        self.kwargs['progress_callback'] = self.signals.progress

    @pyqtSlot()
    def run(self):
        try:
            result = self.fn(*self.args, **self.kwargs)
        except:
            traceback.print_exc()
            exctype, value = sys.exc_info()[:2]
            self.signals.error.emit((exctype, value, traceback.format_exc()))
        else:
            self.signals.result.emit(result)  
        finally:
            self.signals.finished.emit(self.args[0])  

class StreamWorker(QtCore.QObject):
    def __init__(self, *args, **kwargs):
        super(StreamWorker, self).__init__()
        self.threadPool = QThreadPool()
        self.threadPool.setMaxThreadCount(1)
        self.TcpServerStart()

    def UpdateTemperatureSensor(self, bTxt):
        global temp
        _temp = int.from_bytes(bTxt, byteorder='big')
        if(_temp != temp):
            with mutex:
                temp = _temp
                print("\n Temperature: " + str(temp))

    def UpdatePotentinmeterSensor(self, txt):
        data = json.loads(txt)
        print(data["previous"])
        print(data["now"])

    def TcpServerListens(self, progress_callback):
        print("Start TcpServer")
        HOST, PORT = "192.168.0.88", 9999
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        s.listen(1)
        sock, addr = s.accept()
        length = 0
        bReceive = b''

        while True:
            try:
                receiv = sock.recv(BUFFER_SIZE)
                if(receiv == b''):
                    break
                bReceive = bReceive + receiv
                if(len(bReceive) > 6):
                    bReceive = b''

                elif(len(bReceive) == 6):
                    bTxtHead = bReceive[0:2].decode("utf-8")
                    bTxtFooter = bReceive[4:6].decode("utf-8")
                    if (bTxtHead == 'AA' and bTxtFooter == 'FF'):
                        bTxt = bReceive[2:4]
                        self.UpdateTemperatureSensor(bTxt)
                        bReceive = b''
            except (errorCode, message):
                print(message + "aaaaa ")

    def TcpServerStart(self):
        worker = Worker(self.TcpServerListens)
        worker.signals.progress.connect(self.workProgress)
        self.threadPool.start(worker)

    def workProgress(self, n):
        print("done!!!!")

@app.route('/')
def index():
    with mutex:
        return 'Temperature is now ' + str(temp)

if __name__ == '__main__':
    tcpServer = StreamWorker()
    timer = multitimer.MultiTimer(interval=3, function=dbus_timer)
    timer.start()

    app.run(debug=True, host='0.0.0.0')

Так, когда я получаю доступ к http://192.168.0.88: 5000 / из браузера, значение температуры не изменяется (все еще равное начальному значению 20 ). Я не знаю почему ??? Поэтому я пытаюсь проверить значение температуры по тому, как я создаю таймер и читаю его с интервалом = 3 с (посмотрите вверх) , и это результат . Таким образом, через каждые 3 с он будет печатать: «Сейчас температура данных 280, сейчас температура данных 20» одновременно

Любая помощь будет признательна!

...