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 );
}
注意組可以用來關聯間接尋址。再綁定表中找到的目標地址可能是是單點傳送或者是一個組地址。另外,廣播發送可以看做是一個組尋址的特例。
疑問:在程序中如何區分呢?感覺程序的原理都一樣呢