如何通过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
相关产品推荐
相关产品推荐

