环境: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,路由器定时切换到新的信道上。