ZigBee 低功耗自组网
ZigBee 低功耗自组网
一、概述
ZigBee 是基于 IEEE 802.15.4 的低功耗、低速率、短距离无线协议,专为自组网(Mesh)设计,支持大量节点(一个网络可上千个)和低功耗传感应用,广泛用于智能家居、楼宇自控、工业监测。
一句话核心:ZigBee 设备通过"协调器建网 → 路由器/终端加入",自动形成网状网络,数据可多跳转发(节点之间接力传),从而实现大面积覆盖和自愈。
二、与 BLE/WiFi 对比
| 维度 | ZigBee | BLE | WiFi |
|---|---|---|---|
| 标准 | 802.15.4 | 2.4GHz(专有) | 802.11 |
| 速率 | 250 kbps | 1~2 Mbps | 高 |
| 功耗 | 低 | 极低 | 高 |
| 组网 | 自组网(上千节点) | 星型/少量 | 星型 |
| 覆盖 | 多跳(百米级) | 点对点 | 单跳 |
| 成本 | 低 | 低 | 高 |
| 场景 | 智能家居/楼宇 | 穿戴/传感 | 宽带接入 |
关键理解:ZigBee 的核心优势不是速率或功耗,而是大规模自组网(Mesh)——这是它与 BLE/WiFi 的最大区别。
三、物理层(802.15.4)
- 频段:2.4GHz(全球,16 个信道)、868/915MHz;
- 速率:2.4GHz 下 250 kbps;
- 调制:O-QPSK;
- 帧:最大 127 字节(数据部分小,适合传感器小报文)。
数值演算(2.4GHz 信道频点):ZigBee 2.4GHz 有 16 个信道(编号 11~26),相邻信道间隔 5MHz,中心频率 = 2405 + 5×(k−11) MHz:
信道11: 2405 MHz 信道15: 2425 MHz
信道12: 2410 MHz ... ...
信道13: 2415 MHz 信道20: 2450 MHz
信道14: 2420 MHz ... ...
信道25: 2475 MHz 信道26: 2480 MHz为什么常用信道 15/20/25(避开 WiFi):ZigBee 和 WiFi 都工作在 2.4GHz,信道相互重叠会互相干扰。WiFi 常用信道 1/6/11 的中心在 2412/2437/2462 MHz,而 ZigBee 信道 15/20/25 恰好落在 WiFi 信道之间的空隙里:
WiFi: 信道1(2412) 信道6(2437) 信道11(2462)
ZigBee: ──15(2425)── ──20(2450)── ──25(2475)
←12/13MHz间隔→ ←12/13MHz间隔→ ←13MHz→
选 15/20/25 → 与三个常用 WiFi 信道都隔开 12~13MHz, 重叠最小MAC 帧结构(最大 127 字节):
┌───────┬────────┬───────┬──────────┬────────┬──────┬──────┐
│ 帧控制 │ 序列号 │ PAN ID │ 目的地址 │ 源地址 │ 数据 │ FCS │
│(2B) │(1B) │(0/2B) │(0/2/8B) │(0/2/8B) │ (最多│(2B) │
└───────┴────────┴───────┴──────────┴────────┴──────┴──────┘
数据部分实际可用 = 127 − 帧头(各地址字段) − FCS(2)数值演算(净数据长度):若地址都用 2 字节短地址(最省),帧头 = 帧控制2 + 序列号1 + PAN2 + 目的2 + 源2 = 9 字节,再加 FCS2,净数据最大 = 127 − 11 = 116 字节。这就是"ZigBee 报文小、适合传感器"的原因——一帧最多带 116 字节数据。
四、网络拓扑
ZigBee 支持三种拓扑:
星型(Star) 树型(Tree) 网状(Mesh)
◯ ◯ ◯─◯─◯
╱│╲ ╱ ╲ ╱│╲│╱
◯─◯─◯ ◯ ◯ ◯─◯─◯
◯=节点(一个中心) 树状分层 ◯─◯ (多跳互连)| 拓扑 | 特点 | 场景 |
|---|---|---|
| 星型 | 所有节点连协调器 | 简单小网 |
| 树型 | 分层,父节点转发 | 中等规模 |
| 网状(Mesh) | 节点间多跳转发、自愈 | 大规模、高可靠 |
关键理解:Mesh 是 ZigBee 的核心能力——数据可经过多跳(路由)到达远处节点,且某节点故障时自动找新路径(自愈),从而覆盖大面积。
五、网络层角色
ZigBee 网络有三种逻辑角色:
| 角色 | 职责 | 可否睡眠 |
|---|---|---|
| 协调器(Coordinator) | 建立网络、分配 PAN ID | 否(必须常在线) |
| 路由器(Router) | 加入网络、转发数据(路由)、可让终端接入 | 否(需转发) |
| 终端设备(End Device) | 叶子节点,只和自己的父节点通信 | 是(可睡眠) |
关键理解:终端设备可睡眠(低功耗),通过父节点(协调器/路由器)缓存数据、代为收发。路由器和协调器需常在线以维持网络。
六、寻址
- PAN ID:网络标识符(同一 PAN 内通信);
- 16 位短地址:加入网络后分配(协调器=0x0000);
- 64 位 IEEE 地址:设备唯一 MAC 地址;
- 寻址方式:短地址(常用)/长地址/IEEE 地址。
网络协调器 PAN=0x1234, 短地址 0x0000
路由器 A 短地址 0x0001
终端 B 短地址 0x796F (由父节点分配)数值演算(地址空间):
16 位短地址 → 2^16 = 65536 个 (0x0000~0xFFFF)
64 位 IEEE 地址 → 2^64 ≈ 1.8×10^19 (全球唯一)
但实际可用短地址 ≠ 全部 65536:
· 0x0000 保留给协调器
· 0xFFFE / 0xFFFF 是特殊地址(未分配/广播)
· 具体数量还受网络容量(父节点能挂几个子节点)限制短地址如何分配:设备入网时由父节点分配(协调器分给路由器、路由器分给终端),用地址池/地址块机制,避免冲突:
协调器 PAN=0x1234, 短地址 0x0000
├─ 路由器A 短地址 0x0001 (协调器分配)
└─ 终端C 短地址 0x796F (协调器分配)
路由器A 的终端 B 短地址 0x796F (路由器A分配)
每个父节点在自己地址池里分配, 保证 PAN 内不重复关键理解:短地址是入网后动态分配的(不是出厂固定),所以会变化;IEEE 地址才是设备出厂唯一的固定标识。数据通信通常用短地址(报文短、省电省带宽),但跨网或需要唯一标识时用 IEEE 地址。
七、组网流程
7.1 建网(协调器)
协调器 其他节点
1. 扫描信道,选空闲信道 ────► (信道能量/ED扫描)
2. 建立网络,确定 PAN ID
3. 周期性发信标(Beacon) ─────► 其他节点可发现网络7.2 入网(新节点)
新节点 协调器/路由器
1. 扫描信道 ────────────────► 找到网络(收到Beacon)
2. 发送关联请求(Associate) ──►
3. ◄─ 分配 16 位短地址 ──────
4. 入网成功,可通信7.3 路由(Mesh 多跳)
Mesh 的核心是数据经多个路由器接力(多跳)到达目标,而非一跳直达:
终端A ──► 路由器1 ──► 路由器2 ──► 终端B
(A→B 数据经多跳转发, 每跳都走一段无线链路)发现路径(A 想发给 B,但不知道 B 在哪):
① A 广播路由请求 RREQ ──────────► 全网扩散
路由器1 收到→转发 路由器2 收到→转发
② B 收到 RREQ → 原路回路由回复 RREP
路由器2 → 路由器1 → A
③ A 据此建立路由表: 到 B 的下一跳 = 路由器1
后续数据直接发路由器1 转发即可, 不用再广播数值演算(路由表):A 建立到 B 的路由后,本地路由表如下:
目的地址 下一跳 跳数
0x796F (终端B) 0x0001 (路由1) 3 ← 到 B 需经 3 跳
0x0002 (路由2) 0x0001 (路由1) 2 ← 到路由2 需经 2 跳A 之后给 B 发数据:只发给下一跳(路由1),路由1 再查自己的表转给路由2,路由2 再转给 B——每跳只知道"下一跳是谁",不需要知道完整路径。
自愈(链路断了怎么办):若路由1 掉线,A 发现"发给路由1 失败",会触发重新路由(重发 RREQ),找到另一条路径:
原路径: A ──► 路由1 ──► 路由2 ──► B (路由1 故障)
新路径: A ──► 路由3 ──► 路由2 ──► B (A 重新广播 RREQ 找到新路)关键理解:ZigBee 的路由是"下一跳转发"——每个节点只维护"到某目标该发给谁",数据逐跳接力。这带来两个核心能力:覆盖广(数据可绕过远距离)、自愈(节点故障自动找新路径)。这正是"自组网 Mesh"优于星型单跳的关键。
八、应用支持子层(APS)
APS 层提供面向应用的接口和绑定:
- 簇(Cluster):应用功能定义(如开关簇、温度簇);
- 端点(Endpoint):设备内的应用对象(端点 1~240);
- 绑定(Binding):把"源端点+簇"绑定到"目标端点",自动路由消息;
- 设备对象(ZDO):管理设备、服务发现。
绑定(Binding)工作原理:绑定表把"某个源设备的某个端点 + 簇"映射到"一个或多个目标设备端点"。这样源设备发送时只需指明簇,APS 层自动查绑定表把消息路由到目标,无需知道目标地址:
源设备(开关) 绑定表(存于源设备或协调器): 目标(灯泡)
端点 1, 簇 0x0006(On/Off) ──► 端点 1 @ 短地址0x796F
└─► 端点 1 @ 短地址0x0002
开关发: 端点1, 簇0x0006, cmd=开
APS 查绑定表 → 自动转发给 0x796F 和 0x0002 的端点1
源设备不用知道目标地址, 改目标只需改绑定表| 绑定特点 | 说明 |
|---|---|
| 解耦 | 源设备不关心目标是谁、在哪,只发簇命令 |
| 一对多 | 一个开关可绑定多个灯泡(一键全开) |
| 集中管理 | 绑定表可存在协调器/源设备,由网关注册 |
关键理解:绑定把"发送簇命令"和"目标是谁"解耦——开关只需说"我要开 On/Off 簇",至于哪个灯泡开、开几个,由绑定表决定。这让组网后的设备增删/重配非常灵活,也是 ZigBee 面向应用开发易用的原因。
九、具体例子(智能家居)
9.1 例 1:组建网络
/* 协调器:建网 */
ZigBee_InitNetwork(PAN_ID = 0x1234, channel = 15);
/* 终端设备:入网 */
ZigBee_JoinNetwork(0x1234);
short_addr = ZigBee_GetShortAddr(); // 获分配短地址9.2 例 2:开关控制灯泡(绑定/簇)
/* 终端设备(开关)发送开关簇命令到绑定目标 */
uint8_t cmd[] = {0x01}; // 开
ZigBee_SendCluster(
ENDPOINT_ONOFF, // 端点: 开关簇 0x0006
0x0006, // 簇ID: On/Off
cmd, sizeof(cmd)
);9.3 例 3:传感器周期性上报(终端睡眠)
/* 终端传感器:睡眠采集,唤醒上报给父节点 */
while (1) {
sleep_long(); // 深度睡眠(省电)
wake_up();
temp = read_temperature(); // 采集温度
ZigBee_SendToParent(temp); // 发给父节点(路由器/协调器)
sleep_long(); // 再睡
}十、常见坑与排查
| 问题 | 可能原因 | 排查 |
|---|---|---|
| 终端入不了网 | 信道/PAN ID 不匹配 | 核对协调器信道和 PAN ID |
| 节点睡眠后失联 | 父节点缓存/绑定配置 | 确认父节点缓存,绑定正确 |
| 多跳丢包 | 路由未建立、节点离线 | 检查路由表,确认中间节点在线 |
| 网络瘫痪 | 协调器断电 | 协调器必须常在线 |
| 干扰严重 | 与 WiFi 2.4G 同频 | ZigBee 用信道 15/20/25 避开 WiFi |
| 终端数量受限 | 父节点连接数/地址池 | 增路由器或调整网络规模 |