1.原型
位于AF.C
/*********************************************************************
* @fn AF_DataRequest
*
* @brief Common functionality for invoking APSDE_DataReq() for both
* SendMulti and MSG-Send.
*
* input parameters
*
* @param *dstAddr - Full ZB destination address: Nwk Addr + End Point.
* @param *srcEP - Origination (i.e. respond to or ack to) End Point Descr.
* @param cID - A valid cluster ID as specified by the Profile.
* @param len - Number of bytes of data pointed to by next param.
* @param *buf - A pointer to the data bytes to send.
* @param *transID - A pointer to a byte which can be modified and which will
* be used as the transaction sequence number of the msg.
* @param options - Valid bit mask of Tx options.
* @param radius - Normally set to AF_DEFAULT_RADIUS.
*
* output parameters
*
* @param *transID - Incremented by one if the return value is success.
*
* @return afStatus_t - See previous definition of afStatus_... types.
*/
afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,
uint16 cID, uint16 len, uint8 *buf, uint8 *transID,
uint8 options, uint8 radius )
2.解析
1).返回 afStatus_t :实际上是uint8的 typedef
可能值为以下
/*** Generic Status Return Values ***/
#define SUCCESS 0x00
#define FAILURE 0x01
#define INVALIDPARAMETER 0x02
#define INVALID_TASK 0x03
#define MSG_BUFFER_NOT_AVAIL 0x04
#define INVALID_MSG_POINTER 0x05
#define INVALID_EVENT_ID 0x06
#define INVALID_INTERRUPT_ID 0x07
#define NO_TIMER_AVAIL 0x08
#define NV_ITEM_UNINIT 0x09
#define NV_OPER_FAILED 0x0A
#define INVALID_MEM_SIZE 0x0B
#define NV_BAD_ITEM_LEN 0x0C
2). afAddrType_t *dstAddr
目的地址。
结构体原型为
typedef struct
{
union
{
uint16 shortAddr;
ZLongAddr_t extAddr;
} addr; //网络地址
afAddrMode_t addrMode; //传输模式
uint8 endPoint; //端点号
uint16 panId; // used for the INTER_PAN feature
} afAddrType_t;
传输模式枚举原型为:
typedef enum
{
afAddrNotPresent = AddrNotPresent,
afAddr16Bit = Addr16Bit, //点播
afAddr64Bit = Addr64Bit,
afAddrGroup = AddrGroup, //组播
afAddrBroadcast = AddrBroadcast //广播
} afAddrMode_t;
举个例子:
afAddrType_t SampleApp_P2P_DstAddr; //定义点播地址
SampleApp_P2P_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //点播模式
SampleApp_P2P_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; //端点号
SampleApp_P2P_DstAddr.addr.shortAddr = 0x0000; //协调器是0,这个是内定的;另外广播地址是0xffff
这里初始化了一个点播地址。
3).endPointDesc_t *srcEP
源节点端点描述符。
这里的端点类似于socket中的port,或者说本来就是同样的东西。节点相当于一台接入网络电脑,而端点就是用于一台电脑上的不同服务。可以理解为更加细分的地址。
// Endpoint Table - this table is the device description
// or application registration.
// There will be one entry in this table for every
// endpoint defined.
typedef struct
{
uint8 endPoint;
uint8 *task_id; // Pointer to location of the Application task ID.
SimpleDescriptionFormat_t *simpleDesc;
afNetworkLatencyReq_t latencyReq;
} endPointDesc_t;
举个使用例子
// This list should be filled with Application specific Cluster IDs.
const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
{
SAMPLEAPP_PERIODIC_CLUSTERID,
SAMPLEAPP_FLASH_CLUSTERID
};
const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
{
SAMPLEAPP_ENDPOINT, // int Endpoint;
SAMPLEAPP_PROFID, // uint16 AppProfId[2];
SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2];
SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4;
SAMPLEAPP_FLAGS, // int AppFlags:4;
SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;
(cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList;
SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;
(cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;
};
endPointDesc_t SampleApp_epDesc; //定义源端点描述符
// 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 );
4).uint16 cID
簇ID。看名字不好理解。其实这个入口参数的作用是为了区分不同命令集。在接收函数中使用case进行过滤接收信息。
举例说明,很直白
/*********************************************************************
* @fn SampleApp_MessageMSGCB
*
* @brief Data message processor callback. This function processes
* any incoming data - probably from other devices. So, based
* on cluster ID, perform the intended action.
*
* @param none
*
* @return none
*/
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
switch ( pkt->clusterId )
{
case SAMPLEAPP_P2P_CLUSTERID:
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //输出接收到的数据
break;
case SAMPLEAPP_PERIODIC_CLUSTERID:
break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
这是个无线接收函数,clusterId其实就是发送函数传输过来的cID,使用switch case 进行消息过滤选择。
5).uint16 len, uint8 *buf,
待发送消息的长度,与内容缓存
6).uint8 *transID
发送序号指针。为什么要用指针?因为发送成功后它会自增1,据说是为了计算丢包率。
7).uint8 options
发送选项
#define AF_PREPROCESS 0x04 // Will force APS to callback to preprocess before calling NWK layer
#define AF_LIMIT_CONCENTRATOR 0x08
#define AF_ACK_REQUEST 0x10
#define AF_DISCV_ROUTE 0x20 // This option is no longer used, and will be taken out later
#define AF_EN_SECURITY 0x40
#define AF_SKIP_ROUTING 0x80 //跳过路由节点
星型网络,点播,广播,可以使用最后那个,而例子程序里都是使用AF_DISCV_ROUTE,我迷糊了。。。说好的no longer used呢?
8).uint8 radius
最大跳数,我只知道使用AF_DEFAULT_RADIUS。
<0>