4. ZigBee设备类型:协调器、路由器、终端设备与角色切换

ZigBee网络里,设备不是平等的。这一点和Wi-Fi完全不同——Wi-Fi里所有设备都连同一个路由器,地位差不多。但ZigBee网络有三种角色,各司其职。我刚开始接触时也觉得麻烦,后来发现,搞懂这三种角色,整个网络架构就清晰了。

4.1 三种设备类型概述

ZigBee协议定义了三种逻辑设备类型:协调器(Coordinator)、路由器(Router)和终端设备(End Device)。它们分工明确,缺一不可。

设备类型 核心功能 是否必须 典型功耗
协调器 建网、分配地址、管理网络 每个网络唯一 高(常供电)
路由器 转发数据、扩展覆盖、允许入网 可选 中(常供电)
终端设备 采集数据、执行控制、可休眠 至少1个 低(可电池)

说白了,协调器是“创始人”,路由器是“中转站”,终端设备是“一线员工”。

4.2 协调器——网络的起点

每个ZigBee网络有且只有一个协调器。它负责两件事:建立网络和分配短地址。

协调器上电后,会扫描信道,选择一个干扰最小的,然后给自己分配地址0x0000。之后其他设备才能加入。

关键点:协调器不能休眠。一旦协调器掉电,整个网络就瘫痪了。我在项目中见过有人把协调器做成电池供电,结果半天就没电了——这是设计失误。

协调器的代码初始化流程大致如下:

// Z-Stack中协调器初始化示例
void zdoStartDevice(void)
{
    // 1. 初始化网络层
    NLME_Init();
    
    // 2. 设置设备类型为协调器
    NLME_SetDeviceType(DEVICE_COORDINATOR);
    
    // 3. 启动网络
    NLME_StartDevice();
    
    // 4. 等待设备加入
    // 回调函数会通知新设备入网
}

4.3 路由器——网络的骨架

路由器的作用是转发数据和扩展网络覆盖。没有路由器,协调器覆盖范围有限,终端设备远了就连不上。

路由器加入网络后,会获得一个短地址。它自己也能允许其他设备加入。路由器同样不能休眠,必须一直在线。

我的经验:在大型传感器网络中,路由器部署位置很关键。我曾经在一个仓库项目里,把路由器放在金属货架旁边,信号衰减严重。后来调整到货架通道中间,覆盖就好了很多。路由器位置选对了,网络稳定性提升一大截。

路由器的主要职责:

  • 维护路由表,计算最佳路径
  • 转发数据包到下一跳
  • 允许终端设备加入网络
  • 定期发送信标(Beacon)同步网络

4.4 终端设备——网络的末梢

终端设备是ZigBee网络里最灵活的角色。它可以休眠,功耗极低。传感器节点、智能开关、温控器,基本都是终端设备。

终端设备不参与路由转发。它只和自己的父节点(协调器或路由器)通信。数据先发给父节点,再由父节点转发到目标。

注意:终端设备休眠期间,父节点会缓存发给它的数据。但缓存空间有限。如果终端设备长时间不唤醒,数据会丢失。我曾经调试一个项目,终端设备设了10分钟休眠周期,结果父节点缓存溢出,数据全丢了。后来改成30秒轮询一次,问题解决。

终端设备的典型工作模式:

  1. 唤醒 → 采集传感器数据
  2. 发送数据到父节点
  3. 轮询父节点是否有缓存数据
  4. 进入休眠

4.5 设备角色切换

ZigBee设备在运行过程中,角色可以切换吗?答案是:可以,但有条件。

角色切换通常发生在以下场景:

  • 协调器故障:协调器掉线后,网络需要新的协调器接管。但ZigBee 3.0之前不支持协调器热切换。3.0之后引入了“网络管理器”机制,可以迁移协调器功能。
  • 路由器降级:路由器如果检测到网络不需要自己转发,可以主动降级为终端设备以节省功耗。
  • 终端设备升级:终端设备如果发现网络需要更多路由节点,可以申请升级为路由器。

角色切换的代码实现(以Z-Stack为例):

// 终端设备请求升级为路由器
void upgradeToRouter(void)
{
    // 1. 发送升级请求
    NLME_UpgradeDeviceReq();
    
    // 2. 等待协调器批准
    // 回调函数处理批准结果
    if (upgradeApproved)
    {
        // 3. 重新初始化网络层
        NLME_Init();
        NLME_SetDeviceType(DEVICE_ROUTER);
        NLME_StartDevice();
    }
}

避坑指南:我曾经在一个智能照明项目里,尝试让终端设备动态切换为路由器。结果发现,切换过程中设备会短暂离线,导致控制指令丢失。后来我加了一个“切换缓冲期”,在切换前先通知父节点暂存数据,切换完成后再拉取。这个方案后来成了团队的标准做法。

4.6 三种设备的网络拓扑关系

为了让你更直观地理解三种设备如何组成网络,我画了一张结构图。

ZigBee网络拓扑结构图 协调器 地址: 0x0000 路由器1 地址: 0x0001 路由器2 地址: 0x0002 终端设备1 地址: 0x796F 终端设备2 地址: 0x143B 终端设备3 地址: 0x2A8F 终端设备只能与父节点(协调器或路由器)直接通信,不能跨级通信 路由器之间可以互相转发数据,形成多跳网络

从图中可以看出,终端设备只和父节点通信。路由器之间可以互相转发。协调器是网络的根节点。这种分层结构,让ZigBee网络既能覆盖大范围,又能保持低功耗。

4.7 如何选择设备类型

实际项目中,设备类型的选择有规律可循:

  • 常供电的设备 → 做协调器或路由器
  • 电池供电的设备 → 做终端设备
  • 需要中继功能的设备 → 做路由器
  • 只需要上报数据的传感器 → 做终端设备

我的建议:不要把所有设备都设成路由器。路由器越多,网络维护开销越大。一个100个节点的网络,路由器控制在10-15个就足够了。剩下的全做终端设备,功耗低,网络也稳定。

4.8 本章小结

三种设备类型是ZigBee网络的基石。协调器建网,路由器转发,终端设备采集。角色切换提供了灵活性,但需要谨慎使用。搞懂这些,你就能设计出稳定、低功耗的ZigBee网络了。