第14章 仿真到 CC2530 逐行迁移
本章目标
把 ns-3 的点对点 LED 仿真代码,逐行对照迁移到 CC2530 + Z-Stack 3.0 工程。看完你会明白:协议是同一套,只是换了 API 皮。
14.1 迁移总览
| 维度 | ns-3 仿真 | CC2530 + Z-Stack |
|---|---|---|
| 工程类型 | Linux C++(ns-3 模块) | IAR EW for 8051 工程 |
| 协议栈 | ns-3 zigbee 模块 | TI Z-Stack 3.0(源码提供) |
| 设备类型设置 | SetDeviceType() | zgDeviceLogicalType 编译宏 |
| 数据发送 | ZigbeeAps::ApsdeDataRequest | AF_DataRequest |
| 数据接收 | ApsdeDataIndication 回调 | afIncomingData / 应用事件 |
| GPIO/LED | LED_ON() 模拟函数 | HalLedSet(HAL_LED_1, ...) |
14.2 逐行迁移对照表(核心)
| # | ns-3 代码(仿真) | CC2530 Z-Stack(真机) | 说明 |
|---|---|---|---|
| 1 | capabilities.SetDeviceType(COORDINATOR); | -DZDO_COORDINATOR(编译宏)/ zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; | 角色声明 |
| 2 | capabilities.SetDeviceType(ENDDEVICE); | -DZDO_ENDDEVICE / ZG_DEVICETYPE_ENDDEVICE | 终端角色 |
| 3 | req.m_srcEndPoint = 8; | afRegister(&endPointDesc8);(端点 8 描述符注册) | ns-3 免注册,Z-Stack 必须注册 |
| 4 | req.m_dstEndPoint = 3; | SampleApp_epDesc.endPoint = 3; | 目的端点 |
| 5 | req.m_clusterId = 0x0006; | clusterList[0].clusterId = ONOFF_CLUSTER_ID; | On/Off 簇 |
| 6 | req.m_profileId = 0x0104; | profileId = HA_PROFILE_ID; | Home Automation |
| 7 | payload[0]=0x01; payload[1]=seq++; | theMessageData[0]=0x01; theMessageData[1]=seq++; | 应用载荷 |
| 8 | ApsdeDataRequest(aps, req, p); | AF_DataRequest(&SampleApp_DstAddr, &endPointDesc3, 2, theMessageData, &r, 0, AF_DEFAULT_RADIUS); | 发送调用 |
| 9 | ind.m_srcEndpoint == 8 && ind.m_dstEndPoint == 3 | afIncomingMSGCB 里判 MSGpkt->srcEndPoint / dstEndPoint | 接收过滤 |
| 10 | LED_ON() / LED_OFF() | HalLedSet(HAL_LED_1, HAL_LED_MODE_ON/OFF); | 执行动作 |
| 11 | 命令码 0x01/0x00 应用协议 | 同样自定义(可换成 ZCL On/Off 命令 0x01/0x00) | 应用层协议不变 |
| 12 | 序号防重放 | 同理(或交给 APS 计数器) | 安全习惯 |
14.3 关键差异点(易踩坑)
| 差异 | 说明 |
|---|---|
| 端点要注册 | Z-Stack 必须 afRegister,否则收不到任何消息 |
| 目的地址结构 | Z-Stack 用 afAddrType_t(短地址 + 端点),发送前要填 addr.shortAddr |
| 目的端点放在消息里 | Z-Stack 的 AF_DataRequest 参数包含目的端点,而接收端用 srcEndPoint/dstEndPoint 过滤 |
| 任务事件驱动 | Z-Stack 收包走 OSAL 事件(如 SampleApp_MessageMSGCB),不是回调 |
14.4 迁移三步法
- 照抄结构:角色 → 端点注册 → 发送/接收处理(表里 1~12 行);
- 换 API 皮:
ApsdeDataRequest→AF_DataRequest,HalLedSet替代模拟函数; - 真机验证:SmartRF 烧录两块板,串口观察「收到命令 → LED 亮灭」。
学习价值
先仿真理解「协议在干什么」,再迁移就只剩「API 怎么拼」——这就是本栏目存在的意义。