第 12 篇:W55RP20-EVB-Pico CircuitPython实战:MQTT 协议基础通信验证
本文为 WIZnet W55RP20 芯片 CircuitPython 教程第 12篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。
版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处
前言
上一篇实战教程,我们完成了W55RP20芯片HTTP 协议与 OneNET 平台数据上云。本篇内容我们聚焦轻量级物联网场景,实现W55RP20通过MQTT协议与MQTTX服务器对接,完成消息双向收发(订阅接收+发布反馈),掌握MQTTX服务器配置、MQTT连接配置、回调函数编写等核心技能,适配快速原型开发、本地调试、数据交互等各类轻量级物联网场景。
W55RP20集成硬件 TCP/IP 协议栈,搭配CircuitPython专属MQTT客户端(adafruit_minimqtt),通过CircuitPython编程即可实现与MQTTX服务器的稳定通信,无需关心底层Socket细节,依托WIZnet官方驱动库和MQTTX服务器规范,大幅降低嵌入式设备本地联网开发门槛,适用于环境监测、数据采集、原型验证、本地物联网调试等各类轻量级场景。
学完本文,你将掌握:
-
W55RP20在CircuitPython环境下的引脚配置(CS、RST、SPI引脚);
-
MQTTX服务器的安装、配置与启动方法,获取MQTT连接核心参数;
-
CircuitPython环境下adafruit_wiznet5k驱动库、adafruit_minimqtt库的安装与配置;
-
W55RP20以太网初始化(DHCP自动获取IP)、MQTT客户端初始化与连接;
-
MQTT回调函数(连接、断开、接收消息)的编写与调试;
-
消息双向收发逻辑实现,掌握“收到什么、发布什么”的回声功能;
-
串口调试与MQTTX客户端调试方法,快速定位连接失败、消息收发异常等问题。
传统MQTTX本地服务器IoT开发的3大痛点,W55RP20一键解决:
-
痛点1:底层网络编程复杂,新手难以上手——W55RP20集成硬件TCP/IP协议栈,CircuitPython驱动库已封装所有底层操作,无需编写Socket代码,一行代码即可完成以太网初始化;
-
痛点2:驱动库适配性差,频繁出现连接失败——使用WIZnet官方适配的adafruit_wiznet5k库,完美兼容W55RP20和CircuitPython环境,稳定性拉满,无需手动移植适配;
-
痛点3:调试繁琐,消息收发异常难以定位——代码自带详细打印日志,结合串口调试和MQTTX客户端,可一键排查连接、订阅、发布全流程问题,新手也能快速定位故障。
本节课核心目标:
1. 完成CircuitPython开发环境搭建,安装W55RP20所需依赖库(adafruit_wiznet5k、adafruit_minimqtt);
2. 掌握W55RP20的引脚配置(CS、RST、SPI),完成以太网初始化与IP获取;
3. 实现与MQTTX服务器的连接、自动重连,掌握MQTT连接参数配置方法;
4. 编写MQTT回调函数,实现消息订阅接收,并完成“收到什么、发布什么”的回声功能;
5. 掌握串口调试与MQTTX客户端使用方法,排查各类常见问题,确保消息双向收发稳定。
系列教程学习路径
本专栏共 16 篇,循序渐进覆盖 W55RP20-EVB-Pico 模块 CircuitPython开发全流程:
-
第 1 篇:静态 IP 配置与网络基础
-
第 2 篇:DHCP 自动联网与网络诊断
-
第 3 篇:TCP Client 客户端通信
-
第 4 篇:TCP Server 服务端通信
-
第 5 篇:UDP 单播数据通信
-
第 6 篇:UDP 组播/广播数据通信
-
第 7 篇:DNS 域名解析
-
第 8 篇:NTP 从网络获取时间
-
第 9 篇:HTTP Client 客户端请求
-
第 10 篇:HTTP Server 服务端搭建
-
第 11 篇:HTTP 协议与 OneNET 平台数据上云
-
第 12 篇:MQTT 协议基础通信验证(本文)
-
第 13 篇:MQTT 协议与阿里云平台对接
-
第 14 篇:MQTT 协议与 OneNET 平台对接
-
第 15 篇:MQTT 协议与 ThingSpeak 平台对接
-
第 16 篇:Modbus 工业协议通信
建议收藏本专栏,跟随教程逐步学习,所有代码均会同步更新至官方 Gitee 仓库
目录
1、准备工作
1.1 软件准备
所需软件均为免费版本,按要求下载安装即可,无需额外付费,适配CircuitPython开发需求,新增MQTTX服务器及调试相关工具。
|
软件名称 |
版本要求 |
下载地址 |
说明 |
|---|---|---|---|
|
Thonny |
4.0 及以上 |
轻量级 MicroPython IDE,支持代码编辑、烧录与串口调试,新手友好 |
|
|
W55RP20-EVB-Pico 模块 CircuitPython 固件 |
最新稳定版 |
专为 W55RP20-EVB-Pico 模块 编写,已集成 WIZnet 硬件驱动与协议栈 |
1.2 硬件准备
所需硬件均为W55RP20开发常用配件,无需复杂器件,新手可直接采购套装,具体清单如下:
-
W55RP20-EVB-Pico 开发板 1块(核心器件,集成W5500芯片和RP2040主控);
-
Micro USB 数据线 1根(用于供电、固件烧录和串口调试);
-
网线 1根(用于连接开发板与路由器,实现以太网通信);
-
电脑 1台(用于代码编写、固件烧录、串口调试和MQTTX服务器部署);
-
路由器 1台(用于开发板与电脑、MQTTX服务器的局域网通信,确保设备在同一网段)。
1.3 MQTTX服务器准备(关键步骤)
在进行代码开发前,需先在电脑上完成MQTTX服务器的安装、启动和配置,获取MQTT连接所需的核心参数(服务器IP、端口、主题),步骤如下:
-
下载并安装MQTTX服务器,打开软件后,点击“新建连接”,选择“服务器”模式,设置服务器名称(自定义,如W55RP20_MQTTX);
-
配置服务器参数:协议选择“MQTT”,端口默认1883(无需修改,MQTT默认端口),服务器IP为电脑本机IP(可通过cmd输入ipconfig获取,如192.168.1.100);
-
无需设置用户名和密码(简化调试,新手可关闭身份验证),点击“连接”,确认MQTTX服务器启动成功;
-
创建两个主题(用于消息收发):订阅主题(SUB_TOPIC,如w5500RP20/sub)、发布主题(PUB_TOPIC,如w5500RP20/pub),记录主题名称,后续用于代码配置;
-
启动MQTTX客户端,新建客户端连接,参数与服务器一致,订阅上述SUB_TOPIC,用于接收开发板发送的消息,同时可向开发板发送消息,测试双向通信。
2、W55RP20 CircuitPython开发环境搭建
2.1 驱动库与依赖库配置
-
下载W55RP20官方CircuitPython驱动库、adafruit_wiznet5k库和adafruit_minimqtt库,解压后得到核心文件;
-
打开Thonny(推荐),新建项目,将W55RP20驱动库中的核心文件、adafruit_wiznet5k库(.h、.py文件)和adafruit_minimqtt库(.h、.py文件)放入项目根目录;
-
配置Thonny开发环境,选择“解释器”,设置为“CircuitPython”,选择对应的W55RP20开发板(如WIZnet W55RP20-EVB-Pico),确保开发板能被正常识别;
-
验证库配置:在项目中导入adafruit_wiznet5k和adafruit_minimqtt库,无报错即配置成功,可正常调用相关函数。
2.2 固件烧录
W55RP20-EVB-Pico 模块完全兼容树莓派 Pico 的 UF2 固件烧录方式,操作简单无需额外烧录器,新手可快速上手:
-
下载W55RP20 CircuitPython专属UF2固件(从WIZnet官方下载,对应开发板型号);
-
将W55RP20开发板通过Micro USB数据线连接电脑,长按开发板上的BOOT键,同时重启开发板,此时电脑会识别出一个名为“RPI-RP2”的U盘;
-
将下载好的UF2固件拖拽到“RPI-RP2”U盘中,固件会自动烧录,烧录完成后开发板会自动重启,此时固件烧录成功;
-
打开Thonny,选择对应的解释器和串口,若能正常识别开发板,即可开始代码编写和烧录。
3、硬件连接与串口配置
3.1 硬件连接
W55RP20-EVB-Pico 模块连接分为两步,分别实现供电/调试和以太网连接,操作简单,无需复杂接线:
3.1.1 基础连接(供电+调试)
使用 Micro USB 数据线连接 RP2040 开发板与电脑,用于开发板供电、固件烧录和串口调试。
3.1.2 以太网连接
使用网线连接 W55RP20-EVB-Pico 模块的以太网接口与路由器的 LAN 口(或直接连接电脑网口,需手动配置电脑 IP 与开发板同网段)。
3.1.3 模块与开发板接线(分离式模块适用)
若使用分离式模块与开发板,需按以下引脚对应连接(SPI 通信):

3.2 串口调试配置
打开串口调试助手,按以下参数配置,用于查看开发板运行日志和调试信息:
-
波特率:115200
-
数据位:8
-
停止位:1
-
校验位:无
-
流控:无
-
选择开发板对应的串口(通常显示为 COMx),点击打开串口。
4、MQTTX MQTT协议规范解析
MQTTX服务器采用MQTT 5.0协议(与代码中adafruit_minimqtt库默认配置一致),基于发布/订阅模式实现设备与服务器的双向通信,与公共MQTT服务器相比,核心优势在于本地部署、延迟低、调试便捷,无上传间隔限制,适配本地物联网调试场景。
4.1 核心连接规范
-
协议版本:MQTT 5.0(adafruit_minimqtt库默认支持,无需手动配置);
-
连接端口:默认1883(无加密端口,适合本地调试,无需额外配置SSL);
-
服务器IP:电脑本机IP(局域网IP,如192.168.1.100,需与开发板在同一网段);
-
身份验证:可关闭(简化调试),也可手动设置用户名和密码(代码中需对应配置);
-
保活机制:代码中通过mqtt_client.loop()实现心跳保活,确保连接稳定,无需手动维护。
4.2 数据格式规范
MQTTX服务器对消息数据格式无严格限制,支持字符串、键值对、JSON等多种格式,本实战采用字符串格式,实现“收到什么、发布什么”的回声功能,示例如下:
接收消息:"hello W55RP20" → 发布消息:"hello W55RP20"
说明:代码中通过message回调函数接收订阅主题的消息,直接将消息原样发布到发布主题,无需复杂数据封装,适配快速调试需求。
4.3 标准主题格式
MQTTX MQTT通信的主题可自定义,无需遵循固定格式,只需确保开发板订阅的主题(SUB_TOPIC)与MQTTX客户端发布的主题一致,开发板发布的主题(PUB_TOPIC)与MQTTX客户端订阅的主题一致,示例如下:
-
订阅主题(SUB_TOPIC):w5500RP20/sub(开发板订阅此主题,接收MQTTX客户端发送的消息);
-
发布主题(PUB_TOPIC):w5500RP20/pub(开发板发布消息到该主题,MQTTX客户端订阅此主题接收消息)。
代码中已封装好主题格式,只需替换为自己在MQTTX服务器中创建的主题名称,无需手动拼接,注意主题中无多余符号,自定义即可。
4.4 极简工作流程
-
开发板初始化:完成W55RP20硬件初始化、SPI配置、以太网初始化,获取局域网IP;
-
MQTT连接:通过adafruit_minimqtt库初始化MQTT客户端,配置服务器IP、端口、主题,与MQTTX服务器建立连接;
-
消息接收:开发板订阅指定主题,当MQTTX客户端发送消息到该主题时,通过回调函数接收消息并打印;
-
消息发布:开发板将接收的消息原样发布到指定主题,MQTTX客户端订阅该主题,接收开发板反馈的消息,完成双向通信。
5、核心CircuitPython代码复制与烧录
5.1 依赖库说明
核心依赖3类库,无需额外添加MQTTX专用库,代码中已集成连接配置、回调函数和异常处理逻辑,直接关联到项目中即可使用:
-
基础库(time、board、bitbangio、digitalio):CircuitPython自带,用于时间控制、引脚配置、SPI通信;
-
adafruit_wiznet5k库:用于实现W55RP20硬件初始化、以太网连接、IP获取等功能;
-
adafruit_minimqtt库:用于实现MQTT客户端的初始化、连接、订阅、发布、回调等功能,适配MQTT 5.0协议。
5.2 完整CircuitPython代码(主程序)
将以下代码复制到Thonny项目的主文件(如code.py)中,重点替换MQTTX服务器IP和主题名称,烧录到开发板后即可运行,代码注释清晰,关键配置部分已标注,可直接修改。
import time
import board
import bitbangio
import digitalio
from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
from adafruit_wiznet5k.adafruit_wiznet5k_socketpool import SocketPool
import adafruit_minimqtt.adafruit_minimqtt as MQTT
print("===================================")
print(" W5500RP20 MQTT SUB/PUB Demo")
print("===================================")
# ------------------------------------------------
# W5500 Pins
# ------------------------------------------------
cs = digitalio.DigitalInOut(board.GP20)
rst = digitalio.DigitalInOut(board.GP25)
rst.direction = digitalio.Direction.OUTPUT
print("Reset W5500RP20...")
rst.value = False
time.sleep(0.2)
rst.value = True
time.sleep(2)
# ------------------------------------------------
# SPI
# ------------------------------------------------
print("Init SPI...")
spi_bus = bitbangio.SPI(
board.GP21,
MOSI=board.GP23,
MISO=board.GP22
)
# ------------------------------------------------
# Ethernet DHCP
# ------------------------------------------------
print("Start DHCP...")
eth = WIZNET5K(spi_bus, cs)
print("DHCP Success")
print("IP Address:", eth.pretty_ip(eth.ip_address))
# ------------------------------------------------
# Socket Pool
# ------------------------------------------------
pool = SocketPool(eth)
# ------------------------------------------------
# MQTT Config
# ------------------------------------------------
MQTT_BROKER = "broker.emqx.io"
MQTT_PORT = 1883
SUB_TOPIC = "w5500PR20/sub"
PUB_TOPIC = "w5500RP20/pub"
# ------------------------------------------------
# MQTT Callback
# ------------------------------------------------
def connected(client, userdata, flags, rc):
print("\n[ MQTT Connected ]")
client.subscribe(SUB_TOPIC)
print("SUB Topic:", SUB_TOPIC)
print("PUB Topic:", PUB_TOPIC)
def disconnected(client, userdata, rc):
print("[ MQTT Disconnected ]")
def message(client, topic, msg):
print("\n========== SUB ==========")
print("TOPIC :", topic)
print("DATA :", msg)
# 收到什么 回什么
client.publish(PUB_TOPIC, msg)
print("========== PUB ==========")
print("TOPIC :", PUB_TOPIC)
print("DATA :", msg)
print("=========================")
# ------------------------------------------------
# MQTT Client
# ------------------------------------------------
mqtt_client = MQTT.MQTT(
broker=MQTT_BROKER,
port=MQTT_PORT,
socket_pool=pool,
)
mqtt_client.on_connect = connected
mqtt_client.on_disconnect = disconnected
mqtt_client.on_message = message
# ------------------------------------------------
# Connect MQTT
# ------------------------------------------------
print("Connecting MQTT...")
try:
mqtt_client.connect()
print("MQTT Connected OK")
except Exception as e:
print("MQTT Connect Failed:", repr(e))
while True:
time.sleep(1)
# ------------------------------------------------
# Main Loop
# ------------------------------------------------
print("MQTT Running...\n")
while True:
try:
mqtt_client.loop()
except Exception as e:
print("Loop Error:", repr(e))
time.sleep(0.1)
5.3 代码关键配置说明(必看,否则连接失败)
-
MQTTX服务器IP配置:必须替换为电脑本机的局域网IP(如192.168.1.100),确保开发板与电脑在同一网段(可通过路由器查看设备IP);
-
主题配置:SUB_TOPIC和PUB_TOPIC需与MQTTX服务器中创建的主题完全一致,大小写、符号不可出错,否则无法接收或发布消息;
-
引脚配置:CS、RST、SPI引脚(GP20、GP25、GP21、GP23、GP22)需与硬件连接一致,若修改硬件接线,需同步修改代码中的引脚定义;
-
DHCP配置:代码中默认使用DHCP自动获取IP,无需手动配置,若局域网未开启DHCP,需手动配置开发板IP(参考W55RP20官方文档);
-
自动重连:代码中集成异常处理逻辑,当MQTT连接断开、循环出错时,会自动尝试重新连接,无需手动重启开发板;
-
回声功能:message回调函数中实现“收到什么、发布什么”,若需修改消息格式(如添加时间戳),可在client.publish()前修改msg内容。
5.4 编译与烧录步骤
-
打开Thonny,将上述代码复制到code.py文件中,修改MQTT_BROKER(服务器IP)、SUB_TOPIC和PUB_TOPIC(主题);
-
确认开发板通过Micro USB数据线连接电脑,Thonny已识别开发板(解释器选择正确);
-
点击Thonny工具栏中的“保存”按钮,将代码保存到开发板(选择“W55RP20”对应的存储设备);
-
保存完成后,开发板会自动运行代码,打开串口调试助手,即可查看运行日志;
-
若代码有修改,重复步骤1-3,重新保存即可完成烧录,无需额外操作。
6、运行结果与MQTTX服务器验证
6.1 串口输出结果
烧录完成后,开发板自动重启,打开串口调试助手,会输出以下内容,说明以太网初始化、MQTT连接及消息收发功能正常:
===================================
W5500RP20 MQTT SUB/PUB Demo
===================================
Reset W5500RP20...
Init SPI...
Start DHCP...
DHCP Success
IP Address: 192.168.1.140
Connecting MQTT...
[ MQTT Connected ]
SUB Topic: w5500PR20/sub
PUB Topic: w5500RP20/pub
MQTT Connected OK
MQTT Running...
========== SUB ==========
TOPIC : w5500PR20/sub
DATA : {"msg":"Hello"}
========== PUB ==========
TOPIC : w5500RP20/pub
DATA : {"msg":"Hello"}
=========================
说明:若打印“MQTT Connect Failed”,属于正常现象,检查服务器IP、主题配置后,开发板会自动重试;若一直无法连接,参考“常见问题排查”部分。
6.2 MQTTX服务器数据验证
打开MQTTX客户端,连接到本地MQTTX服务器,订阅PUB_TOPIC(如w5500RP20/pub),同时向SUB_TOPIC(如w5500RP20/sub)发送消息,步骤如下:
-
打开MQTTX客户端,新建连接,配置服务器IP(与代码中一致)、端口1883,点击“连接”;
-
在客户端中,订阅主题w5500RP20/pub,用于接收开发板发布的消息;
-
向主题w5500RP20/sub发送消息(如“hello W55RP20”);
-
观察串口调试助手,会打印接收的消息和发布的消息;同时观察MQTTX客户端,会收到开发板反馈的相同消息,说明双向通信成功。
至此,W55RP20的CircuitPython版MQTT协议与MQTTX服务器对接实战完成!
7、常见问题一站式排查
结合MQTTX本地服务器对接的特殊性(局域网连接、IP配置、主题匹配),以下是高频问题及排查步骤,优先排查连接参数和网络配置问题:
|
问题现象 |
排查步骤 |
|---|---|
|
1. 串口无打印或打印乱码 |
1. 确认串口参数配置正确(波特率115200、无校验);2. 固件为W55RP20专属CircuitPython固件;3. 重新烧录固件,检查USB数据线是否支持数据传输;4. 确认Thonny解释器选择正确。 |
|
2. DHCP获取IP失败,提示Start DHCP后无后续输出 |
1. 确认路由器已开启DHCP功能;2. 检查以太网接线是否正常,网线是否完好;3. 重启路由器和开发板;4. 手动配置开发板IP(参考官方文档),确保与电脑在同一网段。 |
|
3. MQTT连接失败,提示Connect Failed |
1. 确认MQTTX服务器已启动,且服务器IP与代码中一致;2. 检查开发板与电脑是否在同一网段(可通过ping命令测试);3. 确认MQTTX服务器端口1883未被占用;4. 关闭电脑防火墙,避免拦截连接。 |
|
4. 能连接MQTTX,但无法接收或发布消息 |
1. 检查代码中SUB_TOPIC和PUB_TOPIC与MQTTX客户端的主题完全一致(大小写、符号不可错);2. 确认MQTTX客户端已订阅PUB_TOPIC、向SUB_TOPIC发送消息;3. 检查代码中回调函数是否正确绑定(on_message、on_connect);4. 查看串口日志,定位是否有消息接收或发布报错。 |
|
5. 消息收发不稳定,频繁断开连接 |
1. 检查以太网接线是否松动,路由器是否正常工作;2. 增加主循环中的sleep时间(如修改为0.5秒),减少消息处理压力;3. 确认MQTTX服务器运行稳定,无异常退出;4. 检查开发板供电是否稳定,避免供电不足导致断开。 |
8、W55RP20 核心优势对比
为了让你更直观地了解 W55RP20 的价值,我们对比了目前主流的三种嵌入式以太网方案,适配CircuitPython开发场景:
|
对比维度 |
W55RP20 集成方案 |
外接 PHY 芯片 方案 |
外接 串口转以太网模块 方案 |
|---|---|---|---|
|
BOM 成本 |
低(单芯片,集成TCP/IP协议栈) |
中高(MCU + 模块 + 外围器件) |
高 |
|
PCB 面积 |
小(仅需网口电路,适配小体积设备) |
大(需预留芯片和布线空间) |
高 |
|
开发难度 |
低(官方CircuitPython驱动库,一行代码联网,无需底层开发) |
中高(调试协议栈、编写驱动,适配CircuitPython难度高) |
低 |
|
网络稳定性 |
极高(WIZnet 专注硬件 TCP/IP 协议栈 25 年,适配CircuitPython环境) |
不定(对于研发人员要求高,熟悉协议栈与CircuitPython适配,才能调试稳定) |
不定(视模块集成情况,易出现通信延迟) |
|
CPU 资源占用 |
0%(协议栈网络处理完全由硬件完成,不占用RP2040资源) |
50% 以上(协议栈完全运行在 MCU 上,占用相关资源) |
0% |
|
硬件 Socket 数量 |
8 个独立硬件 Socket,支持多通道通信 |
视 MCU 能力而定,理论支持多路拓展 |
一般为单路透传 |
|
网络吞吐量 |
最高 15Mbps,满足本地消息收发、数据上传需求 |
视 MCU 能力而定,吞吐量有限 |
约 3-5Mbps |
|
接口易用性 |
单芯片集成,SPI接口,适配CircuitPython标准API |
要 MCU 带有 MII/RMII 等接口,适配难度高 |
TTL 接口,操作简单但灵活性差 |
|
部署难度 |
低(官方CircuitPython驱动库成熟,应用层协议均有适配,可灵活部署) |
高(应用层协议需要手动移植开源库适配CircuitPython) |
视模块集成情况,无集成的功能需要自我封包拆包 |
9、典型应用场景
W55RP20 芯片集成以太网功能,结合CircuitPython的便捷开发特性和工业级稳定性,非常适合以下应用场景:
-
本地物联网调试终端:用于MQTT协议验证、设备通信测试,快速原型开发,降低调试成本;
-
工业数据采集网关:简化现场部署,实现传感器数据的本地存储和双向通信,适配工厂、机房场景;
-
串口转网口设备:将传统 RS232/RS485 串口设备快速升级为以太网设备,实现本地网络通信;
-
智能楼宇节点:用于照明、空调、门禁等楼宇设备的本地网络控制,响应速度快,延迟低;
-
教育实训设备:适配CircuitPython新手入门,用于物联网、网络通信相关实训教学,操作简单、易上手。
10. 系列预告与资源获取
10.1系列预告
下一篇教程我们将讲解 W55RP20 CircuitPython开发下的 MQTT+阿里云实现上传数据,带你了解云平台连接建立、心跳包维护、异常重连等关键机制,掌握嵌入式以太网设备上云的基础能力,实现温湿度数据远程可视化。
10.2 资源获取
本文完整代码:WIZnet 官方 Gitee 仓库
W55RP20 芯片手册:WIZnet 官方资料网址
如果本文对你有帮助,欢迎点赞、收藏、关注,你的支持是我们持续更新的动力!如有任何问题,欢迎在评论区留言,我们会第一时间回复。
更多推荐

所有评论(0)