协调器A,电量充足。
路由器B,电池快没电了。
组网方式,mesh。
目的是:当router 组网成功后,捕获 ZDO_STATE_CHANGE 向 协调器发送一个消息。
我的操作是:
路由器的操作:
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{ if ( events & SYS_EVENT_MSG ){
while ( MSGpkt ) {
switch ( MSGpkt->hdr.event ) {
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE: SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ((SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE)){
//入网成功,通知协调器
AF_DataRequest( &DstAddr,&pDesc,Device_annce,17,Buf,&TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) ;
}
……………………….
}
协调器操作:
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
switch ( pkt->clusterId ){
case SAMPLEAPP_POINT_TO_POINT_CLUSTERID: break;
case Device_annce:
执行代码C
………………………….
}
奇怪现象是:
当路由器B在快没电的情况下,和协调器A组网。网络状态变化,触发:ZDO_STATE_CHANGE。向协调器发送:Device_annce消息。此时路由器收到Device_annce消息后,会不断执行 “执行代码C”。
奇怪的是: 路由器B 拨掉电源。 协调器A,仍然不断执行代码C !!!!!
求大牛指导指导。谢谢!
自己测试了好久,发现如下结果:
1. 路由器B 在电量很低时,会不断的模拟重启过程。此时会发送大量的数据。
2.协调器A 收到这些数据后,会存储到队列里面,排队处理。
3.所以,当路由器B 拨掉电源后,原来存到协调器A中的数据,会不断的补传。。
新问题又来了:
协调器中,如何清除之前的队列消息呢? ——- 我试过,重启是不解决问题的,因为我预编译了:NV_RESTORE。
求指导。。。
VV:
1:当电量很低的时候,节点不断的Reset,是正常的。
2:关于你的路由器上做法,Device Announce是标准的ZDO层消息,所以没必要自己在应用层去添加AF发送函数,如果路由成功入网,会自动化Device Announce的
在void ZDApp_ProcessNetworkJoin( void )函数里面。
3:关于你的ZDO_STATE_CHANGE的这个事件不是说入网成功以后就到这里来了,只要第一次如果网,而且开启了NV功能,那么设备的类型都是保存着的,所以你只要上电就会有发数据的过程,但是其实没有执行入网的操作等。这个和Device Announce的设计违背的。、
4:关于ZigBee调试,最好用抓包来分析问题