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.
热门推荐
护理专业就业去向:职场前景与发展机遇
js如何实现手机音乐自动播放
七项关键指标全面提升 郑钦文还有弱点吗?
今年已有6所985大学迎来新校长,其中5位是院士,只有1名女性学者
《黄帝内经》经典名句,读懂养生大智慧
可视化大屏+教育,能够擦出什么火花,本文为你一一揭秘。
崔和:中国水产品格局变化与展望
Hyper-V和其他软件发生冲突?彻底卸载Hyper-V的几种方法教程
跟悬灸比,隔姜灸能 “ 以一当十”,为什么呢?
德国人的最新平均工资出炉!各行各业差别有多大?
经常感觉喉咙有痰咳不出咽不下?可能是这些原因
以太网、Profinet、Profibus三种网络架构搭建及拓扑分析
唐姓男孩名字独一无二:2025蛇年精选大全
做好这10点,紫砂壶越养越漂亮!
如何选择商标名称以打造响亮易记的品牌?
在马万昌故居发现的“丁龙”照片及其意义
探寻哥大汉学系倡办者丁龙的故事
【网络安全】零日漏洞(0day)是什么?如何防范零日攻击?
并不是所有人都适合午睡!这4个错误方法,可能越睡越伤身
一“栈”赏三国 珲春防川景区三国边境木栈道成为国道G331打卡新地标
东北一家人-1-至-3-季:欢笑生活的延续
消化系统健康的三个秘密,十个危险信号,两个补救绝招
单纯的结肠憩室比较容易治疗
吃金针菇会中毒吗?
霍兰德职业兴趣测试
世界各地的咖啡文化介绍咖啡的发展历程
高密度脂蛋白,如何升高?使用非药物方法才有获益
优化社会保障体系,构建和谐社会新局面
家庭教育中的家庭成员关系平衡与协调
简单拔牙和复杂拔牙区别有哪些?拔牙干槽症是什么