You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时间同步逻辑:

  1. 导入network和ntptime模块
  2. 完成WiFi连接
  3. 同步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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:30:09