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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:15:36