NXP JN5169 ZIGBEE3.0的重入网问题

重入网机制整理:

相关函数:

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 这个函数是可以调的,因此对于不同的设备重入网的频率高的可以把这个调低一

些,这样的话就更加省电了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 使用的是NXP公司的JN5169模块,然后SDK是4170的 ZIGBEE 中我犯下的几个问题: 1.认为 错误点...
    Stc_choice阅读 4,536评论 0 1
  • FreakZ学习笔记:路由发现机制 路由发现机制只有在发送通信包的过程中会被调用,而接收过程因为发送时候已经进行了...
    zplodge阅读 4,353评论 0 0
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,778评论 0 6
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 7,641评论 0 73
  • 一步走错步步错,低头认输最沉默。 人生谁无失手时,卧薪尝胆再来过。
    蛮力阅读 3,093评论 1 3

友情链接更多精彩内容