組播通信
功能要求
協調器創建網絡,並加入一組,並向組內成員組播數據“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
// 發送請求時出錯
}
}