Zigbee網(wǎng)絡(luò)通信之組播

所謂組播,就是在網(wǎng)絡(luò)中所有節(jié)點(diǎn)設(shè)備被分組后組內(nèi)相互通信的過(guò)程。

通過(guò)節(jié)點(diǎn)的組號(hào)來(lái)確定通信對(duì)象。

1.組播參數(shù)設(shè)置
  在文件SampleApp.c中,已經(jīng)定義了組播地址以及組播內(nèi)容

afAddrType_t SampleApp_Flash_DstAddr;//組播地址類型
aps_Group_t SampleApp_Group;//組播內(nèi)容

組播的地址參數(shù)設(shè)置如下:

  // Setup for the flash command's destination address - Group 1
  SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;//地址類型為組播
  SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
  SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;

組播的分組參數(shù)設(shè)置如下,將原有的ID修改為對(duì)應(yīng)的SAMPLEAPP_FLASH_GROUP,便于以后對(duì)分組的擴(kuò)展:

// By default, all devices start out in Group 1
  //SampleApp_Group.ID = 0x0001;
  SampleAPP_Group.ID=SAMPLEAPP_FLASH_GROUP;//Kevin@20161118
  osal_memcpy( SampleApp_Group.name, "Group 1", 7  );
  aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

SAMPLEAPP_FLASH_GROUP的定義在SampleApp.h文件中

// Group ID for Flash Command
#define SAMPLEAPP_FLASH_GROUP                  0x0001
  1. 組播發(fā)送函數(shù)
      在SampleApp.c文件中添加組播發(fā)送函數(shù)實(shí)現(xiàn)及其函數(shù)聲明
void SampleApp_sendGroupMessage()
{
    uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//定義發(fā)送內(nèi)容
    //uint8 data[10]="0123456789";
    if(AF_DataRequest(&SampleApp_Flash_DstAddr,&SampleApp_epDesc,
                      SAMPLEAPP_FLASH_CLUSTERID,
                      10,
                      data,
                      &SampleApp_TransID,
                      AF_DISCV_ROUTE,
                      AF_DEFAULT_RADIUS) == afStatus_SUCCESS)
    {
    }
    else
    {
      // Error occurred in request to send.
    }
}

其中,SAMPLEAPP_FLASH_CLUSTERID的定義在SampleApp.h文件中:

#define SAMPLEAPP_FLASH_CLUSTERID     2

在函數(shù)uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )中調(diào)用組播發(fā)送函數(shù)

 if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
  {
    // Send the periodic message
    //SampleApp_SendPeriodicMessage();//周期廣播發(fā)送函數(shù)
    //SampleApp_SendPointToPointMessage();  //點(diǎn)對(duì)點(diǎn)通信發(fā)送函數(shù)
    SampleApp_sendGroupMessage();  //組播通信發(fā)送函數(shù)

    // Setup to send message again in normal period (+ a little jitter)
    osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
        (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

    // return unprocessed events
    return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
  }
  1. 組播接收函數(shù)
      在函數(shù)void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )中修改case SAMPLEAPP_FLASH_CLUSTERID
case SAMPLEAPP_FLASH_CLUSTERID:
        HalUARTWrite(0,"Group Message:",14);//提示信息
        HalUARTWrite(0,pkt->cmd.Data,pkt->cmd.DataLength);//打印接收到的數(shù)組
        HalUARTWrite(0,"\n",1);//回車換行
        //flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
        //HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
        break;

4.下載程序,查看實(shí)驗(yàn)結(jié)果
  程序修改完成之后分別以1個(gè)協(xié)調(diào)器、兩個(gè)路由器的方式下載到3個(gè)節(jié)點(diǎn)設(shè)備中,將協(xié)調(diào)器和路由器1的組號(hào)(Rebuild All之前修改SampleApp_Group.ID的值)設(shè)置為**SAMPLEAPP_FLASH_GROUP **,即0x0001,路由器設(shè)備2設(shè)置為0x0002,節(jié)點(diǎn)設(shè)備通過(guò)串口與PC相連,查看串口接收的信息。

協(xié)調(diào)器接收到的信息

路由器1收到的信息

  結(jié)論:在組播通信中,只有組內(nèi)的節(jié)點(diǎn)設(shè)備(協(xié)調(diào)器和路由器1)才能進(jìn)行通信。

  終端設(shè)備不參與組播,因?yàn)樵赟ampleApp例程中終端設(shè)備默認(rèn)采取睡眠中斷的工作方式,射頻不是一直工作,協(xié)議規(guī)范中規(guī)定睡眠中斷不接收組播信息,因此下載組播程序到終端中,終端設(shè)備并不能正常接收組播信息。
  當(dāng)然,如果確需終端設(shè)備參與到組播中,確保終端設(shè)備可以接收到組播信息,那么根據(jù)協(xié)議規(guī)范可知,需要終端設(shè)備的接收機(jī)一直處于開(kāi)機(jī)狀態(tài)。將配置文件f8config.cfg中的
-RFD_RCVC_ALWAYS_ON=FALSE修改為
-RFD_RCVC_ALWAYS_ON=TRUE即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)播即點(diǎn)對(duì)點(diǎn)通信,也就是在兩個(gè)設(shè)備之間進(jìn)行通信,不允許有第三個(gè)設(shè)備收到信息。點(diǎn)播描述的就是網(wǎng)絡(luò)中兩個(gè)節(jié)點(diǎn)之間相互通...
    羽墨志閱讀 3,800評(píng)論 0 1
  • ●通過(guò)ZigBee協(xié)議棧實(shí)現(xiàn)一個(gè)簡(jiǎn)單的無(wú)線數(shù)據(jù)通信的時(shí)候怎么做? ①組網(wǎng):調(diào)用協(xié)議棧的組網(wǎng)函數(shù)、加入網(wǎng)絡(luò)函數(shù),實(shí)現(xiàn)...
    康雙全閱讀 5,193評(píng)論 0 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,396評(píng)論 6 13
  • 在swift中針對(duì)class,還是可以利用oc時(shí)代的關(guān)聯(lián)對(duì)象在擴(kuò)展中增加實(shí)例字段。不過(guò)就像這篇文章的示例 一樣,你...
    fuadam1982閱讀 2,097評(píng)論 0 3

友情鏈接更多精彩內(nèi)容