2740|4

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

协议栈例程simpleApp中为什么sensor重复进行加网流程 [复制链接]

协议栈的网络初始化主要是在ZDApp.c里面做的,如果未设置DEV_HOLD,设备会自动循环初始化网络,直到加入网络
如下
ZDApp_Init()-->    ZDOInitDevice( 0 )-->ZDApp_NetworkInit()(在此函数里面启动ZDO层事件ZDO_NETWORK_INIT)。
UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )


    ……
   if ( events & ZDO_NETWORK_INIT )
  {
     // Initialize apps and start the network
     devState = DEV_INIT;
     osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );//更新设备网络状态,并将状态传递到应用层,用户接收到数据后就可以根据设备状态进行相应的处理(即
UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )
{case ZDO_STATE_CHANGE:
          // If the device has started up, notify the application
          if (pMsg->status == DEV_END_DEVICE ||
              pMsg->status == DEV_ROUTER ||
              pMsg->status == DEV_ZB_COORD )
          {
            SAPI_StartConfirm( ZB_SUCCESS );
          }
          else  if (pMsg->status == DEV_HOLD ||
                  pMsg->status == DEV_INIT)
          {
            SAPI_StartConfirm( ZB_INIT );
          }
          break;



     ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
                     DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );

     // Return unprocessed events
     return (events ^ ZDO_NETWORK_INIT);
  }
……


ZDO_StartDevice()函数会触发ZDO层事件SYS_EVENT_MSG,从而调用函数SAPI_ProcessZDOMsgs(),如下
UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )

        case ZDO_CB_MSG:
          SAPI_ProcessZDOMsgs( (zdoIncomingMsg_t *)pMsg );//此函数会根据设备网络状态再次启动ZDO事件ZDO_NETWORK_INIT,这样就形成了循环,直到加入网络
          break;




问题:继续深入应用层关于ZDO_STATE_CHANGE的处理可以发现,在加网不成功后,又一次对设备进行了初始化,这样不就与ZDO层的网络流程重复了吗。
void zb_StartConfirm( uint8 status )
{
  if ( status == ZB_SUCCESS )
  {
    myAppState = APP_START;

    // Set event to bind to a collector
    osal_start_timerEx( sapi_TaskID, MY_FIND_COLLECTOR_EVT, myBindRetryDelay );
  }
  else
  {
    // Try joining again later with a delay
    osal_start_timerEx( sapi_TaskID, MY_START_EVT, myStartRetryDelay );
  }
}


void zb_HandleOsalEvent( uint16 event )
{
  uint8 pData[2];


  if ( event & MY_START_EVT )
  {
    zb_StartRequest();
  }






此帖出自RF/无线论坛

最新回复

很好的经验分享   详情 回复 发表于 2014-9-2 11:09
点赞 关注
 

回复
举报

17

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
额,忽然间明白了。我研究过的这个流程。应用层关于加网失败的处理,是针对 pMsg->status为DEV_INIT或DEV_HOLD时的处理,而在不配置DEV_HOLD的情况下,ZDO层传递过来的参数一般是DEV_NWK_DISC,所以应用层并没有处理,也就不存在重复加网的问题了。
总结:我2了。
此帖出自RF/无线论坛
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
看不懂的更2了………………
此帖出自RF/无线论坛
个人签名选择购线,构造安全,连接你我!http://www.gooxian.com/
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

4
 
我已经贴的很详细了,你可能没看例程,所以有点不明白,对照例程就很好理解了
此帖出自RF/无线论坛
 
 
 

回复

2万

帖子

71

TA的资源

管理员

5
 
很好的经验分享
此帖出自RF/无线论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表