12 ZigBee协议栈实验:组播实验_第1页
12 ZigBee协议栈实验:组播实验_第2页
12 ZigBee协议栈实验:组播实验_第3页
12 ZigBee协议栈实验:组播实验_第4页
12 ZigBee协议栈实验:组播实验_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ZigBee协议栈实验:组播实验主讲:张老师一、实验原理二、重点代码解析三、实验结果验证标题四、数据接收一、实验原理--加入组的流程

当应用程序需要将数据包发送给网络上的一组设备时,使用组播模式。地址模式设置为afAddrGroup,并且addr.shortAddr设置为组ID。使用组播的方式需要加入特定的组。加入组的流程如下:①首先声明一个组对象aps_Group_tSampleApp_Groupaps_Group_t结构体的定义:typedefstruct{

uint16ID;

//Uniquetothistable

uint8

name[APS_GROUP_NAME_LEN];//#defineAPS_GROUP_NAME_LEN

16}aps_Group_t;每个组有个特定的ID跟组名,组名存放在name数组中,name数组的第一个元素是组名的长度,第二个元素开始存放组名字符串。一、实验原理--加入组的流程

②对SampleApp_Group赋值//Bydefault,alldevicesstartoutinGroup1SampleApp_Group.ID=0x0003;

//初始化组IDosal_memcpy(SampleApp_G,"Group3",7);

//将组名的长度写入name数组的第一个元素位置处。

③在本任务里将端点加入到组中aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);一、实验原理--加入组的流程

④设定通信的目标地址及模式//Setupfortheflashcommand'sdestinationaddress-Group1SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr=SampleApp_Group.ID;通信时候,发送设备的输出cluster设定为接收设备的输入cluster,另外profileID设定相同,即可通信。一、实验原理--加入组的流程⑤若要把一个设备加入到组中的端点从组中移除,调用aps_RemoveGroup:aps_Group_t*grp;grp=aps_FindGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);if(grp){

//Removefromthegroupaps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);}注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。一、实验原理——实验效果及原理图协调器周期性的以组播的形式向路由器发送数据路由器收到数据后,使开发板上的LED状态翻转,同时向协调器发送字符串“Routerreceived!",协调器收到路由器发回的数据后,通过串口输出到PC机,用户可以通过串口调试助手查看该信息。在路由器编程时,将两个路由器和协调器加到一个组中,剩余一个路由器不加入该组,观察实验现象。一、实验原理——工作流程组播通信实验协调器程序流程图组播通信实验路由器程序流程图二、重点代码解析--协调器程序设计#include"aps_groups.h"//使用加入组函数aps_AddGroup()函数,需要包含头文件aps_Group_tGenericApp_Group;aps_Group_tGenericApp_Group;voidGenericApp_Init(bytetask_id){。。。GenericApp_Group.ID=0x0001;GenericApp_G[0]=6;osal_memcpy(&(GenericApp_G[1]),"Group1",6);}以上代码是任务初始化代码,主要完成端口初始化和组号的初始化。二、重点代码解析--协调器程序设计UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){。。。caseZDO_STATE_CHANGE:GenericApp_Nwkstate=(devStates_t)(MSGpkt->hdr.status);if(GenericApp_Nwkstate==DEV_ZB_COORD)//建立网络后,加入组

{aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);

osal_set_event(GenericApp_TaskID,SEND_TO_ALL_EVENT);}。。。

if(events&SEND_TO_ALL_EVENT)//发送组播数据,每次发送完就定时5秒

{GenericApp_SendTheMessage();osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}}二、重点代码解析--协调器程序设计voidGenericApp_SendTheMessage(void){char*theMessageData="Coordinatorsend!";afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)AddrGroup;my_DstAddr.endPoint=GENERICAPP_ENDPOINT;my_DstAddr.addr.shortAddr=GenericApp_Group.ID;AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,osal_strlen(theMessageData)+1,theMessageData,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);}上述函数实现了组播发送,此时地址模式设置为AddrGroup,网络地址设置为组ID,即GenericApp_Group.ID。二、重点代码解析--协调器程序设计voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="Coordinatorsend!";afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;my_DstAddr.endPoint=GENERICAPP_ENDPOINT;my_DstAddr.addr.shortAddr=0xFFFF;AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,osal_strlen(theMessageData)+1,theMessageData,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);}使用广播方式发送数据,注意,此时发送模式是广播,如下代码所示:my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;相应的网络地址可以设为0xFFFF,如下代码所示:my_DstAddr.addr.shortAddr=0xFFFF;二、重点代码解析—路由器节点程序设计UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){。。。caseZDO_STATE_CHANGE:GenericAPP_NwkState=(devStates_t)(MSGpkt->hdr.status);if(GenericAPP_NwkState==DEV_ROUTER){aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);}}

以上代码是事件处理函数。当路由器成功加入网络后,调用aps_AddGroup()函数加到组中。二、重点代码解析—路由器节点程序设计voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="Routerreceived!";afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;my_DstAddr.endPoint=GENERICAPP_ENDPOINT;my_DstAddr.addr.shortAddr=0x0000;AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,osal_strlen(theMessageData)+1,theMessageData,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);}以单播的形式向协调器发送数据“Routerreceived!”,发送完数据后,调用HalLedSet()函数使LED的状态翻转。二、重点代码解析—路由器节点程序设计然后,将加入组函数aps_AddGroup()注释掉,如下代码所示。caseZDO_STATE_CHANGE:GenericAPP_NwkState=(devStates_t)(MSGpkt->hdr.status);if(GenericAPP_NwkState==DEV_ROUTER){//aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);}break;将加入组函数aps_AddGroup()注释掉后下载到另一块开发板中三、实验结果验证--开发板A和B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论