前言
如何学习本书
本书的参考资料
本书的技术论坛
第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 数据可视化
联系我们