当前位置: 首页 > news >正文

microPython搭建webServer--(一)使用microdot库实现基本页面显示

1. 准备工作

硬件:esp32s3
软件:MicroPython v1.24.1,使用thonny编程。microdot库可以到github或者gitee下载,只需要microdot.py就可以了。

2. 热点

将esp32作为热点,手机连接该热点后访问默认页面

importnetwork# 创建一个WLAN对象,并将其设置为AP模式(接入点模式)ap=network.WLAN(network.AP_IF)ap.active(True)# 配置接入点的参数,包括SSID(网络名称)和密码ap.config(essid='MyESP32AP',password='password123')# 打印接入点的IP地址print('AP IP address:',ap.ifconfig())

先运行一下这段代码,顺利的话,可以显示当前状态。

AP IP address:('192.168.4.1','255.255.255.0','192.168.4.1','0.0.0.0')

3. 第一个网页

将microdot.py传到开发板根目录,运行如下代码:

frommicrodotimportMicrodotimportnetwork# 创建一个WLAN对象,并将其设置为AP模式(接入点模式)ap=network.WLAN(network.AP_IF)ap.active(True)# 配置接入点的参数,包括SSID(网络名称)和密码ap.config(essid='MyESP32AP',password='password123')# 打印接入点的IP地址print('AP IP address:',ap.ifconfig())app=Microdot()html='''<!DOCTYPE html> <html> <head> <title>Microdot GPIO Example</title> <meta charset="UTF-8"> </head> <body > <h1>Microdot Example</h1> </body> </html> '''@app.route('/',methods=['GET','POST'])asyncdefhello(request):returnhtml,200,{'Content-Type':'text/html'}app.run(host='192.168.4.1',debug=True)

thonny中应该显示如下:

AP IP address:('192.168.4.1','255.255.255.0','192.168.4.1','0.0.0.0')Startingasyncserver on192.168.4.1:5000...

此时,用手机连接“MyESP32AP”热点,用浏览器访问http://192.168.4.1:5000,显示出网页。

通过上面的代码可以看到,使用microdot就是简单的四步:
1、定义一个对象app;
2、定义网页内容字符串变量html,如果有简易的js代码,也直接写在html中。
3、定义装饰器,响应浏览器访问web的请求,示例中就是将html字符串发送给浏览器。
4、运行app,停止app使用app.shutdown()

4. 发送文件
运行以下代码,允许浏览器访问webServer下面的所有文件:

importnetwork# 创建一个WLAN对象,并将其设置为AP模式(接入点模式)ap=network.WLAN(network.AP_IF)ap.active(True)# 配置接入点的参数,包括SSID(网络名称)和密码ap.config(essid='MyESP32AP',password='password123')# 打印接入点的IP地址print('AP IP address:',ap.ifconfig())frommicrodotimportMicrodot,send_file app=Microdot()@app.route('/')asyncdefindex(request):returnsend_file('index.html')@app.route('/<path:path>')asyncdefstatic(request,path):returnsend_file(path)app.run(debug=True)

这段代码有两个装饰器,一个是当路由到根目录时,使用send_file送出index.html文件,另一个是访问具体的path时,使用send_file送出任意文件。当然,从服务器的安全性考虑,一个webServer允许访问所有文件显然是不对的,可以增加一个安全策略,比如只send指定目录、指定扩展名的文档。

5. 访问webServer中的所有文件

importos allFiles=[]deflist_files(directory):#遍历出所有文件,存入allFiles数组中try:files=os.listdir(directory)forfileinfiles:path=directory+'/'+fileifos.stat(path)[0]&0x4000:# 判断是否为目录print("Directory: ",path)list_files(path)# 递归遍历子目录else:#print("File: ", path)allFiles.append(path)exceptOSErrorase:print("Error: ",e)# 从根目录开始遍历list_files('/')html='''<!DOCTYPE html> <html> <head> <title>Microdot GPIO Example</title> <meta charset="UTF-8"> </head> <body > '''foriinallFiles:html+='<a href="{}">{}</a><br>'.format(i.replace("//","/"),i)html+=''' </body> </html> '''

先遍历esp32中的所有文件,然后动态添加到html变量中,生成带超链接的网页,发送给浏览器,这样就可以下载esp32中的所有文件。比如做一个gps轨迹记录仪,将每天的log数据存入文档中。通过前面的代码,可以遍历出文档名字,然后点击超链接下载回来。

遍历全部文件的完整代码:

importnetwork# 创建一个WLAN对象,并将其设置为AP模式(接入点模式)ap=network.WLAN(network.AP_IF)ap.active(True)# 配置接入点的参数,包括SSID(网络名称)和密码ap.config(essid='MyESP32AP',password='password123')# 打印接入点的IP地址print('AP IP address:',ap.ifconfig())importos allFiles=[]deflist_files(directory):#遍历出所有文件,存入allFiles数组中try:files=os.listdir(directory)forfileinfiles:path=directory+'/'+fileifos.stat(path)[0]&0x4000:# 判断是否为目录print("Directory: ",path)list_files(path)# 递归遍历子目录else:#print("File: ", path)allFiles.append(path)exceptOSErrorase:print("Error: ",e)# 从根目录开始遍历list_files('/')html='''<!DOCTYPE html> <html> <head> <title>Microdot GPIO Example</title> <meta charset="UTF-8"> </head> <body > '''foriinallFiles:html+='<a href="{}">{}</a><br>'.format(i.replace("//","/"),i)html+=''' </body> </html> '''frommicrodotimportMicrodot,send_file app=Microdot()@app.route('/')asyncdefindex(request):#return send_file('index.html')returnhtml,200,{'Content-Type':'text/html'}@app.route('/<path:path>')asyncdefstatic(request,path):print(path)returnsend_file(path)app.run(debug=True)
http://www.jsqmd.com/news/1256505/

相关文章:

  • 【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注
  • CST电磁仿真:应用场景与核心用途全解析
  • 3分钟上手Cool Request:让Java开发者告别Postman的IDEA插件神器
  • 西安灞桥本地黄金回收实测测评|2026 城东居民出金避坑全攻略,30 年连锁老店全域上门无损验金 - 华金汇黄金回收
  • 7.24小记
  • 数据结构:跳表
  • 终极NVIDIA显卡色彩校准指南:用novideo_srgb解决广色域显示器过饱和问题
  • 提示词语气风格失控?90%的AI应用失败源于这3个隐形陷阱
  • 2026最好用的AI电商生图工具推荐:PixPix一站式解决电商设计难题
  • 2026年实力之选:苏州杭焕自动化设备有限公司——继电器与工业电气元器件一站式供应品牌机构 - 企业推荐官【官方】
  • Oracle Create user
  • LabVIEW部署Web服务
  • 工业大模型实时学习迭代机制:从“物理状态推演”到“端到端智能自动化”的深度技术解析
  • 【系统架构设计师】预测试卷十:综合知识(75道选择题)
  • 大麦网抢票脚本深度解析:从架构设计到性能优化的自动化解决方案
  • 2026 大连管道疏通口碑 TOP5 深度测评|正规疏通公司哪家好?资质_价格_上门速度全对比 - 园子一号
  • Mamba与YOLOv8结合的目标检测优化实践
  • 2026 玉州区黄金变现避坑指南!30 年本土连锁门店全覆盖,无损验金上门零收费,变现足额不亏 - 华金汇黄金回收
  • 上海居民闲置黄金变现避坑指南:区分品牌专柜与连锁回收价差根源 - 日常比对手册
  • “这一次,把力气用在刀刃上”
  • 2026 上海管道疏通口碑 TOP5 深度测评|正规疏通公司哪家好?资质_价格_上门速度全对比 - 园子一号
  • ComfyUI-Easy-Use终极指南:从零开始掌握AI绘画工作流设计
  • 3步配置GitHub Actions定时任务:让股票智能分析系统每天自动为你工作
  • AMD Ryzen处理器深度调试指南:5个核心技巧掌握硬件级性能调优
  • Python语言基础:9_字符串
  • Gemini决策仪表盘实战:用daily_stock_analysis提升你的股票投资决策效率
  • AI驱动的API版本自动化管理实践
  • 北美的留美求职身份规划服务哪家靠谱,STEM延期策略+绿卡路径规划缺一不可 - Matthewmx
  • 【毕设分享】springboot高校实习管理系统37884
  • AI短视频矩阵从0到100万粉丝:9步标准化SOP,含4类算法加权权重公式(2024最新平台内参)