查看: 49647|回复: 59

“飞比”Zigbee论坛CC2530开发板学习教程(五)--ZStack例程讲解之GenericApp

[复制链接]
outman 发表于 2010-10-27 16:12:22 | 显示全部楼层 |阅读模式
由于我们极力倡导“开源Zigbee”,有网友对我们的CC2530开发板项目有所误解,认为我们的开发板是用freakz而不用TI提供的ZStack。实则不然,ZStack是由Zigbee组织认证通过的“Golden unit”Zigbee平台,或者叫Zigbee中的“明星工程”。而且TI公司免费提供了一整套的开发平台及代码。我们没有理由拒绝这么优秀的平台,选择freakz作为补充,只是为了深入到协议层的学习,了解更多的“为什么”。

  一个有效的学习过程,应该是由浅入深,由表面到本质。我们将ZStack的学习定位为了解“是什么”和“怎么样”的过程。从上一篇SerialApp的讲解开始,到本篇的GenericApp和后面的SampleApp, TransmitApp与SimpleApp我们都会以了解例程功能,操作与基本原理为主,深入的学习将在“奥特曼Zigbee读书日记”中进行铺开。

[注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行,并通知作者]

  其实这几个例程实现了不同的功能,方便了开发者在此基本功能上进行二次开发,以缩短项目周期,一定程序上减轻了Zigbee开发的复杂度。让我们一起来一一进行分析:

例4、ZStack的“Hello, world!”例程――GenericApp
注:本例程位于C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\
Samples\GenericApp\CC2530DB目录下,IAR工程文件为GenericApp.eww

[一]程序功能
  本例程在启动后,自动组织建立一个Zigbee网络(我们以一个协调器和终端节点组成的简单网络进行讲解),网络中的设备间通过“绑定”与“按条件搜索”两种方式,建立连接。成功之后互相发送“Hello, world!”字符信息

[二]操作说明
  打开上述的工程文件,分别选择“Coordinator”与“Enddevice”两种设备进行编译、下载至两个FB2530EB板中,详细过程前文已有描述,不再重复。按Reset键后,屏幕显示如下:
        
      

  如果显示信息如上图所示,则表示网络初始化成功。

  此时,按下Enddevice的摇杆(Joystick)右键进行绑定申请,然后立即按下Coordinator的Joystick右键进行绑定确认。此时,两个节点的红色LED灯--LED1,同时点亮,表示绑定成功,可以开始通信。

  注:绑定也可以由Coordinator发起,由Enddevice响应。

  在成功建立连接后,Enddevice与Coordinator均将每5秒钟向对方发送一次“Hello World”字符串。

  与前文SerialApp例程相似,建立连接的方式除了“绑定”外,还有“条件搜索”的方式。按Enddevice的摇杆(Joystick)左键发送“条件搜索”请求――即按规定的ProfileID,支持的Cluster等信息进行匹配设备查找,收到此请求后,Coordinator将会显示如下:



  此信息表明Coordinator已经接收到搜索请求,并且返回了响应信息。随后,Enddevice的红色LED1亮,表示已与匹配设置建立了连接。Enddevice将发送“Hello, world”信息,从Coordinator的LCD上可以看到信息被成功接收。

[三]系统解析

  下面我们一起从代码中了解下上述的过程:
在自动启动网络成功后,Coordinator与Enddevice均将执行如下代码,进行信息发送:
  1. UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
  2. {
  3.                 … …
  4.         case ZDO_STATE_CHANGE:
  5.           GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
  6.           if ( (GenericApp_NwkState == DEV_ZB_COORD)
  7.               || (GenericApp_NwkState == DEV_ROUTER)
  8.               || (GenericApp_NwkState == DEV_END_DEVICE) )
  9.           {
  10.             // Start sending "the" message in a regular interval.
  11.             osal_start_timerEx( GenericApp_TaskID,
  12.                                 GENERICAPP_SEND_MSG_EVT,
  13.                               GENERICAPP_SEND_MSG_TIMEOUT );
  14.           }
复制代码
并且由下面代码实现重复发送,每5秒种一次
  1.   if ( events & GENERICAPP_SEND_MSG_EVT )
  2.   {
  3.     // Send "the" message
  4.     GenericApp_SendTheMessage();

  5.     // Setup to send message again
  6.     osal_start_timerEx( GenericApp_TaskID,
  7.                         GENERICAPP_SEND_MSG_EVT,
  8.                       GENERICAPP_SEND_MSG_TIMEOUT );

  9.     // return unprocessed events
  10.     return (events ^ GENERICAPP_SEND_MSG_EVT);
  11.   }
复制代码
但此时的发送地址并不明确目标。须要如下建立连接的过程,才可将信息发送至某设备:

一、绑定方式
1、按JoyStick右键发送绑定请求:
  1.     if ( keys & HAL_KEY_SW_2 )
  2.     {
  3.       HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

  4.       // Initiate an End Device Bind Request for the mandatory endpoint
  5.       dstAddr.addrMode = Addr16Bit;
  6.       dstAddr.addr.shortAddr = 0x0000; // Coordinator
  7.       ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
  8.                             GenericApp_epDesc.endPoint,
  9.                             GENERICAPP_PROFID,
  10.                             GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
  11.                             GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
  12.                             FALSE );
  13.     }
复制代码
2、另外一个节点在规定时间内按JoyStick右键进行响应,则双方完成绑定,并将先后收到End_Device_Bind_rsp,即绑定响应信号,以表示对方成功进行了应答,可以互相通讯,此时双方红色LED1先后亮起,互送“Hello, world”字符。
  1. void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
  2. {
  3.   switch ( inMsg->clusterID )
  4.   {
  5.     case End_Device_Bind_rsp:
  6.       if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
  7.       {
  8.         // Light LED
  9.         HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
  10.       }
复制代码
二、“条件搜索”的方式

1、Enddevice按下Joystick左键发起搜索
  1.     if ( keys & HAL_KEY_SW_4 )
  2.     {
  3.       HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
  4.       // Initiate a Match Description Request (Service Discovery)
  5.       dstAddr.addrMode = AddrBroadcast;
  6.       dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
  7.       ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
  8.                         GENERICAPP_PROFID,
  9.                         GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
  10.                         GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
  11.                         FALSE );
  12.     }
复制代码
其要求条件见ZDP_MatchDescReq函数的参数。

2、Coordinator对此搜索进行处理,对于接受此要求的设备进行查找。其依据为设备在开机初始化时,如果注册为响应此类信息,则此时由Coordinator向搜索发起者进行汇报。开机注册函数如下:
  1.   ZDO_RegisterForZDOMsg( GenericApp_TaskID, Match_Desc_rsp );
复制代码
3、搜索发起者(Enddevice)接收到Match_Desc_rsp响应,做如下处理:
  1.    case Match_Desc_rsp:
  2.       {
  3.         ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
  4.         if ( pRsp )
  5.         {
  6.           if ( pRsp->status == ZSuccess && pRsp->cnt )
  7.           {
  8.             GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  9.             GenericApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
  10.             // Take the first endpoint, Can be changed to search through endpoints
  11.             GenericApp_DstAddr.endPoint = pRsp->epList[0];

  12.             // Light LED
  13.             HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
  14.           }
  15.           osal_mem_free( pRsp );
  16.         }
  17.       }
  18.       break;
复制代码
此时,EndDevice点亮红色LED,并将自己要发送数据的目标地址等信息改为“搜索中标者”信息,即可实现其数据“Hello, world”发送至目的地。

本帖子中包含更多资源

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

x
sendoc 发表于 2010-10-27 19:49:32 | 显示全部楼层
又见奥版新作
不错,学习一番。
wuxiujiang 发表于 2010-10-29 17:17:28 | 显示全部楼层
新作先学习了!
zmzweb 发表于 2010-11-17 10:31:12 | 显示全部楼层
学习了,收益匪浅!
koy917 发表于 2010-11-20 09:01:16 | 显示全部楼层
讲得很不错,瞻仰中
yuzhiwu1 发表于 2010-11-27 11:13:43 | 显示全部楼层
期待楼主把图片传上来
beckham 发表于 2010-12-12 14:02:47 | 显示全部楼层
学习了 !!!!!!
xiaoyige 发表于 2011-1-27 15:30:21 | 显示全部楼层
顶顶顶顶顶顶
ericsbear 发表于 2011-2-24 22:25:49 | 显示全部楼层
太棒了!楼主好强大呀……
zs3441548 发表于 2011-3-10 12:54:10 | 显示全部楼层
我一直在寻找,但是好辛苦
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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