3. ZigBee设备类型:协调器、路由器、终端设备的角色与功能

做ZigBee开发,第一件事就是搞清楚三种设备类型。我见过不少新手,上来就写代码,结果组网怎么都组不起来——其实就是没搞明白协调器、路由器和终端设备各自该干什么。

说白了,ZigBee网络就像一个公司。协调器是老板,路由器是部门经理,终端设备就是普通员工。各司其职,缺一不可。

3.1 协调器(Coordinator)——网络的发起者

协调器是整个ZigBee网络的起点。每个ZigBee网络有且只有一个协调器。它的任务很明确:建立网络、管理网络、分配地址。

核心职责:

  • 扫描信道,选择一个干扰最小的信道
  • 设定PAN ID(网络标识符),确保网络中唯一
  • 允许其他设备加入网络,并分配16位短地址
  • 维护网络拓扑信息

我在一个智能照明项目里就踩过坑。当时为了省成本,用了一个低端MCU做协调器,结果设备一多,协调器处理不过来,新设备死活加不进网。后来换了性能强一点的芯片,问题才解决。

注意:协调器一旦断电重启,如果之前没有保存网络信息,它会重新建立一个新网络。原来网络里的设备就全丢了。所以量产产品一定要做NV(非易失性存储)保存。

3.2 路由器(Router)——网络的扩展者

路由器的作用,就是让网络覆盖更远、更广。它接收数据,也转发数据。你想想看,如果只有协调器,那所有终端设备都得在协调器附近,这还怎么用?

路由器的特点:

  • 必须一直供电,不能休眠
  • 可以转发其他设备的数据包
  • 允许新设备通过它加入网络
  • 可以有自己的子节点

我习惯把路由器部署在网络的中间位置,比如走廊、大厅这些地方。这样既能覆盖到远处的终端设备,又能保证数据通路稳定。

经验之谈:在ZigBee 3.0协议栈里,路由器默认是开启“允许加入”的。但如果你不想让新设备随便加进来,可以调用 zbPermitJoiningRequest(0) 关闭。我一般在系统调试阶段才打开,正式部署后就关掉。

3.3 终端设备(End Device)——网络的执行者

终端设备是真正干活的。它采集传感器数据、控制开关、执行命令。但它不转发数据,也不允许其他设备通过它加入网络。

终端设备最大的优势:可以休眠。这对电池供电的设备来说太重要了。

特性 协调器 路由器 终端设备
是否必须存在 是(唯一) 可选 可选
是否转发数据 是 是 否
是否允许设备加入 是 是 否
是否可休眠 否 否 是
典型供电方式 市电 市电 电池
典型应用 网关 中继器 传感器、开关

终端设备休眠的时候,数据怎么办?它会定期醒来,向它的父节点(路由器或协调器)发送轮询请求,看看有没有数据等着它。这个轮询间隔可以配置,我一般设成1秒到5秒,具体看应用场景。

避坑指南:我曾经把一个终端设备的轮询间隔设成30秒,结果控制指令发出去,设备要等半分钟才响应。客户直接投诉说“这开关是坏的”。后来改成2秒,体验就好多了。电池续航也从3个月降到了2个月,但用户能接受。

3.4 三种设备的组网流程

组网的过程,其实就是一个“找组织”的过程。我画了一张图,帮你理清逻辑。

ZigBee 组网流程 协调器上电 扫描信道,建立网络 等待设备加入 路由器加入网络 终端设备加入网络 路由器允许更多设备加入 终端设备休眠/轮询 说明:协调器先建立网络,路由器和终端设备再依次加入。路由器可以继续扩展网络覆盖范围。

流程其实不复杂。协调器先上电,选好信道和PAN ID,网络就建好了。然后路由器和终端设备发起加入请求,协调器分配地址。路由器加入后,它自己也能接受新设备加入,这样网络就一层层铺开了。

3.5 实际项目中的选型建议

选什么设备类型,取决于你的应用场景。我总结了几条经验:

  • 网关类产品:必须用协调器,负责和上位机通信
  • 中继器/信号增强器:用路由器,保证一直在线
  • 传感器节点:用终端设备,电池供电,能休眠就休眠
  • 智能开关/插座:如果接市电,可以用路由器;如果电池供电,只能用终端设备

一个小技巧:在Z-Stack协议栈里,设备类型是在编译时通过预定义宏决定的。比如 ZDO_COORDINATOR 定义协调器,RTR_NWK 定义路由器,NWK_AUTO_POLL 定义终端设备。改设备类型要重新编译固件,不能运行时切换。

嗯,三种设备类型就讲到这里。记住一句话:协调器管建立,路由器管扩展,终端设备管执行。搞明白这个,组网拓扑就成功了一半。