本文为 WIZnet W55RP20 芯片 MicroPython 教程第 4 篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。
版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。


前言

上一篇实战教程中,我们已经完成了 W55RP20-EVB-MKRTCP Client 客户端通信,开发板可以主动连接电脑端 TCP Server,并完成数据接收与回显。

本篇内容将介绍 TCP Server 服务端通信。开发板通过 DHCP 获取 IP 地址后,会创建 TCP Server 并监听指定端口。电脑端 SocketTester 作为 TCP Client 主动连接开发板,发送测试数据后,开发板会接收数据并回发响应内容。

TCP Server 常用于设备本地监听、上位机主动连接、局域网控制、调试工具访问等场景。

W55RP20 集成硬件 TCP/IP 协议栈,配合 MicroPython 的 socket 接口,可以让开发板快速实现 TCP Server 功能。开发者无需手动处理底层 TCP 协议细节,只需要关注 socket 创建、绑定、监听、接收连接和数据收发等应用层逻辑。

学完本文,你将掌握:

  • TCP Server 与 TCP Client 的基本关系
  • 如何让 W55RP20-EVB-MKR作为 TCP Server 监听端口
  • 如何在电脑端使用 SocketTester 作为 TCP Client 连接开发板
  • 如何接收电脑端发送的数据
  • 如何通过 TCP Server 回发数据
  • TCP Server 通信失败时的常见排查方法

系列教程学习路径

本系列共 16 篇,循序渐进覆盖从基础联网到工业级应用的全流程:

  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 仓库。


目录


1. TCP Server 简介

在嵌入式物联网应用中,设备不仅可以作为 TCP Client 主动连接服务器,也可以作为 TCP Server 在本地监听端口,等待电脑、上位机或其他网络设备主动连接。

TCP Server 是基于 TCP 协议的服务端程序。它会绑定本机 IP 地址和端口号,并持续监听来自 TCP Client 的连接请求。当客户端连接成功后,服务器即可与客户端建立可靠的 TCP 连接,并进行双向数据通信。


1.1 TCP Server 是什么

TCP Server 可以理解为“等待连接的一方”。

它的主要作用是在指定端口上监听客户端连接请求。一旦有 TCP Client 连接进来,Server 就可以与该客户端建立连接,并通过这个连接进行数据收发。

简单来说:

TCP Server:先启动,等待客户端连接
TCP Client:主动连接 TCP Server

1.2 TCP Server 与 TCP Client 的关系

TCP 通信通常由 Server 和 Client 两个角色组成。

角色 说明
TCP Server 绑定本机 IP 和端口,监听客户端连接
TCP Client 主动连接 TCP Server 的 IP 和端口
连接建立后 双方都可以发送和接收数据

1.3 TCP Server 工作流程

TCP Server 的通信过程如下图所示:

在这里插入图片描述
从流程可以看到,TCP Server 的核心就是:创建 Socket、绑定 IP 和端口、监听客户端连接,并在连接成功后进行数据收发。


1.4 TCP Server 的优点

TCP Server 的主要优点如下:

优点 说明
连接可靠 基于 TCP 协议,适合稳定数据传输
支持双向通信 连接建立后,Server 和 Client 都可以收发数据
适合上位机访问 电脑、网关或其他客户端可以主动连接设备
便于本地调试 可以使用 SocketTester 等工具快速验证通信
适合设备控制 可用于参数配置、状态查询、远程控制等场景

对于嵌入式设备来说,TCP Server 常用于“设备等待上位机连接”的场景。例如设备上电后监听固定端口,上位机主动连接设备,然后读取设备状态、下发控制命令或进行参数配置。


2. 准备工作

2.1 软件准备

软件名称 版本要求 下载地址 说明
Thonny 4.0 及以上 Thonny 官方下载 用于编辑、运行 MicroPython 程序
W55RP20 MicroPython 固件 最新稳定版 WIZnet 官方资料页面 W55RP20-EVB-MKR 对应 MicroPython 固件
SocketTester v1.0.0.5 SocketTester 下载 用于在电脑端作为 TCP Client 连接开发板

2.2 硬件准备

如图所示,W55RP20-EVB-MKR 开发板实物图。

在这里插入图片描述
需要准备以下硬件:

  • W55RP20-EVB-MKR开发板 × 1
  • USB 数据线(必须支持数据传输,不能使用纯充电线) × 1
  • 标准网线 × 1
  • 路由器或交换机 × 1

W55RP20-EVB-MKR 已板载以太网接口,无需额外焊接飞线其他器件,即插即用。
大幅降低了接线错误和硬件故障概率。


3. 烧录 W55RP20 专属 MicroPython 固件

W55RP20 完全兼容树莓派 Pico 的 UF2 固件烧录方式,操作简单无需额外烧录器:

  1. 按住 W55RP20-EVB-MKR开发板上的 BOOTSEL 按键不放

  2. 使用 Micro USB 数据线连接开发板与电脑

  3. 待电脑识别出名为 RPI-RP2 的 U 盘后,松开 BOOTSEL 按键

  4. 将下载好的 W55RP20_firmware.uf2 固件文件拖拽到 U 盘中

  5. 开发板会自动重启,固件烧录完成

注意:如果电脑没有识别出 RPI-RP2 U 盘,请尝试更换 USB 数据线、重新插拔开发板,或更换电脑 USB 接口。


4. 硬件连接与开发环境配置

4.1 硬件连接

W55RP20-EVB-MKR的连接非常简单,仅需两步:

  1. 使用 USB 数据线连接开发板与电脑,用于供电、代码烧录和串口调试

  2. 使用网线连接开发板的以太网接口与路由器的 LAN 口

如图所示为硬件连接示意图

在这里插入图片描述

4.2 Thonny 开发环境配置

  1. 打开 Thonny 软件,点击顶部菜单栏「运行」→「配置解释器」

  2. 切换到「解释器」选项卡

  3. 在「解释器」下拉列表中选择 MicroPython(通用)

  4. 在「端口」下拉列表中选择 W55RP20-EVB-MKR 对应的串口(通常显示为 Board CDC @ COMx

  5. 勾选「运行代码前先重启解释器」和「同步设备的实时时钟」

  6. 点击「确定」完成配置

如果端口列表中没有出现开发板,请尝试:

  • 重新插拔 USB 数据线
  • 更换支持数据传输的 USB 数据线
  • 关闭其他占用串口的软件(如串口助手、Arduino IDE 等)
  • 重新烧录 MicroPython 固件

5. SocketTester 配置

本实验中,开发板作为 TCP Server,电脑端 SocketTester 作为 TCP Client。

打开 SocketTester 后,按照以下方式配置:

参数 设置
Protocol TCP client
Server IP address 192.168.1.123
Server port number 8087
Decode as ASCII
Encode as ASCII

配置完成后,点击 Connect,电脑端会主动连接开发板 TCP Server。

注意:Server IP address 需要填写开发板在 Thonny 中打印出的 IP 地址。
本文实验中开发板 IP 为 192.168.1.123,监听端口为 8087

SocketTester 配置界面如下图所示:
在这里插入图片描述


6. TCP Server 示例代码

6.1 完整代码

打开 TCP Server 示例文件,或在 Thonny 中输入以下代码:

from wiznet_init import wiznet
import usocket as socket
import time

# 初始化 W55RP20-EVB-MKR 网络
# dhcp=True 表示通过路由器自动获取 IP 地址
nic = wiznet("W55RP20-EVB-MKR", dhcp=True)

# 获取开发板当前 IP 地址
local_ip = nic.ifconfig()[0]

# 设置 TCP Server 监听端口
local_port = 8087

print("==================================")
print("    TCP 服务器启动成功 ✅")
print("    IP:", local_ip)
print("    端口:", local_port)
print("==================================")

# 创建 TCP Socket
# AF_INET 表示使用 IPv4
# SOCK_STREAM 表示使用 TCP 协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定开发板实际 IP 地址和监听端口
# 电脑端 TCP Client 需要连接这个 IP 和端口
s.bind((local_ip, local_port))

# 开始监听客户端连接
# 参数 1 表示最多允许 1 个客户端排队等待连接
s.listen(1)

print("等待电脑 TCP Client 连接...")

# 阻塞等待电脑端 TCP Client 连接
# 连接成功后,conn 用于后续收发数据,addr 为客户端地址信息
conn, addr = s.accept()
print("✅ 电脑已连接:", addr)

# 持续接收电脑端发送的数据
while True:
    try:
        # 接收电脑端发送的数据,最大接收 1024 字节
        data = conn.recv(1024)

        # 如果没有接收到数据,说明电脑端可能已经断开连接
        if not data:
            print("电脑主动断开")
            break

        # 打印接收到的数据
        print("收到:", data)

        # 组织回复数据
        reply = b"TCP Server : " + data

        # 将回复数据发送给电脑端 TCP Client
        conn.send(reply)

    except Exception as e:
        # 如果通信过程中出现异常,打印异常信息并退出循环
        print("连接异常:", repr(e))
        break

# 关闭客户端连接
conn.close()

# 关闭 TCP Server Socket
s.close()

print("❌ 连接断开")

6.2 关键函数说明

本例程中 TCP Server 的核心函数如下:

函数/语句 作用
s.bind((local_ip, local_port)) 绑定开发板 IP 和监听端口
s.listen(1) 开始监听 TCP Client 连接
conn, addr = s.accept() 等待客户端连接
conn.recv(1024) 接收客户端发送的数据
conn.send(reply) 向客户端发送回复数据

其中 accept() 会阻塞等待电脑端连接,recv() 会阻塞等待电脑端发送数据。


7. 运行结果与通信验证

完成 SocketTester 配置并运行 TCP Server 示例程序后,可以通过 Thonny Shell 和 SocketTester 窗口观察通信结果。


7.1 Thonny 串口输出结果

运行程序后,Thonny Shell 输出如下:

>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
Waiting for the network to connect...
Waiting for the network to connect...
Waiting for the network to connect...
Waiting for the network to connect...
MAC Address: 02:90:86:88:4d:56
IP Address: ('192.168.1.123', '255.255.255.0', '192.168.1.1', '202.96.134.33')
==================================
    TCP 服务器启动成功 ✅
    IP: 192.168.1.123
    端口: 8087
==================================
等待电脑 TCP Client 连接...
✅ 电脑已连接: ('192.168.1.119', 53891)
收到: b'hello'
收到: b'123'

从运行结果可以看到,开发板通过 DHCP 获取到 IP 地址 192.168.1.123,并在 8087 端口启动 TCP Server。

电脑端 SocketTester 作为 TCP Client 成功连接开发板,连接地址为:

('192.168.1.119', 53891)

随后电脑端发送 hello123,开发板分别收到 b'hello'b'123',说明 TCP Server 接收数据成功。


7.2 SocketTester 接收结果

电脑端 SocketTester 发送框中输入:

hello

或:

123

点击 Send 后,开发板会收到该数据,并回发:

TCP Server : hello
TCP Server : 123

SocketTester 接收窗口可以看到:

TCP Server : hello
TCP Server : 123

实际运行效果如下图所示,左侧为 Thonny 运行日志,右侧为 SocketTester TCP Client 收发数据窗口。
在这里插入图片描述

从截图可以看到,电脑端 SocketTester 已成功连接开发板 TCP Server,并收到开发板回发的 TCP Server : helloTCP Server : 123,说明双向通信验证成功。


7.3 TCP Server 通信视频演示

下面的视频展示了 W55RP20-EVB-MKR 作为 TCP Server,等待电脑端 TCP Client 连接,并完成数据回显的过程。

在这里插入图片描述


8. 常见问题一站式排查指南

8.1 电脑端 TCP Client 连接失败

问题现象 排查步骤
SocketTester 提示无法连接 1. 确认开发板程序已经运行
2. 确认 Thonny 已打印 等待电脑 TCP Client 连接...
3. 确认 SocketTester 选择的是 TCP client
4. 确认 Server IP 填写为开发板 IP
5. 确认端口号为 8087

8.2 Server IP 或端口填写错误

问题现象 排查步骤
点击 Connect 后连接失败 1. 查看 Thonny 中开发板实际 IP 地址
2. 确认 SocketTester 中 Server IP address 与开发板 IP 一致
3. 确认 Server port number 与代码中的 local_port 一致
4. 确认电脑和开发板处于同一局域网

本文代码中的开发板监听端口为:

local_port = 8087

如果你的开发板 IP 发生变化,需要在 SocketTester 中同步修改。


8.3 端口被占用或未释放

如果频繁停止、重新运行 TCP Server 程序,可能会出现端口未释放或连接状态异常。

可以尝试:

  • 关闭 SocketTester 后重新打开
  • 在 Thonny 中停止程序后重新运行
  • 重新插拔开发板 USB
  • 修改监听端口,例如将 8087 改为 8088
  • 确认没有其他程序正在连接同一端口

8.4 程序卡在 accept()

代码中的:

conn, addr = s.accept()

是阻塞等待电脑端 TCP Client 连接。

如果电脑端没有点击 Connect,程序会一直停在这里,这是正常现象,并不是死机。

解决方法:

  1. 打开 SocketTester
  2. 选择 TCP client
  3. 输入开发板 IP 和端口
  4. 点击 Connect
  5. 查看 Thonny 是否打印 ✅ 电脑已连接

8.5 电脑端收不到回复

如果开发板已经收到数据,但电脑端 SocketTester 没有显示回复,可以检查:

  • SocketTester 是否勾选了 Don't log data
  • SocketTester 接收区是否被清空
  • Decode as 是否选择为 ASCII
  • 开发板代码中是否执行了 conn.send(reply)
  • TCP 连接是否已经断开

电脑端正常收到回复时,应显示:

TCP Server : hello
TCP Server : 123

9. W55RP20 核心优势对比

为了让你更直观地了解 W55RP20 的价值,我们对比了目前主流的三种嵌入式以太网方案:

对比维度 W55RP20 集成方案 外接 PHY 芯片方案 外接串口转以太网模块方案
BOM 成本
(单芯片)
中高
(MCU + 模块 + 外围器件)
PCB 面积
(仅需网口电路)

(需预留芯片和布线空间)
开发难度
(一行代码联网)
中高
(调试协议栈、编写驱动)
网络稳定性 极高
(WIZnet 专注硬件 TCP/IP 协议栈 25 年)
不定
(对于研发人员要求高,熟悉协议栈与网络开发,才能调试稳定)
不定
(视研发公司能力水平)
CPU 资源占用 0%
(协议栈网络处理完全由硬件完成)
50% 以上
(协议栈完全运行在 MCU 上,占用相关资源)
0%
硬件 Socket 数量 8 个独立硬件 Socket 视 MCU 能力而定,理论支持多路拓展 一般为单路透传
网络吞吐量 最高 15Mbps 视 MCU 能力而定 约 3-5Mbps
接口易用性 单芯片集成 要 MCU 带有 MII/RMII 等接口 TTL 接口
部署难度
(MicroPython 成熟固件,应用层协议绝大部分均有库文件,可灵活添加部署)

(应用层协议需要手动移植开源库适配)
视模块集成情况,无集成的功能需要自我封包拆包

10 典型应用场景

W55RP20 芯片集成以太网功能,结合其工业级稳定性,非常适合以下应用场景:

  1. 工业数据采集网关: 简化现场部署,实现传感器数据的稳定上传

  2. 远程监控终端: 用于工厂、机房、变电站等环境的设备状态远程监控

  3. 串口转网口设备: 将传统 RS232/RS485 串口设备快速升级为以太网设备

  4. 智能楼宇节点: 用于照明、空调、门禁等楼宇设备的网络控制

  5. 工业 PLC 扩展模块: 为 PLC 增加以太网通信能力,实现远程编程和数据采集


11 系列预告与资源获取

11.1 系列预告

下一篇教程将讲解 W55RP20 MicroPython 开发下的 UDP 单播数据通信

UDP 与 TCP 不同,它不需要建立连接,适合对实时性要求较高、允许少量丢包的通信场景。


11.2 资源获取

下一篇我们讲解:W55RP20-EVB-MKR 模块 MicroPython 实战 (5):UDP 快速实现 UDP 通信

如果本文对你有帮助,欢迎点赞、收藏、关注,你的支持是我们持续更新的动力!

如有任何问题,欢迎在评论区留言,我们会第一时间回复。

更多推荐