《5-4任务4组播通信》由会员分享,可在线阅读,更多相关《5-4任务4组播通信(21页珍藏版)》请在金锄头文库上搜索。
1、任务4 组播通信目 录任务目标01相关知识点02任务实施03任务目标任务目标(1)掌握组播通信。)掌握组播通信。(2)掌握按键操作。)掌握按键操作。任务2:组播通信v本任务实现组播通信:各节点之间以组播方式发送数据,只有同组的本任务实现组播通信:各节点之间以组播方式发送数据,只有同组的节点可以接收和发送数据,组播通信原理图如图所示。节点可以接收和发送数据,组播通信原理图如图所示。组播通信原理图任务2:组播通信v本任务实现的具体功能:一个节点做协调器,另外两个节点做终端。按终端本任务实现的具体功能:一个节点做协调器,另外两个节点做终端。按终端S1键时,协调器键时,协调器Led2状态改变,同时终端
2、自身的状态改变,同时终端自身的Led2状态也改变,提示发送成状态也改变,提示发送成功。修改其中一个终端的组编号,编译下载后,按此终端功。修改其中一个终端的组编号,编译下载后,按此终端S1键时,此时看协调键时,此时看协调器器Led2状态是否会改变。组播通信协调器程序状态是否会改变。组播通信协调器程序和和终端程序流程图如图所示。终端程序流程图如图所示。协调器程序流程图终端程序流程图相关知识点组播定义组播定义在在apsgroups.h文件中有文件中有aps_Group_t结构体的定义,如下所示:结构体的定义,如下所示:#defineAPS_GROUP_NAME_LEN16typedefstructu
3、int16ID;uint8nameAPS_GROUP_NAME_LEN;aps_Group_t;每个组有一个特定的每个组有一个特定的ID,然后是组名,组名存放在,然后是组名,组名存放在name数组中。数组中。注意:注意:name数组的第一个元素是组名的长度,从第二个元素开始数组的第一个元素是组名的长度,从第二个元素开始存放真正的组名字符串。存放真正的组名字符串。在程序中可以使用如下方法定义一个组。在程序中可以使用如下方法定义一个组。1aps_Group_tSampleApp_Group;2SampleApp_Group.ID=0x0001;3SampleApp_Group.name0=7;4o
4、sal_memcpy(&(SampleApp_Group.name1),Group1,7);5aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);第第1行,定义了一个行,定义了一个aps_Group_t类型的变量类型的变量SampleApp_Group。第第2行,将组行,将组ID初始化为初始化为0x0001。第第3行,将组名的长度写入行,将组名的长度写入name数组的第数组的第1个元素位置处。个元素位置处。第第4行,使用行,使用osal_memcpy()函数将组名()函数将组名“Groupl”拷贝到拷贝到name数组中,从数组中,从第第2个元素位
5、置处开始存放组名。个元素位置处开始存放组名。第第5行,使用行,使用aps_AddGroup()函数使该端口加到组中。函数使该端口加到组中。相关知识点v其中,其中,aps_AddGroup()函数原型如下:()函数原型如下:vaps_AddGroup(uint8endpoint,aps_Group_t*group);v这些协议栈已经帮我们实现了,打开这些协议栈已经帮我们实现了,打开SampleApp.c文件,搜索文件,搜索SampleApp_Group,可以找到组定义,如图所示。,可以找到组定义,如图所示。 组播定义相关知识点组播通信流程(1)在)在Coordinator.c文件文件中添加头文件
6、中添加头文件:(2)定义组播结构体变量)定义组播结构体变量aps_Group_tGenericApp_Group;(3)在)在GenericApp_Init(uint8task_id)中初始化:中初始化:GenericApp_Group.ID=0x0001;/组号组号osal_memcpy(GenericApp_Group.name,“Group1”,6);/组名组名(4)当网络状态发生变化时,加入组)当网络状态发生变化时,加入组aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);/将端口加入组将端口加入组任务开发实施步骤(1)找到初始化函数
7、)找到初始化函数GenericApp_Init(),加上红框代码(),加上红框代码(2)找到任务事件处理函数)找到任务事件处理函数GenericApp_ProcessEvent()()函数,加上按键事件处理函数,加上按键事件处理.任务开发实施步骤(3)找到消息处理函数)找到消息处理函数GenericApp_MessageMSGCB()()任务开发实施步骤v(4)按键处理函数)按键处理函数任务开发实施步骤v(5)发送消息函数(组播发送)发送消息函数(组播发送)任务开发实施步骤v(6)添加几个变量)添加几个变量任务开发实施步骤v(7)添加头文件)添加头文件v(8)添加组播簇)添加组播簇ID任务开发
8、实施步骤v(9)函数声明)函数声明v(10)GenericApp.h文件添加簇文件添加簇任务开发实施步骤任务结果v操作操作步骤步骤v(1)编译程序下载到三个节点中,一个协调器,一个路由)编译程序下载到三个节点中,一个协调器,一个路由器,一个终端。器,一个终端。v(2)终端节点按下)终端节点按下S1按键,发送组播数据,成功则终端按键,发送组播数据,成功则终端D2灯翻转,协调器收到数据后协调器的灯翻转,协调器收到数据后协调器的D2灯同时翻转。灯同时翻转。v(3)按下协调器)按下协调器S2按键,退出组,则终端再按下按键,退出组,则终端再按下S1按键,按键,协调器收不到数据,协调器收不到数据,D2灯不
9、变化。灯不变化。v注意:协调器发送组播信息时,注意:协调器发送组播信息时,终端节点收不到组播的数终端节点收不到组播的数据,只有路由器能收到。什么原因呢?据,只有路由器能收到。什么原因呢?v原因:协议栈规范里面规定,睡眠中断不接收组播信息,原因:协议栈规范里面规定,睡眠中断不接收组播信息,如果一定要接收的话,只有将终端的接收机一直打开,这如果一定要接收的话,只有将终端的接收机一直打开,这样就可以接收到了。具体做法为:样就可以接收到了。具体做法为:v将将f8config.cfg配置文件中的:配置文件中的:v-RFD_RCVC_ALWAYS_ON=FALSEv改为:改为:-RFD_RCVC_ALWA
10、YS_ON=TRUEv就可以了。就可以了。v拓展作业:拓展作业:v改为协调器发送数据,终端接收数据,收到数据后改为协调器发送数据,终端接收数据,收到数据后D2灯翻灯翻转。程序下载到三个节点中,协调器、路由器、终端各一转。程序下载到三个节点中,协调器、路由器、终端各一个,协调器按下个,协调器按下S1按键,其他两个节点上按键,其他两个节点上D2灯同时翻转。灯同时翻转。感谢观看 THANK YOU Please replace text, click add relevant headline, modify the text content, also can copy your content
11、to this directly. Please Please replace text, click add relevant headline, modify the text content, also can copy your content to this directly. Please replace text, click add relevant headline, modify the text content, also can copy your content to this directly. Please replace replace text, click
12、add relevant headline, modify the text content, also can copy your content to this directly. Please replace text, click add relevant headline, modify the text content, also can copy your content to this directly.text, click add relevant headline, modify the text content, also can copy your content to this directly.