Arduino Uno搭配W5500以太网盾的WebSocket Server开发咨询
问题根因
你当前的编译报错直接原因是WebSockets_Generic v2.x版本不支持AVR架构的Arduino Uno,错误提示已明确要求切换到1.x.x的ATmega分支版本。同时你引用的Ethernet2.h已经是过时库,目前官方Ethernet库v2.0及以上版本已原生支持W5500以太网盾,不需要额外用Ethernet2库,报错里的多库提示无需处理,优先用官方Ethernet库即可。
适配方案
有两种可用的方案满足你的需求,任选其一即可:
- 方案1:将
WebSockets_Generic库降级到v1.x.x的ATmega分支版本,原有代码仅需少量调整就能正常运行 - 方案2:换用更轻量、原生支持AVR架构的
WebSockets库,资源占用更低,接口和你现有代码几乎完全兼容
完整可用示例代码
Arduino端代码(适配Uno + W5500)
#include <Ethernet.h> // 如果用降级后的WebSockets_Generic v1.x就保留这行,换用轻量WebSockets库就改成#include <WebSocketsServer.h> #include <WebSockets_Generic.h> WebSocketsServer webSocket = WebSocketsServer(81); // 注意不要和局域网内其他设备MAC冲突 byte mac[] ={0xA8, 0x61, 0x0A, 0xAE, 0x69, 0x13}; // 建议修改为你局域网段内的空闲IP,原代码的198.162大概率是笔误 IPAddress ip(192, 168, 1, 177); void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { switch (type) { case WStype_DISCONNECTED: Serial.printf("[%u] 客户端断开\n", num); break; case WStype_CONNECTED: Serial.printf("[%u] 新客户端连接\n", num); webSocket.sendTXT(num, "Connected"); break; case WStype_TEXT: Serial.printf("[%u] 收到文本: %s\n", num, payload); // 你需要的发送ASCII值直接调用sendTXT传入对应字符串即可 webSocket.sendTXT(num, "收到消息"); break; case WStype_BIN: Serial.printf("[%u] 收到二进制数据,长度: %u\n", num, length); break; default: break; } } void setup() { Serial.begin(115200); while (!Serial); // W5500默认CS引脚为10,硬件有改动可调整这里 Ethernet.init(10); Ethernet.begin(mac, ip); Serial.print("WebSocket服务器IP: "); Serial.println(Ethernet.localIP()); webSocket.begin(); webSocket.onEvent(webSocketEvent); } void loop() { webSocket.loop(); // 你的业务逻辑,比如定时采集数据发送ASCII值可以写在这里 }
Python客户端测试代码
import websocket def on_message(ws, message): print("收到Arduino返回:", message) def on_error(ws, error): print("连接错误:", error) def on_close(ws, close_status_code, close_msg): print("连接断开") def on_open(ws): print("连接已建立,发送测试消息") ws.send("Hello from Python") if __name__ == "__main__": # IP和端口要和Arduino代码里的设置保持一致 ws = websocket.WebSocketApp("ws://192.168.1.177:81", on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close) ws.run_forever()
注意事项
- 调试前先单独测试以太网连通性,确认Arduino可以被你的电脑ping通后再调试WebSocket功能
- Arduino Uno RAM只有2KB,建议最多同时保持2~3个WebSocket连接,单次发送的ASCII字符串不要过长,避免内存溢出
- 如果使用静态IP,要确保IP和你电脑在同一个局域网段内,网关、子网掩码配置正确
内容的提问来源于stack exchange,提问作者tjsmert44
相关产品推荐
相关产品推荐

