环境:TI  CC2530

关键命令:

Mgmt_NWK_Update_notify  : 路由器通知协调器考虑切换信道(不一定会切换 )

Mgmt_NWK_Update_req

 

一、发送 Mgmt_NWK_Update_notify

ZDNWKMGR_MIN_TRANSMISSIONS 并且失败率超过 ZDNWKMGR_CI_TX_FAILURE,则认为当前信道受到干扰,则进行下面操作:

1、进行全部信道能量扫描,如果当前信道能量并不超过其他信道,则继续照常工作。

2、如果当前信道能量增加,则发送Mgmt_NWK_Update_notify到协调器报告信道受到干扰。

3、为避免有设备通信出现故障而不断发送Mgmt_NWK_Update_notify,规定一个设备一小时发送Mgmt_NWK_Update_notify不   能超过 4 次

 

二、Mgmt_NWK_Update_notify 的处理

协调器收到Mgmt_NWK_Update_notify后进行以下判断:

1、是否有必要切换信道?

ZDNWKMGR_CC_TX_FAILURE

     2)设备传输失败率超过上一次失败率

2、如何选择信道?

能量值最低,能量低于最低阈值  ZDNWKMGR_ACCEPTABLE_ENERGY_LEVEL

 

三、信道切换 Mgmt_NWK_Update_req

1、新信道确定后,协调器广播发送 Mgmt_NWK_Update_req(其中nwkUpdateId加1,与旧信道区分)到所有路由和协调器,通知新的信道值,协调器会设置一个 ZDNWKMGR_UPDATE_REQUEST_TIMER 定时器,期间不会接受同样的命令(切换信道)。并且设置一个 nwkNetworkBroadcastDeliveryTime

2、所有路由器接收到 Mgmt_NWK_Update_req 命令后,定时 nwkNetworkBroadcastDeliveryTime 后切换信道,并将新的nwkUpdateId 存放在 NIB 和 beacon payload 中,清除传输总量和传输失败率

3、所有RFD_RCVC_ALWAYS_ON==TRUE的设备,如终端,将不会收到Mgmt_NWK_Update_req命令,即不会自行切换信道,这些设备在路由器和协调器切换信道后会掉线,开始依据 channelList 使用 EPID 进行网络搜索,如果找到有EPID相同的信道,则选择其中 nwkUpdateId 更高的信道,如果 channelList 中找不到 EPID 相同中的则启动全信道搜索。

四、关键代码分析

主要代码文件:ZDNwKMgr.c 、 ZDNwKMgr.h

主要流程:

1、路由器&协调器

1)ZDNwkMgr_ReportChannelInterference 获取当前信道传输总数和传输失败数,发送NM_CHANNEL_INTERFERE事件

2)ZDNwkMgr_ProcessChannelInterference 启动一次信道能量扫描NLME_EDScanRequest,默认全信道扫描(此处个人建议不要修改为部分信道,后面代码好像没有对部分信道扫描的的代码分析,以免发生意想不到的错误)

3)ZDNwkMgr_EDScanConfirmCB() 获得全部信道及其对应的能量值,发送NM_ED_SCAN_CONFIRM事件

4)ZDNwkMgr_ProcessEDScanConfirm()根据扫描信道数量,默认全信道扫描,ZDNwkMgr_MgmtNwkUpdateReq.scanCount == 0xFF 进行当前信道能量检测

 5)ZDNwkMgr_CheckForChannelInterference 若有其他信道能量比当前信道低,则

     a、ZDNwkMgr_BuildAndSendUpdateNotify 将扫描信道能量组合数据包(若有些信道没有扫描可减少数据量,但默认全部信道扫描)

     b、ZDP_MgmtNwkUpdateNotify将状态(未用)、信道掩码、传输总量、传输失败数、能量列表数、能量数组打包,FillAndSendBufferTxOptions单播发送Mgmt_NWK_Update_notify命令给协调器

2、协调器

1)收到Mgmt_NWK_Update_notify事件执行ZDNwkMgr_ProcessMgmtNwkUpdateNotify

2)ZDO_ParseMgmtNwkUpdateNotify内执行ZDO_ParseMgmtNwkUpdateNotify取出消息里的扫描信道掩码、传输总量、传输失败数、能量列表,接着ZDNwkMgr_CheckForChannelChange检查准备切换信道

3)ZDNwkMgr_CheckForChannelChange中比较传输失败率大于设定值,大于最新失败率,能量列表中最小值小于设定值,则确认切换信道。找出能量列表中最小的信道,并与当前信道不同(此处可增加条件,强制切换到自己预定的信道列表中),则将nwkUpdateId+1,新信道掩码广播发送Mgmt_NWK_Update_req给所有路由器,自身定时切换新的信道

3、路由器

1)收到Mgmt_NWK_Update_req后执行ZDNwkMgr_ProcessMgmtNwkUpdateReq

2)先ZDO_ParseMgmtNwkUpdateReq取出数据中的信道掩码channelMask和扫描持续时间scanDuration,后根据scanDuration不同进行处理,此处scanDuration作用不明,协调器广播Mgmt_NWK_Update_req时将scanDuration置为0xfe,是否有其他地方设置为其他值,待研究

3)根据scanDuration == 0xfe,路由器定时切换到新的信道上。