组播通信
功能要求
协调器创建网络,并加入一组,并向组内成员组播数据“I am coordinator device”
终端1加入网络,并加入与协调器相同的组,收到协调器发送而来的数据
终端2加入网络,并加入另外一组,不能收到协调器发来的数据
实现过程
复制工程模块
加入串口通信代码
typedef struct
{
uint16 ID; //组ID
uint8 name[APS_GROUP_NAME_LEN]; //祖名,首元素是组名长度,后面是组名
}aps_Group_t;
代码:
// SampleApp.c
// 添加串口头文件
#include "mt_uart.h"
#include "string.h"
// ...
aps_Group_t SampleApp_Group;
void SampleApp_Init(uint8 task_id)
{
//...
// 加入串口初始化
// 在mt_uart.h 找
MT_UartInit();
HalUARTWrite(0,"uart0 is ok\n",strlen("uart0 is ok\n"));
//...
/*
// 广播去除
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
*/
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; //端口号
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP; //组播地址,与组ID一致
// ...
// By default ,all devices start out in Group 1
// 默认情况下,所有设备都在组1中启动
SampleApp_Group.ID = 0x0001;
// Group 1复制给SampleApp_Group.name 长度为 7
osal_memcpy(SampleApp_Group.name,"Group 1", 7);
//把相应的端口加入SampleApp_Group
aps_AddGroup(SAMPLEAPP_ENDPOINT, &SampleApp_Group);
}
// MT_UART.c
void MT_UartInit(void)
{
halUARTCfg_t uartConfig;
// ...
uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE // 波特率
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW // 流控制
}
// mt_uart.h
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
#define MT_UART_DEFAULT_OVERFLOW FALSE
// SampleApp.h
#define SAMPLEAPP_FLASH_GROUP 0x0001
// aps_groups.h
typedef struct
{
uint16 ID; // Unique to this table 组ID
uint8 name[APS_GROUP_NAME_LEN]; // Human readable name of group 首是长度,后为组名
}aps_Group_t;
// SampleApp.c
// 事件轮循
uint16 SampleApp_ProcessEvent(uint8 task_id,uint16 events)
{
afIncomingMSGPacket_t *MSGpkt;
(void)task_id;
if(event & SYS_EVENT_MSG)
{
MSGpkt = (afIncomingMSGPcker_t *)osal_msg_receive(SampleApp_TaskID);
while(MSGpkt)
{
switch(MSGpkt->hdr.event)
{
// ...
// Received vhenever the device changes state in the netvork
case ZDO_STATE_CHANGE: // 网络创建成功
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); //获取网络状态
if( (SampleApp_NwkState == DEV_ZB_COORD) )
{
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVI, //事件
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{}
break;
default:
break;
}
//release the memory
osal_msg_deallocate((uint8 *)MSGpkt);
//Next -if one is available
MSGpkt = (afIncomingMSGpacket_t *)osal_msg_receive(SampleApp_TaskID);
}
//return unprocessed events
// 返回未处理的事件
return (events ^ SYS_EVENT_MSG)
}
if(events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT)
{
SampleApp_SendPeriodicMessage();
}
}
void SampleApp_SendPeriodicMessage(void)
{
uint8 *buff = "I am coordinator device\n";
if(AF_DataRequest(&SampleApp_Flash_DstAddr, //组播的地址
&SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID, //命令号
strlen(buff),
buff,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS) == afStatus_SUCCESS)
{
}
else
{
// Error occurred in request to send
// 发送请求时出错
}
}