如何将lwIP TCP/IP协议栈集成到嵌入式应用中

2024-07-09

Figure 1

   

摘要

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库文件。

Figure 1. ADI’s MaximSDK lwIP library files.

图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所示。

Figure 2. TCP/IP protocol layers.

图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所示。

Figure 3. lwipcfg header file.

图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和微控制器之间连接正确。

Figure 4. Ping output in command prompt.

图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所示。

Figure 5. Ping output in serial terminal.

图5. 串行终端中的ping输出

命令提示符仅显示ping的统计信息。要查看实际发送的数据,需要使用名为Wireshark的工具。Wireshark能够从网络连接中捕获数据包。打开Wireshark后,应选择Ethernet选项。该工具会显示详细信息,例如来源和目标MAC地址、来源和目标IP地址、通信协议、发送的附加数据等。Wireshark中显示的信息如图6所示。

Figure 6. Ping data packet in Wireshark.

图6. Wireshark中的ping数据包

示例中显示,发送的数据为0x00、0x01……0x1F。但是,如果用户想要更改发送的数据,应该怎么做?

修改微控制器ping发送的数据

与ping一同发送的数据在“ping.c”文件中设置。“ping.c”文件就 是ping的发送程序模块。要发送的数据大小通过“ping.c”文件中 的“PING_DATA_SIZE”设置,如图7所示,数据大小设置为32字节。

Figure 7. Ping data packet size.

图7. ping数据包大小

要发送的数据也在“ping.c”文件中定义。如图8所示,附加数据缓冲区填充了一些数据:“0x00、0x01、0x02……0x1F”。

Figure 8. Ping data packet.

图8. ping数据包

根据应用要求,如果用户希望更改数据,可以在“ping .c”文件中修改数据缓冲区。例如,将32个字节的数据全部更改为 “0x01、0x01……0x01”,如图9所示。

Figure 9. Modified ping data packet.

图9. 修改后的ping数据包

修改后的“ping .c”文件在Wireshark中显示的信息如图10所示。数据随后会被更新围新的参数。

Figure 10. Modified ping data packet in Wireshark.

图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协议栈进行初始化。

Figure 11. A snippet of code giving an overview of the firmware structure.

图11. 简要呈现固件结构的代码片段

EMAC和lwIP协议栈初始化之后,使用tcpecho_raw_init对TCP回显服务器进行初始化。回显服务器初始化结构如图12所示。

Figure 12. The Echo server initialization structure.

图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”)
                      

Figure 13. TCP Echo server output.

图13. TCP回显服务器输出

通过网络发送的TCP协议和数据可以利用Wireshark软件进行验证。Wireshark会显示通过网络发送的数据包,如图14所示。通过命令提示符发送的数据是“LwIP TCP echo server Example”,在Wireshark软件中可以看到同样的数据。

Figure 14. TCP Echo server output in Wireshark.

图14. Wireshark中显示的TCP回显服务器输出

结论

理解并高效运用lwIP协议栈的功能,结合基于ICMP的ping工具和TCP协议,将极大地拓展网络诊断和数据传输的可能性。ADI的MAX32570微控制器和MaximSDK为实现lwIP协议栈和构建可靠的通信系统提供了坚实的基础。借鉴本文所述的示例,用户可以排除网络故障,建立顺畅的连接并确保数据完整性。

参考文献

1 nongnu.org/lwIP/2_1_x/index.html

wireshark.org/download.html

github.com/PavelBansky/EchoTool

关于作者

Anju Puthenpurayil
Anju Puthenpurayil目前担任ADI公司CAC团队的核心应用工程师。Anju拥有印度浦那国防先进技术学院(DIAT)的VLSI和嵌入式系统硕士学位。她持续关注行业趋势和进展,为ADI公司产品的成功做出了重要贡献。

关联至此文章

最新视频 21

Subtitle
了解更多