1、“1+X”传感网应用开发 基于Z-S t a c k 的点对多点通信01单播通信组网02组播通信组网03广播通信组网目录目录CONTENTS0 1 单播通信组网0 2 组播通信组网0 3 广播通信组网目录C O N T【任务要求】任务一:采用2个ZigBee模块,分别作为协调器和终端。终端采用单播的方式向协调器发送数据。(单播)(单播)任务二:采用3个ZigBee模块,分别作为协调器、路由器1和路由器2,其协调器和路由器1的组号设置为0 x0001,路由器2的组号设置为0 x0003,测试组播通信。(组播)(组播)任务三:采用3个ZigBee模块,分别作为协调器、路由器和终端,协调器向外周期性
2、地发送数据,路由器和终端接收数据,测试广播通信。(广播)(广播)【任务要求】任务一:采用2 个Z i g B e e 模块,分别作为协调器【知识链接】在ZigBee无线传感网络中,数据通信主要有单播、组播和广播三种类型,用户可以根据通信的需要灵活采用某种通信方式。单播单播表示网络中两个节点之间进行数据发送与接收的过程。组播组播,又称多播,表示网络中一个节点发送的数据包时,只有与该节点属于同一组的节点,才能收到该数据包。广播广播表示一个节点发送的数据包,网络中所有节点都可以收到。【知识链接】在Z i g B e e 无线传感网络中,数据通信主要有单播【知识链接】复习一下之前学习的 Zigbee协
3、议栈进行数据发送的函数:AF_DataRequest(afAddrType_t*dstAddr,/目的地址指针目的地址指针 endPointDesc_t*srcEP,/发送节点的端点描述符指针 uint16 cID,/ClusID 簇ID号 uint16 len,/发送数据的长度 uint8*buf,/指向存放发送数据的缓冲区指针 uint8*transID,/传输序列号 uint8 options,/发送选项 uint8 radius /最大传输半径(发送的跳数))【知识链接】复习一下之前学习的 Z i g b e e 协议栈进行数据发【知识链接】参数参数1:afAddrType_t *ds
4、tAddr,/目的地址指针目的地址指针 该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单播、广播或多播等。播、广播或多播等。afAddrType_t 是个结构体如下:是个结构体如下:typedef struct union uint16 shortAddr;/用于标识该节点网络地址的变量用于标识该节点网络地址的变量 addr;afAddrMode_t addrMode;/用于指定数据传送模式,单播、多用于指定数据传送模式,单播、多 播还是广播播还是广播 byte endPoint;/端点号端点号 afAddrType_t;
5、/其定义在其定义在AF.h中中【知识链接】参数1:a f A d d r T y p e _ t *d s t A d【知识链接】afAddrMode_t addrMode 就是用于指定数据传送模式,是个枚举类型,可以设置为以下几个值:typedef enum afAddrNotPresent=AddrNotPresent,/表示通过表示通过绑定绑定关系指定目的地址关系指定目的地址 afAddr16Bit=Addr16Bit,/单播单播发送发送 afAddrGroup=AddrGroup,/组播组播 afAddrBroadcast=AddrBroadcast/广播广播 afAddrMode_t
6、;enum AddrNotPresent=0,AddrGroup=1,Addr16Bit=2,Addr64Bit=3,AddrBroadcast=15;3种不同的通信模种不同的通信模式,我们要设置式,我们要设置哪些参数呢?哪些参数呢?【知识链接】a f A d d r Mo d e _ t a d d r Mo d e 就【知识链接】其实其实单播单播有两种方式:有两种方式:一种是绑定传输一种是绑定传输my_DstAddr.addrMode=(afAddrMode_t)AddrNotPresent 一种是直接指定目标地址的单播传输,比如协调器就一种是直接指定目标地址的单播传输,比如协调器就是是0
7、 x0000。绑定后面再学绑定后面再学吧!吧!【知识链接】其实单播有两种方式:绑定后面再学吧!【知识链接】单播配置步骤单播配置步骤:一、自定义点对点通信地址结构体变量(单播)一、自定义点对点通信地址结构体变量(单播)afAddrType_t SampleApp_PTP_DstAddr;/单播单播 二、对自定义的单播结构体变量进行填充二、对自定义的单播结构体变量进行填充 SampleApp_PTP_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;/单播通信模式单播通信模式 SampleApp_PTP_DstAddr.endPoint=SAMPLEAPP_ENDP
8、OINT;/端口号端口号 SampleApp_PTP_DstAddr.addr.shortAddr=0 x0000;/发送目标地址发送目标地址 三、簇的定义和修改三、簇的定义和修改 簇代通信协议中表示某种(类)命令簇代通信协议中表示某种(类)命令 SampleApp.h文件中:文件中:#define SAMPLEAPP_MAX_CLUSTERS 3 /由由2修改为修改为3#define SAMPLEAPP_PTP _CLUSTERID 3 /定义点对点数据传输命令定义点对点数据传输命令【知识链接】单播配置步骤:【知识链接】单播配置步骤单播配置步骤:SampleApp.c文件中:文件中:cons
9、t cId_t SampleApp_ClusterListSAMPLEAPP_MAX_CLUSTERS=SAMPLEAPP_PERIODIC_CLUSTERID,SAMPLEAPP_FLASH_CLUSTERID,SAMPLEAPP_PTP _CLUSTERID /添加点对点簇命令添加点对点簇命令;【知识链接】单播配置步骤:【知识链接】单播配置步骤单播配置步骤:四、编写四、编写PTP数据发送数据数据发送数据SampleApp.c文件中:文件中:void SampleApp_SendPTPMessage(void)uint8 data6=NEWLab;if(AF_DataRequest(&Sam
10、pleApp_PTP_DstAddr,&SampleApp_epDesc,SAMPLEAPP_PTP_CLUSTERID,6,data,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)=afStatus_SUCCESS)else /Error occurred in request to send.【知识链接】单播配置步骤:【知识链接】单播配置步骤单播配置步骤:五、使终端周期性地向协调器发送数据五、使终端周期性地向协调器发送数据 SampleApp.c文件中:文件中:if(events&SAMPLEAPP_SEND_PERIODIC_MS
11、G_EVT)/Send the periodic message /SampleApp_SendPeriodicMessage();注释掉 SampleApp_SendPTPMessage();/调用调用PTP发送函数发送函数 /Setup to send message again in normal period(+a little jitter)osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand()&0 x00
12、FF);/return unprocessed events return(events SAMPLEAPP_SEND_PERIODIC_MSG_EVT);【知识链接】单播配置步骤:【知识链接】单播配置步骤单播配置步骤:六、配置接收(消息处理)函数六、配置接收(消息处理)函数SampleApp.c文件中:文件中:void SampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)uint16 flashTime;switch(pkt-clusterId)case SAMPLEAPP_PERIODIC_CLUSTERID:break;case SAMPLE
13、APP_FLASH_CLUSTERID:flashTime=BUILD_UINT16(pkt-cmd.Data1,pkt-cmd.Data2);HalLedBlink(HAL_LED_4,4,50,(flashTime/4);break;case SAMPLEAPP_PTP_CLUSTERID:if(osal_memcmp(pkt-cmd.Data0,NEWLab,6)/判断接收数据是否为判断接收数据是否为NEWLab HAL_TOGGLE_LED2();/每收到正确数据每收到正确数据1次,次,LED2取反取反1次次 break;【知识链接】单播配置步骤:【知识链接】单播配置步骤单播配置步骤:
14、七、禁止协调器发数据给自己七、禁止协调器发数据给自己 SampleApp.c文件中:文件中:case ZDO_STATE_CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.status);if(/(SampleApp_NwkState=DEV_ZB_COORD)/禁止协调器发数禁止协调器发数据给自己据给自己|(SampleApp_NwkState=DEV_ROUTER)|(SampleApp_NwkState=DEV_END_DEVICE)/Start sending the periodic message in a regular int
15、erval.osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);【知识链接】单播配置步骤:【任务要求】任务一:采用2个ZigBee模块,分别作为协调器和终端。终端采用单播的方式向协调器发送数据。(单播)(单播)【任务要求】任务一:采用2 个Z i g B e e 模块,分别作为协调器【任务实施】第一步,打开第一步,打开Z-Stack的的SampleApp.eww工程。工程。在路径C:Texas InstrumentsZStack-CC25
16、30-2.5.1aProjectszstackSamplesSampleApp CC2530DB目录下找到SampleApp.eww工程,双击SampleApp.eww文件,打开工程。第二步,协调器通过串口向第二步,协调器通过串口向PC机发送数据。机发送数据。1.通过串口线,把协调器模块与PC机连接起来。2.编写协调器的程序。采用MT层配置串口,简化操作流程,因此协调器程序主要包括串口初始化、任务注册和串口数据发送三个部分。具体程序代码见本教材资源。3.向协调器烧录程序。每复位一次协调器,都会向PC机发送一次数据,则在串口调试软件上显示一行“NEWLab”字符,如图所示。注意:在IAR的Wor
17、kspace栏要记得选择“CoordinatorEB”(协调器),再编辑,烧录。【任务实施】第一步,打开Z-S t a c k 的S a m p l e A p p.【小结】单播配置步骤单播配置步骤:一、自定义点对点通信地址结构体变量(单播)一、自定义点对点通信地址结构体变量(单播)二、对自定义的单播结构体变量进行填充二、对自定义的单播结构体变量进行填充 三、簇的定义和修改三、簇的定义和修改 四、编写四、编写PTP数据发送数据数据发送数据 五、使终端周期性地向协调器发送数据五、使终端周期性地向协调器发送数据 六、配置接收(消息处理)函数六、配置接收(消息处理)函数 七、禁止协调器发数据给自己七
18、、禁止协调器发数据给自己【小结】单播配置步骤:【知识链接】组播组播:当应用程序需要将数据包发送给网络上的一组:当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。设备时,使用该模式。配置思路:配置思路:地址模式设置为地址模式设置为afAddrGroup 并且并且addr.shortAddr 设置为设置为组组ID。节点要加入特定的组节点要加入特定的组【知识链接】组播:当应用程序需要将数据包发送给网络上的一组设【知识链接】组播配置步骤组播配置步骤:一、首先声明一个组对象一、首先声明一个组对象 SampleApp.c文件中:文件中:aps_Group_t SampleApp_Group;ap
19、s_Group_t结构体的定义:typedef struct uint16 ID;/Unique to this table uint8 nameAPS_GROUP_NAME_LEN;/#define APS_GROUP_NAME_LEN 16 aps_Group_t;每个组有个特定的ID跟组名,组名存放在name数组中,name数组的第一个元素是组名的长度,第二个元素开始存放组名字符串。【知识链接】组播配置步骤:【知识链接】组播配置步骤组播配置步骤:二、对二、对SampleApp_Group赋值赋值 SampleApp_Group.ID=0 x0001;/初始化组初始化组ID osal_me
20、mcpy(SampleApp_Group.name,“Group 1”,7);/将组名的长度将组名的长度写入写入name数组的第一个元素位置处数组的第一个元素位置处 三、在本任务里将端点加入到组中三、在本任务里将端点加入到组中 aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);四、设定通信的目标地址及模式四、设定通信的目标地址及模式 SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPO
21、INT;SampleApp_Flash_DstAddr.addr.shortAddr=SampleApp_Group.ID;【知识链接】组播配置步骤:【知识链接】组播配置步骤组播配置步骤:五、编写组播发送数据函数五、编写组播发送数据函数 void SampleApp_SendGroupMessage(void)uint8 data6;if(AF_DataRequest(&SampleApp_Flash_DstAddr,&SampleApp_epDesc,SAMPLEAPP_FLASH_CLUSTERID,6,data,&SampleApp_TransID,AF_DISCV_ROUTE,AF_D
22、EFAULT_RADIUS)=afStatus_SUCCESS);else ;【知识链接】组播配置步骤:【知识链接】组播配置步骤组播配置步骤:六、使设备周期性地向同组节点发送数据六、使设备周期性地向同组节点发送数据 if(events&SAMPLEAPP_SEND_PERIODIC_MSG_EVT)/Send the periodic message /SampleApp_SendPeriodicMessage();注释掉 SampleApp_SendGroupMessage;/调用组播发送函数调用组播发送函数 /Setup to send message again in normal pe
23、riod(+a little jitter)osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand()&0 x00FF);/return unprocessed events return(events SAMPLEAPP_SEND_PERIODIC_MSG_EVT);【知识链接】组播配置步骤:【知识链接】组播配置步骤组播配置步骤:七、配置接收(消息处理)函数七、配置接收(消息处理)函数 void SampleApp_M
24、essageMSGCB(afIncomingMSGPacket_t*pkt)uint16 flashTime;switch(pkt-clusterId)case SAMPLEAPP_PERIODIC_CLUSTERID:break;case SAMPLEAPP_FLASH_CLUSTERID:if(osal_memcmp(pkt-cmd.Data0,NEWLab,6)/判断接收数据是否为判断接收数据是否为NEWLab HAL_TOGGLE_LED2();/每收到正确数据每收到正确数据1次,次,LED2取反取反1次次 break;【知识链接】组播配置步骤:【小结】组播配置步骤组播配置步骤:一、一
25、、首先声明一个组对象首先声明一个组对象 二、对二、对SampleApp_Group赋值赋值 三、在本任务里将端点加入到组中三、在本任务里将端点加入到组中 四、设定通信的目标地址及模式四、设定通信的目标地址及模式 五、编写组播发送数据函数五、编写组播发送数据函数 六、使设备周期性地向同组节点发送数据六、使设备周期性地向同组节点发送数据 七、配置接收(消息处理)函数七、配置接收(消息处理)函数【小结】组播配置步骤:【任务要求】任务一:采用2个ZigBee模块,分别作为协调器和终端。终端采用单播的方式向协调器发送数据。(单播)(单播)任务二:采用3个ZigBee模块,分别作为协调器、路由器1和路由器
26、2,其协调器和路由器1的组号设置为0 x0001,路由器2的组号设置为0 x0003,测试组播通信。(组播)(组播)任务三:采用3个ZigBee模块,分别作为协调器、路由器和终端,协调器向外周期性地发送数据,路由器和终端接收数据,测试广播通信。(广播)(广播)【任务要求】任务一:采用2 个Z i g B e e 模块,分别作为协调器【任务实施】第一步,打开第一步,打开Z-Stack的的SampleApp.eww工程。工程。在路径C:Texas InstrumentsZStack-CC2530-2.5.1aProjectszstackSamplesSampleApp CC2530DB目录下找到S
27、ampleApp.eww工程,双击SampleApp.eww文件,打开工程。第二步,协调器通过串口向第二步,协调器通过串口向PC机发送数据。机发送数据。1.通过串口线,把协调器模块与PC机连接起来。2.编写协调器的程序。采用MT层配置串口,简化操作流程,因此协调器程序主要包括串口初始化、任务注册和串口数据发送三个部分。具体程序代码见本教材资源。3.向协调器烧录程序。每复位一次协调器,都会向PC机发送一次数据,则在串口调试软件上显示一行“NEWLab”字符,如图所示。注意:在IAR的Workspace栏要记得选择“CoordinatorEB”(协调器),再编辑,烧录。【任务实施】第一步,打开Z-
28、S t a c k 的S a m p l e A p p.【拓展】广播广播:【拓展】广播:【任务要求】任务一:采用2个ZigBee模块,分别作为协调器和终端。终端采用单播的方式向协调器发送数据。(单播)(单播)任务二:采用3个ZigBee模块,分别作为协调器、路由器1和路由器2,其协调器和路由器1的组号设置为0 x0001,路由器2的组号设置为0 x0003,测试组播通信。(组播)(组播)任务三:采用3个ZigBee模块,分别作为协调器、路由器和终端,协调器向外周期性地发送数据,路由器和终端接收数据,测试广播通信。(广播)(广播)【任务要求】任务一:采用2 个Z i g B e e 模块,分别
29、作为协调器【任务实施】第一步,打开第一步,打开Z-Stack的的SampleApp.eww工程。工程。在路径C:Texas InstrumentsZStack-CC2530-2.5.1aProjectszstackSamplesSampleApp CC2530DB目录下找到SampleApp.eww工程,双击SampleApp.eww文件,打开工程。第二步,协调器通过串口向第二步,协调器通过串口向PC机发送数据。机发送数据。1.通过串口线,把协调器模块与PC机连接起来。2.编写协调器的程序。采用MT层配置串口,简化操作流程,因此协调器程序主要包括串口初始化、任务注册和串口数据发送三个部分。具体
30、程序代码见本教材资源。3.向协调器烧录程序。每复位一次协调器,都会向PC机发送一次数据,则在串口调试软件上显示一行“NEWLab”字符,如图所示。注意:在IAR的Workspace栏要记得选择“CoordinatorEB”(协调器),再编辑,烧录。【任务实施】第一步,打开Z-S t a c k 的S a m p l e A p p.【总结】在ZigBee无线传感网络中,数据通信主要有单播、组播和广播三种类型,用户可以根据通信的需要灵活采用某种通信方式。单播单播表示网络中两个节点之间进行数据发送与接收的过程。组播组播,又称多播,表示网络中一个节点发送的数据包时,只有与该节点属于同一组的节点,才能
31、收到该数据包。广播广播表示一个节点发送的数据包,网络中所有节点都可以收到。【总结】在Z i g B e e 无线传感网络中,数据通信主要有单播、组【任务实施】4.在协调器串口调试软件的发送区中输入“NEWLab2”,点击“手动发送”,则在终端节点串口调试软件的接收区显示“NEWLab2”信息。如左图和右图所示。5.在终端节点串口调试软件的发送区中输入“NEWLab1”,点击“手动发送”,则在协调器串口调试软件的接收区显示“NEWLab1”信息。如左图和右图所示。【任务实施】4.在协调器串口调试软件的发送区中输入“N E W【技能拓展】在该任务的基础上增加功能,具体要求是:增加ZigBee模块和PC,形成3台以上电脑串口透传。【技能拓展】在该任务的基础上增加功能,具体要求是:增加Z i g