第9章 实验一:点对点 LED 控制
本章目标
用 ns-3 仿真跑通「协调器 → 终端 → LED 点亮」全链路,理解端点寻址与数据投递。配套交互页有完整动画。
9.1 实验拓扑
[协调器/控制器] [终端1/LED 执行器]
短地址 0x0000 短地址 42:24
端点 8 (控制应用) ────→ 端点 3 (LED 应用)
APS: 簇 0x0006 On/Off | Profile 0x01049.2 完整运行日志(真实)
+1s [协调器] 建网成功 PAN=0x.... 信道=11
+2.5s [终端1] 入网成功 短地址=42:24 父=协调器
+6s [协调器/控制器] 发送 LED 命令: 0x1 (seq 1) -> 终端 (短地址 42:24)
+6.00144s [终端1/LED 执行器] 收到命令
源端点 8 -> 目的端点 3 | 帧长 2
[应用层解析] 命令码=0x1 序号=1
[执行动作] 终端 1 拉高 GPIO -> LED 点亮成功 (LED=ON)
+8s [协调器/控制器] 发送 LED 命令: 0x0 (seq 2) -> 终端 (短地址 42:24)
+8.00144s [终端1/LED 执行器] 收到命令
[应用层解析] 命令码=0x0 序号=2
[执行动作] 终端 1 拉低 GPIO -> LED 熄灭成功 (LED=OFF)9.3 命令协议(应用层自定义)
| 字节 | 含义 | 值 |
|---|---|---|
| 命令码 | 0x1=点亮,0x0=熄灭 | 01 / 00 |
| 序号 | 每次递增,防重放 | 01 / 02 |
看这里
帧长 2 = 命令码 1 字节 + 序号 1 字节。应用层协议是你自己定的——这就是「应用层开发」的含义。
9.4 源码位置与关键函数
源码:led-control/zigbee-led-control.cc(本栏目配套工程)
// 控制器侧发送
SetDeviceType(COORDINATOR);
req.m_srcEndPoint = 8; req.m_dstEndPoint = 3;
req.m_clusterId = 0x0006; req.m_profileId = 0x0104;
payload[0]=0x01; payload[1]=seq++; // 命令码+序号
ZigbeeAps::ApsdeDataRequest(...)
// 终端侧接收(indication 回调里)
ZigbeeApsdeDataIndicationParams ind = ...;
if (ind.m_srcEndpoint == 8 && ind.m_dstEndPoint == 3) {
if (payload[0] == 0x01) LED_ON(); else LED_OFF();
}9.5 与 CC2530 真机的第一步对应
| ns-3(本实验) | CC2530 + Z-Stack |
|---|---|
ApsdeDataRequest | AF_DataRequest |
| 端点 8/3 | endPointDesc_t 注册的端点 |
ApsdeDataIndication 回调 | afIncomingData / zclIncomingMsg |
| LED_ON()/LED_OFF() | HalLedSet(HAL_LED_1, HAL_LED_MODE_ON) |
逐行迁移表见第 14 章。
打开交互实验:实验一 · 点对点 LED 控制(动画演示)