import json
import urequests
import network
from time import sleep
from _thread import start_new_thread
try:
import usocket as socket
except:
import socket
import gc
gc.collect()
class Net_Manager:
wlan=network.WLAN(network.STA_IF)
mysocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_key=False#监听标志位
net_name = ''#网络名称
password = ''#密码
json=None#配置信息
connect="finding"#连接状态信息
try_times=0#尝试连接次数
temp=None#网络层温度数据
humidity=None#网络层湿度数据
# 初始化网络并加载init.json配置数据
def __init__(self):
self.wlan.active(True)
self.load_n_p()
self.mysocket.bind(('', 80))
self.mysocket.listen(5)
#加载init.json数据
def load_n_p(self):
self.try_times=0
with open("init.json","r")as f:
self.json=json.loads(f.read())
self.net_name=self.json['name']
self.password=self.json['password']
self.json["led"]=None
print(self.net_name+':'+self.password)
#连接网络函数
def connect_network(self):
self.try_times+=1#连接次数加一
#连接次数超过30次关闭连接,并将网络状态置为'later reset!'阻止继续尝试,将监听标志位置为false
if self.try_times>30:
self.wlan.disconnect()
self.connect='later reset!'
self.listen_key=False
return
if self.connect=='No find!':#如果未找到网络表明网络连接线程正在运行没必要再次启动该线程,阻止其再次启动
return
try:
#扫描并启动连接
ssid_all=self.wlan.scan()
for ssid in ssid_all:
if self.net_name==str(bytes.decode(ssid[0])):
self.connect='find!'
if self.password=='':
self.wlan.connect(self.net_name)
else:
self.wlan.connect(self.net_name,self.password)
sleep(3)
time=15
while not self.wlan.isconnected() and time>0:
sleep(1)
time-=1
return
self.connect='No find!'
except BaseException as e:
self.connect='No find!'
self.listen_key=False
#监听请求
def listen_socket(self):
while self.listen_key:
while True:
try:
conn, addr = self.mysocket.accept()
request = conn.recv(1024)
request = str(request)
conn.send('HTTP/1.1 200 OK\n')
data=''
#响应温湿度请求
if '/get_th' in request:
conn.send('Content-Type: text/json\n')
conn.send('Connection: close\n\n')
data={"temperature":str(self.temp),"humidity":str(self.humidity)}
conn.sendall('\r\n\r\n'+json.dumps(data))
#接收处理设置信息请求
elif '/update' in request:
data=request.split("/update?")[1]
data=data.split(" HTTP/1.1")[0]
data=data.split('&')
data_dict={"led":[]}
for i in data:
if i.split('=')[0]=='led':
data_dict['led'].append(i.split('=')[1])
else:
if i.split('=')[1]!='':
data_dict[i.split('=')[0]]=int(i.split('=')[1])
else:
data_dict[i.split('=')[0]]='none'
if isinstance(data_dict["h_max"],int):
self.json["humidityMax"]=data_dict["h_max"]
if isinstance(data_dict["h_min"],int):
self.json["humidityMin"]=data_dict["h_min"]
if isinstance(data_dict["t_max"],int):
self.json["temperatureMax"]=data_dict["t_max"]
if isinstance(data_dict["t_min"],int):
self.json["temperatureMin"]=data_dict["t_min"]
# 保存json配置数据
self.save_init()
led=0
if data_dict["led"]!=[]:
for i in data_dict["led"]:
led+=pow(2,7-int(i))
self.json["led"]=led
else:
#返回html控制界面文件
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
with open('control_platform.html','r')as f:
for line in f:
data=line
conn.sendall('\r\n\r\n'+data)
conn.sendall('\r\n\r\n'+data)
conn.close()
except BaseException as e:
break
self.json['led']=None
#循环上传数据
def updateToServer(self):
while self.listen_key:
# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 目标服务器的IP地址和端口
server_ip = self.json["IP"]
server_port = 45678
while True:
# 要发送的 JSON 数据
data = {"temperature": self.temp, "humidity": self.humidity}
if not isinstance(data["temperature"],int) or not isinstance(data["humidity"],int):
sleep(2)
continue
json_data = json.dumps(data) # 将 JSON 对象转换为字符串
try:
# 发送UDP消息
udp_socket.sendto(json_data.encode(), (server_ip, server_port))
print("JSON数据已发送")
except Exception as e:
print("发送UDP消息时发生错误:", e)
break
sleep(2)
#保存配置
def save_init(self,name=True,psw=True):
if name!=True:
self.json['name']=name
if psw!=True:
self.json['password']=psw
with open("init.json",'w')as f:
f.write(json.dumps(self.json))
self.load_n_p()
if name!=True or psw!=True:
self.connect='fonding'
self.listen_key=False
self.wlan.disconnect()
self.connect_network()
#返回状态并启动监听和数据上传
def get_connect(self):
if self.wlan.isconnected():
self.connect=self.wlan.ifconfig()[0]
if not self.listen_key:
self.listen_key=True
start_new_thread(self.listen_socket,())
start_new_thread(self.updateToServer,())
else:
self.listen_key=False
return self.connect
#返回扫描到的WiFi
def get_around_wifi(self):
ssid_all=self.wlan.scan()
return list(str(bytes.decode(ssid[0])) for ssid in ssid_all)
#返回是否连接到网络
def get_isconnect(self):
return self.wlan.isconnected()
# 获取配置中的wifi名称和密码
def get_name_psw(self):
return self.net_name, self.password
#获取配置信息
def get_json(self):
return self.json
# 设置网络层的温湿度数据
def set_th(self,t,h):
self.temp=t
self.humidity=h
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明,项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【建议小白】: 在所有嵌入式开发中硬件部分若不会画PCB/电路,可选择根据引脚定义将其代替为面包板+杜邦线+外设模块的方式,只需轻松简单连线,下载源码烧录进去便可轻松复刻出一样的项目 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能
资源推荐
资源详情
资源评论
收起资源包目录
基于esp32开发的温湿度记录检测项目.zip(毕设/课设/竞赛/实训/项目开发) (970个子文件)
index.css 230KB
index.css 230KB
cascader.css 29KB
cascader.css 29KB
date-picker.css 28KB
date-picker.css 28KB
transfer.css 27KB
transfer.css 27KB
col.css 25KB
col.css 25KB
pagination.css 23KB
pagination.css 23KB
table.css 22KB
table.css 22KB
message-box.css 21KB
message-box.css 21KB
time-picker.css 21KB
time-picker.css 21KB
select.css 18KB
select.css 18KB
slider.css 18KB
slider.css 18KB
tabs.css 16KB
tabs.css 16KB
base.css 16KB
base.css 16KB
dropdown.css 15KB
dropdown.css 15KB
time-select.css 13KB
time-select.css 13KB
table-column.css 13KB
table-column.css 13KB
cascader-panel.css 13KB
cascader-panel.css 13KB
tree.css 13KB
tree.css 13KB
upload.css 12KB
upload.css 12KB
icon.css 12KB
icon.css 12KB
calendar.css 12KB
calendar.css 12KB
autocomplete.css 10KB
autocomplete.css 10KB
button.css 10KB
button.css 10KB
input-number.css 10KB
input-number.css 10KB
menu.css 9KB
menu.css 9KB
color-picker.css 7KB
color-picker.css 7KB
checkbox.css 7KB
checkbox.css 7KB
input.css 7KB
input.css 7KB
step.css 5KB
step.css 5KB
collapse.css 5KB
collapse.css 5KB
drawer.css 5KB
drawer.css 5KB
tag.css 5KB
tag.css 5KB
image.css 3KB
image.css 3KB
radio.css 3KB
radio.css 3KB
form.css 3KB
form.css 3KB
dialog.css 3KB
dialog.css 3KB
select-dropdown.css 3KB
select-dropdown.css 3KB
tooltip.css 3KB
tooltip.css 3KB
carousel.css 2KB
carousel.css 2KB
radio-button.css 2KB
radio-button.css 2KB
progress.css 2KB
progress.css 2KB
popover.css 2KB
popover.css 2KB
link.css 2KB
link.css 2KB
message.css 2KB
message.css 2KB
alert.css 2KB
alert.css 2KB
switch.css 2KB
switch.css 2KB
notification.css 2KB
notification.css 2KB
loading.css 2KB
loading.css 2KB
skeleton.css 2KB
skeleton.css 2KB
popper.css 2KB
popper.css 2KB
共 970 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
阿齐Archie
- 粉丝: 1w+
- 资源: 2303
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 树莓派连接 DS18B20 温度传感器读取温度时监控客户端,服务器端连接状况,实现断线重连机制
- jQuery 3.7.1
- 校园失物招领小程序源码可作毕业设计
- SAP客户端GUI740安装包(JAVA版本)
- winlibs-x86-64-posix-seh-gcc-13.2.0-llvm-16.0.6-mingw-w64msvcrt
- HTML5小游戏【愤怒的小红帽-优秀H5小游戏合集射击游戏-过关游戏】游戏源码分享下载 - fndxhm.zip
- 医学影像处理-图像分割-肿瘤识别-诊断辅助-matlab图像分割肿瘤代码-DeepBTSeg.zip
- 抖音取图表情包小程序源码+创作者入驻+流量主
- 数字电子-JK触发器-可逆计数器-教学模拟-同步六进制加减法可逆计数器(JK).ms7.zip
- 小程序项目源码之熊猫签证.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功