如何将lwIP TCP/IP协议栈集成到嵌入式应用中
摘要
TCP/IP协议栈广泛应用于局域网和广域网的以太网通信接口。轻量级TCP/IP (lwIP)是TCP/IP协议的微缩版实现方案,旨在减少RAM的使用。本文提供了如何将lwIP TCP/IP协议栈集成到嵌入式应用的指南,目的是简化开发流程,帮助开发者节省时间和精力。
引言
轻量级TCP/IP (lwIP)协议栈是TCP/IP协议族的精简实现方案,旨在尽可能减少RAM的使用,因此非常适合用于嵌入式系统。它提供了三种不同的应用程序编程接口(API):
- 底层Raw API
- 更高层的Netconn API
- BSD风格的Socket API
本文内容将完全基于Raw API接口的使用示例展开。Raw API采用事件驱动机制,能够在无底层操作系统支持的环境中独立运行。采用Raw API的应用程序实现由核心事件触发的回调函数。
相比Socket API,Raw API更为复杂,但由于开销较低,其吞吐能力远高于前者。
本文将基于ADI公司的MAX32570微控制器,讨论多个构建于lwIP TCP/IP协议栈之上的演示示例。第一部分详细探讨一个ping演示,说明如何在PC和设备之间进行ping操作。后续部分深入介绍一个TCP回显服务器示例,这是一个基础的服务器演示,可用于测试TCP的连接。
包含ADI MSX32xxx微控制器固件开发所需的软件和工具,其中有一个lwIP协议栈库文件“MaximSDK\Libraries\lwIP”。图1显示了MaximSDK文件夹中的lwIP库文件。
图1. ADI的MaximSDK lwIP库文件
lwIP文件夹包含多个子文件夹:
- API文件夹(Netconn和Socket API)
- Core文件夹(lwIP核心文件,包括“tcp.c”、“ip.c”等)
- Netif文件夹(网络接口文件)
- Include文件夹(所有lwIP头文件)
- Maxim文件夹(针对ADI微控制器定制的mac驱动程序)
lwIP架构遵循TCP/IP模型结构。TCP/IP协议是一种由不同层的多个 协议组合而成的协议体系。通常认为TCP/IP是一个4层体系,如图2所示。
图2. TCP/IP协议的层级结构
每个lwIP项目都包含一个名为“lwipopts.h”的配置文件,以及一个名为“opt.h”的默认配置文件。“opt.h”文件包含所有默认协议栈配置及其模块配置,而“lwipopts.h”允许用户对协议栈及其模块进行全面配置。请注意,此文件并不包含所有可能的lwIP选项。因此,如果某个配置未在“lwipopts.h”文件中定义,则会使用“opt.h”中定义的默认配置。
类似地,lwIP库有一个应用程序专用的头文件,称为“lwipcfg.h”。控制器的IP地址、网关地址、网络掩码地址和MAC地址应在“lwipcfg.h”文件中定义,如图3所示。
图3. lwipcfg头文件
为了在lwIP和底层硬件驱动程序之间建立连接,需要一个平台专用的适配层。例如,为微控制器实现lwIP协议栈时,需要定制驱动程序,以实现lwIP协议栈与微控制器以太网MAC驱动程序的对接。定制驱动程序应包含以下功能:
- 初始化函数:此函数负责初始化微控制器专用的MAC驱动程序。
- 发送函数:此函数帮助将从TCP协议栈接收的数据传输到以太网MAC驱动程序,以便进行后续传输。
- 接收函数:此函数负责将从以太网MAC驱动程序接收的数据包转发至TCP协议栈。
对于ADI微控制器,MaximSDK中提供了定制驱动程序,其路径为 “MaximSDK\Libraries\lwIP\Maxim\mxc_eth.c”。该驱动程序是对微控 制器自带的以太网MAC (EMAC)外设库的封装,相关库位于外设驱 动程序中:“C:\MaximSDK\ Libraries\PeriphDrivers\Source\EMAC”。
ping示例
ping”命令是一个用于排除网络故障的简单工具。它会向特定IP地址发送信号,然后等待回复,以此来执行互联网控制消息协议(ICMP)回显请求。目标地址收到此请求时,会发送一个回显回复包作为回应。本部分将解释如何从Windows PC对微控制器执行基本ping测试,以检查它们之间的连接。本部分还会介绍如何使用微控制器的ping模块与PC通信。
Windows ping实用程序的工作原理如下:
- PC向微控制器发送四个数据包并等待响应。
- 微控制器将这些数据包送回PC作为回复(这被称为回显回复请求)。
运行ping测试的步骤如下:
- 使用以太网线缆将微控制器评估套件连接到PC。
- 打开命令提示符,键入“ping
”,然后按回车键。
如果命令提示符中的回复类似图4所示的内容,则说明PC和微控制器之间连接正确。
图4. 命令提示符的ping输出
在微控制器端测试ping
“lwIP_Ping”文件是MaximSDK中包含的ADI MAX32570微控制器ping示例。它位于“C:\MaximSDK\Examples\ MAX32570\lwIP_Ping”,相关步骤如下:
- 微控制器的IP地址通过“lwipcfg.h”文件设置。微控制器和PC的IP地址须在同一网段内。
- PC的IP地址应作为网关地址,并在微控制器“lwipcfg.h”文件中提供。
- 使用以太网线缆连接PC和MAX32570 EVKIT。
- 运行ping示例代码。
- 在eclipse中打开串行终端(Window -> Show view -> Terminal)。如 果ping操作成功,终端会显示ping结果,如图5所示。
图5. 串行终端中的ping输出
命令提示符仅显示ping的统计信息。要查看实际发送的数据,需要使用名为Wireshark的工具。Wireshark能够从网络连接中捕获数据包。打开Wireshark后,应选择Ethernet选项。该工具会显示详细信息,例如来源和目标MAC地址、来源和目标IP地址、通信协议、发送的附加数据等。Wireshark中显示的信息如图6所示。
图6. Wireshark中的ping数据包
示例中显示,发送的数据为0x00、0x01……0x1F。但是,如果用户想要更改发送的数据,应该怎么做?
修改微控制器ping发送的数据
与ping一同发送的数据在“ping.c”文件中设置。“ping.c”文件就 是ping的发送程序模块。要发送的数据大小通过“ping.c”文件中 的“PING_DATA_SIZE”设置,如图7所示,数据大小设置为32字节。
图7. ping数据包大小
要发送的数据也在“ping.c”文件中定义。如图8所示,附加数据缓冲区填充了一些数据:“0x00、0x01、0x02……0x1F”。
图8. ping数据包
根据应用要求,如果用户希望更改数据,可以在“ping .c”文件中修改数据缓冲区。例如,将32个字节的数据全部更改为 “0x01、0x01……0x01”,如图9所示。
图9. 修改后的ping数据包
修改后的“ping .c”文件在Wireshark中显示的信息如图10所示。数据随后会被更新围新的参数。
图10. Wireshark中显示的修改后的ping数据包
TCP回显服务器
ping示例利用ICMP确定目标系统的响应能力。它使用默认数据通过网络向预期接收者发送回显请求。目标地址收到此请求时,会发送一个回显回复包作为回应。
用户想要将自定义数据从一个设备发送到另一个设备时,会使用TCP协议进行数据传输。回显服务是一个标准的TCP功能,主要用于检查可达性和识别路由问题。在此服务中,服务器和客户端基于TCP协议建立连接。服务器从客户端收到消息时,会将相同的消息送回客户端。
在MaximSDK中,“lwIP TCP”源文件演示了如何使用lwIP库中的TCP函数。 在这种情况下,微控制器充当TCP服务器,等待客户端请求。客户端发送的数据会被回显。TCP回显服务器示例中应使用“tcpecho_raw.c”应用程序源文件。按照以下步骤指定TCP回显服务器。
设置TCP回显服务器的步骤如下:
- 创建套接字
- 将套接字绑定到广播的端口号
- 绑定后,它便开始监听传入的连接
- 当请求连接时,它接受来自客户端机器的请求
- 然后,服务器接收客户端发送的数据
- 最后,服务器将相同的数据送回客户端
图11所示的代码片段简要呈现了固件结构,这段代码是主函数的一部分。config_emac函数对EMAC进行初始化,MXC_ETH_Init对lwIP协议栈进行初始化。
图11. 简要呈现固件结构的代码片段
EMAC和lwIP协议栈初始化之后,使用tcpecho_raw_init对TCP回显服务器进行初始化。回显服务器初始化结构如图12所示。
图12. 回显服务器初始化结构
回显服务器初始化时会创建一个新的套接字。它随后将分配的IP地址和端口号绑定到新的套接字。绑定后,它会监听来自远程客户端的连接请求。
要测试TCP服务器示例,请使用echotool.exe PC客户端实用程序。echotool. exe文件应保存在C盘,命令提示符应从C盘打开。在客户端模式下,它将数据发送到服务器,然后检查该数据是否被送回,如图13所示。测试服务器演示时,务必在客户端模式下使用回显工具。
如何测试TCP服务器示例:
- 确保所有连接均正常工作。
- 使用eclipse构建示例代码。
- 在调试模式下运行代码。
- 在远程PC上打开命令提示符窗口。
- 在命令提示符中输入以下内容:
-
“C:\>echotool IP_address /p tcp /r 7 /n 15 /t 2 /d LwIP TCP echo server Example” IP_address为实际的电路板IP地址。静态IP地址为192.168.100.200 /p tcp为协议(TCP协议) /r为回显服务器上的实际远程端口(回显端口) /n为回显请求的数量 /t为连接超时时间(以秒为单位) /d为要发送的用于回显的消息(例如“LwIP TCP echo server Example”)
-
图13. TCP回显服务器输出
通过网络发送的TCP协议和数据可以利用Wireshark软件进行验证。Wireshark会显示通过网络发送的数据包,如图14所示。通过命令提示符发送的数据是“LwIP TCP echo server Example”,在Wireshark软件中可以看到同样的数据。
图14. Wireshark中显示的TCP回显服务器输出
结论
理解并高效运用lwIP协议栈的功能,结合基于ICMP的ping工具和TCP协议,将极大地拓展网络诊断和数据传输的可能性。ADI的MAX32570微控制器和MaximSDK为实现lwIP协议栈和构建可靠的通信系统提供了坚实的基础。借鉴本文所述的示例,用户可以排除网络故障,建立顺畅的连接并确保数据完整性。
参考文献
1 nongnu.org/lwIP/2_1_x/index.html
github.com/PavelBansky/EchoTool