|
基于 RT1170 的 FreeRTOS + LWIP DHCP 工程及 TCP 客户端实现 一、项目背景 在工业控制、物联网网关等嵌入式网络应用中,NXPi.MX RT1170 系列处理器因其高性能和丰富的外设接口,成为很多用户的选择。本文介绍基于 MIMXRT1170 平台,构建了一个使用FreeRTOS 和 LWIP 协议栈的网络工程,实现以下功能: · DHCP 自动获取IP 地址,简化网络配置; · TCP 客户端功能,用于与远程服务器进行可靠通信。 为了验证嵌入式TCP 客户端的功能,我们使用Python 编写了一个简单的TCP Echo 服务器,运行在 PC端,并与RT1170 客户端进行交互。 下面简单介绍一下LWIP,DHCP和TCP协议,感兴趣的同学也可以通过恩智浦MIMXRT1170-EVKB开发板,以及配套的SDK库例程做开发验证。 二、LWIP 与 DHCP 简介 LWIP(LightweightIP) ,顾名思义,它是一种轻量级的IP协议栈,是专为嵌入式系统设计的开源 TCP/IP 协议栈,其特点包括如下:
- 占用资源少,适合 RAM 和 ROM 受限的系统;
- 支持 IPv4/IPv6、TCP、UDP、DHCP、DNS 等多种协议;
- 可与 FreeRTOS 集成,支持多线程。
DHCP(动态主机配置协议) 允许设备在启动时自动获取IP 地址、网关、DNS 等信息,避免手动配置。LWIP 中的 DHCP 模块通过状态机实现自动分配流程:
- DHCP_DISCOVER:客户端广播请求;
- DHCP_OFFER:服务器响应;
- DHCP_REQUEST:客户端确认;
- DHCP_ACK:服务器确认分配。
在 本文介绍的RT1170工程中,只需在初始化时启用DHCP,LWIP就 会自动完成 IP 的分配。 三、PythonTCP 服务器实现 为了测试RT1170 TCP 客户端,我们PC端编写了一个简单的 Python TCP 服务器(TCP Server)代码,如下:
用于监听客户端连接并进行简单的回显通信。核心逻辑如下:
- Socket 创建与配置
- 绑定地址和端口
- 进入监听状态
- 连接处理循环
- 数据收发逻辑
在连接会话中,服务器通过recv(1024) 接收客户端发送的数据(最大1024 字节)。 如果接收到数据,打印解码后的内容,并通过sendall() 回传带有 Echo:前缀的响应,实现回显功能。 如果客户端断开连接或发生ConnectionResetError,服务器捕获异常并关闭连接。 四、TCP 客户端实现 TCP 是一种面向连接的可靠传输协议,适用于需要数据完整性和顺序的场景。TCP客户端通常包括以下步骤:
- 创建 socket;
- 连接服务器;
- 发送数据;
- 接收响应;
- 关闭连接。
在 RT1170 工程中,TCP 客户端任务通常作为 FreeRTOS 的一个独立线程运行,确保网络通信的实时性和稳定性。 硬件环境搭建: · MIMXRT1170-EVKB开发板 · 网络线 采用RJ45 标准接头 · 网线连接MIMXRT1170-EVKB开发板1G ENET口,即J4 软件搭建 IDE:MCUXPressoIDE V25.6 SDK: SDK_2.x_MIMXRT1170-EVKB 25.09.00 导入SDK demo工程“evkbmimxrt1170_lwip_dhcp_freertos_cm7” 添加代码如下: 在 DHCP 协议中,BOUND 状态表示客户端已成功获取并应用 IP 地址及相关网络参数,网络配置处于稳定状态。在 print_dhcp_state() 函数中,当检测到 DHCP 状态切换至 BOUND 时,系统会打印当前网络配置(IPv4 地址、子网掩码、网关),并在首次进入该状态时创建 TCP 客户端任务,以便后续进行应用层通信。
tcp_client_task任务实现了一个典型的TCP 客户端通信逻辑:在成功连接服务器后,TCP客户端进入循环,周期性发送测试字符串并接收服务器响应,处理异常情况并在通信结束后释放资源。该设计体现了嵌入式网络应用的基本模式,结合FreeRTOS 任务管理和Socket API,保证了通信的稳定性和系统资源的合理使用。
五、基于开发板验证结果 下图为MIMXRT1170-EVKB开发板的连接图: 在PC端运行TCP服务端脚本文件后,显示Log如下: 运行MIMXRT1170-EVKB开发板,显示Log如下: 本文基于 NXPi.MX RT1170 平台,构建了一个集成FreeRTOS 与 LWIP 的嵌入式网络工程,实现 DHCP 自动获取 IP 和 TCP 客户端通信功能,并通过 Python TCP Echo 服务器进行验证,该方案体现了嵌入式网络应用的基本模式。
|