W55RP20-EVB-MKR 模块 MicroPython 实战 (3):TCP Client 客户端通信
本文为 WIZnet W55RP20 芯片 MicroPython 教程第 3 篇基于官方最新固件编写代码均经过实际验证可直接烧录运行。版权声明本文为 WIZnet 官方原创技术文章转载请注明出处。前言上一篇实战教程中我们已经完成了W55RP20-EVB-MKR的DHCP 自动联网测试开发板可以通过路由器自动获取 IP 地址并成功接入局域网。在完成基础联网后接下来就可以进行真正的数据通信测试。本篇内容将介绍TCP Client 客户端通信。开发板通过 DHCP 获取 IP 地址后会作为 TCP Client 主动连接电脑端 TCP Server。电脑端发送测试数据后开发板会接收数据并回发响应内容。TCP 是一种面向连接的可靠传输协议适合用于需要稳定数据传输的场景例如设备状态上报、传感器数据上传、远程控制指令交互等。W55RP20 集成硬件 TCP/IP 协议栈配合 MicroPython 的 socket 接口可以用较少代码实现 TCP Client 通信无需手动处理底层 TCP 协议细节。学完本文你将掌握TCP Client 与 TCP Server 的基本关系如何在电脑端开启 TCP Server 测试工具如何让W55RP20-EVB-MKR主动连接 TCP Server如何通过 TCP 接收电脑端发送的数据如何将接收到的数据回显给电脑端TCP Client 通信失败时的常见排查方法系列教程学习路径本系列共 16 篇循序渐进覆盖从基础联网到工业级应用的全流程第 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 TCP Client 简介1.1 TCP 是什么1.2 TCP Client 与 TCP Server 的关系1.3 TCP Client 工作流程1.4 TCP Client 的优点2 准备工作2.1 软件准备2.2 硬件准备3 烧录 W55RP20 专属 MicroPython 固件4 硬件连接与开发环境配置4.1 硬件连接4.2 Thonny 开发环境配置5 SocketTester 配置6 TCP Client 示例代码6.1 完整代码6.2 关键函数说明7 运行结果与通信验证7.1 Thonny 串口输出结果7.2 SocketTester 接收结果7.3 TCP Client 通信视频演示8 常见问题一站式排查指南8.1 电脑端 TCP Server 未开启8.2 PC_IP 或端口填写错误8.3 出现 OSError(104)8.4 程序卡在 recv()8.5 电脑端收不到回复9 W55RP20 核心优势对比10 典型应用场景11 系列预告与资源获取11.1 系列预告11.2 资源获取1 TCP Client 简介在嵌入式以太网通信中设备不仅可以作为 TCP Server 等待连接也可以作为 TCP Client 主动连接服务器。TCP Client 通常运行在设备端由设备主动连接上位机、服务器或云端平台。连接建立成功后客户端和服务器之间即可进行双向数据通信。1.1 TCP 是什么TCP全称Transmission Control Protocol中文通常称为传输控制协议。TCP 是一种面向连接的可靠传输协议。通信双方在正式传输数据之前需要先建立连接连接建立后双方即可进行稳定的数据收发。TCP 的特点可以概括为特点说明面向连接通信前需要先建立连接可靠传输适合需要稳定传输的应用场景双向通信连接建立后客户端和服务器都可以收发数据应用广泛常用于上位机通信、服务器通信、云端通信等场景1.2 TCP Client 与 TCP Server 的关系TCP 通信通常由 Client 和 Server 两个角色组成。角色说明TCP Server监听指定 IP 和端口等待客户端连接TCP Client主动连接 TCP Server 的 IP 和端口连接建立后双方都可以发送和接收数据简单来说TCP Server先启动等待客户端连接 TCP Client主动连接 TCP Server1.3 TCP Client 工作流程TCP Client 的通信过程如下图所示从流程可以看到TCP Client 的核心就是创建 Socket、主动连接服务器并在连接成功后进行数据收发。1.4 TCP Client 的优点TCP Client 基于 TCP 协议进行通信具备可靠、有序、双向通信等特点适合需要稳定连接的嵌入式网络应用。优点说明主动连接设备可以主动连接上位机、服务器或云端平台通信稳定基于 TCP 可靠连接进行数据收发双向通信连接建立后Client 和 Server 都可以收发数据易于调试可以通过 SocketTester 等工具快速验证通信结果应用广泛适用于数据上传、远程控制、设备状态上报等场景对于嵌入式设备来说TCP Client 常用于“设备主动连接服务器”的场景。例如设备上电后主动连接上位机或云端服务器然后上传数据或接收服务器下发的控制指令。2 准备工作2.1 软件准备软件名称版本要求下载地址说明Thonny4.0 及以上Thonny 官方下载用于编辑、运行 MicroPython 程序W55RP20 MicroPython 固件最新稳定版WIZnet 官方资料页面W55RP20-EVB-MKR 对应 MicroPython 固件SocketTesterv1.0.0.5SocketTester 下载用于在电脑端作为 TCP Server 等待开发板连接2.2 硬件准备如图所示W55RP20-EVB-MKR 开发板实物图。需要准备以下硬件W55RP20-EVB-MKR开发板 × 1USB 数据线必须支持数据传输不能使用纯充电线 × 1标准网线 × 1路由器或交换机 × 1W55RP20-EVB-MKR已板载以太网接口无需额外焊接飞线其他器件即插即用。大幅降低了接线错误和硬件故障概率。3 烧录 W55RP20 专属 MicroPython 固件W55RP20 完全兼容树莓派 Pico 的 UF2 固件烧录方式操作简单无需额外烧录器按住 W55RP20-EVB-MKR 上的BOOTSEL按键不放使用 Micro USB 数据线连接开发板与电脑待电脑识别出名为RPI-RP2的 U 盘后松开 BOOTSEL 按键将下载好的W55RP20_firmware.uf2固件文件拖拽到 U 盘中开发板会自动重启固件烧录完成注意如果电脑没有识别出RPI-RP2U 盘请尝试更换 USB 数据线、重新插拔开发板或更换电脑 USB 接口。4 硬件连接与开发环境配置4.1 硬件连接W55RP20-EVB-MKR 的连接非常简单仅需两步使用USB数据线连接开发板与电脑用于供电、代码烧录和串口调试使用网线连接开发板的以太网接口与路由器的 LAN 口如图所示为硬件连接示意图4.2 Thonny 开发环境配置打开 Thonny 软件点击顶部菜单栏「运行」→「配置解释器」切换到「解释器」选项卡在「解释器」下拉列表中选择MicroPython通用在「端口」下拉列表中选择 W55RP20-EVB-MKR 对应的串口通常显示为Board CDC COMx勾选「运行代码前先重启解释器」和「同步设备的实时时钟」点击「确定」完成配置如果端口列表中没有出现开发板请尝试重新插拔 USB 数据线更换支持数据传输的 USB 数据线关闭其他占用串口的软件如串口助手、Arduino IDE 等重新烧录 MicroPython 固件5 SocketTester 配置电脑端需要先启动 TCP Server等待开发板连接。打开 SocketTester 后按照以下方式配置参数设置ProtocolTCP serverLocal IP address192.168.1.119Listen port number8082Decode asASCIIEncode asASCII配置完成后点击监听按钮使电脑端进入 TCP Server 等待连接状态。注意Local IP address需要选择电脑当前所在局域网的 IP 地址本文实验中为192.168.1.119。Listen port number需要和开发板代码中的PC_PORT保持一致本文实验中为8082。SocketTester 配置界面如下图所示6 TCP Client 示例代码6.1 完整代码打开 TCP Client 示例文件或在 Thonny 中输入以下代码fromwiznet_initimportwiznetimportusocketassocketimporttime# 初始化 W55RP20-EVB-MKR 网络# dhcpTrue 表示通过路由器自动获取 IP 地址nicwiznet(W55RP20-EVB-MKR,dhcpTrue)# 打印开发板当前 IP 地址print(IP:,nic.ifconfig()[0])# 电脑端 TCP Server 的 IP 地址和监听端口PC_IP192.168.1.119PC_PORT8082whileTrue:sNonetry:# 创建 TCP Socketssocket.socket()# 主动连接电脑端 TCP Serverprint(准备连接电脑...)s.connect((PC_IP,PC_PORT))print(已连接电脑等待电脑发送数据...)whileTrue:# 接收电脑端发送的数据最大接收 1024 字节datas.recv(1024)# 如果没有接收到数据说明电脑端可能已经断开连接ifnotdata:print(电脑主动断开)break# 打印接收到的数据print(收到指令:,data)# 组织回复数据replybClient echo: data# 将回复数据发送给电脑端 TCP Servers.send(reply)print(已回复:,reply)exceptExceptionase:# 如果连接失败或通信异常打印异常信息print(连接失败或断开:,repr(e))try:# 关闭当前 Socketifs:s.close()except:pass# 等待 2 秒后重新尝试连接time.sleep(2)6.2 关键函数说明本例程中 TCP Client 的核心函数如下函数/语句作用socket.socket()创建 TCP Sockets.connect((PC_IP, PC_PORT))主动连接电脑端 TCP Servers.recv(1024)接收服务器发送的数据s.send(reply)向服务器发送回复数据s.close()关闭当前 Socket其中connect()会主动连接电脑端 TCP Serverrecv()会阻塞等待电脑端发送数据。7 运行结果与通信验证完成 SocketTester 配置并运行 TCP Client 示例程序后可以通过 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) IP: 192.168.1.123 准备连接电脑... 连接失败或断开: OSError(104,) 准备连接电脑... 已连接电脑等待电脑发送数据... 收到指令: bhello 已回复: bClient echo: hello从运行结果可以看到开发板通过 DHCP 获取到 IP 地址192.168.1.123并主动连接电脑端 TCP Server。电脑端 SocketTester 作为 TCP Server监听地址和端口为192.168.1.119:8082随后电脑端发送hello开发板收到bhello并回发bClient echo: hello说明 TCP Client 通信成功。说明首次出现连接失败或断开: OSError(104,)通常是因为电脑端 TCP Server 尚未完全处于监听状态或上一次连接未完全释放。程序会在 2 秒后自动重新连接后续连接成功后即可正常收发数据。7.2 SocketTester 接收结果电脑端 SocketTester 发送框中输入hello点击Send后开发板会收到该数据并回发Client echo: helloSocketTester 接收窗口可以看到Client echo: hello实际运行效果如下图所示左侧为 Thonny 运行日志右侧为 SocketTester TCP Server 收发数据窗口。从截图可以看到开发板已成功连接电脑端 TCP Server并完成hello数据接收与Client echo: hello回显验证。7.3 TCP Client 通信视频演示下面的视频展示了 W55RP20-EVB-MKR 作为 TCP Client 连接电脑端 TCP Server并完成数据回显的过程。8 常见问题一站式排查指南8.1 电脑端 TCP Server 未开启问题现象排查步骤开发板一直打印连接失败或断开1. 确认 SocketTester 已选择TCP server2. 确认电脑端已经点击监听按钮3. 确认 SocketTester 中显示有监听状态4. 确认端口号和代码中的PC_PORT一致8.2 PC_IP 或端口填写错误问题现象排查步骤开发板无法连接电脑1. 确认PC_IP是电脑当前局域网 IP2. 确认PC_PORT与 SocketTester 监听端口一致3. 确认电脑和开发板连接到同一路由器4. 确认电脑防火墙没有阻止 TCP 连接本文代码中的电脑 IP 和端口为PC_IP192.168.1.119PC_PORT8082如果你的电脑 IP 或端口不同需要按实际情况修改。8.3 出现 OSError(104)运行过程中如果看到连接失败或断开: OSError(104,)通常表示 TCP 连接被对端关闭或电脑端 TCP Server 尚未准备好。可以尝试确认 SocketTester 已经开始监听关闭并重新打开 SocketTester重新运行开发板程序等待程序自动重连检查是否有上一次连接未完全释放如果后续可以重新连接成功并正常出现已连接电脑等待电脑发送数据... 收到指令: bhello 已回复: bClient echo: hello则说明 TCP Client 通信已经成功。8.4 程序卡在 recv()代码中的datas.recv(1024)是阻塞等待接收数据。如果电脑端不发送数据程序会一直停在这里这是正常现象并不是死机。解决方法在 SocketTester 的发送框中输入数据例如hello确认Connected clients list中选择Send to all (1)点击Send查看 Thonny 是否打印收到的数据8.5 电脑端收不到回复如果开发板已经收到数据但电脑端 SocketTester 没有显示回复可以检查SocketTester 是否勾选了Dont log dataSocketTester 接收区是否被清空Decode as是否选择为ASCII开发板代码中是否执行了s.send(reply)TCP 连接是否已经断开电脑端正常收到回复时应显示Client echo: hello9 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 芯片集成以太网功能结合其工业级稳定性非常适合以下应用场景工业数据采集网关简化现场部署实现传感器数据的稳定上传远程监控终端用于工厂、机房、变电站等环境的设备状态远程监控串口转网口设备将传统 RS232/RS485 串口设备快速升级为以太网设备智能楼宇节点用于照明、空调、门禁等楼宇设备的网络控制工业 PLC 扩展模块为 PLC 增加以太网通信能力实现远程编程和数据采集11 系列预告与资源获取11.1 系列预告下一篇教程将讲解 W55RP20 MicroPython 开发下的TCP Server 服务端通信。与 TCP Client 主动连接服务器不同TCP Server 会在开发板端监听指定端口等待电脑或其他客户端主动连接。11.2 资源获取本文完整代码WIZnet Pico MicroPython 示例工程W55RP20 芯片手册WIZnet 官方资料页面下一篇我们讲解W55RP20-EVB-MKR 模块 MicroPython 实战 (4)TCP Server 服务端通信如果本文对你有帮助欢迎点赞、收藏、关注你的支持是我们持续更新的动力如有任何问题欢迎在评论区留言我们会第一时间回复。