2. Zigbee协议栈基础:分层模型与各层规范

大家好,欢迎来到第二章。

这一章我们聊聊Zigbee协议栈的骨架——分层模型。说实话,很多初学者一看到协议栈分层就头大,觉得太抽象。我当年刚接触时也一样,总觉得这东西离实际开发很远。直到我在一个智能照明项目里,被一个物理层干扰问题折磨了三天……嗯,从那以后,我再也不敢小看每一层了。

2.1 Zigbee协议栈分层模型

Zigbee协议栈,说白了就是一套通信规则。它把复杂的无线通信过程,拆成了四个层次:

  • 物理层(PHY)——最底层,管信号的收发
  • MAC层——管信道访问和组网
  • 网络层(NWK)——管路由和数据传输
  • 应用层(APL)——管你实际要做什么

每一层只跟上下邻居打交道。上层调用下层的服务,下层给上层提供接口。这种设计的好处是:你改物理层,不影响应用层代码。我在移植协议栈时深有体会——只要接口不变,底层换芯片都不怕。

核心思想:分层解耦。每一层各司其职,互不干扰。

2.2 物理层(PHY)规范

物理层是Zigbee的“嘴巴和耳朵”。它负责把数据变成无线电波发出去,也负责把收到的电波变回数据。

Zigbee物理层主要工作在三个频段:

频段 频率范围 信道数 数据速率 适用区域
2.4 GHz 2400–2483.5 MHz 16个(11~26信道) 250 kbps 全球通用
868 MHz 868–868.6 MHz 1个(0信道) 20 kbps 欧洲
915 MHz 902–928 MHz 10个(1~10信道) 40 kbps 北美

我个人习惯用2.4 GHz频段。为什么?因为全球通用,芯片选择多,开发工具也成熟。但要注意——2.4 GHz也是Wi-Fi和蓝牙的地盘。干扰问题很常见。我曾经在一个工厂里调试,发现Zigbee设备老是掉线。查了半天,原来是旁边有台Wi-Fi路由器正好占了11信道。换到15信道后,问题就解决了。

避坑指南:部署Zigbee网络前,先用抓包工具扫一下周围信道占用情况。选一个干净的频段,能省很多麻烦。

物理层还负责:

  • 能量检测(ED)——看看信道里有没有信号
  • 链路质量指示(LQI)——评估信号好不好
  • 空闲信道评估(CCA)——发数据前先听听信道空不空

你想想看,如果没有CCA,两个设备同时发数据,就会撞车。数据就丢了。所以物理层虽然“底层”,但很关键。

2.3 MAC层规范

MAC层在物理层上面。它管的是“什么时候发、发给谁、怎么确认”。

MAC层有两个核心机制:

  • CSMA/CA——载波监听多路访问/冲突避免。发数据前先听一下,信道空闲才发。如果忙,就随机等一会儿再试。
  • 信标使能模式 vs 非信标模式——信标模式适合周期性上报的场景,比如温度传感器每小时上报一次。非信标模式更灵活,适合随机事件,比如门磁报警。

我记得有个项目,客户要求智能灯控响应时间小于100毫秒。我一开始用了信标模式,结果发现设备要等信标帧才能发数据,延迟超标。后来换成非信标模式,响应时间降到30毫秒以内。嗯,选对模式很重要。

MAC层还定义了三种设备类型:

  • 协调器(Coordinator)——每个网络只有一个,负责建网
  • 路由器(Router)——负责转发数据,扩展网络范围
  • 终端设备(End Device)——只能收发,不能转发。可以休眠省电

注意:终端设备虽然省电,但它的父节点(路由器或协调器)必须一直在线。如果父节点掉电,终端设备就失联了。我曾经在部署时没注意这个,结果一批电池供电的传感器经常掉线。后来给每个终端设备配了两个父节点做冗余,才稳定下来。

2.4 网络层(NWK)规范

网络层是Zigbee的“大脑”。它负责路由、组网、地址分配。

网络层的主要任务:

  • 网络形成——协调器发起建网,分配PAN ID(网络标识符)
  • 设备加入/离开——新设备通过关联流程加入网络
  • 路由发现与维护——数据从A到B,走哪条路?网络层说了算
  • 地址分配——给每个设备分配一个16位短地址

Zigbee网络层支持两种路由方式:

  • 树状路由——按父子关系转发,简单但路径不一定最优
  • 网状路由——动态计算最短路径,灵活但开销大

我个人偏爱网状路由。虽然它需要维护路由表,但可靠性高。有一次我在一个大型仓库里部署了200多个节点,树状路由下,中间一个路由器坏了,后面一串设备都失联了。换成网状路由后,数据会自动绕路,网络健壮多了。

经验之谈:节点数量超过50个时,建议用网状路由。树状路由适合小规模、结构固定的网络。

2.5 应用层(APL)规范

应用层离用户最近。它定义了设备之间怎么“对话”。

应用层包含三个子层:

  • 应用支持子层(APS)——提供数据封装、绑定、组播等功能
  • Zigbee设备对象(ZDO)——管理设备角色、网络发现、绑定管理
  • 应用框架(AF)——开发者在这里写自己的应用代码

应用层还定义了“簇”(Cluster)的概念。每个簇代表一种功能,比如开关簇、调光簇、温度测量簇。不同厂家的设备,只要支持同一个簇,就能互操作。

举个例子:你买了一个A品牌的Zigbee灯泡,和一个B品牌的Zigbee开关。只要它们都支持“开关簇”,开关就能控制灯泡。这就是Zigbee的互操作性。我在做智能家居项目时,经常利用这一点,把不同厂家的设备混搭使用,效果很好。

小技巧:开发自己的Zigbee设备时,尽量使用标准簇。这样你的设备就能跟市面上大多数Zigbee网关兼容。我见过有人自己定义私有簇,结果只能跟自家网关通信,市场推广很受限。

2.6 各层之间的交互

各层之间通过服务接入点(SAP)通信。上层调用下层的请求原语,下层给上层返回确认原语。

举个例子,应用层要发一条数据:

  1. 应用层调用APSDE-DATA.request
  2. APS层处理后,调用NLDE-DATA.request给网络层
  3. 网络层调用MCPS-DATA.request给MAC层
  4. MAC层调用PD-DATA.request给物理层
  5. 物理层把数据发出去

收到数据时,流程反过来。每一层剥掉自己的头部,把数据往上送。

我记得第一次看这个流程时,觉得好复杂。后来自己动手写了一个简单的数据收发demo,才真正理解。说白了,就是每一层加一个信封,收件时一层层拆信封。你只要关心自己那一层的信封格式就行。

总结一下:Zigbee协议栈分层模型,把复杂的无线通信拆成了四个层次。物理层管收发,MAC层管信道访问,网络层管路由,应用层管业务。每一层职责清晰,接口明确。理解了这个模型,你就能看懂协议栈的代码,也能自己动手移植和调试。

下一章,我们会深入物理层,看看Zigbee的无线电到底是怎么工作的。到时候我会分享一些我在射频调试中踩过的坑,希望对你有帮助。