重入网机制整理:
相关函数:
BDB_vStart()
重要的标志位:eInitState
{
E_INIT_IDLE,
E_INIT_WAIT_REJOIN,
}
1.如果不在网络中的话
路由设备而且是TCLK link的话那么这就是设置 bdbcTLPrimaryChannelSet这里的
其他的情况的话就是返回一个 BDB_EVENT_INIT_SUCCESS 这样的事件
2.如果设备在网络中的话
a.对于路由和协调器而言的话其实就是返回一个BDB_EVENT_INIT_SUCCESS 这样的事件
b.这里如果是终端设备的话主要是执行重入网的情况BDBC_IMP_MAX_REJOIN_CYCLES 这个参数是重入网的时候的一轮下来的次数,
可以进行修改,每次的重新连接的尝试将包括以下几个方面:
a. Rejoin without discovery (direct rejoin)
b. Rejoin with discovery on primary channel set
c. Rejoin with discovery on secondary channel set
如果上述的任一种情况下成功了的话那么 BDB_EVENT_REJOIN_SUCCESS 这个事件将会产生
在上面所有的尝试都失败后,如果 bApsUseInsecureJoin 设置为 TRUE 的话那么将会进行下面的尝试:
a. 如果 ApsUseExtendedPanid 设置的是非0的话,那么将会试图在同一网络上面进行连接
b. 如果 在调用BDB_vStart 之前ApsUseExtendedPanid 设置为0的话,那么重入网将会尝试加入任意的可以使用的网络
如果 上述尝试都失败了,如果 bApsUseInsecureJoin 为FALSE的话那么将会产生BDB_EVENT_REJOIN_FAILURE 这样的事件
这里我们只看重入网的部分
BDB_vRejoinCycle
sBDB.sAttrib.ebdbCommissioningStatus = E_BDB_COMMISSIONING_STATUS_IN_PROGRESS;
这里先通过eRejoinType 进入不同的模式
{
E_REJOIN_WITHOUT_DISC = 0,
E_REJION_WITH_DISC_ON_PRIMARY_CH,
E_REJOIN_WITH_DISC_ON_SECONDARY_CH,
E_REJOIN_ATTEMPT_OVER
}
首先进入的话应该是在E_REJION_WITH_DISC_ON_PRIMARY_CH
这里会去根据之前预设的通道去查找网络
BDB_vSetRejoinFilter()//设置重入网的时候的一些指标
ZPS_eAplZdoRejoinNetwork()//通过该函数去尝试进去之前的网络
ZPS_EVENT_NWK_JOINED_AS_ROUTER
ZPS_EVENT_NWK_JOINED_AS_ENDDEVICE
ZPS_EVENT_NWK_FAILED_TO_JOIN
调用该函数后一般会产生下面的几种结果
之后的话,主要就是通过调用定时器,然后反复的尝试重新入网这样的,一般情况下我们没有设置bApsUseInsecureJoin
所以当重新加入的次数,大于了BDBC_IMP_MAX_REJOIN_CYCLES 的话那么就会返回一个失败的事件
/* Before doing the next rejoin attempt; let's break the context. */
if(u8RejoinCycles < BDBC_IMP_MAX_REJOIN_CYCLES)
{
ZTIMER_eStart(u8TimerBdbRejoin, ZTIMER_TIME_MSEC(1));
return;
}
这里我大概看明白了 BDB_ns 包括这些 BDB_start他们的架构
0.有一个起始函数如 BDB_vStart() 或者BDB_eNsStartNwkSteering() 这样的
1.有一个标志位 eInitState 这样的用来指示当前的工作到了哪一步
2.有一个BDB_vInitStateMachine() 或者 BDB_vNsStateMachine() 这样的在bdb_taskBDB() 里面,主要是一个循环函数
这里会根据 eInitState 的当前值来判断处于什么时期,然后去执行响应的功能
3.有一个定时器加以辅助,定时器并非一定是必须的,但是如果有用到定时器那么这个定时器一定是专门为这个.c文件而使用的
关于轮寻消息多次失败然后让设备尝试重入网的问题:
BDB_vFrStateMachine()//该函数的作用就是当轮训失败或者说是离网的时候选择重入网的话那么堆栈将会在内部启用重新连接
后面的流程就和BDB_vStart() 是一样的了
另外需要注意的是 BDBC_IMP_MAX_REJOIN_CYCLES 这个函数是可以调的,因此对于不同的设备重入网的频率高的可以把这个调低一
些,这样的话就更加省电了。