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

Raspberry Pi Pico W无法连网且wlan.scan()返回空列表求助

Raspberry Pi Pico W 连接问题解决方案

一、wlan.scan()返回空列表的原因及解决办法

原因分析

  • 频段不支持:Raspberry Pi Pico W的无线模块仅支持2.4GHz WiFi,不兼容5GHz频段。如果目标WiFi是5GHz,扫描结果必然为空。
  • 信号强度不足:Pico W的无线接收能力有限,若WiFi信号过弱,模块无法检测到网络。
  • 模块未完全激活:调用wlan.active(True)后,模块需要短暂时间完成初始化,立即扫描可能返回空结果。

解决步骤

  1. 确认WiFi频段:检查目标WiFi是否为2.4GHz频段(双频路由器可分开设置2.4G/5G SSID,选择2.4G的SSID)。
  2. 增加激活延时:在wlan.active(True)后添加延时,确保模块初始化完成:
    wlan.active(True)
    time.sleep(0.5)  # 增加0.5秒延时
    networks = wlan.scan()
    
  3. 靠近路由器测试:将Pico W移至WiFi路由器附近,排除信号弱的问题。

二、需要网页验证的WiFi(门户WiFi)连接问题

问题本质

Pico W默认的wlan.connect()仅支持WPA/WPA2加密的常规WiFi,无法自动完成网页认证(Captive Portal)流程。这类WiFi连接后仅获得局域网IP,需通过HTTP请求提交认证信息才能访问公网。

解决流程

  1. 连接WiFi:先完成基础WiFi连接(即使未认证,wlan.status()也会显示连接成功)。
  2. 抓取认证参数:用抓包工具(如Wireshark)或浏览器开发者工具,获取认证页面的请求URL、表单参数(如账号、密码字段名)。
  3. 编写认证代码:通过socket发送HTTP请求完成认证,示例代码如下:
import network
import socket
import time

# 1. 连接目标WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("你的WiFi SSID", "WiFi密码(无则为空)")

max_wait = 10
while max_wait > 0:
    if wlan.status() >= 3:
        break
    max_wait -= 1
    time.sleep(1)

if wlan.status() != 3:
    raise RuntimeError("WiFi连接失败")
print("WiFi已连接,IP地址:", wlan.ifconfig()[0])

# 2. 执行门户认证(需根据实际认证页面修改参数)
def auth_captive_portal():
    auth_host = "认证服务器域名或IP"  # 从抓包结果获取
    auth_path = "/auth"  # 认证接口路径,从抓包结果获取
    username = "你的认证账号"
    password = "你的认证密码"

    # 构造POST请求(若为GET请求则调整格式)
    post_data = f"username={username}&password={password}"
    request = (
        f"POST {auth_path} HTTP/1.1\r\n"
        f"Host: {auth_host}\r\n"
        "Content-Type: application/x-www-form-urlencoded\r\n"
        f"Content-Length: {len(post_data)}\r\n"
        "\r\n"
        f"{post_data}"
    )

    try:
        addr = socket.getaddrinfo(auth_host, 80)[0][-1]
        s = socket.socket()
        s.connect(addr)
        s.send(request.encode())
        response = s.recv(2048).decode()
        print("认证响应:", response[:200])  # 打印部分响应内容

        if "success" in response.lower():
            print("认证成功")
        else:
            print("认证失败,请检查参数")
    except OSError as e:
        print("认证出错:", str(e))
    finally:
        s.close()

# 3. 执行认证并测试网络
auth_captive_portal()

def test_network():
    try:
        addr = socket.getaddrinfo("8.8.8.8", 80)[0][-1]
        s = socket.socket()
        s.connect(addr)
        s.send(b"GET / HTTP/1.1\r\nHost: 8.8.8.8\r\n\r\n")
        response = s.recv(1024)
        print("网络连通性测试成功")
        s.close()
    except OSError:
        print("网络仍未连通,请检查认证流程")

test_network()

注意事项

  • 不同门户的认证逻辑差异较大,部分需要先访问触发页面获取Cookie,再提交认证信息,需根据实际抓包结果调整代码。
  • 部分公共WiFi可能限制设备数量或绑定MAC地址,需提前确认相关规则。

内容的提问来源于stack exchange,提问作者Drago627

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:44:57