ZStack 通信 单播具体实验步骤见:
http://wenku.baidu.com/view/7c8ad28184868762caaed5f8.html
ZStack 单播组播广播见
http://wenku.baidu.com/view/a5ac07f4941ea76e58fa0464.html
更全面的单播解释:
转自http://hi.baidu.com/dongyuejiang/item/df32a42f820f1e112b0f1c2c
按照协议栈示例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*)&SampleApPeriodicCounter, &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.对数据的处理与单播的实现一样