zigbee單播、組播、廣播

http://panqiujuan.blog.163.com/blog/static/9285237420115289127172/

zigbee單播、組播、廣播  

單播:

按照協議棧示例GenericApp中的用法:
單播有兩種方式一種是綁定傳輸,一種是直接指定目標地址的單播傳輸
按照如下步驟
1.設定發送的目標地址
GenericApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
GenericApp_DstAddr.endPoint = 0;
GenericApp_DstAddr.addr.shortAddr = 0;
設定發送的目標地址,這裏地址模式AddrNotPresent,即按照綁定的方式進行單播,不需要指定目標地址,需要先將兩個設備綁定,將兩個設備綁定後即可通信
還有另外三種傳送方式,如下:
enum
{
AddrNotPresent = 0,//按照綁定表進行綁定傳輸
AddrGroup = 1,//組播傳輸
Addr16Bit = 2,//指定目標網絡地址進行單播傳輸
Addr64Bit = 3,//指定IEEE地址進行單播傳輸
AddrBroadcast = 15//廣播傳輸
};
2.註冊端點描述符
// Fill out the endpoint description.
GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id = &GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq = noLatencyReqs;

// Register the endpoint description with the AF
afRegister( &GenericApp_epDesc );
3.在需要發送數據的地方,執行如下代碼:
if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       (byte)osal_strlen( theMessageData ) + 1,
                       (byte *)&theMessageData,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
    // Successfully requested to be sent.
}
else
{
    // Error occurred in request to send.
}
注意GENERICAPP_CLUSTERID必須爲對方的輸入cluster,且兩方的簡單描述符中的profileID必須一致
4.在接收設備任務循環中檢測AF_INCOMING_MSG_CMD事件:
afIncomingMSGPacket_t結構的數據包進行處理
afIncomingMSGPacket_t結構如下:
typedef struct
{
osal_event_hdr_t hdr;
uint16 groupId;
uint16 clusterId;
afAddrType_t srcAddr;
byte endPoint;
byte wasBroadcast;
byte LinkQuality;
byte SecurityUse;
uint32 timestamp;
afMSGCommandFormat_t cmd;
} afIncomingMSGPacket_t;
其中afMSGCommandFormat_t結構如下:
typedef struct
{
byte   TransSeqNumber;
uint16 DataLength;               // Number of bytes in TransData
byte *Data;
} afMSGCommandFormat_t;
提取出Data即可

---------------------------

組播:

按照SampleApp實驗,組播的實現需要如下步驟:
1.聲明一個組對象aps_Group_t SampleApp_Group;
2.對aps_Group_t結構體賦值,示例如下:
// By default, all devices start out in Group 1
SampleApp_Group.ID = 0x0003;
osal_memcpy( SampleApp_Group.name, “Group 3”, 7 );
3.設定通信的目標地址,示例如下:
// 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;
4.註冊端點描述符,示例如下:
// Fill out the endpoint description.
SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_epDesc.task_id = &SampleApp_TaskID;
SampleApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
SampleApp_epDesc.latencyReq = noLatencyReqs;

// Register the endpoint description with the AF
afRegister( &SampleApp_epDesc );
5.在本任務裏將端點加入到組中,示例如下:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
6.按照組播地址向對方發送數據,示例如下:
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID,
                       1,
                       (uint8*)&SampleAppPeriodicCounter,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
    // Error occurred in request to send.
}
通信時候,發送設備的輸出cluster設定爲接收設備的輸入cluster,另外profileID設定相同,即可通信
7.對數據的處理與單播的實現一樣
8.若要把一個設備加入到組中的端點從組中移除,調用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 );
}

 

---------------------------

廣播

按照SampleApp,執行如下步驟即可
1.聲明afAddrType_t 的變量SampleApp_Periodic_DstAddr;
2.設定目標地址變量爲廣播地址,示例如下:
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
3.進行數據發送,示例如下:
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID,
                       1,
                       (uint8*)&SampleAppPeriodicCounter,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
    // Error occurred in request to send.
}
通信時候,發送設備的輸出cluster設定爲接收設備的輸入cluster,另外profileID設定相同,即可通信
4.對數據的處理與單播的實現一樣

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