W55RP20-EVB-Pico 模块 CircuitPython 实战 (DNS示例):快速实现域名解析
上一篇教程中,我们已经完成了UDP 组播 / 广播开发,实现了局域网多设备批量通信。而在实际物联网项目中,设备除了需要局域网通信,还必须具备访问公网服务器的能力,这就离不开 DNS 域名解析功能。当我们结合 WIZnet W5500 网络模块,CircuitPython 和树莓派 PICO 的开发潜力被进一步放大。这款模块内置了硬件 TCP/IP 协议栈,使得在嵌入式设备上实现网络连接、域名解析变
本文为 W55RP20-EVB-Pico 模块 CircuitPython 教程专项篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。 版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。
前言
上一篇教程中,我们已经完成了 UDP 组播 / 广播 开发,实现了局域网多设备批量通信。而在实际物联网项目中,设备除了需要局域网通信,还必须具备访问公网服务器的能力,这就离不开 DNS 域名解析功能。
当我们结合 WIZnet W5500 网络模块,CircuitPython 和树莓派 PICO 的开发潜力被进一步放大。这款模块内置了硬件 TCP/IP 协议栈,使得在嵌入式设备上实现网络连接、域名解析变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。
本文将带你快速上手 W55RP20-EVB-Pico 模块的 CircuitPython 开发,重点实现 DNS 域名解析功能,学完本文,你将掌握:
- DNS 协议的核心原理与工作流程
- W55RP20-EVB-Pico 模块开发环境搭建与固件烧录
- 极简代码实现域名解析,将域名转换为 IP 地址
- DNS 解析的测试验证与常见故障排查
- WIZnet 硬件协议栈芯片的核心优势
系列教程学习路径
本专栏共 15 篇,循序渐进覆盖 W55RP20-EVB-Pico 模块 CircuitPython 开发全流程:
1.第 1 篇:静态 IP 配置与网络基础
2.第 2 篇:DHCP 自动联网与网络诊断
3.第 3 篇:TCP Client 客户端通信
4.第 4 篇:TCP Server 服务端通信
5.第 5 篇:UDP 单播数据通信
6.第 6 篇:UDP 组播/广播数据通信
7.第 7 篇:DNS 域名解析(本文)
8.第 8 篇:NTP 从网络获取时间
9.第 9 篇:HTTP Client 客户端请求
10.第 10 篇:HTTP Server 服务端搭建
11.第 11 篇:HTTP 协议与 OneNET 平台数据上云
12.第 12 篇:MQTT 协议基础通信验证
13.第 13 篇:MQTT 协议与阿里云平台对接
14.第 14 篇:MQTT 协议与 OneNET 平台对接
15.第 15 篇:MQTT 协议与 ThingSpeak 平台对接
16.第 16 篇:Modbus 工业协议通信
建议收藏本专栏,跟随教程逐步学习,所有代码均会同步更新至官方 Gitee 仓库。
目录
2. 烧录 W55RP20-EVB-Pico 模块专属 CircuitPython 固件
1. 准备工作
1.1 软件准备
所需软件均为免费版本,按要求下载安装即可,无需额外付费。
|
软件名称 |
版本要求 |
下载地址 |
说明 |
|---|---|---|---|
|
Thonny |
4.0 及以上 |
Thonny 官方下载 |
轻量级 CircuitPython IDE,支持代码编辑、烧录与串口调试,新手友好 |
|
W55RP20-EVB-Pico 模块 CircuitPython 固件 |
最新稳定版 |
WIZnet 官方固件下载 |
专为 W55RP20-EVB-Pico 模块 编写,已集成 WIZnet 硬件驱动与协议栈 |
1.2 硬件准备

-
W55RP20-EVB-Pico × 1
-
Circuit USB 数据线(必须支持数据传输,不能使用纯充电线)× 1
-
标准网线 × 1
-
开启 DHCP 功能的路由器 / 交换机 × 1(用于获取网络参数,实现 DNS 解析)
W55RP20-EVB-Pico 模块已集成以太网相关器件,无需额外焊接飞线,配合 RP2040 开发板可快速搭建开发环境,大幅降低接线错误和硬件故障概率。
2. 烧录 W55RP20-EVB-Pico 模块专属 CircuitPython 固件
W55RP20-EVB-Pico 模块 完全兼容树莓派 Pico 的 UF2 固件烧录方式,操作简单无需额外烧录器,新手可快速上手:
- 按住 RP2040 开发板上的 BOOTSEL 按键不放;
- 使用 USB 数据线连接开发板与电脑;
- 待电脑识别出名为 RPI-RP2 的 U 盘后,松开 BOOTSEL 按键;
- 将下载好的 W5500_RP2040_firmware.uf2 固件文件拖拽到 U 盘中;
- 开发板会自动重启,固件烧录完成。
注意:如果电脑没有识别出 RPI-RP2 U 盘,请尝试更换 USB 数据线、重新插拔开发板,或更换电脑 USB 接口(优先使用 USB 2.0 接口)。
3. 硬件连接与开发环境配置
3.1 硬件连接
W55RP20-EVB-Pico 模块连接分为两步,分别实现供电/调试和以太网连接,操作简单,无需复杂接线:
3.1.1 基础连接(供电+调试)
使用 USB 数据线连接 RP2040 开发板与电脑,用于开发板供电、代码烧录和串口调试。
3.1.2 以太网连接
使用网线连接 W55RP20-EVB-Pico 模块的以太网接口与路由器的 LAN 口(或直接连接电脑网口,需手动配置电脑 IP 与开发板同网段)。
3.1.3 模块与开发板接线
若使用分离式模块与开发板,需按以下引脚对应连接(SPI 通信):
【硬件预留】此处插入硬件连接示意图
3.2 Thonny 开发环境配置
打开 Thonny 软件,按以下步骤配置开发环境,确保代码能正常烧录和运行:
- 点击顶部菜单栏「运行」→「配置解释器」;
- 切换到「解释器」选项卡;
- 在「解释器」下拉列表中选择 CircuitPython (通用);
- 在「端口」下拉列表中选择开发板对应的串口(通常显示为 Board CDC @ COMx);
- 勾选「运行代码前先重启解释器」和「同步设备的实时时钟」;
- 点击「确定」完成配置。

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

4.2 DNS 工作流程
- W55RP20-EVB-Pico 模块 实现 DNS 解析的完整工作流程如下:
- 开发板上电 → 初始化 SPI 接口 → 激活 W55RP20-EVB-Pico 模块 网络模块;
- 通过 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-Pico 模块 的 CircuitPython 库已经封装了所有底层细节,实现 DNS 域名解析仅需 X 行核心代码,无需编写复杂的底层驱动和协议解析逻辑。
5.1 完整代码
以下代码可直接复制到 Thonny 中,烧录后即可运行,实现 DNS 域名解析功能:
import board
import bitbangio
import digitalio
import time
from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
# 硬件配置
cs = digitalio.DigitalInOut(board.GP20)
rst = digitalio.DigitalInOut(board.GP25)
# 复位 W5500
rst.direction = digitalio.Direction.OUTPUT
rst.value = False
time.sleep(0.2)
rst.value = True
time.sleep(2)
# 软件 SPI
spi_bus = bitbangio.SPI(
board.GP21, # SCK
MOSI=board.GP23, # MOSI
MISO=board.GP22, # MISO
)
# 初始化网口(用DHCP自动获取IP)
print("初始化以太网...")
eth = WIZNET5K(spi_bus, cs)
print("本机 IP:", eth.pretty_ip(eth.ip_address))
# DNS 解析部分
domain = "www.baidu.com"
print(f"\n正在解析域名: {domain}")
try:
ip_bytes = eth.get_host_by_name(domain)
ip_str = eth.pretty_ip(ip_bytes)
print("✅ 解析成功:", ip_str)
except Exception as e:
print("❌ 解析失败:", e)
# 保持 DHCP 连接
while True:
if hasattr(eth, "maintain_dhcp_lease"):
eth.maintain_dhcp_lease()
time.sleep(1)
以下是实现 DNS 域名解析功能过程:

5.2 代码关键步骤说明
网络初始化:
- 初始化 SPI 接口,指定波特率和对应引脚,与硬件接线保持一致;
- 创建 WIZNET5K 网络对象,绑定 SPI、CS、RST 引脚;
- 优先尝试 DHCP 自动获取网络参数,失败则切换为静态 IP,提升兼容性;
- 打印网络参数,便于调试;若未联网,打印寄存器信息辅助排查问题。
DNS 解析:
- 调用 usocket.getaddrinfo 函数,传入域名和端口;
- 提取解析结果中的 IP 地址,返回字符串格式,便于后续使用。
主函数:
- 定义待解析的域名,可根据需求修改;
- 调用网络初始化和 DNS 解析函数,打印解析结果;
6. 运行结果与测试验证
6.1 串口输出结果
在 Thonny 中点击运行按钮(或按 F5 键),Shell 窗口会输出类似以下内容,说明 DNS 解析成功:
初始化以太网...
本机 IP: 192.168.1.140
正在解析域名: www.baidu.com
✅ 解析成功: 183.2.172.177
说明:
若显示「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-Pico 模块 专属固件,不是通用树莓派 Pico 固件; 2. 重新烧录固件,确保拖拽过程中数据线未断开; 3. 检查 USB 供电是否稳定,避免供电不足。 |
7.2 端口识别问题
|
问题现象 |
排查步骤 |
|---|---|
|
Thonny 中找不到开发板端口 |
1. 重新插拔 USB 数据线,确保连接牢固; 2. 关闭其他占用串口的软件(如串口助手、Arduino IDE 等); 3. 在设备管理器中查看是否有 Board CDC 设备,若无则安装树莓派 Pico USB 驱动; 4. 重新烧录 CircuitPython 固件;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-Pico 模块 专属固件; 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 面积 |
小(模块集成度高,仅需预留模块安装空间) |
大(需预留芯片、布线空间及外围电路) |
中(需预留模块安装空间) |
|
开发难度 |
低(CircuitPython 固件已封装底层,一行代码实现联网) |
中高(需调试协议栈、编写底层驱动,对研发能力要求高) |
低(模块已集成驱动,仅需串口通信) |
|
网络稳定性 |
极高(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 串口接口,适配性强,但速率受限 |
|
部署难度 |
低(CircuitPython 成熟固件,应用层协议均有库文件,可灵活部署) |
高(应用层协议需要手动移植开源库适配,调试成本高) |
中(无集成功能需自行封包拆包,灵活性不足) |
9. 典型应用场景
W55RP20-EVB-Pico 模块,结合 CircuitPython 快速开发优势和 WIZnet 硬件协议栈的稳定性,非常适合以下嵌入式、物联网应用场景:
- 工业数据采集网关:简化现场部署,实现传感器、PLC 等设备数据的稳定上传;
- 远程监控终端:用于工厂、机房、变电站等环境的设备状态远程监控和数据传输;
- 串口转网口设备:将传统 RS232/RS485 串口设备(如仪表、传感器)快速升级为以太网设备;
- 物联网节点:用于智能家电、智能楼宇等设备的网络连接,实现远程控制和数据上云;
- 嵌入式学习开发:适合新手入门嵌入式网络开发,快速掌握 DNS、TCP/UDP、HTTP 等网络协议;
- 小型服务器:搭建简易 HTTP Server、TCP Server,实现设备间的局域网通信。
10. 系列预告与资源获取
10.1 系列预告
下一篇教程我们将讲解 W55RP20-EVB-Pico 模块 CircuitPython 开发下的 NTP 从网络获取时间实现,带你了解 NTP 协议原理、网络时间同步流程、本地时间校准、定时同步等关键机制,掌握嵌入式设备精准获取网络时间的核心能力,为后续日志打时间戳、定时任务执行、物联网设备时序控制打下基础。
10.2 资源获取
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)