|
由于我们极力倡导“开源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均将执行如下代码,进行信息发送:- UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
- {
- … …
- case ZDO_STATE_CHANGE:
- GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
- if ( (GenericApp_NwkState == DEV_ZB_COORD)
- || (GenericApp_NwkState == DEV_ROUTER)
- || (GenericApp_NwkState == DEV_END_DEVICE) )
- {
- // Start sending "the" message in a regular interval.
- osal_start_timerEx( GenericApp_TaskID,
- GENERICAPP_SEND_MSG_EVT,
- GENERICAPP_SEND_MSG_TIMEOUT );
- }
复制代码 并且由下面代码实现重复发送,每5秒种一次- if ( events & GENERICAPP_SEND_MSG_EVT )
- {
- // Send "the" message
- GenericApp_SendTheMessage();
- // Setup to send message again
- osal_start_timerEx( GenericApp_TaskID,
- GENERICAPP_SEND_MSG_EVT,
- GENERICAPP_SEND_MSG_TIMEOUT );
- // return unprocessed events
- return (events ^ GENERICAPP_SEND_MSG_EVT);
- }
复制代码 但此时的发送地址并不明确目标。须要如下建立连接的过程,才可将信息发送至某设备:
一、绑定方式
1、按JoyStick右键发送绑定请求:- if ( keys & HAL_KEY_SW_2 )
- {
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
- // Initiate an End Device Bind Request for the mandatory endpoint
- dstAddr.addrMode = Addr16Bit;
- dstAddr.addr.shortAddr = 0x0000; // Coordinator
- ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
- GenericApp_epDesc.endPoint,
- GENERICAPP_PROFID,
- GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
- GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
- FALSE );
- }
复制代码 2、另外一个节点在规定时间内按JoyStick右键进行响应,则双方完成绑定,并将先后收到End_Device_Bind_rsp,即绑定响应信号,以表示对方成功进行了应答,可以互相通讯,此时双方红色LED1先后亮起,互送“Hello, world”字符。- void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
- {
- switch ( inMsg->clusterID )
- {
- case End_Device_Bind_rsp:
- if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
- {
- // Light LED
- HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
- }
复制代码 二、“条件搜索”的方式
1、Enddevice按下Joystick左键发起搜索- if ( keys & HAL_KEY_SW_4 )
- {
- HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
- // Initiate a Match Description Request (Service Discovery)
- dstAddr.addrMode = AddrBroadcast;
- dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
- ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
- GENERICAPP_PROFID,
- GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
- GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
- FALSE );
- }
复制代码 其要求条件见ZDP_MatchDescReq函数的参数。
2、Coordinator对此搜索进行处理,对于接受此要求的设备进行查找。其依据为设备在开机初始化时,如果注册为响应此类信息,则此时由Coordinator向搜索发起者进行汇报。开机注册函数如下:- ZDO_RegisterForZDOMsg( GenericApp_TaskID, Match_Desc_rsp );
复制代码 3、搜索发起者(Enddevice)接收到Match_Desc_rsp响应,做如下处理:- case Match_Desc_rsp:
- {
- ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
- if ( pRsp )
- {
- if ( pRsp->status == ZSuccess && pRsp->cnt )
- {
- GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
- GenericApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
- // Take the first endpoint, Can be changed to search through endpoints
- GenericApp_DstAddr.endPoint = pRsp->epList[0];
- // Light LED
- HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
- }
- osal_mem_free( pRsp );
- }
- }
- break;
复制代码 此时,EndDevice点亮红色LED,并将自己要发送数据的目标地址等信息改为“搜索中标者”信息,即可实现其数据“Hello, world”发送至目的地。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|