树莓派Pico W的MicroPython客户端无法连接本地Socket.io服务器
树莓派Pico W无法连接Node.js Socket.io服务器的解决方案
我搭建了Node.js Socket.io服务器,React客户端可正常传输数据,但树莓派Pico W上的MicroPython客户端无法建立Socket连接,报错OSError: [Errno 103] ECONNABORTED。以下是问题分析和解决步骤:
服务器代码
const express = require("express") const app = express(); const http = require("http"); const { Server } = require("socket.io"); const cors = require("cors") const server = http.createServer(app) const io = new Server(server, { cors: { origin: "*", } }) io.on("connection", (socket) => { console.log('User Connected: ${socket.id}'); }) app.get('/', function(req, res, next) { res.send("Hello world"); }); server.listen(80, () => { console.log("Server is running") })
MicroPython客户端代码(原错误版本)
import time import socket import network ssid = '<name>' password = '<password>' # Just making our internet connection wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(ssid, password) # Wait for connect or fail max_wait = 10 while max_wait > 0: if wlan.status() < 0 or wlan.status() >= 3: break max_wait -= 1 print('waiting for connection...') time.sleep(1) # Handle connection error if wlan.status() != 3: raise RuntimeError('network connection failed') else: print('connected') status = wlan.ifconfig() print(wlan.ifconfig()) c = socket.socket() c.connect(('http://127.0.0.1/',80)) print('Connected')
报错信息
Traceback (most recent call last): File "<stdin>", line 32, in <module> OSError: [Errno 103] ECONNABORTED
解决步骤
1. 修正连接地址格式
- MicroPython的
socket.connect()不支持http://前缀,且地址末尾不能带斜杠。 - 关键错误:
127.0.0.1是本地回环地址,Pico W作为独立设备无法通过该地址访问服务器,必须替换为服务器在局域网内的真实IP(如192.168.1.100)。
修正后的连接代码:
c.connect(('192.168.x.x', 80)) # 替换为你的服务器局域网IP
2. 适配Socket.io协议(核心问题)
Socket.io基于WebSocket协议,不是原生TCP Socket,直接使用MicroPython内置socket模块无法建立连接。需使用专门的Socket.io客户端库:
- 安装
micropython-socketio库(通过Thonny或命令行):pip install micropython-socketio - 适配后的客户端代码:
import time import network from socketio import Client ssid = '<name>' password = '<password>' # 连接WiFi wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(ssid, password) max_wait = 10 while max_wait > 0: if wlan.status() < 0 or wlan.status() >= 3: break max_wait -= 1 print('waiting for connection...') time.sleep(1) if wlan.status() != 3: raise RuntimeError('network connection failed') else: print('WiFi connected') # 初始化Socket.io客户端 sio = Client() @sio.event def connect(): print("Connected to Socket.io server") @sio.event def disconnect(): print("Disconnected from server") # 连接服务器(替换为你的服务器IP) sio.connect('http://192.168.x.x:80') # 保持连接并处理事件 while True: sio.sleep(1) # 可在此添加发送数据逻辑,例如: # sio.emit('sensor_data', {'value': 123})
3. 优化服务器CORS配置(可选)
虽然当前配置允许所有源,但明确配置可避免潜在问题:
const io = new Server(server, { cors: { origin: "*", methods: ["GET", "POST"], credentials: true } })
4. 验证网络连通性
先确认Pico W能访问服务器:
import socket server_ip = '192.168.x.x' # 服务器IP try: addr = socket.getaddrinfo(server_ip, 80)[0][-1] s = socket.socket() s.connect(addr) s.send(b'GET / HTTP/1.1\r\nHost: %s\r\n\r\n' % server_ip.encode()) print("Server response:", s.recv(1024)) s.close() except OSError as e: print(f"Network error: {e}")
内容的提问来源于stack exchange,提问作者shilleh
相关产品推荐
相关产品推荐

