一、要求
实现一个简易的传感器数据采集系统,完成以下功能:
- 数据采集客户端。能够随机产生等模拟数据(如:温度、湿度),并发送到服务器端。
- 数据采集服务器,接收多个客户端的数据并进行展示。
- 通讯协议设计,包括:心跳协议、数据上报、客户端上线、下线等。
二、实现
数据采集客户端
-
UI界面
-
部分代码
# -*- coding: utf-8 -*-
# import multiprocessing
import socket
import json
import random
import time
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi
from PyQt5.QtCore import QTimer
from Communication import Heartbeat
import threading
import sys
Host = 'localhost'
Server_Port = 13141
Server_Address = (Host, Server_Port)
class ClientMainWindow(QMainWindow):
def __init__(self):
super(ClientMainWindow, self).__init__()
loadUi('ClientUI.ui', self)
self.ConnectBTN.clicked.connect(self.ConnectToServer)
self.SendBTN.clicked.connect(self.StartSending)
self.PauseBTN.clicked.connect(self.PauseSending)
self.StopBTN2.clicked.connect(self.StopSending)
self.Client_Socket = None
self.sending = False
self.heartbeat = Heartbeat(20)
def ConnectToServer(self):
self.Client_Socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print("已连接到服务器...")
数据采集服务器
-
UI界面

-
部分代码
# -*- coding: utf-8 -*-
# import multiprocessing
import sys
import time
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout
from PyQt5.uic import loadUi
import socket
import json
import threading
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from Communication import Heartbeat
Host = 'localhost'
Server_Port = 13141
Server_Address = (Host, Server_Port)
class MyFigure(FigureCanvas):
def __init__(self, container, width=5, height=4, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
super(MyFigure, self).__init__(self.fig)
self.axes = self.fig.add_subplot(111)
layout = QVBoxLayout(container)
layout.addWidget(self)
class ServerMainWindow(QMainWindow):
def __init__(self, parent=None):
super(ServerMainWindow, self).__init__(parent)
loadUi("ServerUI.ui", self)
matplotlib.use("Qt5Agg")
self.fig = MyFigure(self.figure, width=3, height=2, dpi=100)
self.Server_Socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.Server_Socket.bind(Server_Address)
print("服务器已上线")
self.Heartbeat = Heartbeat(20)
self.client_last_active = {} #记录最后活跃时间
self.received_data = [] # 用来保存接收到的数据
# 启动接收数据的线程
thread = threading.Thread(target=self.receive_data)
thread.daemon = True # 设置线程为守护线程,当主线程结束时它也会结束
thread.start()
self.RenewBTN.clicked.connect(self.update_chart) # 点击“更新图表”按钮时处理数据
三、结果展示

需全部代码可私信询价
本文介绍了一款基于PyQT的传感器数据采集系统的设计与实现,包括客户端和服务器的搭建,客户端能模拟生成温度、湿度等数据并发送至服务器,服务器端负责接收并展示多个客户端的数据。此外,还涉及心跳协议、数据上报等通讯协议的设计。


359

被折叠的 条评论
为什么被折叠?



