《无线短距离通信技术开发项目教程》(第二版) 课件 第10-12章 测误码率实验、ZigBee协议栈实验:广播与单播实验、ZigBee协议栈实验:组播实验_第1页
《无线短距离通信技术开发项目教程》(第二版) 课件 第10-12章 测误码率实验、ZigBee协议栈实验:广播与单播实验、ZigBee协议栈实验:组播实验_第2页
《无线短距离通信技术开发项目教程》(第二版) 课件 第10-12章 测误码率实验、ZigBee协议栈实验:广播与单播实验、ZigBee协议栈实验:组播实验_第3页
《无线短距离通信技术开发项目教程》(第二版) 课件 第10-12章 测误码率实验、ZigBee协议栈实验:广播与单播实验、ZigBee协议栈实验:组播实验_第4页
《无线短距离通信技术开发项目教程》(第二版) 课件 第10-12章 测误码率实验、ZigBee协议栈实验:广播与单播实验、ZigBee协议栈实验:组播实验_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

测误码率实验一、实验原理二、重点代码解析三、数据发送标题四、数据接收一、实验原理——功能描述

实验效果:两块WeBee模块通信,一个模块作发射,另外一个模块接收,接收模块通过串口不在PC机上显示当前的误包率、RSSI值和接收到数据包的个数。

实验目的::PER(误包率检测)实验是BasicRF的第二个实验,和无线点灯一样是没有使用协议栈的点对点通讯。通过无线点灯大家应该对zigbee的发射和接收有个感性的认识,本次实验讲解不会像无线点灯一样讲得那么详细,因为接收发射的过程基本上是一样的,但也希望初学者能自己认真学习一下这个实验,相信会对无线传输会有一个更清晰的认识。一、实验原理——实验现象由于距离比较近,所以掉包不明显的,有兴趣的可以把发送节点拿到较远的地方,然后观察掉包率。或者先打开发送模块,打开接收模块来测试掉包,会显示出掉包情况。二、重点代码解析1.首先还是要先找到main.c

main.c做了哪些事情:①一大堆的初始化(都是必须的);②

设置信道,发射和接收模块的信道必须一致;③选择为发射或者接收模式。发射函数defineMODE_SEND则进入appTransmitter();接收函数没有

defineMODE_SEND则进入appReceiver()二、重点代码解析2.为了获取传输的性能参数,接收器中包含了如下几个数据(包含在rxStats变量中,其类型为perRxStats_t)参数含义rxStats.expectedSeqNum预计下一个数据包的序号,其值等于“成功接收的数据包”+“丢失的数据包”+1rxStats.rssiSum上32个数据包的RSSI值的和rxStats.rcvdPkts每次PER测试中,成功接收到的数据包的个数rxStats.lostPkts丢失数据包的个数三、数据发送appTransmitter函数完成的任务:①初始化BasicRF②设置发射功率③设定测试的数据包量④配置定时器和IO⑤初始化数据包载荷⑥进行循环函数,不断地发送数据包,每发送完一次,下一个数据包的序列号自加1再发送;四、数据接收

接收函数appReceiver的作用:①串口在此初始化②初始化BasicRF③不断地接收数据包,并检查数据包序号是否为期望值,作出相应处理④串口打印出,接收包的个数\误包率及上32个数据包的RSSI值的平均值ZigBee协议栈实验:广播与单播实验主讲:张老师一、实验原理二、重点代码解析三、实验结果验证标题四、数据接收一、实验原理——基础知识储备Zigbee网络中进行数据通信主要有三种类型:广播、单播、组播。一、实验原理——通信方式的协议栈实现参数1:afAddrType_t*dstAddr该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单播、广播或多播等。typedefstruct

{

Union

{

uint16shortAddr;

//用于标识该节点网络地址的变量

}addr;afAddrMode_taddrMode;

//用于指定数据传送模式,单播、多播还是广播

byteendPoint;

//端点号

}afAddrType_t;

//

其定义在AF.h中afAddrType_t是个结构体如下:一、实验原理——通信方式的协议栈实现

ZigBee协议栈将数据通信过程高度抽象,使用一个函数完成数据的发送,以不同的参数来选择数据发送方式(广播、组播还是单播)。afStatus_tAF_DataRequest(afAddrType_t*dstAddr,//目的地址指针endPointDesc_t*srcEP,

//发送节点的端点描述符指针uint16cID,

//ClusID簇ID号uint16len,

//发送数据的长度uint8*buf,

//指向存放发送数据的缓冲区指针uint8*transID,//传输序列号,该序列号随着信息的发送而增加

uint8options,//发送选项uint8radius

//最大传输半径(发送的跳数)

)ZigBee协议栈中数据发送函数原型如下:一、实验原理——通信方式的协议栈实现

上述结构体中的afAddrMode_taddrMode就是用于指定数据传送模式,是个枚举类型,可以设置为以下几个值。typedefenum{

afAddrNotPresent=AddrNotPresent,

//表示通过绑定关系指定目的地址

afAddr16Bit=Addr16Bit,

//单播发送

afAddrGroup=AddrGroup,

//组播

afAddrBroadcast=AddrBroadcast//广播}afAddrMode_t;Enum{

AddrNotPresent=0,

AddrGroup=1,

Addr16Bit=2,

Addr64Bit=3,

AddrBroadcast=15};一、实验原理——单播注意,其实单播有两种方式一种是绑定传输,一种是目标地址的单播传输。my_DstAddr.addrMode=(afAddrMode_t)AddrNotPresent,一种是直接指定目标地址的单播传输,比如协调器就是0x0000。①单播绑定传输my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;

//单播发送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;

//目的端口号my_DstAddr.addr.shortAddr=0;

//按照绑定的方式进行单播,不需要指定目标地址,需要先将两个设备绑定,将两个设备绑定后即可通信②直接指定目标地址的单播传输:是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备,将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;

//单播发送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;

//目的端口号my_DstAddr.addr.shortAddr=0x0000;

//目标设备网络地址一、实验原理——广播当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为AddrBroadcast。目标地址my_DstAddr.addr.shortAddr可以根据需求设置为下面广播地址的一种。NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//广播发送my_DstAddr.endPoint=GENERICAPP_ENDPOINT;

//目的端口号my_DstAddr.addr.shortAddr=0xFFFF;

//协调器网络地址一、实验原理——实验效果及原理图

实验效果预设为:协调器周期性以广播的形式向终端节点发送数据,终端节点收到数据后,使开发板上的LED状态翻转,同时向协调器发送字符串“EndDevicereceived!”,协调器收到终端节点发回的数据后,通过串口输出到PC机,用户可以通过串口调试助手查看该信息。一、实验原理——协调器工作流程协调器周期性以广播的形式向终端节点发送数据,如何实现周期性地发送数据呢?这里又需要用定时函数osal_start-timcrEx0,定时5s,定时时间达到后,向终端节点发送数据,发送完数据再定时5s,这样就实现了周期性地发送数据。一、实验原理——终端节点工作流程终端节点上电后,会进行硬件电路的初始化,然后搜索是否有ZigBee无线网络,如果有ZigBee无线网络再自动加入(这是最简单的情况,当然可以控制节点加入网络时要符合编译时确定的网络号等),然后判断是否收到协调器发送的数据,若收到,则将LED状态取反,然后发送数据到协调器,否则继续等待接收数据。二、重点代码解析--协调器程序设计if(events&SEND_TO_ALL_EVENT)//数据发送事件处理{GenericApp_SendTheMessage();osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}

当网络状态发生变化时,启动定时器定时5S,定时时间到达后,设置SEND_TO_ALL_EVENT事件,在SEND_TO_ALL_EVENT事件处理函数中,调用发送数据函数GenericApp_SendTheMessage(),发送完数据后,再次启动定时器,定时5S……二、重点代码解析--协调器程序设计if(events&SEND_TO_ALL_EVENT)//数据发送事件处理{GenericApp_SendTheMessage();osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);return(events^SEND_TO_ALL_EVENT);}

当网络状态发生变化时,启动定时器定时5S,定时时间到达后,设置SEND_TO_ALL_EVENT事件,在SEND_TO_ALL_EVENT事件处理函数中,调用发送数据函数GenericApp_SendTheMessage(),发送完数据后,再次启动定时器,定时5S……二、重点代码解析--协调器程序设计voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){unsignedcharbuf[20];unsignedcharbuffer[2]={0x0A,0x0D};switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:osal_memcpy(buf,pkt->cmd.Data,20);HalUARTWrite(0,buf,20);HalUARTWrite(0,buffer,2);break;}}当收到终端节点发回的数据后,读取该数据,然后发送到串口。二、重点代码解析--协调器程序设计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;二、重点代码解析—终端节点程序设计voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){char*recvbuf;unsignedcharbuffer[2]={0x0A,0x0D};switch(pkt->clusterId){caseGENERICAPP_CLUSTERID:osal_memcpy(recvbuf,pkt->cmd.Data,osal_strlen("Coordinatorsend!")+1);if(osal_memcmp(recvbuf,"Coordinatorsend!",osal_strlen("Coordinatorsend!")+1)){HalUARTWrite(0,recvbuf,18);

HalUARTWrite(0,buffer,2);GenericApp_SendTheMessage();}}}上述代码是对接收到的数据进行处理,当正确接收到协调器发送的字符串"Coordinatorsend!"时,调用函数GenericApp_SendTheMessage()发送返回消息。二、重点代码解析—终端节点程序设计voidGenericApp_SendTheMessage(void){unsignedchar*theMessageData="EndDevicereceived!";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);}向协调器发送单播数据,注意加粗字体部分的代码实现的是单播通信。注意:HalLedSet()函数可以设置LED的状态进行翻转。三、实验结果验证--终端节点的串口发送设置好串口调试助手,打开协调器电源,然后打开两个终端节点的电源,此时可以看到如下实验现象:①每隔5S,终端节点的串口显示一个字符串"Coordinatorsend!"②同时终端节点的LED每隔5S点亮一次。三、实验结果验证--协调器节点的串口发送设置好串口调试租手,打开协调器电源,然后打开两个终端节点的电源,此时可以看到如下实验现象:①每隔5S,串口会显示三个字符串"EndDevicereceived!";②同时终端节点的LED每隔5S点亮一次。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

温馨提示

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

评论

0/150

提交评论