Zigbee單播、組播、廣播使用

 Zigbee網絡中進行數據通信主要有三種類型:單播、組播、廣播。那這三種方式如何設置呢,在哪裏設置呢,還記得之前學習的 Zigbee協議棧進行數據發送是調用AF_DataRequest這個函數:

 afStatus_t AF_DataRequest( afAddrType_t *dstAddr, //目的地址指針

               endPointDesc_t *srcEP, //發送節點的端點描述符指針
               uint16 cID,    //ClusID 簇ID號

               uint16 len,   //發送數據的長度

               uint8 *buf,   //指向存放發送數據的緩衝區指針

               uint8 *transID,//傳輸序列號,該序列號隨着信息的發送而增加                                     uint8 options, //發送選項

               uint8 radius   //最大傳輸半徑(發送的跳數)

)

參數1:afAddrType_t *dstAddr 該參數包含了目的節點的網絡地址、端點號及數據傳送的模式,如單播、廣播或多播等。

     afAddrType_t 是個結構體如下:

    typedef struct
   {
      union
     {
       uint16 shortAddr;      //用於標識該節點網絡地址的變量
     } addr;
    afAddrMode_t addrMode;   //用於指定數據傳送模式,單播、多播還是廣播
    byte endPoint;           //端點號
   } afAddrType_t;  // 其定義在AF.h中

    在Zigbee 中,數據包可以單點傳送(unicast),多點傳送(multicast)或者廣播傳送,所以必須有地址模式參數。一個單點傳送數據包只發送給一個設備,多點傳送數據包則要傳送給一組設備,而廣播數據包則要發送給整個網絡的所有節點。因此上述結構體中的afAddrMode_t addrMode 就是用於指定數據傳送模式,是個枚舉類型,可以設置爲以下幾個值,

typedef enum
{
  afAddrNotPresent = AddrNotPresent,   //表示通過綁定關係指定目的地址
  afAddr16Bit = Addr16Bit,   //單播發送
  afAddrGroup = AddrGroup,   //組播
  afAddrBroadcast = AddrBroadcast //廣播
} afAddrMode_t;

enum
{
  AddrNotPresent = 0,
  AddrGroup = 1,
  Addr16Bit = 2,
  Addr64Bit = 3,
  AddrBroadcast = 15
};

  看到這裏知道了通信方式在哪裏設置了,那不同的通信模式,我們要怎麼設置哪些參數呢? 

單播:注意:其實單播有兩種方式一種是綁定傳輸my_DstAddr.addrMode=(afAddrMode_t) AddrNotPresent一種是直接指定目標地址的單播傳輸,比如協調器就是0x0000。綁定後面再學吧! 

  單播綁定傳輸:

  my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;   //單播發送
  my_DstAddr.endPoint=GENERICAPP_ENDPOINT;       //目的端口號
  my_DstAddr.addr.shortAddr=0;   //按照綁定的方式進行單播,不需要指定目標地址,需要先將兩個設備綁定,將兩個設備綁定後即可通信
  直接指定目標地址的單播傳輸:是標準尋址模式,它將數據包發送給一個已經知道網絡地址的網絡設備,將afAddrMode 設置爲Addr16Bit 並且在數據包中攜帶目標設備地址。
  my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;   //單播發送
  my_DstAddr.endPoint=GENERICAPP_ENDPOINT;       //目的端口號
  my_DstAddr.addr.shortAddr=0x0000;              //目標設備網絡地址

 

廣播:當應用程序需要將數據包發送給網絡的每一個設備時,使用這種模式。地址模式設置爲
AddrBroadcast。
目標地址 my_DstAddr.addr.shortAddr可以根據需求設置爲下面廣播地址的一種:

   NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——數據包將被傳送到網絡上的所有設備,包括睡眠中的設備。對於睡眠中的設備,數據包將被保留在其父親節點直到查詢到它,或者消息超時(NWK_INDIRECT_MSG_TIMEOUT 在f8wConifg.cfg 中)。
  NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——數據包將被傳送到網絡上的所有在空閒時打開接收的設備(RXONWHENIDLE),也就是說,除了睡眠中的所有設備。

  NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——數據包發送給所有的路由器,包括協調器。

  my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//廣播發送
  my_DstAddr.endPoint=GENERICAPP_ENDPOINT;       //目的端口號

  my_DstAddr.addr.shortAddr=0xFFFF;              //協調器網絡地址

 

 組播:當應用程序需要將數據包發送給網絡上的一組設備時,使用該模式。地址模式設置爲
afAddrGroup 並且addr.shortAddr 設置爲組ID。使用組播的方式需要加入特定的組

1.首先聲明一個組對象aps_Group_t SampleApp_Group;

aps_Group_t結構體的定義:

typedef struct
{
  uint16 ID;                       // Unique to this table
  uint8  name[APS_GROUP_NAME_LEN]; // #define APS_GROUP_NAME_LEN  16
} aps_Group_t;

每個組有個特定的ID跟組名,組名存放在name數組中,name數組的第一個元素是組名的長度,第二個元素開始存放組名字符串。
2.對SampleApp_Group賦值:
// By default, all devices start out in Group 1
SampleApp_Group.ID = 0x0003;  //初始化組ID
osal_memcpy( SampleApp_Group.name, “Group 3”, 7 );  //將組名的長度寫入name數組的第一個元素位置處
3.在本任務裏將端點加入到組中:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

4.設定通信的目標地址及模式:
// 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_Group.ID ;
  通信時候,發送設備的輸出cluster設定爲接收設備的輸入cluster,另外profileID設定相同,即可通信。
5.若要把一個設備加入到組中的端點從組中移除,調用aps_RemoveGroup:
aps_Group_t *grp;
grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
if ( grp )
{
   // Remove from the group
   aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
}

 注意組可以用來關聯間接尋址。再綁定表中找到的目標地址可能是是單點傳送或者是一個組地址。另外,廣播發送可以看做是一個組尋址的特例。


疑問:在程序中如何區分呢?感覺程序的原理都一樣呢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章