必须在应用程序代码中使用函数 BDB_vInit() 以初始化 ZBD。在 ZigBee PRO stack 初始化以及从持久性存储中恢复 ZBD 的属性(bbdbNodeIsOnANetwork)之后,必须调用此函数。
Note 1:BDB_vInit() 的内部调用了函数 BDB_vSetKeys(),该函数从文件 bdb_link_keys.c 中将预先配置的链接密钥加载到内存中。网络安全和预配置的(pre-configured)链接密钥在 2.3 节中详述。
Note 2:ZBD 需要多个内部软定时器,由宏 BDB_ZTIMER_STORAGE 定义。因此,当应用程序调用 ZTIMER_eInit() 以初始化所需的软定时器并且为其分配存储空间(数组元素)时,它必须添加 BDB_ZTIMER_STORAGE 的定时器以供 ZBD 使用。该函数必须在 BDB_vInit() 之前调用。软定时器及其相关功能在 ZigBee 3.0 Stack User Guide (ZB3STAUG)中详述。
然后,可以通过调用 BDB_vStart() 来启动 ZBD。根据节点的类型以及其之前是否为网络的成员,此函数可能执行或不执行该动作,如下所述。无论是那种情况,该函数最终都会使用合适的事件调用 APP_vBdbCallback() 回调函数。
如果节点不(曾经)在网络中:
对于支持 TC(Touchlink)commissioning 的路由器节点(参见 2.2.1 节),此函数会在 BDBC_TL_PRIMARY_CHANNEL_SET 的位映像(bitmap)(参见 2.5.2.2 节)中为节点从 TC 指定的主要信道集合中选择一个无线信道。其会选择指定集合中的第一个信道,或者如果宏 RAND_CHANNEL 被设置为 TRUE(在文件 bdb_options.h 中)时,将随机从集合中选择一个信道。
对于协调器、其他路由器和终端设备节点将不采取任何行动,并且应用程序随后需要使用在 2.2 节中描述的一种 commissioning 方法形成网络(协调器或路由器)或加入网络(终端设备或路由器)。
以上的情况,函数会生成一个 BDB_EVENT_INIT_SUCCESS 事件。
如果节点(曾经)在网络中:
对于协调器和路由器节点,不采取任何行动,并且函数会生成一个 BDB_EVENT_INIT_SUCCESS 事件。
对于终端设备节点,此函数会尝试让节点重连到网络中。它会执行一系列的周期重连,每个周期包含以下三次重连尝试:
- 使用以前的网络参数(没有网络发现)进行尝试
- 在 u32bdbPrimaryChannelSet 的位映像(属性)中指定的主要信道集上进行网络发现并尝试
- 在 u32bdbPrimaryChannelSet 的位映像(属性)中指定的次要信道集上进行网络发现并尝试
信道的位映像是 ZBD 的属性,在 2.5.1 节中详述。
上述的周期重连会被执行最多 BDBC_IMP_MAX_REJOIN_CYCLES 次,这是一个特定实现的(implementation-specific) ZBD 常数(参见 2.5.2 节)。
如果尝试重连成功,函数将会生成 BDB_EVENT_REJOIN_SUCCESS 事件。
如果所有的尝试重连都不成功,函数将会生成 BDB_EVENT_REJOIN_FAILURE 事件,除非通过 APS 的 apsUseInsecureJoin 属性使能了非安全加入,在这种情况下,该函数将尝试通过网络导向(Network Steering)(在 2.2.2 节中描述)进行加入。加入的性质取决于 APS 属性 ApsUseExtendedPanid 中设置的扩展 PAN ID(EPID)的值:
- 对于非零的 EPID,该节点会尝试加入这个 EPID 相关的网络
- 对于为零的 EPID,函数会尝试加入到可用的网络
此连接将尝试自动调用函数 BDB_eNsStartNwkSteering()。