(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911)
上一节中,我们详细介绍了ZigBee的第二种无线通信方式——广播;本节中,我们将介绍ZigBee的第三种无线通信方式——组播。
(仅描述不同之处)
本节中实现的功能为:两个以上ZigBee设备组网成功后,默认都在同一个分组中,网络中任意一个设备按下KEY1,网络中其余属于该分组的ZigBee设备上的LED1状态均会取反,同时串口也会打印出接收到的组播数据;网络中任意一个设备按下KEY2,该设备的组状态就会取反(进入该组<—>离开该组)。
1、组播函数
与组播通信相关的函数,都存在于aps_groups.h文件中,所以我们一开始就应先在ProjectApp.c文件中将该头文件包含进来:
#include "aps_groups.h"我们只能看到相关函数声明,而看不到具体的函数实现(半开源)。本节中需要使用的三个函数aps_AddGroup( )、aps_FindGroup( )、aps_RemoveGroup( )的函数声明及说明如下:
/* * Add a group for an endpoint */ extern ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group ); /* * Find a group with endpoint and groupID * - returns a pointer to the group information, NULL if not found */ extern aps_Group_t *aps_FindGroup( uint8 endpoint, uint16 groupID ); /* * Remove a group with endpoint and groupID * - returns TRUE if removed, FALSE if not found */ extern uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID );
2、定义“组号”
为了进行组播通信,我们必然需要定义一个“组号”,我们将定义放在ProjectApp.h文件中:
...... #define PROJECTAPP_TEST_GROUP 0x0001 ......
3、定义及初始化“分组”
“分组”的类似于无线通信的地址,我们将其定义为全局变量:
...... aps_Group_t ProjectApp_Group; ......“分组”的初始化放在ProjectApp_Init( )函数中:
...... // By default, all devices start out in Group 1 ProjectApp_Group.ID = 0x0001; osal_memcpy( ProjectApp_Group.name, "Group 1", 7 ); aps_AddGroup( PROJECTAPP_ENDPOINT, &ProjectApp_Group ); ......
4、组播发送函数,声明及定义如下:
5、实验验证...... static void ProjectApp_SendGroup( void ); ......static void ProjectApp_SendGroup( void ) { char theMessageData[ ] = "Group data\r\n"; ProjectApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup; ProjectApp_DstAddr.endPoint = PROJECTAPP_ENDPOINT; ProjectApp_DstAddr.addr.shortAddr = PROJECTAPP_TEST_GROUP; AF_DataRequest( &ProjectApp_DstAddr, &ProjectApp_epDesc, PROJECTAPP_CLUSTERID, (byte)osal_strlen( theMessageData ) + 1, (byte *)&theMessageData, &ProjectApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); }其中需要注意的是,目的地址的短地址(ProjectApp_DstAddr.addr.shortAddr)部分,需要指定为对应的“组号”;相信这个函数的定义大家也是一眼就能看明白~
(1)调用组播发送函数
(2)取反设备在组状态static void ProjectApp_HandleKeys( uint8 shift, uint8 keys ) { ...... if ( keys & HAL_KEY_SW_1 ) { ...... ProjectApp_SendGroup(); } ...... }static void ProjectApp_HandleKeys( uint8 shift, uint8 keys ) { ...... if ( keys & HAL_KEY_SW_2 ) { ...... aps_Group_t *grp; grp = aps_FindGroup( PROJECTAPP_ENDPOINT, PROJECTAPP_TEST_GROUP ); if ( grp ) { // Remove from the group aps_RemoveGroup( PROJECTAPP_ENDPOINT, PROJECTAPP_TEST_GROUP ); } else { // Add to the group aps_AddGroup( PROJECTAPP_ENDPOINT, &ProjectApp_Group ); } } }(3)编译下载
(4)实验现象在IAR左侧的Workspace中,一个ZigBee设备选择CoordinatorEB编译下载,其余所有的ZigBee设备任意选择RouterEB或EndDeviceEB编译下载,如下图所示进行选择;
所有的ZigBee设备上电后,任意ZigBee设备上的KEY2可以取反该设备的“在组状态”(进入该组<—>离开该组);任意ZigBee设备上的KEY1可以触发组播发送;凡是属于同一个分组下的ZigBee设备,都能收到该组播数据包,该设备上的LED1状态会取反,同时串口每次都会打印出“Group data”:
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911)