栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python

        一般一个典型的物联网系统包括感控层(传感器),网络层和应用层组成,而网络层主要用于实现感控对象与应用层的服务对象之间的通信。本次作业就以TCP/IP 协议栈中传输层协议的应用开发为目标,以UDP方式实现一种感控对象与服务对象之间的通信机制,其体系结构如图1所示。其中感控对象为一个虚拟路灯对象,在实现过程中用随机数模拟其温度、湿度和环境照度等感知数据,灯作为被控对象,可以通过服务器对其进行打开、关闭控制,且用不同颜色表示其开关状态。每个虚拟路灯都将有一个标识,以示区别。而服务对象可以同时与若干个虚拟路灯对象通信,每个虚拟路灯会定期向服务对象发送其当前状态,服务对象可以对任一个虚拟路灯进行开关控制。

PySide2安装:

pip install PySide2

UI:

需添加UIClient.ui和UIServer.ui两个ui组件


 udp客户端:使用时需更改IP地址为本机IP

import random
from socket import *
from PySide2.QtCore import QFile
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
import threading
import time
sendAddress = ('192.168.1.101', 8081)


class Client:

    def __init__(self):
        # 从文件中加载UI定义
        qfile_Server = QFile("venv/UIClient.ui")
        qfile_Server.open(QFile.ReadOnly)
        qfile_Server.close()
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load(qfile_Server)

        self.wendu=self.shidu=self.zhaodu=0
        self.ui.btlight.clicked.connect(self.light)
        self.ui.btwork.clicked.connect(self.work)
        self.ui.btstopwork.clicked.connect(self.stopwork)
        self.ui.btsenddata.clicked.connect(self.senddata)
        self.open = False

    # 发送数据,格式:str:data
    def senddata(self):
        self.senddata = 'Temperature:' + str(self.wendu) + 'degreenHumidity:' + str(self.shidu) + 'RHnEnvironmental illumination:' + str(self.zhaodu) + 'lx'
        udpclient.sendto(self.senddata.encode(), sendAddress)

    # 客户端手动开灯
    def light(self):
        if self.open == False:
            self.open = True
            self.ui.btlight.setStyleSheet("background-color:#ffff00;")
        else:
            self.open = False
            self.ui.btlight.setStyleSheet("background-color:#ffffff;")

    # 客户端工作开始
    def work(self):
        self.wendu = round(random.uniform(1, 100), 2)
        self.shidu = round(random.uniform(40, 60), 2)
        self.zhaodu = round(random.uniform(250, 2000), 1)

        self.ui.Textwendu.setText(str(self.wendu) + '摄氏度')
        self.ui.Textshidu.setText(str(self.shidu) + 'RH')
        self.ui.Textzhaodu.setText(str(self.zhaodu) + '勒克斯')
        self.ui.TextAddress.setText('')
        self.ui.btlight.setEnabled(True)
        self.ui.btstopwork.setEnabled(True)
        self.ui.btwork.setEnabled(False)
        self.ui.Textwendu.setEnabled(True)
        self.ui.Textshidu.setEnabled(True)
        self.ui.Textzhaodu.setEnabled(True)
        self.ui.TextAddress.setEnabled(True)
        self.ui.btsenddata.setEnabled(True)
        self.ui.TextAddress.setText("IP地址:192.168.1.101端口号:8080")

    # 客户端停止工作
    def stopwork(self):
        self.ui.Textwendu.setText('')
        self.ui.Textshidu.setText('')
        self.ui.Textzhaodu.setText('')
        self.ui.TextAddress.setText('')
        self.ui.btwork.setEnabled(True)
        self.ui.btlight.setEnabled(False)
        self.ui.Textwendu.setEnabled(False)
        self.ui.Textshidu.setEnabled(False)
        self.ui.Textzhaodu.setEnabled(False)
        self.ui.TextAddress.setEnabled(False)
        self.ui.btsenddata.setEnabled(False)
        self.ui.btstopwork.setEnabled(False)


# 实例化窗口程序
app = QApplication([])
stats = Client()
stats.ui.show()
# 定义socket对象
udpclient = socket(AF_INET, SOCK_DGRAM)
udpclient.bind(('192.168.1.101', 8080))
print(f'客户端1启动成功...')


# 接受服务端数据包,并发送握手数据包,格式为str:ACK,data
def receive():
    while (True):
        receiveData = udpclient.recvfrom(10240)
        if int(receiveData[0].decode()) == 1:
            stats.ui.btlight.setStyleSheet("background-color:#ffff00;")
            udpclient.sendto(("ACK,"+'Temperature:' + str(stats.wendu) + 'degreenHumidity:' + str(stats.shidu) + 'RHnEnvironmental illumination:illumination:' + str(stats.zhaodu) + 'lx').encode(), sendAddress)
        else:
            stats.ui.btlight.setStyleSheet("background-color:#ffffff;")
            udpclient.sendto(("ACK,"+'Temperature:' + str(stats.wendu) + 'degreenHumidity:' + str(stats.shidu) + 'RHnEnvironmental illumination:illumination:' + str(stats.zhaodu) + 'lx').encode(), sendAddress)
        time.sleep(0.1)


# 每隔1min发送1次数据(温度,湿度,照度),格式:str:data
def send():
    while(True):
        time.sleep(60)
        udpclient.sendto(('Temperature:' + str(stats.wendu) + 'degreenHumidity:' + str(stats.shidu) + 'RHnEnvironmental illumination:illumination:' + str(stats.zhaodu) + 'lx').encode(), sendAddress)


# 设置接受数据守护线程
receivethread = threading.Thread(target=receive)
receivethread.setDaemon(True)
receivethread.start()
# 设置发送数据守护线程
sendthread = threading.Thread(target=send)
sendthread.setDaemon(True)
sendthread.start()
# 循环执行
app.exec_()

udp服务端:使用时需更改IP地址为本机IP

from socket import *
from PySide2.QtCore import QFile
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
import threading
import time
sendAddress=[('192.168.1.101', 8080),('192.168.1.101', 8082),('192.168.1.101', 8083)]


# 接收客户端的数据包
def receive():
    while(True):
        receiveData = udpserver.recvfrom(102400)
        time.sleep(0.1)
        if receiveData[0].decode().startswith('ACK'):
            data=receiveData[0].decode().split(',')
            stats.ui.Textshangchuan.append(data[0]+"nIP地址:"+str(receiveData[1][0])+"端口号:"+str(receiveData[1][1])+"nSuccess!")
            stats.ui.Textshangchuan.ensureCursorVisible()
            stats.ui.Textzhongduan.append('IP地址:' + str(receiveData[1][0]))
            stats.ui.Textzhongduan.insertPlainText('端口号:' + str(receiveData[1][1]))
            stats.ui.Textzhongduan.append(data[1])
            stats.ui.Textzhongduan.insertPlainText('n')
            stats.ui.Textzhongduan.ensureCursorVisible()
        else:
            stats.ui.Textzhongduan.append('IP地址:'+str(receiveData[1][0]))
            stats.ui.Textzhongduan.insertPlainText('端口号:'+str(receiveData[1][1]))
            stats.ui.Textzhongduan.append(str(receiveData[0].decode()))
            stats.ui.Textzhongduan.insertPlainText('n')
            stats.ui.Textzhongduan.ensureCursorVisible()


class Server:

    def __init__(self):
        # 从文件中加载UI定义
        qfile_Server = QFile("C:/Users/hp/Desktop/Python/venv/UIServer.ui")
        qfile_Server.open(QFile.ReadOnly)
        qfile_Server.close()
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load(qfile_Server)

        self.ui.btopen.clicked.connect(self.openlight)
        self.ui.btclose.clicked.connect(self.closelight)
        self.ui.btserver.clicked.connect(self.startserver)
        self.ui.btnoserver.clicked.connect(self.stopserver)
    
    # 开灯,发送开灯数据包,格式为:str(1)
    def openlight(self):
        for add in sendAddress:
            udpserver.sendto('1'.encode(), add)
            self.ui.Textxiafa.append('开灯指令已发出.'+'nIP地址:'+add[0]+'端口号:'+str(add[1]))
            self.ui.Textxiafa.ensureCursorVisible()
   
    # 关灯,发送关灯数据包,格式为:str(0)
    def closelight(self):
        for add in sendAddress:
            udpserver.sendto('0'.encode(), add)
            self.ui.Textxiafa.append('关灯指令已发出.'+'nIP地址:'+add[0]+'端口号:'+str(add[1]))
            self.ui.Textxiafa.ensureCursorVisible()
    
    # 开始服务/开机
    def startserver(self):
        self.ui.btopen.setEnabled(True)
        self.ui.btclose.setEnabled(True)
        self.ui.btnoserver.setEnabled(True)
        self.ui.Textzhongduan.setEnabled(True)
        self.ui.Textshangchuan.setEnabled(True)
        self.ui.Textxiafa.setEnabled(True)
        self.ui.btserver.setEnabled(False)
    
    # 停止服务/关机
    def stopserver(self):
        self.ui.Textzhongduan.setText('')
        self.ui.Textshangchuan.setText('')
        self.ui.Textxiafa.setText('')
        self.ui.btserver.setEnabled(True)
        self.ui.btopen.setEnabled(False)
        self.ui.btclose.setEnabled(False)
        self.ui.btnoserver.setEnabled(False)
        self.ui.Textzhongduan.setEnabled(False)
        self.ui.Textshangchuan.setEnabled(False)
        self.ui.Textxiafa.setEnabled(False)


# 实例化窗口程序
app = QApplication([])
stats = Server()
stats.ui.show()
# 定义socket对象
udpserver = socket(AF_INET, SOCK_DGRAM)
udpserver.bind(('192.168.1.101',8081))
print(f'服务端启动成功...')
# 设置接受数据守护线程
receivethread = threading.Thread(target=receive)
receivethread.setDaemon(True)
receivethread.start()
# 循环执行
app.exec_()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/587839.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号