Zigbee應用開發 組播通信

組播通信

      功能要求

            協調器創建網絡,並加入一組,並向組內成員組播數據“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
        // 發送請求時出錯
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章