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

如何通过Python脚本获取Raspberry Pi Pico W Socket中的数据?

问题解答

当然可以通过另一设备的Python脚本获取Pico W上的状态与温度数据,你遇到的BadStatusLine错误,本质是Pico W上的Socket服务返回的HTTP响应不符合标准规范——浏览器对不规范的响应容错性高,但requests库是严格遵循HTTP协议的,所以会报错。

核心问题:修复Pico W的Socket服务响应格式

树莓派基金会的示例代码可能为了简化,省略了部分HTTP标准响应要求,你需要确保服务端返回的响应完全符合HTTP/1.1规范:

  • 响应首行必须是HTTP/1.1 <状态码> <状态描述>格式,比如HTTP/1.1 200 OK
  • 响应头与正文之间必须用**两个连续的换行符(\r\n\r\n)**分隔
  • 必须包含Content-Length头(指定正文长度),或者使用Transfer-Encoding: chunked
  • 如果返回JSON/HTML等结构化内容,要添加对应的Content-Type头

修正后的Pico W服务端代码片段

以下是补全HTTP规范的处理逻辑示例(替换原示例中处理客户端请求的部分):

def handle_client(client):
    # 接收客户端请求
    request_data = client.recv(1024).decode('utf-8')
    
    # 模拟获取LED状态和温度(根据你的实际逻辑调整)
    led_status = True  # 假设当前LED点亮
    temperature = 26.3  # 模拟温度数据
    
    # 构造标准HTTP响应
    response_body = f'{{"led_status": {led_status}, "temperature": {temperature}}}'
    response = (
        'HTTP/1.1 200 OK\r\n'
        'Content-Type: application/json\r\n'
        f'Content-Length: {len(response_body)}\r\n'
        '\r\n'  # 头与正文的分隔空行
        f'{response_body}'
    )
    
    # 发送响应并关闭连接
    client.send(response.encode('utf-8'))
    client.close()

客户端Python脚本示例

修复服务端后,用requests库就能正常请求:

import requests

PICO_W_IP = "192.168.1.100"  # 替换成你的Pico W的IP地址

try:
    # 发送GET请求获取状态数据
    response = requests.get(f"http://{PICO_W_IP}/status")
    response.raise_for_status()  # 捕获HTTP状态码错误
    
    # 解析JSON响应
    data = response.json()
    print(f"LED状态: {'点亮' if data['led_status'] else '熄灭'}")
    print(f"当前温度: {data['temperature']}℃")
except requests.exceptions.RequestException as e:
    print(f"请求失败: {str(e)}")

常见排查点

如果还是报错,检查以下内容:

  • 服务端是否正确处理了请求路径(比如你请求的/status是否对应到了处理逻辑)
  • 响应中的换行符是否用了\r\n(HTTP标准要求的Windows风格换行),而不是单纯的\n
  • 服务端是否在发送完响应后才关闭连接,避免requests收到不完整的数据包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:25:38