第2章 协议栈分层
本章目标
看懂数据从「应用层」到「空中帧」的逐层封装过程。这是全书最重要的一章——配合交互页「协议栈分层教学」观看动画效果最佳。
2.1 五层协议栈
| 层 | 职责 | 一句话记忆 |
|---|---|---|
| 应用层 APL | 业务逻辑(你写的代码) | 「我要开灯」 |
| APS 层 | 应用支持:端点、簇、绑定 | 「端点 8 找端点 3,办 On/Off」 |
| 网络层 NWK | 组网、路由、地址 | 「送到 75:82,走 3 跳」 |
| 链路层 MAC | 802.15.4 帧、ACK、信道访问 | 「一帧一帧传,到了点个头」 |
| 物理层 PHY | 射频收发(2.4GHz) | 「变成无线电波发出去」 |
发送时每层「包一层头」,接收时每层「剥一层头」——这是所有分层协议的核心机制。
2.2 29 字节空中帧解剖(真实日志)
在 zigbee-stack-layers 示例中,发送端逐字节序列化出完整的空中帧(29 字节):
MAC 头(9B): 61 98 30 b1 1b 82 75 00 00 ← 帧控制/序号/PAN 0x1bb1/目的 82 75/源 00 00
NWK 头(8B): 4c 00 82 75 00 00 0a dd ← 帧控制/目的/源/半径 0x0a/序号 0xdd
APS 头(8B): 00 03 06 00 04 01 08 00 ← 帧控制/目的端 3/簇 0x0006/Profile 0x0104/源端 8/计数
载荷(2B): 01 01 ← 命令 0x01(点亮) + 序号 0x01
FCS (2B): 00 00 ← 校验接收端解封装后打印:
[应用层] 收到 ASDU size=2 ... 内容: 0x01 0x01
-> [执行] LED 点亮逐字节看
- APS 头里的
08 00= 源端点 8(控制器应用),00 03= 目的端点 3(LED 应用)——这就是端点寻址在帧里的样子; - 簇
0x0006= On/Off 簇,Profile0x0104= Home Automation; - NWK 头
82 75= 目的短地址(0x7582),00 00= 源(协调器 0x0000)。
2.3 ns-3 实操对照
// 应用层发数据(ns-3)
req.m_srcEndPoint = 8; // 源端点
req.m_dstEndPoint = 3; // 目的端点
req.m_clusterId = 0x0006; // On/Off 簇
req.m_profileId = 0x0104; // Home Automation
Simulator::ScheduleNow(&ZigbeeAps::ApsdeDataRequest, aps, req, p);与真机对照
第 14 章会看到:这些参数到 CC2530 上就是 AF_DataRequest 的同名参数——协议是同一套,只是 API 名字变了。
配套交互页:协议栈分层教学(发送端逐层封装动画 + 帧解剖)