本文为 W55RP20-EVB-MKR 模块 MicroPython 教程专项篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。 版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。
前言
上一篇教程中,我们已经完成了 UDP 组播 / 广播 开发,实现了局域网多设备批量通信。而在实际物联网项目中,设备除了需要局域网通信,还必须具备访问公网服务器的能力,这就离不开 DNS 域名解析功能。
当我们结合 WIZnet W5500 网络模块,MicroPython 和树莓派 MKR 的开发潜力被进一步放大。这款模块内置了硬件 TCP/IP 协议栈,使得在嵌入式设备上实现网络连接、域名解析变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
本文将带你快速上手 W55RP20-EVB-MKR 模块的 MicroPython 开发,重点实现 DNS 域名解析功能,学完本文,你将掌握:
- DNS 协议的核心原理与工作流程
- W55RP20-EVB-MKR 模块开发环境搭建与固件烧录
- 极简代码实现域名解析,将域名转换为 IP 地址
- DNS 解析的测试验证与常见故障排查
- WIZnet 硬件协议栈芯片的核心优势
系列教程学习路径
本专栏共 15 篇,循序渐进覆盖 W55RP20-EVB-MKR 模块 MicroPython 开发全流程:
11.第 11 篇:HTTP 协议与 OneNET 平台数据上云
14.第 14 篇:MQTT 协议与 OneNET 平台对接
15.第 15 篇:MQTT 协议与 ThingSpeak 平台对接
建议收藏本专栏,跟随教程逐步学习,所有代码均会同步更新至官方 Gitee 仓库。
目录
2. 烧录 W55RP20-EVB-MKR 模块专属 MicroPython 固件
1. 准备工作
1.1 软件准备
所需软件均为免费版本,按要求下载安装即可,无需额外付费。
| 软件名称 | 版本要求 | 下载地址 | 说明 |
|---|---|---|---|
| Thonny | 4.0 及以上 | Thonny 官方下载 | 轻量级 MicroPython IDE,支持代码编辑、烧录与串口调试,新手友好 |
| W55RP20-EVB-MKR 模块 MicroPython 固件 | 最新稳定版 | WIZnet 官方固件下载 | 专为 W55RP20-EVB-MKR 模块 编写,已集成 WIZnet 硬件驱动与协议栈 |
1.2 硬件准备
-
W55RP20-EVB-MKR× 1 -
Micro USB 数据线(必须支持数据传输,不能使用纯充电线)× 1
-
标准网线 × 1
-
开启 DHCP 功能的路由器 / 交换机 × 1(用于获取网络参数,实现 DNS 解析)
W55RP20-EVB-MKR 模块已集成以太网相关器件,无需额外焊接飞线,配合 RP2040 开发板可快速搭建开发环境,大幅降低接线错误和硬件故障概率。
2. 烧录 W55RP20-EVB-MKR 模块专属 MicroPython 固件
W55RP20-EVB-MKR 模块 完全兼容树莓派 MKR 的 UF2 固件烧录方式,操作简单无需额外烧录器,新手可快速上手:
- 按住 RP2040 开发板上的 BOOTSEL 按键不放;
- 使用 Micro USB 数据线连接开发板与电脑;
- 待电脑识别出名为 RPI-RP2 的 U 盘后,松开 BOOTSEL 按键;
- 将下载好的 W5500_RP2040_firmware.uf2 固件文件拖拽到 U 盘中;
- 开发板会自动重启,固件烧录完成。
注意:如果电脑没有识别出 RPI-RP2 U 盘,请尝试更换 USB 数据线、重新插拔开发板,或更换电脑 USB 接口(优先使用 USB 2.0 接口)。
3. 硬件连接与开发环境配置
3.1 硬件连接

W55RP20-EVB-MKR 模块连接分为两步,分别实现供电/调试和以太网连接,操作简单,无需复杂接线:
3.1.1 基础连接(供电+调试)
使用 Micro USB 数据线连接 RP2040 开发板与电脑,用于开发板供电、代码烧录和串口调试。
3.1.2 以太网连接
使用网线连接 W55RP20-EVB-MKR 模块的以太网接口与路由器的 LAN 口(或直接连接电脑网口,需手动配置电脑 IP 与开发板同网段)。
3.1.3 模块与开发板接线
若使用分离式模块与开发板,需按以下引脚对应连接(SPI 通信):
【硬件预留】此处插入硬件连接示意图
3.2 Thonny 开发环境配置
打开 Thonny 软件,按以下步骤配置开发环境,确保代码能正常烧录和运行:
- 点击顶部菜单栏「运行」→「配置解释器」;
- 切换到「解释器」选项卡;
- 在「解释器」下拉列表中选择 MicroPython (通用);
- 在「端口」下拉列表中选择开发板对应的串口(通常显示为 Board CDC @ COMx);
- 勾选「运行代码前先重启解释器」和「同步设备的实时时钟」;
- 点击「确定」完成配置。

如果端口列表中没有出现开发板,请尝试:
重新插拔 USB 数据线;
更换支持数据传输的 USB 数据线;
关闭其他占用串口的软件(如串口助手、Arduino IDE 等);
重新烧录 MicroPython 固件;
安装树莓派 MKR USB 驱动。
4. DNS 域名解析原理
4.1 DNS 协议简介
DNS,即域名系统,是因特网中的一项核心服务。它是用于实现域名和 IP 地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用去记住能够被机器直接读取的 IP 数字串。
在互联网中,每台计算机都有一个唯一的标识,称为 IP 地址。然而,IP 地址是由数字组成的,不便于人们记忆。因此,我们通常使用域名来访问网站。
简单来说,DNS 协议的核心作用就是「将域名转换为 IP 地址」,相当于互联网中的「地址簿」,让人们通过易于记忆的域名,快速找到对应的网络设备。

4.2 DNS 工作流程
- W55RP20-EVB-MKR 模块 实现 DNS 解析的完整工作流程如下:
- 开发板上电 → 初始化 SPI 接口 → 激活 W55RP20-EVB-MKR 模块 网络模块;
- 通过 DHCP 自动获取网络参数(IP 地址、子网掩码、网关、DNS 服务器地址);
- 用户输入目标域名,程序调用 DNS 解析函数;
- 开发板向 DNS 服务器发送域名解析请求;
- DNS 服务器查询域名对应的 IP 地址,返回解析结果;
- 开发板接收解析结果,提取 IP 地址并打印,完成 DNS 解析;
- 后续可通过解析得到的 IP 地址,实现 TCP/UDP 通信、网页访问等功能。
4.3 DNS 核心优势
- 易于记忆:人们通常更容易记住单词和短语组成的域名,而非复杂的数字 IP 地址;
- 灵活性高:网站可在不通知用户的情况下更换服务器 IP 地址,只需更新 DNS 服务器记录,用户仍可通过原域名访问;
- 负载均衡:DNS 可将一个域名解析为多个 IP 地址,实现多服务器负载分担,提升网站可用性和性能;
- 安全性强:通过 DNSSEC(域名系统安全扩展),可防止 DNS 欺骗攻击,保障解析结果的真实性。
4.4 DNS 典型应用场景
DNS 协议在物联网、嵌入式开发中应用广泛,主要包括:
- 网页浏览:通过域名访问网站,无需记忆 IP 地址;
- 电子邮件:邮件服务器通过 DNS 查询收件人邮箱服务器的 IP 地址;
- 网络通信:嵌入式设备通过域名解析,连接远程服务器(如物联网平台);
- 在线游戏/网络电话:通过 DNS 解析游戏服务器、通话对方设备的 IP 地址;
- 云服务访问:通过域名访问 AWS、Azure 等云服务,无需关注云服务器 IP 变化。
5. 核心代码解析
W55RP20-EVB-MKR 模块 的 MicroPython 库已经封装了所有底层细节,实现 DNS 域名解析仅需 X 行核心代码,无需编写复杂的底层驱动和协议解析逻辑。
5.1 完整代码
以下代码可直接复制到 Thonny 中,烧录后即可运行,实现 DNS 域名解析功能:
import network
import time
import usocket
try:
from machine import Pin, WIZNET_PIO_SPI
except ImportError:
WIZNET_PIO_SPI = None
Pin = None
# ======================================
# 全能网络初始化
# ======================================
def net_init():
print("=== 初始化 W55RP20 以太网 ===")
spi = WIZNET_PIO_SPI(
baudrate=31250000,
sck=Pin(21), cs=Pin(20),
mosi=Pin(23), miso=Pin(22)
)
nic = network.WIZNET6K(spi, Pin(20), Pin(25))
nic.active(True)
# 公共DNS组合
nic.ifconfig((
"192.168.1.100", # 静态IP
"255.255.255.0", # 掩码
"192.168.1.1", # 网关
"114.114.114.114" # DNS
))
while not nic.isconnected():
print("等待网络连接...")
time.sleep(1)
print("✅ 网络连接成功")
print("IP:", nic.ifconfig()[0])
print("DNS:", nic.ifconfig()[3])
return nic
# ======================================
# 万能域名解析
# ======================================
def resolve(host):
print(f"\n正在解析:{host}")
for i in range(3): # 自动重试3次
try:
addr = usocket.getaddrinfo(host, 80)[0][-1][0]
print(f"✅ 成功:{addr}")
return addr
except:
print(f" 重试 {i+1}...")
time.sleep(1)
print("❌ 解析失败")
return None
# ======================================
# 主程序:测试所有网址
# ======================================
def main():
net_init()
domains = [
"www.baidu.com",
"api.thingspeak.com",
"mqtt.thingspeak.com",
"www.taobao.com",
"www.google.com"
]
for d in domains:
resolve(d)
time.sleep(1)
print("\n=== 全能DNS解析完成 ===")
if __name__ == "__main__":
main()
以下是实现 DNS 域名解析功能过程:
5.2 代码关键步骤说明
库导入:导入 usocket(DNS 解析)、Pin/SPI(硬件控制)、network(网络模块)、time(延时)四个核心库;
网络初始化:
- 初始化 SPI 接口,指定波特率和对应引脚,与硬件接线保持一致;
- 创建 WIZNET5K 网络对象,绑定 SPI、CS、RST 引脚;
- 优先尝试 DHCP 自动获取网络参数,失败则切换为静态 IP,提升兼容性;
- 打印网络参数,便于调试;若未联网,打印寄存器信息辅助排查问题。
DNS 解析:
- 调用 usocket.getaddrinfo 函数,传入域名和端口;
- 提取解析结果中的 IP 地址,返回字符串格式,便于后续使用。
主函数:
- 定义待解析的域名,可根据需求修改;
- 调用网络初始化和 DNS 解析函数,打印解析结果;
5.3 扩展:静态 IP 下的 DNS 配置
若开发环境没有 DHCP 功能(如无路由器),需手动配置静态 IP 和 DNS 服务器地址,只需修改 w5x00_init 函数中的静态 IP 配置语句即可:
# 静态 IP 配置格式:(IP地址, 子网掩码, 网关, DNS服务器地址)
# 可根据实际网络环境修改,DNS 服务器地址建议使用公共 DNS(如 8.8.8.8 谷歌DNS、114.114.114.114 国内DNS)
nic.ifconfig(('192.168.1.20','255.255.255.0','192.168.1.1','114.114.114.114'))
注意:静态 IP 需与电脑/服务器处于同一网段,否则无法实现 DNS 解析和网络通信。
6. 运行结果与测试验证
6.1 串口输出结果
在 Thonny 中点击运行按钮(或按 F5 键),Shell 窗口会输出类似以下内容,说明 DNS 解析成功:
MPY: soft reboot
=== 初始化 W55RP20 以太网 ===
等待网络连接...
等待网络连接...
✅ 网络连接成功
IP: 192.168.1.100
DNS: 114.114.114.114
正在解析:www.baidu.com
✅ 成功:183.2.172.177
正在解析:www.taobao.com
✅ 成功:59.36.64.97
正在解析:www.google.com
✅ 成功:69.171.235.22
=== 全能DNS解析完成 ===
说明:
若显示「Configuring DHCP」后长时间无反应,说明 DHCP 配置失败,会自动切换为静态 IP 配置;
解析后的 IP 地址可能因网络环境、DNS 服务器不同而略有差异,属于正常现象;
6.2 DNS 解析验证方法
解析完成后,可通过以下两种方式验证解析结果的正确性:
方法① 电脑 ping 解析后的 IP 地址
- 打开电脑的命令提示符(Windows)或终端(Mac/Linux);
- 输入命令:ping 你的目标域名(如 ping www.w5500.com); - 观察命令返回的IP地址是否与你预期的解析结果一致,同时看是否能收到正常回复。
- 若收到类似以下回复,说明解析结果正确,网络连通正常:
来自 203.253.128.164 的回复: 字节=32 时间=50ms TTL=64
来自 203.253.128.164 的回复: 字节=32 时间=48ms TTL=64
来自 203.253.128.164 的回复: 字节=32 时间=52ms TTL=64
在实际测试中, ping 同一个域名时,收到的回复 IP 可能会出现变化,这是正常现象,并非解析错误:
同一域名对应多个服务器地址大型网站 / 服务通常会部署多台服务器,并通过 DNS 轮询、CDN 或智能解析,将用户导向延迟最低、距离最近的节点,因此不同时间 ping 域名,返回的 IP 可能不同。
域名解析的本质是 “域名→IP 映射”无论返回的 IP 如何变化,它们最终都指向同一个服务,所以你 ping 得到的 IP 不同,不代表解析结果错误,也不影响最终访问。
方法② 更换域名重新解析
修改 main 函数中的 domain 变量(如改为 "www.baidu.com"),重新运行程序,查看是否能正常解析出百度的 IP 地址,验证 DNS 解析功能的稳定性。
7. 常见问题一站式排查指南
开发过程中遇到问题,可按以下分类排查,快速解决问题。
7.1 烧录相关问题
| 问题现象 | 排查步骤 |
|---|---|
| 电脑无法识别 RPI-RP2 U 盘 | 1. 确认按住 BOOTSEL 按键再插入 USB 数据线; 2. 更换支持数据传输的 USB 数据线; 3. 更换电脑 USB 接口(优先使用 USB 2.0 接口); 4. 尝试使用另一台电脑。 |
| 固件拖拽后开发板无反应 | 1. 确认下载的是 W55RP20-EVB-MKR 模块 专属固件,不是通用树莓派 MKRo 固件; 2. 重新烧录固件,确保拖拽过程中数据线未断开; 3. 检查 USB 供电是否稳定,避免供电不足。 |
7.2 端口识别问题
| 问题现象 | 排查步骤 |
|---|---|
| Thonny 中找不到开发板端口 | 1. 重新插拔 USB 数据线,确保连接牢固; 2. 关闭其他占用串口的软件(如串口助手、Arduino IDE 等); 3. 在设备管理器中查看是否有 Board CDC 设备,若无则安装树莓派 MKR USB 驱动; 4. 重新烧录 MicroPython 固件;5. 更换 USB 数据线或电脑 USB 接口。 |
7.3 网络连接与 DNS 解析问题
| 问题现象 | 排查步骤 |
|---|---|
| 长时间显示 "Configuring DHCP",无法获取 IP | 1. 检查网线是否插紧,网口指示灯是否闪烁; 2. 确认网线连接到路由器的 LAN 口,不是 WAN 口; 3. 确认路由器已开启 DHCP 功能; 4. 更换路由器 LAN 口或网线; 5. 重启路由器和开发板; 6. 切换为静态 IP 配置,手动设置网络参数。 |
| IP 地址显示为 0.0.0.0 | 1. 执行上述网络连接排查步骤; 2. 确认代码中 SPI 引脚、CS 引脚、RST 引脚配置与硬件接线一致; 3. 确认使用的是 W55RP20-EVB-MKR 模块 专属固件; 4. 重新烧录固件,重启开发板。 |
| DNS 解析失败,提示报错 | 1. 确认 DNS 服务器地址配置正确(DHCP 自动获取或静态配置); 2. 检查开发板与 DNS 服务器的网络连通性(可 ping DNS 服务器地址); 3. 确认域名输入正确(如无拼写错误、无多余空格); 4. 更换公共 DNS 服务器地址(如 8.8.8.8、114.114.114.114); 5. 检查网络是否正常,路由器是否能正常访问互联网。 |
| 电脑 ping 不通解析后的 IP 地址 | 1. 确认电脑和开发板连接到同一个路由器(同一网段); 2. 关闭电脑的防火墙和杀毒软件; 3. 检查解析后的 IP 地址是否正确,是否与开发板打印的 IP 一致; 4. 重启开发板和电脑; 5. 检查网线连接是否正常,网口是否有故障。 |
8. WIZnet 硬件协议栈核心优势对比
为了让你更直观地了解 W5500 硬件协议栈芯片的价值,我们对比了目前主流的三种嵌入式以太网方案:
| 对比维度 | W5500 硬件协议栈方案 | 外接 PHY 芯片方案 | 外接串口转以太网模块方案 |
|---|---|---|---|
| BOM 成本 | 中(MCU + 网络模块,无需额外器件) | 中高(MCU + PHY 芯片 + 外围器件) | 高(MCU + 串口转网口模块) |
| PCB 面积 | 小(模块集成度高,仅需预留模块安装空间) | 大(需预留芯片、布线空间及外围电路) | 中(需预留模块安装空间) |
| 开发难度 | 低(MicroPython 固件已封装底层,一行代码实现联网) | 中高(需调试协议栈、编写底层驱动,对研发能力要求高) | 低(模块已集成驱动,仅需串口通信) |
| 网络稳定性 | 极高(WIZnet 专注硬件 TCP/IP 协议栈 25 年,抗干扰能力强) | 不定(依赖研发人员对协议栈和网络开发的掌握程度) | 不定(视模块厂商研发能力和产品质量) |
| CPU 资源占用 | 0%(协议栈完全由硬件处理,不占用 MCU 资源) | 50%以上(协议栈运行在 MCU 上,占用大量 CPU 和内存) | 0%(模块独立处理网络逻辑) |
| 硬件 Socket 数量 | W5500 8个独立硬件 Socket | 视 MCU 能力而定,理论支持多路拓展 | 一般为单路透传,多连接需额外配置 |
| 网络吞吐量 | W5500 最高 15Mbps | 视 MCU 能力而定,普遍低于硬件协议栈方案 | 约 3-5Mbps,速率较低 |
| 接口易用性 | SPI 接口,接线简单,适配大多数 MCU | 需 MCU 带有 MII/RMII 等专用接口,适配性有限 | TTL 串口接口,适配性强,但速率受限 |
| 部署难度 | 低(MicroPython 成熟固件,应用层协议均有库文件,可灵活部署) | 高(应用层协议需要手动移植开源库适配,调试成本高) | 中(无集成功能需自行封包拆包,灵活性不足) |
9. 典型应用场景
W55RP20-EVB-MKR 模块,结合 MicroPython 快速开发优势和 WIZnet 硬件协议栈的稳定性,非常适合以下嵌入式、物联网应用场景:
- 工业数据采集网关:简化现场部署,实现传感器、PLC 等设备数据的稳定上传;
- 远程监控终端:用于工厂、机房、变电站等环境的设备状态远程监控和数据传输;
- 串口转网口设备:将传统 RS232/RS485 串口设备(如仪表、传感器)快速升级为以太网设备;
- 物联网节点:用于智能家电、智能楼宇等设备的网络连接,实现远程控制和数据上云;
- 嵌入式学习开发:适合新手入门嵌入式网络开发,快速掌握 DNS、TCP/UDP、HTTP 等网络协议;
- 小型服务器:搭建简易 HTTP Server、TCP Server,实现设备间的局域网通信。
10. 系列预告与资源获取
10.1 系列预告
下一篇教程我们将讲解 W55RP20-EVB-MKR 模块 MicroPython 开发下的 NTP 从网络获取时间实现,带你了解 NTP 协议原理、网络时间同步流程、本地时间校准、定时同步等关键机制,掌握嵌入式设备精准获取网络时间的核心能力,为后续日志打时间戳、定时任务执行、物联网设备时序控制打下基础。
10.2 资源获取
下一篇我们讲解:W55RP20-EVB-MKR模块 MicroPython 实战 (8):NTP 从网络获取时间并实现自动同步

523

被折叠的 条评论
为什么被折叠?



