ZigBee协议详解:从基础概念到协议栈实现
创作时间:
作者:
@小白创作中心
ZigBee协议详解:从基础概念到协议栈实现
引用
CSDN
1.
https://blog.csdn.net/xiujiti6871/article/details/146057549
ZigBee是一种基于IEEE 802.15.4标准的无线通信技术,广泛应用于智能家居、工业自动化等领域。本文将从ZigBee的命名由来、技术特点、核心概念以及协议栈实现等方面进行详细介绍。
是什么?
- ZigBee的名字源自蜜蜂的"八字舞"。蜜蜂(Bee)通过嗡嗡(Zip)声与同伴传递方位信息,依靠同伴接力形成通信网络。
- 采用IEEE 802.15.4标准规范的媒体访问层与物理层。
- WiFi与ZigBee的信道有重叠部分。
为什么?
- 相较于蓝牙等无线通信技术,ZigBee无线通信技术可有效降低使用成本。
怎么做?
- Texas Instruments(TI)提供了Z-Stack协议包,可以根据该协议包进行迁移编程。
- 强推参考文档10、参考文档14、参考文档15。
核心本质
核心名词解释
Cluster
什么是IEEE 802.15.4?
- IEEE是一个组织,叫作“电气和电子工程师协会”。
- 802.15是这个协会里面的一个部门,部门里的第4工作组开发了一个协议,就叫IEEE 802.15.4协议。
CSMA-CA
- 同一个空间内,多个无线节点同时发送信号,互相在空间中形成干扰,导致数据变形。
- CSMA-CA机制是listen before talk的机制,发之前先听一下,判断当前信道是否空闲。
如何判断空闲的?
- 假设节点正在listen,将根据接收信号RSSI来做出判断。
- 接收到信号强度小于一个门限,比如小于-75 dBm,认为这个信道上没有人在发送。
- MAC层是逐跳的确认,在APS层是端到端的确认。
ZigBee设备角色
长短地址 PAN ID
ZigBee短网络地址是一个16位的地址(0x0000 - 0xFFFF)。
地址类型 | 描述 |
---|---|
0x0000 | 协调器的网络地址 |
0xFFFF | 这是一个对整个ZigBee进行广播的广播地址 |
0xFFFD | 只对打开接收的设备进行广播的地址 |
0xFFFC | 只对协调器和路由设备广播的地址 |
0xFFFE | 用作无效地址 |
0xFFF8 ~0xFFFB | 保留地址 |
0x0001~0xFFF7 | 被分配到ZigBee网络中的设备,作为网络地址使用 |
PAN ID
- PAN,又称个人区域网络。
- 中国可能有二十几个地方叫马鞍山。
- 马鞍山就类似于PAN ID,Extended PAN ID就类似一个全地名,比如说安徽省马鞍山市。
Commissioning
协调器
bdb_StartCommissioning(//组建网络
BDB_COMMISSIONING_MODE_NWK_FORMATION | //支持Network Formation
BDB_COMMISSIONING_MODE_FINDING_BINDING //支持Finding and Binding(F & B)
);
路由器或终端设备
bdb_StartCommissioning(//设备入网
BDB_COMMISSIONING_MODE_NWK_STEERING | //支持Network Steering
BDB_COMMISSIONING_MODE_FINDING_BINDING //支持Finding and Binding(F & B)
);
AF描述符
端点号
- ZigBee 3.0通信最终是发送到设备的特定的服务的,也就是端点号。
案例
端点号 | 描述 |
---|---|
0 | ZDO(ZigBee Device Object) |
255 | 广播,设备的所有服务(简单描述符)都会收到这个数据 |
241~254 | 暂时保留起来的端点号,暂时不能使用 |
1~240 | 可以供开发者自由地使用 |
OSAL
核心两要素
- 注册在哪里注册
- 响应在哪里响应
OSAL(Operating System Abstraction Layer,系统抽象层),可以通俗地理解为一个简化版的操作系统,为Z-Stack的正确运行提供了内存管理、中断管理和任务调度等基本功能。
//初始化OSAL,包括初始化任务池
osal_init_system();
HalDriverInit(); // 初始化硬件适配层,比如串口、显示器等
//轮询任务池
osal_start_system();
- Hal_ProcessPoll主要作用是轮询需要快速处理的功能模块 tasksArr[]里Hal_ProcessEvent处理慢HAL层的事件
- osalInitTasks 初始化任务池 tasksEvents
void osalInitTasks( void )
{
uint8 taskID = 0;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
macTaskInit( taskID++ );//调用macTaskInit()函数初始化MAC层的任务
nwk_init( taskID++ );//- 调用nwk_init()函数初始化网络层的任务。
#if !defined (DISABLE_GREENPOWER_BASIC_PROXY) && (ZG_BUILD_RTR_TYPE)
gp_Init( taskID++ );
#endif
Hal_Init( taskID++ );
#if defined( MT_TASK )
MT_TaskInit( taskID++ );
#endif
APS_Init( taskID++ );
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_Init( taskID++ );
#endif
ZDApp_Init( taskID++ );
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_Init( taskID++ );
#endif
// Added to include TouchLink functionality
#if defined ( INTER_PAN )
StubAPS_Init( taskID++ );
#endif
// Added to include TouchLink initiator functionality
#if defined( BDB_TL_INITIATOR )
touchLinkInitiator_Init( taskID++ );
#endif
// Added to include TouchLink target functionality
#if defined ( BDB_TL_TARGET )
touchLinkTarget_Init( taskID++ );
#endif
zcl_Init( taskID++ );
bdb_Init( taskID++ );
zclSampleSw_Init( taskID++ );//- 调用zclSampleSw_Init()函数初始化应用层的任务。
#if (defined OTA_CLIENT) && (OTA_CLIENT == TRUE)
zclOTA_Init( taskID );
#endif
}
tasksArr
//创建一个元素类型为pTaskEventHandlerFn的数组
1.const pTaskEventHandlerFn tasksArr[] = {
1. macEventLoop, //第1个数组元素 处理MAC层任务中的事件
2. nwk_event_loop, //第2个数组元素 专门处理网络层任务中的事件
//
//第3个数组元素
4.#if !defined (DISABLE_GREENPOWER_BASIC_PROXY) && (ZG_BUILD_RTR_TYPE)
1. gp_event_loop,
6.#endif
//
//第4个数组元素
1. Hal_ProcessEvent, //主要作用是处理HAL层的事件
//第5个数组元素
8.#if defined( MT_TASK )
1. MT_ProcessEvent,
10.#endif
//
//第6个数组元素
1. APS_event_loop,
//
//第7个数组元素
12.#if defined ( ZIGBEE_FRAGMENTATION )
1. APSF_ProcessEvent,
14.#endif
//
//第8个数组元素
1. ZDApp_event_loop,
//
//第9个数组元素
16.#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
1. ZDNwkMgr_event_loop,
18.#endif
//
//第10个数组元素
1. //Added to include TouchLink functionality
2. #if defined ( INTER_PAN )
3. StubAPS_ProcessEvent,
4. #endif
//
//第11个数组元素
1. // Added to include TouchLink initiator functionality
2. #if defined ( BDB_TL_INITIATOR )
3. touchLinkInitiator_event_loop,
4.
热门推荐
家用体脂秤“称脂肪”数据可信吗?
工具类网站SEO优化策略详解,如何提升搜索引擎排名与流量
你还在纠结充电方式吗?看专家教你如何保护新能源车电池!
张贵人为什么会杀死皇帝?原因是什么
《哪吒2》中“急急如律令”怎么译?DeepSeek这样答
联想笔记本键盘被锁了怎么办?六种实用解决方案帮你轻松应对
新加坡O水准考试全攻略:考试内容、计分方式及备考指南
运动减压迎高考,专家支招这样做→
城市猴子:适应城市生活
运动后喝饮料会否影响减肥效果
我国“最安全”的省市,仅有11个不在地震带上,其中有你家乡吗?
2024年九江职业技术学院单招章程,附招生计划
菲律宾家政清洁服务内容及费用详解
新车怎样办理上外地牌照的手续?办理上外地牌照手续时需要准备哪些材料?
夏日必备!陕西凉皮的正宗制作方法详解
80后美国人将在未来二十年继承83.5万亿美元的巨额财富
为什么西方人眼中的二战起点与中国人不同?九一八事变的历史意义
从高峰期912万降至不足300万,无止跌迹象的代理人队伍何去何从
怎么申请城乡居民的医疗补助?
猪苓汤的配方
CAD 无法修复图形文件怎么办?原因分析与解决方案
剪辫运动与清末民初社会变革
如何使用Excel计划表模板提高工作效率?
未给员工买保险,工伤怎么赔?
石嘴山自驾游旅游攻略:探索自然美景与历史文化之旅
695分!湛江一中的他如何叩开北大之门
江东小霸主孙策:英年早逝的传奇人物
四六级基础如何无缝转战雅思备考——词汇、听力篇!
互联网抢红包测评:套路重重,多设提现门槛
星级酒店评定标准的关键指标有哪些