网络导向可以将本地节点加入到现有的网络,或允许其他节点通过本地节点加入到网络。
如果节点需要网络导向,则必须通过属性 u8bdbCommissioningMode 使能。你可以在你的应用程序中通过调用函数 BDB_eNsStartNwkSteering() 来启动网络导向。
所采用的途径取决于本地节点是否已经是网络中的成员(通过布尔类型属性 bbdbNodeIsOnANetwork 指示)。在所有情况下,网络导向的结果通过传入回调函数 APP_vBdbCallback() 的事件来指示。
节点已在网络中
当节点已经是网络中的成员时,它会在一个固定的时间内开放网络,通过广播一个管理许可加入(Management Permit Joining)请求来让其他节点加入(任何节点类型都可以以这种方式开放网络)。这个固定的时间周期默认为 180 秒,可以通过 ZBD 的常量 BDBC_MIN_COMMISSIONING_TIME 配置(以秒为单位),见 2.5.2 节。在发起上述广播后,将生成 BDB_EVENT_NWK_STEERING_SUCCESS 事件。
节点不在网络中
当节点不是网络中的成员并且是路由器或终端设备时,它会搜索一个合适并可以加入的网络,如果找到,则尝试加入网络,如下所示:
- 节点通过扫描 u32bdbPrimaryChannelSet 位映像(属性)指定的主要无线信道集合来执行网络发现。如果没有找到开放的网络,则通过 u32bdbSecondaryChannelSet 位映像(属性)指定的次要无线信道集合来重复网络发现。如果仍然没有找到网络,则生成事件 BDB_EVENT_NO_NETWORK,并且放弃网络导向。
- 如果找到至少一个开放网络,节点将逐个尝试加入,最多尝试 BDBC_MAX_SAME_NETWORK_RETRY_ATTEMPTS 次。如果加入成功,则属性 bbdbNodeIsOnANetwork 会被设置为 TRUE。如果在主要信道扫描后加入不成功,将在次要信道上重复(步骤 1)扫描。如果次要信道扫描后仍然加入不成功,则会生成 BDB_EVENT_NWK_JOIN_FAILURE 事件,并放弃网络导向。
- 已验证的加入节点从其父节点上接收网络密钥。如果加入的网络为集中式安全网络(具有 TC(信任中心)),则节点向 TC 单播一个节点描述符(Node Descriptor)请求。检查接收到的节点描述符以确保 TC 支持 ZigBee PRO stack r21 或以上版本。如果是这种情况,节点会执行检索一个新的 TC 链接密钥的过程以替换其预配置的链接密钥。在任何时候发生失败,都会通过 BDB_EVENT_NWK_JOIN_FAILURE 事件向应用程序指示。
- 在成功完成上述步骤后,加入节点请求的 ‘允许加入’ 时间(用于新节点加入网络)通过 BDBC_MIN_COMMISSIONING_TIME(默认为 180 秒)延长,并且为应用程序生成一个 BDB_EVENT_NWK_STEERING_SUCCESS 事件。
取决于上述网络导向过程的结果:
- 如果节点成功加入网络,你可能希望将节点与另一个节点绑定或添加到一个组中。在这种情况下,必须进行 2.2.4 节 所述的发现和绑定阶段。
- 如果节点加入网络失败,你可能希望确保所需的网络是开放加入的并且重新发起此网络导向过程。在节点是路由器的情况下,应用程序可以选择形成自己的分布式网络,这种情况下,节点必须进行网络形成阶段(在 2.2.3 节中描述)。