Files
EmbeddedSoftwareLearn1/06-NetworkIot/README.md
T
2025-06-16 19:38:23 +08:00

287 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🟣 第六层:网络通信与物联网协议(Network & IoT)
本模块聚焦于嵌入式系统中的通信机制和物联网协议栈,涵盖串口通信、无线模块、MQTT 等协议到云平台对接,适用于 IoT 产品开发全流程。
---
## 串口通信与Socket通信
### 串口通信
- 串口基础:波特率、校验位、停止位、数据位
- 应用:模块通信、调试信息输出
- 中断方式与 DMA 模式接收
```c
// 基本 UART 初始化
USART1->BRR = 0x1A1; // 设置波特率
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能收发
```
### Socket网络通信
- Socket 基础:TCP/UDP 区别、连接建立过程
- 在 ESP32 等模块中使用 LWIP 实现 TCP 客户端/服务器
```c
// TCP 客户端基础逻辑 (伪代码)
socket();
connect();
send();
recv();
```
---
## 无线通信协议
### Wi-Fi
- ESP32 支持 STA / AP 模式,常用于联网或热点传输
- SmartConfig、ESP-NOW、HTTP Server 应用
### BLE(蓝牙低功耗)
- GATT 协议模型:服务、特征值、通知机制
- 使用 nRF52、ESP32 等平台进行广播、连接和数据交互
### LoRa / ZigBee
- 长距离通信:适用于室外传感器
- 使用 Semtech SX1278 / ZigBee 模块通信帧格式解析
---
## 物联网协议栈
### MQTT
- 轻量级发布-订阅协议,常用于设备与云平台交互
- QoS 等级、主题结构、客户端连接
- 常见平台支持:EMQX、OneNet、阿里云 IoT
### HTTP / HTTPS
#### HTTP 请求方法(Methods)
* **GET**:请求指定资源。常用于获取数据。
* **POST**:提交数据到服务器,如表单、上传。
* **PUT**:上传数据,通常是更新资源。
* **DELETE**:删除指定资源。
* **HEAD**:与 GET 类似,但不返回响应体。
* **OPTIONS**:返回服务器支持的请求方法。
* **TRACE**:诊断请求响应路径,回显请求报文。
* **CONNECT**:用于建立隧道(如 HTTPS 代理)。
---
#### HTTP 状态码
| 分类 | 范围 | 含义 |
| --- | -------- | -------- |
| 1xx | 100\~199 | 接收中,继续处理 |
| 2xx | 200\~299 | 请求成功 |
| 3xx | 300\~399 | 重定向或更多操作 |
| 4xx | 400\~499 | 客户端错误 |
| 5xx | 500\~599 | 服务器错误 |
**部分状态码示例:**
* 200 OK
* 201 Created
* 204 No Content
* 301 Moved Permanently
* 302 Found
* 304 Not Modified
* 400 Bad Request
* 401 Unauthorized
* 403 Forbidden
* 404 Not Found
* 500 Internal Server Error
* 502 Bad Gateway
---
#### HTTP 长连接与短连接
* **HTTP/1.0** 默认使用短连接(每次请求后断开)
* **HTTP/1.1** 默认使用长连接(`Connection: keep-alive`)
---
#### HTTP 请求报文格式
```
GET /hello.htm HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: */*
Connection: Keep-Alive
... 其他头部字段
```
#### HTTP 响应报文格式
```
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 158
Server: Apache
Date: Sun, 14 Jun 2025 10:00:00 GMT
<html>...</html>
```
---
### HTTPS 通信过程
HTTPS = HTTP + TLS/SSL 加密
#### 通信过程:
1. 客户端发起 HTTPS 请求(握手开始)
2. 服务器返回证书(含公钥)
3. 客户端验证证书合法性
4. 客户端生成随机对称密钥(用公钥加密传给服务器)
5. 双方使用对称密钥开始加密通信
---
#### 对称加密(加解密使用同一密钥)
* **DES**(56 位)
* **AES**(128/192/256 位)
#### 非对称加密(加密/解密使用公钥/私钥)
* **RSA**:支持加密、签名
* **DSA**:只支持签名(效率高,但不用于加解密)
#### 哈希算法(不可逆)
* **MD5**(128 位)
* **SHA-1**(160 位)
* **SHA-256**(256 位)
### CoAP / LwM2M
- 适合低功耗终端的简化协议,UDP 传输,可压缩
- 用于 NB-IoT、LwIP 等网络栈中
---
## TCP/IP 协议栈基础与嵌入式实现
### TCP/IP 协议栈分层结构(四层模型)
| 层级 | 协议/组件 | 功能说明 |
|----------------|----------------------------|----------------------------------|
| 应用层 | HTTP, MQTT, CoAP, DNS | 面向用户的协议 |
| 传输层 | TCP, UDP | 数据传输可靠性与端口管理 |
| 网络层 | IP, ICMP, ARP | 地址与路由 |
| 链路层 | Ethernet, Wi-Fi, BLE | 硬件通信和数据帧传输 |
---
### TCP 与 UDP 区别
| 特性 | TCP | UDP |
|----------------|----------------------------|----------------------------|
| 是否连接 | 是(面向连接) | 否(无连接) |
| 是否可靠 | 是(有重传、确认) | 否(可能丢包) |
| 适用场景 | Web、文件传输、SSH | 视频流、语音、广播 |
| 开销 | 较大(握手、窗口等) | 较小(直接发送) |
---
### 嵌入式 TCP/IP 协议栈组件
- **LwIP(Lightweight IP)**
- 开源轻量级 TCP/IP 协议栈
- 支持 TCP/UDP/IP/DNS/DHCP 等
- 常用于 STM32、ESP32、RT-Thread 中
- **uIP(micro IP)**
- 更轻量,适合资源极小的 MCU
- **FreeRTOS+TCP**
- 与 FreeRTOS 配套的 TCP/IP 协议栈
- **Nut/Net、CycloneTCP**:其他常用协议栈
---
### 嵌入式 TCP/IP 通信流程(以 LwIP 为例)
1. **初始化网络接口**:配置 IP、MAC、网关
2. **创建 socket 套接字**:TCP 或 UDP
3. **建立连接 / 绑定端口**
4. **接收/发送数据**:`recv()`, `send()`
5. **关闭连接**:`close()`
---
### 常用 API 示例(LwIP BSD socket)
```c
// TCP 客户端示例
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(12345);
server.sin_addr.s_addr = inet_addr("192.168.1.10");
connect(sock, (struct sockaddr*)&server, sizeof(server));
send(sock, "Hello", strlen("Hello"), 0);
recv(sock, buffer, sizeof(buffer), 0);
close(sock);
```
---
### DHCP / DNS / ICMP 说明
* **DHCP**:动态分配 IP(LwIP 可配置)
* **DNS**:域名解析,调用 `gethostbyname()` 等
* **ICMP**:如 `ping` 实现通信测试
---
### 推荐阅读资料
* [LwIP 官方文档](https://savannah.nongnu.org/projects/lwip/)
* [FreeRTOS+TCP 文档](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html)
* [TCP/IP Illustrated (Vol 1)](https://book.douban.com/subject/1088054/)
---
## 云平台接入 & OTA 实现
### 云平台对接
- 主流平台:阿里云 IoT、腾讯连连、OneNet、ThingsBoard
- 认证方式:三元组 / MQTT 密钥 / TLS 证书
### OTA 升级机制
- 本地或远程固件更新,防止刷写失败
- 双分区设计(bootA / bootB)
- 签名验证与版本控制
```c
// OTA 示例流程
1. 下载固件至指定 Flash 区域
2. 校验 MD5 / 签名
3. 更新启动地址 / 重启
```
---
## ✅ 推荐学习顺序
1. 学习 UART 通信与基本网络 socket 原理
2. 掌握 Wi-Fi / BLE 开发流程(推荐 ESP32/nRF52)
3. 理解 MQTT 协议与平台接入逻辑
4. 实践 OTA 升级流程,构建远程维护能力
---
## 📌 常见问题 FAQ
| 问题 | 解答 |
|------|------|
| MQTT 断线如何重连? | 设置心跳机制与 reconnect 回调逻辑 |
| OTA 更新失败怎么办? | 回退机制 + 双镜像分区设计 |
| CoAP 和 MQTT 有何区别? | CoAP 基于 UDP,适合低功耗设备;MQTT 基于 TCP,稳定性好 |