请问大家,谁知道在ZStack中怎样获取11到26通道的通道能量值呢?
谢谢!
VV:
协议栈中有针对ED Scan的API函数
Susan Yang:
回复 VV:
可以看一下 协议栈安装文件夹内的 802.15.4 MAC API 第19页
bx da:
回复 Susan Yang:
SuSan and VV,
谢谢你们的回复,使用这个函数MAC_MlmeScanReq(macMlmeScanReq_t *pData)就可以实现吧,scanType设置为:MAC_SCAN_ED?
VV:
回复 bx da:
NLME_EDScanRequest( MAX_CHANNELS_24GHZ, _NIB.scanDuration )
bx da:
回复 VV:
VV好,
谢谢您的回复,NLME_EDScanRequest函数只是request,上层怎么知道什么时候扫描完成,并且得到通道ED值呢?
VV:
回复 bx da:
ZDNwkMgr_ProcessEDScanConfirm( ZDNwkMgr_EDScanConfirm_t *pEDScanConfirm )
这个函数是可以看到的啊!
bx da:
回复 VV:
VV您好,
static void ZDNwkMgr_ProcessEDScanConfirm( ZDNwkMgr_EDScanConfirm_t *pEDScanConfirm )这个函数应该是NwkMgr自己内部的函数,这个函数是通过ZDNwkMgr_EDScanConfirmCB函数发消息产生的调用,而ZDNwkMgr_EDScanConfirmCB函数应该是在协议栈内部调用的(并且我在该函数加打印信息测试,发现没有调用这个函数)。我在应用层是不能直接用这个函数的。
VV:
回复 bx da:
你好,
在协议栈里面关于ED Scan Request, 你直接使用NLME_EDScanRequest函数就可以了,在这个函数里面调用的是ZMacScanReq,在这个函数里面调用的是
MAC_MlmeScanReq。所以你直接使用NLME_EDScanRequest就可以了。
在扫描完成以后,首先调用的是 macScanComplete,这个函数里面会调用MAC_CbackEvent,这个函数里面会把扫描结果发到网络层去,在网络层里面会调用
pNwkFreqAgilityScanCfg = NwkFreqAgilityScanCfg这个call back函数。在这个callback函数里面,会调用ZDNwkMgr_EDScanConfirmCB,在这个callback函数里面会把NM_ED_SCAN_CONFIRM消息发送给 ZDNwkMgr_TaskID,那么你只要去ZDNwkMgr_event_loop处理这个消息就可以了,处理这个消息的函数是
ZDNwkMgr_ProcessEDScanConfirm( (ZDNwkMgr_EDScanConfirm_t *)msgPtr ) 之后调用ZDNwkMgr_BuildAndSendUpdateNotify,在这个函数里面你就可以获得扫描的结果了。
下面是我调试的截图
bx da:
回复 VV:
VV您好,
谢谢您的详细回复,我按照您的方法,用NLME_EDScanRequest(MAX_CHANNELS_24GHZ, 1);请求扫描ED值,用仿真器设置断点看返回的ED值,但是我扫描出来的ED值还是很多通道都是0,感觉是不正常的ED值,下面是我调试的截图。
所以有几个问题想麻烦您帮忙确认:
1、很多通道扫描返回的ED值都是0应该是不正常的吧?
2、Zigbee协议里面ED值是属于phy层,表示通道检测到的能量值,这个值是会以一个8位数送给mac层,ED应该是越大越好吧?越大表示通道能接收或发送的能量越高?
3、cc2530有没有寄存器直接能读ED值呢?我只看到RSSI值的寄存器。
4、协调器创建网络时也会扫描ED,有时会扫描两到三次,并且串口会输出“Energy Level Scan Failed”,我将ED值打印出来发现这种情况下很多通道的ED值也都是0。协调器创建网络成功的最后一次ED扫描就不会打印“Energy Level Scan Failed”,并且通道的ED值也基本都是非0值。您能大概说下协议栈内部是怎么进行多次ED扫描最后得到一个正常值的吗?
谢谢!
VV:
回复 bx da:
MAX_CHANNELS_24GHZ这个值你那边定义的是多少?
ED值越大越不好,越大表明信道中正在进行无线通信,或者其他干扰信号,所以能量值会很高。