LwIP应用开发实战指南—基于野火+STM32+全系列(M47)开发板.pdf
来源:新闻资讯 /
时间: 2024-11-23
【实例简介】
野火出品的LwIP开发教程,基于STM32单片机,从TCP/IP原理到LwIP实战,例程多多,相对于现有的LwIP教程,更有针对性,适合入门学习
c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 应用层 FTP 主要使用TCP、 运输层 UDP协议 主要为IP、 网络层 ICMP、ARP协议 链路层 MAC层 主要定义物理 物理层 传输介质 图11TCP/P协议的分层 TCPP协议栈中不同协议所完成的功能是不一样的,某些协议的实现要依赖丁其它协 议,依据这种依赖关系,可以将协议栈分层。在图1-1中,低层协议为相邻的上层办议提 供服务,是上层协议得以实现的基础。 其中,物理层(PHY)规定了传输信号所需要的物理电平、介质特征;链路层(MAC) 规定了数据帧能被网卡接收的条件,最常见的方式是利用网卡的MAC地址,发送方会在 欲发送的数据帧的首部加上接收方树卡的MAC地址信息,接收方只有监听到属于自己的 MAC地址信息后,才会去接收并处理该数据;每台网络设备都应该有自己的网络地址,网 终层规定了上机的网终地址该如何定义,以及如何在网终地址和MAC地址之间进行映射, 即ARP协议;网终层实现了数据包在主机之间的传递,而一台主机内部可能运行着多个网 络程序,传输层可以区分数据包是属丁哪一个应用程序的,可以说传输层实现了数据包端 到端的传递。另外,数据包在传输过程中可能会出现丢包、乱序和重复的现象,网络层并 没有提供应对这些锖误的机制,而传输层可以解决这些问题,如TCP办议;应用层以下的 工作完成了数据的传递工作,应用层则决定了你如何应用和处理这些数据,之所以会有许 多的应用层协议,是因为互联网中传递的数据种类很多、差异很大、应用场景十分多样。 1.3协议层报文间的封装与拆封 本书的后面章节会对TCPP协议栈中的每层协议进行分析和讲解。在这里,我们以图 1-2简单解释一卜在数据的发送和接收过程中,TCPP都做了哪些事儿。 当用户发送数据时,将数据向下交给传输层,这是处于应用层的操作,应用层可以通 过调用传输层的接口来编写特定的应用程序。而 TCP/IP协议一般也会包含一些简单的应用 程序如τ eInet远程登录、FTP文件传输、SMTP邮件传输协议等。传输层会在数据前面加 上传输层首部(此处以TCP协议为例,图1-2的传输层首部为TCP首部,也可以是UDP 第3页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 首部),然后向下交给网络层。同样地,网络层会在数据前面加上网络层首部(IP首部), 然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在薮据前面加上链路 层首部(此处使用以太网接口为例),然后将数据交给冽卡。最后,网卡将数据转换成物 理链路上的电平信号,数据就这样被发送到了网络中。数据的发送过稈,可以概括为 TCPP的各层协议对数据进行封装的过程,如图1-2所示。 当设备的网卡接收到某个数据包后,它会将其放置在网卡的接收缓存中,并告知 TCPP内核。然后TCPP内核就开始工作了,它会将数据包从接收缓存中取出,并逐层 解析数据包中的协议首部信息,并最终将数据交给某个应用程序。数据的接收过程与发送 过稈正好相反,可以概括为 TCP/IP的各层协议对数据进行解析的过稈。 应用数据 >应用层 APP 首部应用数据 TCP APP 首部首部 应用数据 >传输层 TcP段 TCP APP 首部 首部 首部 应用数据 网络层 ===m== P数据报 ebbott 以太网 P TCP APP 首部应用数据 CRC 首部 首部 首部 链路层 14 20 20 4 以太网帧 45~1500字节 图1-2TCP/P协议栈各层的报文封装与拆封 第4页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 第2章LwP简介 本书使用最新的LwP2.1.2版本,官方下载链接:htp:/ savannah. nongnu. org/projects/lwip/s 21LwP的优缺点 本书以LwP2.1.2为主要对象进行讲解,后续中出现的LwIP如果没有特殊声明,均 指2.1.2版本。此时的LwP2.1.2为最新版本,可能当这本书写完的时候,LwIP又被更新 了,对于学习而言,大家其实不必纠结于是否必须用最新的版本,因为2.1.2版本和亡后面 的版本在移植和应用方法上并没有什么区别。 LwP全名: Light weight IP,意思是轻量化的TCPP协议,是瑞典计算机科学院 (SICS)的 Adam dunkels开发的一个小型开源的TCPP协议栈。LwP的设计初衷是:用少 量的资源消耗实现一个较为完整的TCPP协议栈,其中“完整”主要指的是TCP协议的 完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。此外LwP 既可以移植到操作系统上运行,也可以在无操作系统的情况卜独立运行 LwP具有主要特性 1.支持ARP协议(以太网地址解析协议)。 2.攴持ICM协议(控制报文协议),用于网络的调试与维护。 3.支持lGMP协议(互联网组管理协议),可以实现多播数据的接收。 4.支持UDP协议(用户数据报协议) 5.支持TCP协议(传输控制协议),包括阳塞控制、RTT估算、快速恢复和快速转发。 6.支持PP协议(点对点通信协议),支持 PPPOE 7.支持DNS(域名解析) 8.支持DHCP协议,动态分配IP地址 9.支持P协议,包括IPV4、IPv6协议,支持I分片与重装功能,多网络接口下的 数据包转发。 10.支持SNMP协议(简单网络管理协议) 11.支持 AUTOIP,自动P地址配置。 12.提供专门的内部回调接口( Raw aPl,用于提高应用程序性能 13.提供可选择的 Berkeley接口APl,即 Socket套接字(在多线稈情况下使用)。 LwP在嵌入式中使用有以下优点 1.资源开销低,即轻量化。IwP内核有自凵的內存管理策略和薮据包管理策略,使 得内核处理数据包的效率很高。另外,LwP高度可剪裁,一切不需要的功能都可 以通过宏编译选项去掉。LwIP的流畅运行需要40KB的代码ROM和几十KB的 RAM,这让它非常适合用在内存资源受限的嵌入式设备中。 2.所支持的协议较为完整。几乎支持TCPP中所有常见的协议,这在嵌入式设备中 早已够用 第5页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M4/7)开发板 3.实现了一些常见的应用程序:DHCP客户端、DNS客户端、HITP服务器、 MQTT客户端、TFTP服务器、SNTP客户端等等。 4.同时提供了三种编程接口: RAW API、 NETCONN API(注: NETCONN API即 为 Sequential API,为了统一,下文均采用 NETCONN API)和 Socket aPi。这三 种API的执行效率、易用性、可移植性以及时空间的开销各不相同,用户可以根 据实际需要,平衡利弊,选择合适的API进行网络应用程序的开发 5.高度可栘植。其源代码仝部用C实现,用户可以很方便地实现跨处理器、跨编译 器的栘植。另外,它对内核中会使用到操作系统功能的地方进行了抽象,使用了 套自定义的API,用户可以通过自己实现这些API,从而实现跨操作系统的移 植工作。 6.丌源、免费,用户可以不用承担任何商业风险地使用它。 7.相比于嵌入式领域其它的TCP/P协议栈,比如uC-TCP/P、 FreeRTos-TCP等, LwIP的发展历史要更悠久一些,得到了更多的验证和测试。LwP被广泛用在嵌 入式网络设备中,国内一些物联网公司推出的物联网操作系统,其 TCP/IP核心就 是LwP;物联网知名的Wii模块ESP8266,其TCPP固件,使用的就是LwP LwP尽管有如此多的优点,但它毕竞是为嵌入式而生,所以并没有很完整地实现 TCPP协议栈。相比于 Linux和 Windows系统自带的TCPP协议栈,LwIP的功能不算完 整和强大。但对于大多数物联网领域的网络应用程序,LwP已经足够了。 22LwIP的文件说明 2.2.1如何获取LwIP源码文件 LwP的代码己经交给 Savannah托管,LwIP的项日主页是: htt: savannah. nongnu.org/ projects/wip这个主页简单地介绍了一下LwP,然后给出了许 多链接,你可以通过这些链接去挖掘更多关于LwIP的信息。在这里,我们只关注两个地 方,如图2-1中的方框所示 第6页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 Quick Overvi ◎ Project Homepage U Download Area &3 Project memberlist(35 members) Project Member GPG Keyring Communication tools Mailing Lists(3 public mailing lists Development tools Git Repository Browse Sources Repository L cvs Repository Browse Web Pages Repository o Bug Tracker (open items: 23, total: 1320) Browse open items Submit a new item 图21LwP项目主页截图 点击“ Project Homepage”,会得到一个网页,如图2-2所示。这个网页可以看成是 LwIP的官方说明文档。我们可以通过这个网页获得关于IwP的很多信息,包括LwIP的 使用注意、数扼的拷贝、系统初始化流程、多线程中要注意的问题、优化方法、内核模块 的分类介绍、内核数据结枃、内核重要全局变量、内核源码文件等。这些内容专业性比较 强,不建议初学时在它上面花费精力,并且里面的很多内容在我们教材的后续章节中中会 有所讲解。在这里,读者只要知道有这么个东丙就行了 口wF: oven 命wwww.rongruoeglnip htweight IP stack Main Page ReLated Pag Modules Dat$ tructures=问 LwIP ts a small indeperdent implementation of the TCP/IP protocol suite U减 the focus ef the lwIP ICP/IP implementation is to reduce the RA usage ile still having a full scale TCP, This making IvIp suitable for us How la contre to NIP n embedded systems with tens of kilobytes of free RAM and room for ground 4e kilobytes of code ROM Recoding b wIp was originally developed by Adam Dunkels at the Computer and Networks Architectures (CA) lab at the Swedish Institute of Computer science (sIcS) and i, now developed and meintained by a worldwide network of developers EFATURGS IP (Internet Protocol, IPy4 and IPv6)including packet forwarding ov ltiple network interfaces MP(Internet Control Message protocol) for network mai ntenance and dehugging InhasincLre ND(Neighbor discovery and stateless address autoconfiguration for Ipvh) 口a5 UGUIUE Ais te be compliant with Hr 48b1 (Neighbor discovery) and NC 48b2 b Uan strucure Uaa卜e mental ino lite ertan fan ran/native Art for retransmit omg t)wits uwrgestion control, RIT estimation IcP-beased tol/ layered ICP ("alto")for nearly transparent its for any os and PppoE (Point-to-point protocol over Serial/Ethernet Generated by区 oXygen1a1 图2-2IwP官方说明文档(HTML网页) 第7页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 a Inde of /ekeseswior x+ v 4 0 6 o download. savannannongnuorg'relea ☆☆夏 Indexof/releases/lwip/ 把s⊥ 17=2012 ttt⊥02101 My20110a01 更1L corarib-200FC24 03-Au20161202 totanh-2 0..21a.Le 中1 a3a 1pan2917092 1D429170925 tnb? main 25Sp291B1914 更业1围 2-5p2216)1 °6Me2011090a Isin-L4.0 2n.so IsiD-2.0,0.zins 10-an-20170925 y=201 Ihit-20.2. 2iD m1p-..41p3 Mip-1.0..ip Nn-2.0,3,2D5n 2-5p221 22-N0-2082005 图23LwP的资源下载 点击“ Download area”,会得到一个网页,如图2-3所示。通过这个网页,我们可以 下载到LwP所有版本的源代码包和 contrib包。你每点击一个红色字体的资源链接,浏览 器就公开启一个ftp连接,帮助你下载想要的文件到电脑中。但是这个页面提供的下载链 接,在国内一般是没有响应的。这个网页最下方的黑字内容推荐我们使用另外一个下载页 面:htt: download-mirror. savannah. gnu. org/releases。在这个页面下,用户可以下载到所有 在 Savannah托管的开源软件,但我们只关心LwP。利用浏览器的搜索功能,快捷键 CtH+,可以快速找到lwip日录。在这里为了方便读者,我们直接给出最终的下载链接 http://download-mirror.savannahgnuorg/rclcascs/lwip/o 可能有读者会问,什么是 contrib包,它与源代码包有什么不同?源代码包里面装的主 要是LwP内核的源码文件,而 contrib包里面装的是移植和应用LwP的一些deno,即应 用示例。 contrib包不属于LwIP内核的一部分,里面的很多内容来自开源社区的贡献,因 此 contrib包的版本管理不像内核源码那样严柊和规范,但也是很有参考价值的。按理说 LwIP源码面世越久,开源社区对它的贡献就越大,所以越高版本的 contrib包,提供的应 用示例就越丰富,越有参考价值。在大版本区别不大的情况下,建议大家下载最新的 contrib包。后续我们会对 contrib包里面提供的应用示例进行讲解。另外,还有些“sig” 后缀的文件,这是数字签名,大家忽略就好。 222LwP文件说明 按照上一小节的介绍,我们下载两个包:lwip-2.1.2.zip(源码包)和 contrib-2.0.zip ( contrib包)。解压以后会得到两个文件夹,如图24所示。 第8页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 contrib-2,1.0 2019/1/16星期三11:42文件夹 Iwip-2.1.2 2019/1/16星期=11:42文件夹 图2-4下载解压后得到的源码包和 contrib包 我们先打开“lwip-2.1.2”文件火,如图2-5所示。 名称 修改日期 类型 doc 2019/1/16星期文件夹 src 2019/1/16星期,文件夹 2019/1/16星期文件夹 口 CHANGELOG 2018/11/23呈期…文件 186K8 自 CMakeLists. txt 2018/10/25星期,文本文档 1 KB D COPYING 2017/1/13星期文件 2 KB LFEATURES 2018/10/25量期文件 2 KB 2018/10/25星期文件 1 KB D README 2018/10/25星期文件 5KB 口 UPGRADING 2018/9/25星期,文件 13 KB 图2-5源码包的目录 该目录的内容为: 1) CHANGELOG文件记录了LwIP在版本升级过程中源代码发牛的变化。 (2) COPYING文件记录了Lw这个开源软件的 license。一个软件开源,不代表你 能无限制地使用它,你需要在使用它的过程中遵守一定的规则,这些规则就是 licenseε大 家可以用记事本打开这个 COPYING文件看看它的内容。开源软件的 license有很多种, LwIP的属于 BSD License。LwIP的开源程度是很高的,你几乎可以无限制地使用它。 (3) FILES文件用于介绍当前目录下的目录信息。 4) README文件对LwP进行了一个简单的介绍。 (5) UPGRADING文件记录了LwIP每个大版木的更新,会对用户使用和栘植LwIP 造成的影响。所谓大版本更新指的是:1.3.x-1.4.X-2.0x-2.1x。小版本更新,比如20.1 2.0.2-20.3,这个过稈只是一些bug的修复和性能的改善,不会对用户的使用造成影响。 用户只要将原有工程的目汞中与LwP相关的旧版本文件替换成新版本的文件,重新编译 就能直接使用。 (6)doc文件夹里面是关于LwIP的一些文档,可以看成是应用和移植LwIP的指南 但是这些文档比较零散,不成体系,而且纯文本阅读起来很费劲,阅读意义不是很大 (7)tcst文件夹里面是测试Iw内核性能的源码,将它们和LwP源码加入到工程中 一起编译,调用它们提供的函数,可以获得许多与LwP内核性能有关的指标。这种内核 性能测试功能,只有非常专业的人上才用的到 (8)src文件夹里面就是我们最关心的LwP源码文件,下面会详细讲解 第9页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 打开src文件夹,如图2-6所示。 名称 修改日期 a 2019/1/16星期,文件夹 apps 2019/1/16星期文件夹 core 2019/1/16星期文件夹 include 2019/1/16星期,文件夹 netid 2019/1/16星期,文件夹 Filelists, cmake 2018/11/23星期, CMAKE文件 口 Filelists, mk 2018/10/25星期MK文件 FILES 2017/1/13星期…文件 图2-6src目录(LwP源码文件所在的目录 api文件夹里面装的是 NETCONN API和 Socket api相关的源文件,只有在操作系统的 环境中,才能被编译。 aps文件火里面装的是应用程序的源文件,包括常见的应用程序,如httd、mqtt p、snp、snp等。 core文件夹里面是LwP的内核源文件,后续会详细讲解。 include文件夹里面是LwP所有模块对应的头文件。 neif文件夹里面是与网卡移植有关的文件,这些文件为我们移植网卡提供了模板,我 们可以直接使用。 LwP內核是由一系列模块组合而成的,这些模块包括:TCP/P协议栈的各种协议、 内存管理模块、数捃包管理模块、网卡管模块、网卡接口模块、基础功能类模块、ΔPI 模块。每个模块是山相关的几个源文什和头文件组成的,通过头文件对外声明一些函数 宏、数据类型,使得其亡模块可以方便地调用比模垬的功能。而构成每个模块的头文件都 被组织在了 include目录中,而源文件则根据类型被分散地组织在api、apps、core、 netil目 录中。 接下来,我们介绍一下core文件夹,如图2-7所示。 第10页共426 【实例截图】
【核心代码】
野火出品的LwIP开发教程,基于STM32单片机,从TCP/IP原理到LwIP实战,例程多多,相对于现有的LwIP教程,更有针对性,适合入门学习
c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 应用层 FTP 主要使用TCP、 运输层 UDP协议 主要为IP、 网络层 ICMP、ARP协议 链路层 MAC层 主要定义物理 物理层 传输介质 图11TCP/P协议的分层 TCPP协议栈中不同协议所完成的功能是不一样的,某些协议的实现要依赖丁其它协 议,依据这种依赖关系,可以将协议栈分层。在图1-1中,低层协议为相邻的上层办议提 供服务,是上层协议得以实现的基础。 其中,物理层(PHY)规定了传输信号所需要的物理电平、介质特征;链路层(MAC) 规定了数据帧能被网卡接收的条件,最常见的方式是利用网卡的MAC地址,发送方会在 欲发送的数据帧的首部加上接收方树卡的MAC地址信息,接收方只有监听到属于自己的 MAC地址信息后,才会去接收并处理该数据;每台网络设备都应该有自己的网络地址,网 终层规定了上机的网终地址该如何定义,以及如何在网终地址和MAC地址之间进行映射, 即ARP协议;网终层实现了数据包在主机之间的传递,而一台主机内部可能运行着多个网 络程序,传输层可以区分数据包是属丁哪一个应用程序的,可以说传输层实现了数据包端 到端的传递。另外,数据包在传输过程中可能会出现丢包、乱序和重复的现象,网络层并 没有提供应对这些锖误的机制,而传输层可以解决这些问题,如TCP办议;应用层以下的 工作完成了数据的传递工作,应用层则决定了你如何应用和处理这些数据,之所以会有许 多的应用层协议,是因为互联网中传递的数据种类很多、差异很大、应用场景十分多样。 1.3协议层报文间的封装与拆封 本书的后面章节会对TCPP协议栈中的每层协议进行分析和讲解。在这里,我们以图 1-2简单解释一卜在数据的发送和接收过程中,TCPP都做了哪些事儿。 当用户发送数据时,将数据向下交给传输层,这是处于应用层的操作,应用层可以通 过调用传输层的接口来编写特定的应用程序。而 TCP/IP协议一般也会包含一些简单的应用 程序如τ eInet远程登录、FTP文件传输、SMTP邮件传输协议等。传输层会在数据前面加 上传输层首部(此处以TCP协议为例,图1-2的传输层首部为TCP首部,也可以是UDP 第3页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 首部),然后向下交给网络层。同样地,网络层会在数据前面加上网络层首部(IP首部), 然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在薮据前面加上链路 层首部(此处使用以太网接口为例),然后将数据交给冽卡。最后,网卡将数据转换成物 理链路上的电平信号,数据就这样被发送到了网络中。数据的发送过稈,可以概括为 TCPP的各层协议对数据进行封装的过程,如图1-2所示。 当设备的网卡接收到某个数据包后,它会将其放置在网卡的接收缓存中,并告知 TCPP内核。然后TCPP内核就开始工作了,它会将数据包从接收缓存中取出,并逐层 解析数据包中的协议首部信息,并最终将数据交给某个应用程序。数据的接收过程与发送 过稈正好相反,可以概括为 TCP/IP的各层协议对数据进行解析的过稈。 应用数据 >应用层 APP 首部应用数据 TCP APP 首部首部 应用数据 >传输层 TcP段 TCP APP 首部 首部 首部 应用数据 网络层 ===m== P数据报 ebbott 以太网 P TCP APP 首部应用数据 CRC 首部 首部 首部 链路层 14 20 20 4 以太网帧 45~1500字节 图1-2TCP/P协议栈各层的报文封装与拆封 第4页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 第2章LwP简介 本书使用最新的LwP2.1.2版本,官方下载链接:htp:/ savannah. nongnu. org/projects/lwip/s 21LwP的优缺点 本书以LwP2.1.2为主要对象进行讲解,后续中出现的LwIP如果没有特殊声明,均 指2.1.2版本。此时的LwP2.1.2为最新版本,可能当这本书写完的时候,LwIP又被更新 了,对于学习而言,大家其实不必纠结于是否必须用最新的版本,因为2.1.2版本和亡后面 的版本在移植和应用方法上并没有什么区别。 LwP全名: Light weight IP,意思是轻量化的TCPP协议,是瑞典计算机科学院 (SICS)的 Adam dunkels开发的一个小型开源的TCPP协议栈。LwP的设计初衷是:用少 量的资源消耗实现一个较为完整的TCPP协议栈,其中“完整”主要指的是TCP协议的 完整性,实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。此外LwP 既可以移植到操作系统上运行,也可以在无操作系统的情况卜独立运行 LwP具有主要特性 1.支持ARP协议(以太网地址解析协议)。 2.攴持ICM协议(控制报文协议),用于网络的调试与维护。 3.支持lGMP协议(互联网组管理协议),可以实现多播数据的接收。 4.支持UDP协议(用户数据报协议) 5.支持TCP协议(传输控制协议),包括阳塞控制、RTT估算、快速恢复和快速转发。 6.支持PP协议(点对点通信协议),支持 PPPOE 7.支持DNS(域名解析) 8.支持DHCP协议,动态分配IP地址 9.支持P协议,包括IPV4、IPv6协议,支持I分片与重装功能,多网络接口下的 数据包转发。 10.支持SNMP协议(简单网络管理协议) 11.支持 AUTOIP,自动P地址配置。 12.提供专门的内部回调接口( Raw aPl,用于提高应用程序性能 13.提供可选择的 Berkeley接口APl,即 Socket套接字(在多线稈情况下使用)。 LwP在嵌入式中使用有以下优点 1.资源开销低,即轻量化。IwP内核有自凵的內存管理策略和薮据包管理策略,使 得内核处理数据包的效率很高。另外,LwP高度可剪裁,一切不需要的功能都可 以通过宏编译选项去掉。LwIP的流畅运行需要40KB的代码ROM和几十KB的 RAM,这让它非常适合用在内存资源受限的嵌入式设备中。 2.所支持的协议较为完整。几乎支持TCPP中所有常见的协议,这在嵌入式设备中 早已够用 第5页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M4/7)开发板 3.实现了一些常见的应用程序:DHCP客户端、DNS客户端、HITP服务器、 MQTT客户端、TFTP服务器、SNTP客户端等等。 4.同时提供了三种编程接口: RAW API、 NETCONN API(注: NETCONN API即 为 Sequential API,为了统一,下文均采用 NETCONN API)和 Socket aPi。这三 种API的执行效率、易用性、可移植性以及时空间的开销各不相同,用户可以根 据实际需要,平衡利弊,选择合适的API进行网络应用程序的开发 5.高度可栘植。其源代码仝部用C实现,用户可以很方便地实现跨处理器、跨编译 器的栘植。另外,它对内核中会使用到操作系统功能的地方进行了抽象,使用了 套自定义的API,用户可以通过自己实现这些API,从而实现跨操作系统的移 植工作。 6.丌源、免费,用户可以不用承担任何商业风险地使用它。 7.相比于嵌入式领域其它的TCP/P协议栈,比如uC-TCP/P、 FreeRTos-TCP等, LwIP的发展历史要更悠久一些,得到了更多的验证和测试。LwP被广泛用在嵌 入式网络设备中,国内一些物联网公司推出的物联网操作系统,其 TCP/IP核心就 是LwP;物联网知名的Wii模块ESP8266,其TCPP固件,使用的就是LwP LwP尽管有如此多的优点,但它毕竞是为嵌入式而生,所以并没有很完整地实现 TCPP协议栈。相比于 Linux和 Windows系统自带的TCPP协议栈,LwIP的功能不算完 整和强大。但对于大多数物联网领域的网络应用程序,LwP已经足够了。 22LwIP的文件说明 2.2.1如何获取LwIP源码文件 LwP的代码己经交给 Savannah托管,LwIP的项日主页是: htt: savannah. nongnu.org/ projects/wip这个主页简单地介绍了一下LwP,然后给出了许 多链接,你可以通过这些链接去挖掘更多关于LwIP的信息。在这里,我们只关注两个地 方,如图2-1中的方框所示 第6页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 Quick Overvi ◎ Project Homepage U Download Area &3 Project memberlist(35 members) Project Member GPG Keyring Communication tools Mailing Lists(3 public mailing lists Development tools Git Repository Browse Sources Repository L cvs Repository Browse Web Pages Repository o Bug Tracker (open items: 23, total: 1320) Browse open items Submit a new item 图21LwP项目主页截图 点击“ Project Homepage”,会得到一个网页,如图2-2所示。这个网页可以看成是 LwIP的官方说明文档。我们可以通过这个网页获得关于IwP的很多信息,包括LwIP的 使用注意、数扼的拷贝、系统初始化流程、多线程中要注意的问题、优化方法、内核模块 的分类介绍、内核数据结枃、内核重要全局变量、内核源码文件等。这些内容专业性比较 强,不建议初学时在它上面花费精力,并且里面的很多内容在我们教材的后续章节中中会 有所讲解。在这里,读者只要知道有这么个东丙就行了 口wF: oven 命wwww.rongruoeglnip htweight IP stack Main Page ReLated Pag Modules Dat$ tructures=问 LwIP ts a small indeperdent implementation of the TCP/IP protocol suite U减 the focus ef the lwIP ICP/IP implementation is to reduce the RA usage ile still having a full scale TCP, This making IvIp suitable for us How la contre to NIP n embedded systems with tens of kilobytes of free RAM and room for ground 4e kilobytes of code ROM Recoding b wIp was originally developed by Adam Dunkels at the Computer and Networks Architectures (CA) lab at the Swedish Institute of Computer science (sIcS) and i, now developed and meintained by a worldwide network of developers EFATURGS IP (Internet Protocol, IPy4 and IPv6)including packet forwarding ov ltiple network interfaces MP(Internet Control Message protocol) for network mai ntenance and dehugging InhasincLre ND(Neighbor discovery and stateless address autoconfiguration for Ipvh) 口a5 UGUIUE Ais te be compliant with Hr 48b1 (Neighbor discovery) and NC 48b2 b Uan strucure Uaa卜e mental ino lite ertan fan ran/native Art for retransmit omg t)wits uwrgestion control, RIT estimation IcP-beased tol/ layered ICP ("alto")for nearly transparent its for any os and PppoE (Point-to-point protocol over Serial/Ethernet Generated by区 oXygen1a1 图2-2IwP官方说明文档(HTML网页) 第7页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 a Inde of /ekeseswior x+ v 4 0 6 o download. savannannongnuorg'relea ☆☆夏 Indexof/releases/lwip/ 把s⊥ 17=2012 ttt⊥02101 My20110a01 更1L corarib-200FC24 03-Au20161202 totanh-2 0..21a.Le 中1 a3a 1pan2917092 1D429170925 tnb? main 25Sp291B1914 更业1围 2-5p2216)1 °6Me2011090a Isin-L4.0 2n.so IsiD-2.0,0.zins 10-an-20170925 y=201 Ihit-20.2. 2iD m1p-..41p3 Mip-1.0..ip Nn-2.0,3,2D5n 2-5p221 22-N0-2082005 图23LwP的资源下载 点击“ Download area”,会得到一个网页,如图2-3所示。通过这个网页,我们可以 下载到LwP所有版本的源代码包和 contrib包。你每点击一个红色字体的资源链接,浏览 器就公开启一个ftp连接,帮助你下载想要的文件到电脑中。但是这个页面提供的下载链 接,在国内一般是没有响应的。这个网页最下方的黑字内容推荐我们使用另外一个下载页 面:htt: download-mirror. savannah. gnu. org/releases。在这个页面下,用户可以下载到所有 在 Savannah托管的开源软件,但我们只关心LwP。利用浏览器的搜索功能,快捷键 CtH+,可以快速找到lwip日录。在这里为了方便读者,我们直接给出最终的下载链接 http://download-mirror.savannahgnuorg/rclcascs/lwip/o 可能有读者会问,什么是 contrib包,它与源代码包有什么不同?源代码包里面装的主 要是LwP内核的源码文件,而 contrib包里面装的是移植和应用LwP的一些deno,即应 用示例。 contrib包不属于LwIP内核的一部分,里面的很多内容来自开源社区的贡献,因 此 contrib包的版本管理不像内核源码那样严柊和规范,但也是很有参考价值的。按理说 LwIP源码面世越久,开源社区对它的贡献就越大,所以越高版本的 contrib包,提供的应 用示例就越丰富,越有参考价值。在大版本区别不大的情况下,建议大家下载最新的 contrib包。后续我们会对 contrib包里面提供的应用示例进行讲解。另外,还有些“sig” 后缀的文件,这是数字签名,大家忽略就好。 222LwP文件说明 按照上一小节的介绍,我们下载两个包:lwip-2.1.2.zip(源码包)和 contrib-2.0.zip ( contrib包)。解压以后会得到两个文件夹,如图24所示。 第8页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 contrib-2,1.0 2019/1/16星期三11:42文件夹 Iwip-2.1.2 2019/1/16星期=11:42文件夹 图2-4下载解压后得到的源码包和 contrib包 我们先打开“lwip-2.1.2”文件火,如图2-5所示。 名称 修改日期 类型 doc 2019/1/16星期文件夹 src 2019/1/16星期,文件夹 2019/1/16星期文件夹 口 CHANGELOG 2018/11/23呈期…文件 186K8 自 CMakeLists. txt 2018/10/25星期,文本文档 1 KB D COPYING 2017/1/13星期文件 2 KB LFEATURES 2018/10/25量期文件 2 KB 2018/10/25星期文件 1 KB D README 2018/10/25星期文件 5KB 口 UPGRADING 2018/9/25星期,文件 13 KB 图2-5源码包的目录 该目录的内容为: 1) CHANGELOG文件记录了LwIP在版本升级过程中源代码发牛的变化。 (2) COPYING文件记录了Lw这个开源软件的 license。一个软件开源,不代表你 能无限制地使用它,你需要在使用它的过程中遵守一定的规则,这些规则就是 licenseε大 家可以用记事本打开这个 COPYING文件看看它的内容。开源软件的 license有很多种, LwIP的属于 BSD License。LwIP的开源程度是很高的,你几乎可以无限制地使用它。 (3) FILES文件用于介绍当前目录下的目录信息。 4) README文件对LwP进行了一个简单的介绍。 (5) UPGRADING文件记录了LwIP每个大版木的更新,会对用户使用和栘植LwIP 造成的影响。所谓大版本更新指的是:1.3.x-1.4.X-2.0x-2.1x。小版本更新,比如20.1 2.0.2-20.3,这个过稈只是一些bug的修复和性能的改善,不会对用户的使用造成影响。 用户只要将原有工程的目汞中与LwP相关的旧版本文件替换成新版本的文件,重新编译 就能直接使用。 (6)doc文件夹里面是关于LwIP的一些文档,可以看成是应用和移植LwIP的指南 但是这些文档比较零散,不成体系,而且纯文本阅读起来很费劲,阅读意义不是很大 (7)tcst文件夹里面是测试Iw内核性能的源码,将它们和LwP源码加入到工程中 一起编译,调用它们提供的函数,可以获得许多与LwP内核性能有关的指标。这种内核 性能测试功能,只有非常专业的人上才用的到 (8)src文件夹里面就是我们最关心的LwP源码文件,下面会详细讲解 第9页共426 c野火 LwIP应用开发实战指南 一基于野火STM32全系列(M47)开发板 打开src文件夹,如图2-6所示。 名称 修改日期 a 2019/1/16星期,文件夹 apps 2019/1/16星期文件夹 core 2019/1/16星期文件夹 include 2019/1/16星期,文件夹 netid 2019/1/16星期,文件夹 Filelists, cmake 2018/11/23星期, CMAKE文件 口 Filelists, mk 2018/10/25星期MK文件 FILES 2017/1/13星期…文件 图2-6src目录(LwP源码文件所在的目录 api文件夹里面装的是 NETCONN API和 Socket api相关的源文件,只有在操作系统的 环境中,才能被编译。 aps文件火里面装的是应用程序的源文件,包括常见的应用程序,如httd、mqtt p、snp、snp等。 core文件夹里面是LwP的内核源文件,后续会详细讲解。 include文件夹里面是LwP所有模块对应的头文件。 neif文件夹里面是与网卡移植有关的文件,这些文件为我们移植网卡提供了模板,我 们可以直接使用。 LwP內核是由一系列模块组合而成的,这些模块包括:TCP/P协议栈的各种协议、 内存管理模块、数捃包管理模块、网卡管模块、网卡接口模块、基础功能类模块、ΔPI 模块。每个模块是山相关的几个源文什和头文件组成的,通过头文件对外声明一些函数 宏、数据类型,使得其亡模块可以方便地调用比模垬的功能。而构成每个模块的头文件都 被组织在了 include目录中,而源文件则根据类型被分散地组织在api、apps、core、 netil目 录中。 接下来,我们介绍一下core文件夹,如图2-7所示。 第10页共426 【实例截图】
【核心代码】