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 三种设备的组网流程
组网的过程,其实就是一个“找组织”的过程。我画了一张图,帮你理清逻辑。
流程其实不复杂。协调器先上电,选好信道和PAN ID,网络就建好了。然后路由器和终端设备发起加入请求,协调器分配地址。路由器加入后,它自己也能接受新设备加入,这样网络就一层层铺开了。
3.5 实际项目中的选型建议
选什么设备类型,取决于你的应用场景。我总结了几条经验:
- 网关类产品:必须用协调器,负责和上位机通信
- 中继器/信号增强器:用路由器,保证一直在线
- 传感器节点:用终端设备,电池供电,能休眠就休眠
- 智能开关/插座:如果接市电,可以用路由器;如果电池供电,只能用终端设备
一个小技巧:在Z-Stack协议栈里,设备类型是在编译时通过预定义宏决定的。比如 ZDO_COORDINATOR 定义协调器,RTR_NWK 定义路由器,NWK_AUTO_POLL 定义终端设备。改设备类型要重新编译固件,不能运行时切换。
嗯,三种设备类型就讲到这里。记住一句话:协调器管建立,路由器管扩展,终端设备管执行。搞明白这个,组网拓扑就成功了一半。