logo资料库

《LwIP应用开发实战指南—基于野火 i.MX RT系列开发板》.pdf

第1页 / 共430页
第2页 / 共430页
第3页 / 共430页
第4页 / 共430页
第5页 / 共430页
第6页 / 共430页
第7页 / 共430页
第8页 / 共430页
资料共430页,剩余部分请下载后查看
前言
如何学习本书
本书的参考资料
本书的技术论坛
第1章 网络协议简介
1.1 常用网络协议
1.2 网络协议的分层模型
1.3 协议层报文间的封装与拆封
第2章 LwIP简介
2.1 LwIP的优缺点
2.2 LwIP的文件说明
2.2.1 如何获取LwIP源码文件
2.2.2 LwIP文件说明
2.3 查看LwIP的说明文档
2.4 使用vscode查看源码
2.4.1 查看文件中的符号列表(函数列表)
2.4.2 函数定义跳转
2.5 LwIP源码里的example
2.6 LwIP的三种编程接口
2.6.1 RAW/Callback API
2.6.2 NETCONN API
2.6.3 SOCKET API
第3章 开发平台介绍
3.1 以太网简介
3.1.1 PHY层
1. 传输介质
2. 编码
3. CSMA/CD 冲突检测
3.1.2 MAC子层
1. MAC的功能
2. MAC 数据包
3.2 i.MX RT的ENET外设
3.3 ENET信号引脚介绍
3.4 PHY:LAN8720A
3.5 硬件设计
第4章 LwIP的网络接口管理
4.1 netif结构体
4.2 netif使用
4.3 与netif相关的底层函数
4.4 enet_ethernetif.c文件内容
4.4.1 ethernetif数据结构
4.4.2 ethernetif_init()
4.4.3 ethernetif_enet_init ()
第5章 LwIP的内存管理
5.1 几种内存分配策略
5.1.1 固定大小的内存块
5.1.2 可变长度分配
5.2 动态内存池(POOL)
5.2.1 内存池的预处理
5.2.2 内存池的初始化
5.2.3 内存分配
5.2.4 内存释放
5.3 动态内存堆
5.3.1 内存堆的组织结构
5.3.2 内存堆初始化
5.3.3 内存分配
5.3.4 内存释放
5.4 使用C库的malloc和free来管理内存
5.5 LwIP中的配置
第6章 网络数据包
6.1 TCP/IP协议的分层思想
6.2 LwIP的线程模型
6.3 pbuf结构体说明
6.4 pbuf的类型
6.4.1 PBUF_RAM类型的pbuf
6.4.2 PBUF_POOL类型的pbuf
6.4.3 PBUF_ROM和PBUF_REF类型pbuf
6.5 pbuf_alloc()
6.6 pbuf_free()
6.7 其它pbuf操作函数
6.7.1 pbuf_realloc()
6.7.2 pbuf_header()
6.7.3 pbuf_take()
6.8 网卡中使用的pbuf
6.8.1 ethernetif_linkoutput()
6.8.2 ethernetif_linkinput()
6.8.3 ethernetif_input()
第7章 无操作系统移植LwIP
7.1 将LwIP添加到裸机工程
7.2 移植头文件
7.3 移植网卡驱动
7.4 LwIP时基
7.5 协议栈初始化
7.6 获取数据包
7.6.1 查询方式
7.6.2 ping命令详解
7.6.3 中断方式
第8章 有操作系统移植LwIP
8.1 LwIP中添加操作系统
8.1.1 拷贝FreeRTOS源码到工程文件夹
8.1.2 添加FreeRTOS源码到工程组文件夹
8.1.3 指定FreeRTOS头文件的路径
8.1.4 修改bsp_systick.c
8.2 lwipopts.h文件需要加入的配置
8.3 sys_arch.c/h文件的编写
8.4 网卡底层的编写
8.5 协议栈初始化
8.6 移植后使用ping测试基本响应
第9章 LwIP一探究竟
9.1 网卡接收数据的流程
9.2 内核超时处理
9.2.1 sys_timeo结构体与超时链表
9.2.2 注册超时事件
9.2.3 超时检查
9.3 tcpip_thread线程
9.4 LwIP中的消息
9.4.1 消息结构
9.4.2 数据包消息
9.4.3 API消息
9.5 揭开LwIP神秘的面纱
第10章 ARP协议
10.1 链路层概述
10.2 MAC地址的基本概念
10.3 初识ARP
10.4 以太网帧结构
10.5 IP地址映射为物理地址
10.6 ARP缓存表
10.7 ARP缓存表的超时处理
10.8 ARP报文
10.9 发送ARP请求包
10.10 数据包接收流程
10.10.1 以太网之数据包接收
10.10.2 ARP数据包处理
10.10.3 更新ARP缓存表
10.11 数据包发送流程
10.11.1 etharp_output()函数
10.11.2 etharp_output_to_arp_index()函数
10.11.3 etharp_query()函数
第11章 IP协议
11.1 IP地址
11.1.1 概述
11.1.2 IP地址编址
11.1.3 特殊IP地址
1. 受限广播地址
2. 直接广播地址
3. 多播地址
4. 环回地址
5. 本网络本主机
11.2 局域网和广域网的概念
11.2.1 什么是局域网
11.2.2 什么是广域网
11.3 网络地址转换(NAT)
11.4 IP数据报
11.5 IP数据报的数据结构
11.6 IP数据报分片
11.7 IP数据报发送
11.8 IP数据报接收
第12章 网际控制报文协议ICMP
12.1 ICMP功能简介
12.2 ICMP报文结构
12.3 ICMP报文类型
12.3.1 ICMP差错报告报文
1. 目的不可达
2. 源站抑制
3. 重定向
4. 超时
5. 参数错误
12.3.2 ICMP查询报文
12.4 LwIP中的ICMP实现
12.4.1 ICMP报文数据结构
12.4.2 发送ICMP差错报文
12.4.3 处理ICMP报文
第13章 TCP协议
13.1 TCP服务简介
13.2 TCP的特性
13.2.1 连接机制
13.2.2 确认与重传
13.2.3 缓冲机制
13.2.4 全双工通信
13.2.5 流量控制
13.2.6 差错控制
13.2.7 拥塞控制
13.3 端口号的概念
13.4 TCP报文段结构
13.4.1 TCP报文段的封装
13.4.2 TCP报文段格式
13.5 TCP连接
13.5.1 “三次握手”建立连接
13.5.2 “四次挥手”终止连接
13.6 TCP状态
13.6.1 LwIP中定义的TCP状态
13.6.2 TCP状态转移
1. 三次握手过程
2. 四次挥手过程
13.7 TCP中的数据结构
13.8 窗口的概念
13.8.1 接收窗口
13.8.2 发送窗口
13.9 TCP报文段处理
13.9.1 报文段缓冲队列
13.9.2 TCP报文段发送
13.9.3 TCP报文段接收
第14章 UDP协议
14.1 UDP协议简介
14.2 UDP常用端口号
14.3 UDP报文
14.4 UDP报文的数据结构
14.4.1 UDP报文首部结构体
14.4.2 UDP控制块
14.5 UDP报文发送
14.6 UDP报文接收
第15章 使用NETCONN接口编程
15.1 netbuf结构体
15.2 netbuf相关函数说明
15.2.1 netbuf_new()
15.2.2 netbuf_delete()
15.2.3 netbuf_alloc()
15.2.4 netbuf_free()
15.2.5 netbuf_ref()
15.2.6 netbuf_chain()
15.2.7 netbuf_data()
15.2.8 netbuf_next()与netbuf_first()
15.2.9 netbuf_copy()
15.2.10 netbuf_take()
15.2.11 其他操作netbuf的宏定义
15.3 netconn结构体
15.4 netconn函数接口说明
15.4.1 netconn_new()
15.4.2 netconn_delete()
15.4.3 netconn_getaddr()
15.4.4 netconn_bind()
15.4.5 netconn_connect()
15.4.6 netconn_disconnect()
15.4.7 netconn_listen()
15.4.8 netconn_accept()
15.4.9 netconn_recv()
15.4.10 netconn_send()
15.4.11 netconn_sendto()
15.4.12 netconn_write()
15.4.13 netconn_close()
15.5 实验
15.5.1 TCP Client
15.5.2 TCP Client实验现象
15.5.3 TCP Server
15.5.4 TCP Server实验现象
15.5.5 UDP
15.5.6 UDP实验现象
第16章 使用Socket接口编程
16.1 什么是Socket
16.2 LwIP中的Socket
16.3 Socket API
16.3.1 socket()
16.3.2 bind()
16.3.3 connect()
16.3.4 listen()
16.3.5 accept()
16.3.6 read()、recv()、recvfrom()
16.3.7 sendto()
16.3.8 send()
16.3.9 write()
16.3.10 close()
16.3.11 ioctl()、ioctlsocket()
16.3.12 setsockopt()
16.3.13 getsockopt()
16.4 实验
16.4.1 TCP Client
16.4.2 TCP Server
16.4.3 UDP
第17章 使用RAW API接口编程
17.1 RAW API的UDP编程
17.1.1 新建控制块udp_new()
17.1.2 绑定控制块udp_bind()
17.1.3 建立会话udp_connect()
17.1.4 断开会话udp_disconnect()
17.1.5 接收数据udp_recv()
17.1.6 发送数据udp_send()与udp_sendto()
17.1.7 删除UDP控制块udp_remove()
17.2 RAW API的TCP编程
17.2.1 新建控制块tcp_new()
17.2.2 绑定控制块tcp_bind()
17.2.3 控制块监听tcp_listen()
17.2.4 处理连接tcp_accept()
17.2.5 建立连接tcp_connect()
17.2.6 终止连接tcp_close()
17.2.7 接收数据tcp_recv()
17.2.8 发送数据tcp_sent()
17.2.9 异常处理tcp_err()
17.2.10 周期性回调tcp_poll()
17.2.11 构建报文段tcp_write()
17.2.12 更新接收窗口tcp_recved()
17.3 实验
17.3.1 TCP Client
17.3.2 TCP Server
17.3.3 UDP
第18章 使用JPerf工具测试网速
18.1 iPerf与JPerf
18.2 测试网络速度
18.2.1 获取JPerf网络测速工具
18.2.2 测试开发板接收速度(NETCONN API)
18.2.3 测试开发板接收速度(Socket API)
18.2.4 测试开发板发送速度(NETCONN API)
18.2.5 测试开发板发送速度(Socket API)
18.3 提高LwIP网络传输的速度
第19章 HTTP协议
19.1 什么是HTTP协议?
19.2 URL与资源
19.3 HTTP报文
19.4 使用Postman获取论坛数据
19.5 使用开发板获取论坛数据
第20章 HTTP服务器
20.1 Hello World 网页demo
20.2 提供网页控制LED灯开关的功能
第21章 MQTT协议
21.1 MQTT协议简介
21.2 MQTT通信模型
21.3 消息主题与服务质量
21.4 MQTT控制报文
21.4.1 固定报头
21.4.2 可变报头
1. CONNECT
2. CONNACK
21.4.3 有效载荷
21.5 移植MQTT协议
21.6 cJSON移植
第22章 连接到百度天工物接入
22.1 物接入简介
22.2 使用IoT Hub
22.2.1 创建计费套餐
22.2.2 创建项目
22.2.3 创建策略
22.2.4 创建身份与创建用户
22.2.5 MQTT软件测试连接
22.3 开发板连接IoT Hub
22.4 IoT Hub的规则引擎
22.4.1 什么是规则引擎
22.4.2 使用规则引擎
22.5 数据可视化
22.5.1 IoT Hub的时序数据库
22.5.2 IoT Hub的物可视
第23章 连接到阿里云物联
23.1 使用阿里云物联
23.2 MQTT软件测试连接
23.3 开发板连接阿里云物联
23.4 阿里云物联的规则引擎
第24章 连接到OneNET
24.1 使用OneNET
24.2 测试连接
24.3 开发板连接OneNET
24.4 添加数据流
24.5 系统主题的发布格式
24.6 使用开发板发布数据点
24.7 数据可视化
联系我们
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 前言 如何学习本书 本书围绕 LwIP 2.1.2 版本源码进行讲解,讲解 TCP/IP 网络协议栈的基本知识,带领读 者走入网络的世界。无论你是学生、嵌入式开发者亦或者是物联网开发者,都可以从本书 中学习到网络的知识,了解网络协议栈的处理的思想,本书将深入分析网络协议栈的原理 与实现过程,如 ARP、IP、ICMP、TCP、UDP、HTTP、MQTT 等协议。本书还将深入讲 解 LwIP 中内存管理、pbuf 数据包、网卡接口管理的原理与实现,并详细介绍 LwIP 的移植 过程,读者可以将其移植到无操作系统/有操作系统中的环境中使用。 除此之外,本书还通过理论和实践相结合,使用 LwIP 接入当前最大的云平台,如阿 里云、百度云、OneNET,最终达到熟练掌握。在本书中,读者可以熟练掌握 LwIP 中 NETCONN API 与 Socket API 的使用方式,并且掌握多种网络调试工具,如 Wireshark、 Postman 以及 MQTT.fx 等。 全书内容循序渐进,不断迭代,在学习的时候建议做到两点:一是不能一味地看书, 要把代码和理论结合起来学习,一边看书,一边调试代码。通过执行每一条程序,看看程 序的执行流程和执行效果与自己想的是不是一样;二是在每学完一章之后,必须将配套的 例程重写一遍(抄也可以,切记不要复制,哪怕是一个符号),举一反三,确保真正理解。 本书的参考资料 1. LwIP 官方源代码 2. 《i.MX RT 库开发实战指南》(电子版) 3. 《FreeRTOS 内核实现与应用开发实战指南》(电子版) 本书的技术论坛 如果在学习过程中遇到问题,可以到野火电子论坛:www.firebbs.cn 发帖交流 ,开源 共享,共同进步。 鉴于水平有限,本书难免有纰漏,热心的读者也可把勘误发到论坛好让我们改进做得 更好,祝您学习愉快,LwIP 的世界,野火与您同行。 第 1 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 第1章 网络协议简介 1.1 常用网络协议 互联网对人类社会产生的巨大变革,大家是有目共睹的,它几乎改变了人类生活的方 方面面。互联网通信的本质是数字通信,任何数字通信都离不开通信协议的制定,通信设 备只有按照约定的、统一的方式去封装和解析信息,才能实现通信。互联网通信所要遵守 的众多协议,被统称为 TCP/IP。 TCP/IP 是一个协议族,包含众多的协议。但对于网络应用开发人员,可能听到更多的 是其中的应用层协议,比如 HTTP、FTP、MQTT 等。 HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,HTTP 的应用最 为广泛。比如大家日常使用电脑时的一个常规操作:打开电脑,打开浏览器,输入网址, 最后按下回车,这一刻你就开启了 HTTP 通信。HTTP 协议工作于<客户端-服务端>架构之 上,(服务端也称作为服务器端,除非特别说明,否则本书出现的“服务端”即为“服务 器端”),浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请 求。Web 服务器根据接收到的请求后,向客户端发送响应信息。借助这种浏览器和服务器 之间的 HTTP 通信,我们能够足不出户地获得来自世界各个角落的信息。另外,网页不仅 仅是大型服务器的专利, 在物联网风潮盛行的今天,许多随处可见的小型设备(空调、冰 箱、插座、路由器等),都内嵌网页,在物理链路畅通的情况下,用户可以用手机、平板 电脑上的浏览器随时随地监控这些设备。 FTP(File Transfer Protocol)是文件传输协议的简称。FTP 是工作在应用层的网络协议。 FTP 使得主机间可以共享文件,用于在两台设备之间传输文件(双向传输)。它也是一个 客户端-服务端框架系统。用户可以通过一个支持 FTP 协议的客户端程序,连接到在远程主 机上的 FTP 服务端程序,通过客户端程序向服务端程序发出命令,服务端程序执行用户所 发出的命令,并将执行的结果返回到客户机。FTP 除了基本的文件上传/下载功能外,还有 目录操作、权限设置、身份验证机制,许多网盘的文件传输功能都是基于 FTP 实现的。 在物联网发展的处期,物联网场景中的设备使用何种应用层协议进行通信一直是备受 争议的话题。很多开发人员习惯了网页的开发模式,于是经常选择 HTTP 作为通信方式。 使用 HTTP 有以下不利因素:HTTP 是一种同步协议,设备需要等待服务器的响应才可以 进行下一步的工作,然而在设备数量多、网络不可靠的场景下,实现同步通信很困难; HTTP 是单向的,设备只能主动向服务器发出数据,无法被动的接收来自网络的数据,这 不适用于实时控制的场合;HTTP 是有许多帧头和规则的重量级协议,实现在设备中需要 耗费大量的系统资源。基于上述的形势,MQTT 和 COAP 等轻量级、异步的通信协议便得 到了物联网设备开发商的宠爱,尤其是 MQTT。MQTT(消息队列遥测传输)是 IBM 公司 于 1990 年设计并推出的一款通信协议,于 2014 年正式成为了一个 OASIS 开放标准。近年 来,MQTT 的应用呈现出爆炸性的增长势头,大有一统物联网的趋势。另外,MQTT 在物 联网以外的其他领域也得到了广泛的应用,比如许多公司在制作手机 APP 时,会使用 MQTT 来实现消息推送、即时聊天等功能。 第 2 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 嵌入式设备接入互联网的需求越来越大,有以下几点原因: (1)近些年,各种带网络接入功能的 MCU、SoC 层出不穷,开源轻量的 TCP/IP 协议栈 日趋成熟和完善,云平台的市场越来越繁荣,这些因素大大降低了嵌入式设备的入网成本, 也为许多资源受限的低端设备接入互联网提供了可能。 (2)“物联网+”的风潮日渐盛行,设备能够被远程监控,这一点已经成为许多产品 的技术要求。 (3)人们对于设备“智能性”的追求越来越高,当今热门的大数据、图像处理、语音 识别、机器学习等功能都可以被集成在云端,成为云平台能提供的服务。终端设备大多是 计算、存储能力有限的设备,这些设备如果想要获取“智能”,最便捷的办法就是接入云 平台,利用各项云服务。 互联网的基础就是 TCP/IP。TCP/IP 是一个非常复杂的协议族,即便我们能把它的设计 思想和实现原理都解释得清清楚楚,你也不见得有时间和精力去学习它,所以本书的写作 重点不在于对 TCP/IP 的解读,而在于对它的应用。另外,TCP/IP 的复杂性也决定了它并 不是那么简单就能用好的东西,即便我们只关注应用开发,也依然需要对它的许多概念和 设计思想有所了解,才能编写出正确、高效、健壮性好的应用程序。 希望能借此书,让嵌入式开发工程师们以浓厚的兴趣和清晰的视野,搭上物联网发展 的快车。 1.2 网络协议的分层模型 TCP/IP 是一个庞大的协议族,它是众多网络协议的集合,包括:ARP、IP、ICMP、 UDP、TCP、DNS、DHCP、HTTP、FTP、MQTT 等等。这些协议按照功能,可以被划分 为几个不同的层次,如图 1-1 所示。我们在上一节中介绍的 HTTP、FTP、MQTT,它们隶 属于应用层。那么 TCP/IP 为什么需要分层,分层又是依靠什么依据呢? 第 3 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 应用层 运输层 网络层 链路层 物理层 DNS、HTTP、 FTP、 主要使用 TCP、 UDP 协议 主要为 IP、 ICMP、ARP 协议 MAC 层 主要定义物理 传输介质 图 1-1 TCP/IP 协议的分层 TCP/IP 协议栈中不同协议所完成的功能是不一样的, 某些协议的实现要依赖于其它协 议,依据这种依赖关系,可以将协议栈分层。在图 1-1 中,低层协议为相邻的上层协议提 供服务,是上层协议得以实现的基础。 其中,物理层(PHY)规定了传输信号所需要的物理电平、介质特征;链路层(MAC) 规定了数据帧能被网卡接收的条件,最常见的方式是利用网卡的 MAC 地址,发送方会在 欲发送的数据帧的首部加上接收方网卡的 MAC 地址信息,接收方只有监听到属于自己的 MAC 地址信息后,才会去接收并处理该数据;每台网络设备都应该有自己的网络地址,网 络层规定了主机的网络地址该如何定义,以及如何在网络地址和 MAC 地址之间进行映射, 即 ARP 协议;网络层实现了数据包在主机之间的传递,而一台主机内部可能运行着多个网 络程序,传输层可以区分数据包是属于哪一个应用程序的,可以说传输层实现了数据包端 到端的传递。另外,数据包在传输过程中可能会出现丢包、乱序和重复的现象,网络层并 没有提供应对这些错误的机制,而传输层可以解决这些问题,如 TCP 协议;应用层以下的 工作完成了数据的传递工作,应用层则决定了你如何应用和处理这些数据,之所以会有许 多的应用层协议,是因为互联网中传递的数据种类很多、差异很大、应用场景十分多样。 1.3 协议层报文间的封装与拆封 本书的后面章节会对 TCP/IP 协议栈中的每层协议进行分析和讲解。在这里,我们以图 1-2 简单解释一下在数据的发送和接收过程中,TCP/IP 都做了哪些事儿。 当用户发送数据时,将数据向下交给传输层,这是处于应用层的操作,应用层可以通 过调用传输层的接口来编写特定的应用程序。而 TCP/IP 协议一般也会包含一些简单的应用 程序如 Telnet 远程登录、FTP 文件传输、 SMTP 邮件传输协议等。传输层会在数据前面加 上传输层首部(此处以 TCP 协议为例,图 1-2 的传输层首部为 TCP 首部,也可以是 UDP 第 4 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 首部),然后向下交给网络层。同样地,网络层会在数据前面加上网络层首部(IP 首部), 然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路 层首部(此处使用以太网接口为例),然后将数据交给网卡。最后,网卡将数据转换成物 理链路上的电平信号,数据就这样被发送到了网络中。数据的发送过程,可以概括为 TCP/IP 的各层协议对数据进行封装的过程,如图 1-2 所示。 当设备的网卡接收到某个数据包后,它会将其放置在网卡的接收缓存中,并告知 TCP/IP 内核。然后 TCP/IP 内核就开始工作了,它会将数据包从接收缓存中取出,并逐层 解析数据包中的协议首部信息,并最终将数据交给某个应用程序。数据的接收过程与发送 过程正好相反,可以概括为 TCP/IP 的各层协议对数据进行解析的过程。 图 1-2 TCP/IP 协议栈各层的报文封装与拆封 第 5 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 第2章 LwIP 简介 本书使用最新的 LwIP 2.1.2 版本,官方下载链接:http://savannah.nongnu.org/projects/lwip/。 2.1 LwIP 的优缺点 本书以 LwIP 2. 1.2 为主要对象进行讲解,后续中出现的 LwIP 如果没有特殊声明,均 指 2.1.2 版本。此时的 LwIP 2. 1.2 为最新版本,可能当这本书写完的时候,LwIP 又被更新 了,对于学习而言,大家其实不必纠结于是否必须用最新的版本,因为 2.1.2 版本和它后面 的版本在移植和应用方法上并没有什么区别。 LwIP 全名:Light weight IP,意思是轻量化的 TCP/IP 协议,是瑞典计算机科学院 (SICS)的 Adam Dunkels 开发的一个小型开源的 TCP/IP 协议栈。LwIP 的设计初衷是:用少 量的资源消耗实现一个较为完整的 TCP/IP 协议栈,其中“完整”主要指的是 TCP 协议的 完整性,实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。此外 LwIP 既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。 LwIP 具有主要特性: 1. 支持 ARP 协议(以太网地址解析协议)。 2. 支持 ICMP 协议(控制报文协议),用于网络的调试与维护。 3. 支持 IGMP 协议(互联网组管理协议),可以实现多播数据的接收。 4. 支持 UDP 协议(用户数据报协议)。 5. 支持 TCP 协议(传输控制协议),包括阻塞控制、RTT 估算、快速恢复和快速转发。 6. 支持 PPP 协议(点对点通信协议),支持 PPPoE。 7. 支持 DNS(域名解析)。 8. 支持 DHCP 协议,动态分配 IP 地址。 9. 支持 IP 协议,包括 IPv4、IPv6 协议,支持 IP 分片与重装功能,多网络接口下的 数据包转发。 10. 支持 SNMP 协议(简单网络管理协议)。 11. 支持 AUTOIP,自动 IP 地址配置。 12. 提供专门的内部回调接口(Raw API),用于提高应用程序性能。 13. 提供可选择的 Socket API、NETCONN API (在多线程情况下使用) 。 LwIP 在嵌入式中使用有以下优点: 1. 资源开销低,即轻量化。LwIP 内核有自己的内存管理策略和数据包管理策略,使 得内核处理数据包的效率很高。另外,LwIP 高度可剪裁,一切不需要的功能都可 以通过宏编译选项去掉。LwIP 的流畅运行需要 40KB 的代码 ROM 和几十 KB 的 RAM,这让它非常适合用在内存资源受限的嵌入式设备中。 2. 支持的协议较为完整。几乎支持 TCP/IP 中所有常见的协议,这在嵌入式设备中早 已够用。 第 6 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 3. 实现了一些常见的应用程序:DHCP 客户端、DNS 客户端、HTTP 服务器、 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/IP 协议栈,比如 uC-TCP/IP、FreeRTOS-TCP 等, LwIP 的发展历史要更悠久一些,得到了更多的验证和测试。LwIP 被广泛用在嵌 入式网络设备中,国内一些物联网公司推出的物联网操作系统,其 TCP/IP 核心就 是 LwIP;物联网知名的 WiFi 模块 ESP8266,其 TCP/IP 固件,使用的就是 LwIP。 LwIP 尽管有如此多的优点,但它毕竟是为嵌入式而生,所以并没有很完整地实现 TCP/IP 协议栈。相比于 Linux 和 Windows 系统自带的 TCP/IP 协议栈,LwIP 的功能不算完 整和强大。但对于大多数物联网领域的网络应用程序,LwIP 已经足够了。 2.2 LwIP 的文件说明 2.2.1 如何获取 LwIP 源码文件 LwIP 的代码已经交给 Savannah 托管,LwIP 的项目主页是: http://savannah.nongnu.org/projects/lwip/。这个主页简单地介绍了一下 LwIP,然后给出了许 多链接,你可以通过这些链接去挖掘更多关于 LwIP 的信息。在这里,我们只关注两个地 方,如图 2-1 中的方框所示。 第 7 页 共 430
LwIP 应用开发实战指南 —基于野火 i.MX RT 全系列(M7)开发板 图 2-1 LwIP 项目主页截图 点击“Project Homepage”,会得到一个网页,如图 2-2 所示。这个网页可以看成是 LwIP 的官方说明文档。我们可以通过这个网页获得关于 LwIP 的很多信息,包括 LwIP 的 使用注意、数据的拷贝、系统初始化流程、多线程中要注意的问题、优化方法、内核模块 的分类介绍、内核数据结构、内核重要全局变量、内核源码文件等。这些内容专业性比较 强,不建议初学时在它上面花费精力,并且里面的很多内容在我们教材的后续章节中中会 有所讲解。在这里,读者只要知道有这么个东西就行了。 图 2-2 LwIP 官方说明文档(HTML 网页 ) 第 8 页 共 430
分享到:
收藏