Microdot搭建Pico W Web服务器:获取客户端IP及修复时钟异常求助
问题解决:Raspberry Pi Pico W Microdot Web服务器的客户端IP获取与时间同步问题
一、获取访问客户端IP
问题原因
手动调用socket.accept()会触发端口冲突,因为Microdot的app.run()已经占用80端口监听HTTP连接,重复绑定同一端口必然报错。
解决方法
Microdot的请求对象(req)自带客户端连接信息,直接通过req.client_addr即可获取客户端IP,无需额外创建socket。
修改index函数,添加客户端IP获取逻辑:
@app.route("/",methods=['GET']) def index(req): # 原有温度计算代码不变 val= machine.ADC(4) steps = val.read_u16() coeff_conv= 3.3/(65535) vin= steps*coeff_conv farenheit= vin*100 # 获取客户端IP client_ip = req.client_addr[0] # 提取IP地址部分 # 原有时间、变量赋值代码不变 titolo= "ESAME FINALE LIVELLO 1" tempo = time.localtime() ora= ':'.join([str(tempo[3]),str(tempo[4]),str(tempo[5])]) #time data= '-'.join([str(tempo[2]),str(tempo[1]),str(tempo[0])]) #date sistema = 'RASPBERRY PI PICO W' temp = str(round(temperatura_lib.C_F(farenheit),0)) + '^C' # 将client_ip传入模板 return render_template('finale.html',titolo=titolo,sistema=sistema, ora=ora, data=data, temp=temp, client_ip=client_ip)
同时在finale.html模板中添加显示字段:
<p>客户端IP: {{ client_ip }}</p>
二、市电供电时时间同步问题
问题原因
Raspberry Pi Pico W无内置实时时钟(RTC),连接电脑时通过USB从主机同步时间;单独接市电时,系统时间会从默认值(00:00)开始,需通过WiFi连接NTP服务器校准时间。
解决方法
在启动Web服务器前添加WiFi连接和NTP时间同步逻辑:
- 导入
network和ntptime模块 - 完成WiFi连接
- 同步NTP时间并调整时区(以东八区为例)
修改启动部分代码:
if __name__ == "__main__": boot # WiFi连接配置 import network import ntptime wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("你的WiFi名称", "你的WiFi密码") # 等待WiFi连接 while not wlan.isconnected(): time.sleep(1) # 同步NTP时间 ntptime.settime() # 调整时区为东八区(UTC+8) time.localtime(time.time() + 8*3600) app.run(host='0.0.0.0', port=80, debug = True)
注意事项
- 替换代码中的WiFi名称和密码为实际网络信息
- 若时区非东八区,调整
8*3600为对应时区偏移秒数(如UTC+1为1*3600)
完整修改后代码
from microdot import Microdot, Response, Request from microdot_utemplate import render_template import time import temperatura_lib import machine import socket import boot_oled_debug as boot app = Microdot() Response.default_content_type = 'text/html' @app.route("/",methods=['GET']) def index(req): # 计算Pico温度 val= machine.ADC(4) steps = val.read_u16() coeff_conv= 3.3/(65535) vin= steps*coeff_conv farenheit= vin*100 # 获取客户端IP client_ip = req.client_addr[0] # 模板变量赋值 titolo= "ESAME FINALE LIVELLO 1" tempo = time.localtime() ora= ':'.join([str(tempo[3]),str(tempo[4]),str(tempo[5])]) #time data= '-'.join([str(tempo[2]),str(tempo[1]),str(tempo[0])]) #date sistema = 'RASPBERRY PI PICO W' temp = str(round(temperatura_lib.C_F(farenheit),0)) + '^C' return render_template('finale.html',titolo=titolo,sistema=sistema, ora=ora, data=data, temp=temp, client_ip=client_ip) if __name__ == "__main__": boot # WiFi连接与NTP时间同步 import network import ntptime wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("你的WiFi名称", "你的WiFi密码") while not wlan.isconnected(): time.sleep(1) ntptime.settime() # 时区调整:UTC+8 time.localtime(time.time() + 8*3600) app.run(host='0.0.0.0', port=80, debug = True)
内容的提问来源于stack exchange,提问作者CiccioImberlicchio
相关产品推荐
相关产品推荐

