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.
热门推荐
嵌瓷——潮汕三大建筑装饰艺术之一
尿潜血是怎么回事
英雄联盟联盟:深度解析游戏机制与竞技文化
年轻人开始“反向消费”了,这是怎么回事?什么是反向消费?
线上阴线的含义是什么?如何利用线上阴线进行投资操作?
宾馆装修隔音处理全攻略
墨客:文人之雅号,文学创作之魂
“促进长指甲健康生长:全方位饮食、习惯、护理与营养指导”
天然皂粉和洗衣粉的区别
国产主板版型有哪些区别?一文读懂ATX、MATX、ITX主板版型
广州东出发!高铁1-5h可达的11个城市!
特里芬难题是怎样的一种经济现象?它对国际货币体系有何影响?
绣球花施肥指南:掌握时机、方法与常见误区,让你的花园绽放绚丽色彩
绣球属(Hydrangea):花色变化原理、毒性解析与栽培指南
行楷的正确练习方式:常用偏旁部首及例字的写法
中科院心理所揭示社会影响的持久效应及其认知计算机制
如何学好系统化数学
今日黄金技术走势分析:金价可能大幅下跌 技术指标从接近超卖读数中恢复
趣味学习防中毒:园山公卫中心带你认识身边的毒蘑菇
北京有所小学,用抗日名将的名字命名!
CMA认证后,我们需要采取哪些措施来确保持续改进和质量提升?
深读|佛山南海:以"天下之西樵",复兴千年人文盛景
其他应收款和应收账款的区别是什么?如何影响财务报表分析?
浙大邵逸夫医院:构建微创技术生态体系 做医学创新主力军
巨蟹座摩羯座配对组合图表大全 巨蟹座摩羯座相配指数
消炎药吃多了有什么副作用?
真实的专业是怎样的?电气工程及其自动化【每日一专业】
岛津EPMA在医用钛材料中的综合分析
户外野餐新体验:从选址、美食到游戏全攻略
水煮鱼用什么鱼做最好吃(水煮鱼片用什么鱼比较好?)