问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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.  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号