查看: 9003|回复: 9

zstack例程之serialApp网络形成分析--zigbee如何一步步建立网络

[复制链接]
真诚星君 发表于 2011-12-20 21:54:28 | 显示全部楼层 |阅读模式
        一个学期又结束了,寒假来了,我等它很久了,被上课浪费了很多时间,还是在假期可以学到东西啊,最近重新拿到ZIGBEE,像是看到一个久违的朋友啊,倍感亲切啊。!
        由于项目的需要,所以最近重新看了一下serial这个协议栈,这次将这次的学习历程给大家分享下,如果时间允许的话,我也效仿OUTMAN,将这一年来对ZIGBEE学习的经验总结下,来个系列的学习笔记。
        这个历程相对SERSOR DEMO来说要简单的多,但这个历程是了解UART通信的良好例子,顺便温习一下协议栈的运行流程。在这里我就不厌其烦地再讲述一下这个组网的流程吧,老规矩,从MAIN()函数开始。
       
发现图片传不上来。。干脆就把文档上传了。。大家下载看吧。。呵呵。。

在此我还有一个问题,想请教一下大家,在组网的最后调用的一个函数,我文档里的最后那个函数
void ZDO_UpdateNwkStatus(devStates_t state)
{
  epList_t *pItem = epList;

  while (pItem != NULL)
  {
    if (pItem->epDesc->endPoint != ZDO_EP)
    {
      zdoSendStateChangeMsg(state, *(pItem->epDesc->task_id));                  这个函数我看不明白
    }

    pItem = pItem->nextDesc;
  }
  //没运行
#if defined MT_ZDO_CB_FUNC
  zdoSendStateChangeMsg(state, MT_TaskID);
#endif

  ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr();
  (void)NLME_GetExtAddr();  // Load the saveExtAddr pointer.
}
我跟踪不进去了,通过查看变量的值,那个task_id值为0x04和0x06,但我并没有找到相应的处理函数,希望有高人解惑。。!!
根据SERSOR DEMO里的,这个处理函数是在SAPI有相应的处理函数,但是在这里没找到,但是它又调用了那个设置事件的函数。。!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
outman 发表于 2011-12-23 11:10:51 | 显示全部楼层
太好了,我把标题的关键词进行了一点优化,而且最好把内容贴到论坛里,这样更多的人就可以搜索到楼主的文章了。已经把楼主升级为vip会员了。楼主加油
临渊结网 发表于 2011-12-23 15:28:40 | 显示全部楼层
本帖最后由 临渊结网 于 2011-12-23 15:59 编辑

ZDO_UpdateNwkStatus函数的说明说得很清楚:

这个函数把网络状态改变的信息发送到每一个用afRegister()注册过endpoint的任务,在serialApp中只有两个任务用afRegister()注册过endpoint,一个是ZDAPP_Task,另一个是SerialApp_Task,但ZDO_STATE_CHANGE这个消息是ZDO层发送出去的,不会再往ZDO层发送了,这是用if (pItem->epDesc->endPoint != ZDO_EP)这个判断过滤的。调用ZDO_UpdateNwkStatus的结果就是你将在应用层收到ZDO_STATE_CHANGE消息。我想这样你应该清楚了吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
残灯 发表于 2012-5-6 16:59:15 | 显示全部楼层
学习了!
wuyanfeitoby 发表于 2012-5-14 10:11:46 | 显示全部楼层
应用层没有对ZDO_STATE_CHANGE这个消息进行处理啊。。。这个接下来是怎么弄的?
ylxren 发表于 2012-8-9 22:40:50 | 显示全部楼层
{:soso_e100:}
神经火光 发表于 2012-8-14 11:25:44 | 显示全部楼层
wuyanfeitoby 发表于 2012-5-14 10:11
应用层没有对ZDO_STATE_CHANGE这个消息进行处理啊。。。这个接下来是怎么弄的?

可以根据自己需要,添加事件处理函数:
比如;
//-------------------add ZDO_STATE_CHANGE Event process-----------------------  
        case ZDO_STATE_CHANGE:
          SerialApp_NwkState = (devStates_t)(MSGpkt->hdr.status);    //  DEV_ZB_COORD
         
          // 如果是路由器或者终端
          if ( (SerialApp_NwkState == DEV_ROUTER)
              || (SerialApp_NwkState == DEV_END_DEVICE) )
          {
            HalLedSet( HAL_LED_1,HAL_LED_MODE_ON );
            // Start sending the periodic message in a regular interval.
            //-------------here should be modified--------------------
            // ----not need set a event can slove this problem-------
//         SerialApp_BindProcess();
            //--------------------end--------------------------------
            //osal_set_event( SerialApp_TaskID, KEY_CHANGE);
          }
          else
          {
            // Device is no longer in the network
          }
          break;
lizheng86312 发表于 2012-8-29 11:52:51 | 显示全部楼层
学到东西了。顶。。。
mingrufan 发表于 2012-10-9 18:07:27 | 显示全部楼层
受教了,谢谢楼主耐心分析,只是看看关于7楼给5楼的回复,时间上都相差半年啊!真心的希望这个论坛能成为大家寻找真知的天地,希望大家能挤出自己的一点宝贵时间,给有困难的同胞们解答解答……
cuilin 发表于 2013-1-8 10:31:30 | 显示全部楼层
还是不理解啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表