将lwIP TCP/IP堆栈整合至嵌入式应用的界面

嵌入式系统 时间:2025-02-07来源:CTIMES

轻量化TCP/IP(lwIP)堆栈是TCP/IP协议的精简实作,专门设计用来缩减RAM内存的使用量,这使其非常适合用在嵌入式系统。它提供三种独特的应用程序编程接口(API):
‧ 未封装的低阶API
‧ 负责网络通讯的高阶 API
‧ BSD 风格的socket套接字 API

本文专注探讨使用未封装API接口的范例。运用未封装API建置callback回调函数的应用程序会由核心事件触发。
尽管未封装API较socket套接字API更为复杂,但由于其处理负荷(overhead)较低,因此能提供高出许多的吞吐量。
接着将探讨几个建构在lwIP TCP/IP堆栈之上的范例,其中采用Analog Devices的MAX32570微控制器。开始的部分是一个ping展示,主要从PC向装置发送ping探测讯号。后续的部分介绍TCP Echo服务器范例,这个初步的服务器展示对于测试TCP连结相当实用。

ADI的MaximSDK软件开发工具包收录许多必要的软件与工具,让用户针对ADI的MSX32xxx微控制器开发韧体。套件中有一个lwIP堆栈函式库档案「MaximSDKLibrarieslwIP」。图一显示MaximSDK文件夹结构中的lwIP函式库档案。
图片.png 图片.png

图一 : ADI的MaximSDK lwIP 函式库档案

lwIP文件夹包含多个子目录:
‧ API 文件夹(网络通讯与 socket 套接字API)
‧ 核心文件夹(lwIP 核心档案,包含 “tcp.c”、“ip.c” 等)
‧ Netif 文件夹(网络接口档案)
‧ Include 文件夹(所有lwIP include 引入档案)
‧ Maxim文件夹(为ADI微控制器设计的客制化mac 驱动程序)

lwIP架构依循TCP/IP模型结构。TCP/IP通讯协议是多个分层组成的协定。TCP/IP通常被看成是一个四层结构的系统,如图二所示。

图片.png
 
图二 : TCP/IP 通讯协议分层

lwIP 项目档中一定有一个名为「lwipopts.h」的组态档案,以及一个名为「opt.h」的组态档案。「opt.h」档案中记录所有默认的堆栈组态以及其模块组态,而「lwipopts.h」则让用户能自行设定堆栈与其模块的所有组态。须注意这个档案并未包含所有可能的lwIP选项。因此,如果在“lwipopts.h”组态档案中没有定义某项组态,系统就会采用「opt.h」中定义的预设组态。
类似的情况,lwIP函式库有一个和程序相关的表头文件名为 「lwipcfg.h」。包括控制器的IP地址、网关地址、网络屏蔽地址、以及MAC地址都应定义在「lwipcfg.h」档案。
要在lwIP以及底层的硬件驱动程序之间建立链接,需要用到一个特定平台专属的配接层。举例来说,在为微控制器建置lwIP堆栈时,需要量身设计的驱动程序来桥接lwIP堆栈与微控制器的以太网络MAC驱动程序。这个客制化驱动程序应涵盖以下功能:
‧ 初始化功能: 此项功能负责初始化微控制器专属的MAC驱动程序
‧ 传送功能: 将从TCP堆栈收到的数据传送给以太网络MAC驱动程序,以便进行后续的传输
‧ 接收功能: 将从以太网络MAC驱动程序收到的封包转送到TCP堆栈

对于ADI微控制器,预存的客制化驱动程序已放在「MaximSDKLibrarieslwIPMaximmxc_eth.c」路径下的MaximSDK。这个驱动程序可作为包装器,能包装微控制器本身的Ethernet MAC (EMAC)外围函式库,该函式库位于「C:MaximSDK LibrariesPeriphDriversSourceEMAC」路径下的外围驱动程序中。

Ping 范例
「ping」指令是一个简单的工具,用来进行网络除错。其能执行因特网控制讯息协议(ICMP)的echo 响应请求,向指定的IP地址传送一个讯号然后等候回复。当目的地收到这个请求,就会回复一个echo封包。本章节解释如何从Windows PC向微控制器执行基本的ping测试以检查其连结状态,同时还会阐述如何使用微控制器的ping模块来和PC进行通讯。

以下详列Windows环境中ping工具的工作流程:
‧ 向微控制器传送4个数据封包,然后等待响应
‧ 微控制器将这些数据封包传回PC作为响应,亦即回响答复请求。
‧ 执行ping测试
‧ 使用以太网络线将微控制器EVKIT套件连到PC
‧ 开启命令行提示窗口,然后输入「ping <微控制器的IP地址>」然后按下enter键
命令行提示窗口中显示响应,如图三所示,意谓着在PC与微控制器之间已建立正常运行的连结

图片.png
 
图三 : 命令行提示窗口显示的 Ping输出内容

从微控制器测试Ping
「lwIP_Ping」档案是ADI旗下MAX32570微控制器的ping范例,收录于MaximSDK开发工具包。该档案存放在「C:MaximSDKExamples MAX32570lwIP_Ping」,目录中并提供以下指南:
‧ 微控制器的IP地址是使用「lwipcfg.h」档案来设定。微控制器与PC的IP地址应在同一个网段。在微控制器的「lwipcfg.h」档案中,PC的IP地址应设定成网关地址。
‧ 使用以太网络线连接PC与MAX32570 EVKIT套件
‧ 执行ping范例码
‧ 在eclipse程序中开启序列终端机 (Window-> Show view -> Terminal)。如图四所示,如果ping成功,终端机画面应显示ping的结果


图片.png 
图四 : 序列终端机显示的Ping 输出内容

命令行提示窗口仅显示ping统计数据。要检视实际传送的数据,需要用到一个名为Wireshark的程序。Wireshark能撷取网络联机所传送的数据。开启Wireshark后,再选择以太网络选项。另外还能显示像是来源与目的地MAC地址、来源与目的地IP地址、通讯协议、以及额外传送数据等细部数据。Wireshark显示的信息如图五所示。
正如范例所示,传送的数据为 0x00, 0x01… 一直到0x1F。但如果用户想要修改传送数据的内容那该怎么做?

图片.png
 
图五 : Wireshark程序中显示的ping数据封包

修改微控制器Ping指令所发送的数据
透过ping指令发出的数据是在「ping. c」档案中设定的。「Ping.c」档案是ping的传送程序模块。要传送的数据大小是以「PING_DATA_SIZE」参数设定在“ping.c”档案中。例如要传送的数据大小为32 字节。
准备要传送的数据的定义亦写在「ping.c」档案。额外的数据缓冲区会写入相同的数据,如「0x00, 0x01, 0x02…to 0x1F.」。
依据应用程序的需求,如果用户想要修改数据,可以在「ping .c」档案中修改数据缓冲区。举例来说,将所有32字节的数据变更成「0x01, 0x01…0x01」。在Wireshark中显示修改后的「ping .c」档案。此处使用新的参数来更新数据。

TCP Echo 服务器
ping范例中采用ICMP来判断目标系统的反应状况。其会使用默认数据透过网络向目标接收端传送一个echo请求。当目标地址收到这个请求时,它会回复一个echo应答封包。
如果用户希望从某个装置向另一个装置传送客制化数据,可使用TCP协议进行数据传输。在标准TCP函式中的Echo服务主要用来检查可及性以及判断各种路由问题。在这项服务中,服务器与客户端都是使用TCP来建立的。当服务器从客户端收到讯息,它会回复相同的讯息。
在MaximSDK,「lwIP TCP」原始码档案展示如何使用lwIP函式库中的 TCP函数。在这个案例中,微控制器扮演TCP服务器,并会等候客户端发送连接请求。接着服务器会返传从客户端送来的数据。在TCP Echo服务器范例中,应使用「tcpecho_raw.c」原始码档案。依循以下步骤设定TCP Echo服务器。

要设定TCP Echo服务器:

‧ 建立一个 socket
‧ 将socket绑定到宣告的埠号
‧ 完成绑定后,其会开始监听传来的连接请求
‧ 收到连接请求后,其会接受客户端设备发送来的连接请求
‧ 服务器接收到客户端传来的数据
‧ 最后,其传回相同的数据

图六的脚本显示了韧体的结构,该结构是主函数的一部分。config_emac会初始化EMAC,而MXC_ETH_Init 则会初始化 lwIP堆栈。

图片.png
 
图六 : 从脚本片断观察韧体的结构

在EMAC与lwIP堆栈完成初始化后,TCP Echo 服务器会透过tcpecho_raw_init进行初始化。Echo服务器结构如图七所示。

图片.png
 
图七 : Echo 服务器初始化结构.

Echo服务器的初始化会建立新的socket。之后它会将指定的IP地址和端口号绑定到新的socket。完成绑定后,其会持续监听远程客户端发送的连接请求。
要测试TCP服务器范例,须使用 echotool.exe PC 客户端工具。echotool.exe执行档应存放在C槽,故我们应从C槽开启命令行提示窗口。在客户端模式中,其会将数据传送到服务器并检查是否会回传。确保一定要在客户端模式中使用echo工具来测试服务器范例。

如何测试 TCP Server 范例
‧ 确保所有连结都正常运行
‧ 使用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 是回应服务器的实际远程通信埠 (echo port)
/n 是echo请求的数量
/t 是连接时长限制的秒数
/d 是请求响应的讯息 (像是 「LwIP TCP echo server Example」)

图片.png
 
图八 : TCP Echo 服务器输出内容

TCP协议和透过网络传送的数据,都可透过Wireshark软件进行检验。透过网络传送的封包在会Wireshark中显示,如图九所示。透过命令行提示栏传送的数据为「LwIP TCP echo server Example」。在Wireshark程序中也能看到相同的数据。

图片.png
 
图九 : Wireshark 程序中的TCP Echo 服务器输出结果

总结
了解并有效率地运用lwIP堆栈的功能以及ICMP协议为基础的ping工具和TCP协议,能为网络诊断以及数据传输开创出众多的可能性。ADI的MAX32570微控制器与MaximSDK 提供一个扎实的基础来建置lwIP堆栈,并建构可靠的通讯系统。藉由依循本文列举的范例,即可排除各种网络问题,进而创造无缝的链接以及确保数据完整性。

(本文作者Anju Puthenpurayil为ADI应用工程师)

关键词: lwIP TCP/IP 堆栈整合 嵌入式应用 ADI

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版