您的位置:首页 > 产品设计 > UI/UE

Zigbee协议栈发送函数AF_DataRequest说明

2017-02-27 18:58 260 查看
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
};
 注意:ZigBee设备有两种类型的地址。一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,
设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16为网络地址是当设备加入网
络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。

参数2:endPointDesc_t *srcEP 是发送节点的端点描述符指针,在Zigbee网络中,可以通过网络地址找到某个具体的节点,
但是具体到某个节点,还有不同的端口(每个节点上最多可支持240个端口),不同节点的端口间可以相互通信。如节点1的
端口1可以给节点2的控制端口1发led控制命令,也可以给节点2的端口2发采集命令,但是同一个节点上的端口的网络地址是相同的,
所以仅仅通过网络地址无法区分节点1的端口1是与节点2的哪个端口进行通信,因此在发送数据时不但要指定网络地址,还要指点端口号。
因此得出结论:使用网络地址来区分不同的节点,使用端口号区分同一节点上的端口
typedef struct
{
  byte endPoint;  //端点号 
  byte *task_id;  //哪一个任务的端点号(调用任务的ID).
  SimpleDescriptionFormat_t *simpleDesc;  //描述一个Zigbee设备节点,称为简单设备描述符
  afNetworkLatencyReq_t latencyReq;       //枚举结构,这个字段必须为nolatencyreqs
} endPointDesc_t;       // 其定义在AF.h中
typedefstruct 

  byte            EndPoint;                   //EP 
  uint16          AppProfId;                 //应用规范ID 
  uint16          AppDeviceId;              //特定规范ID的设备类型 
  byte            AppDevVer:4;              //特定规范ID的设备的版本 
  byte            Reserved:4;                 //AF_V1_SUPPORTusesforAppFlags:4. 
  byte            AppNumInClusters;       //输入簇ID的个数 
  cId_t          *pAppInClusterList;       //输入簇ID的列表 
  byte           AppNumOutClusters;        //输出簇ID的个数 
  cId_t          *pAppOutClusterList;      //输出簇ID的列表 
}SimpleDescriptionFormat_t;     // 其定义在AF.h中
typedef enum
{
  noLatencyReqs,
  fastBeacons,
  slowBeacons
} afNetworkLatencyReq_t;

参数3 uint16 cID 是ClusID 簇ID号,一个Zigbee节点有很多属性,一个簇实际上是一些相关命令和属性的集合,在整个网络中,
每个簇都有唯一的簇ID,也就是用来标识不同的控制操作的命令号。

参数4 uint16 len 是送数据的长度

参数5 uint8 *buf  指向发送数据缓冲的指针

参数6 uint8 *transID 该参数是指向发送序号的指针,每发送一个数据包,该发送序号会自动加1,因此在接收端可以查看接收数据包的序号来计算丢包率。

参数7 uint8 options 是发送选项,有如下选项 
    #defineAF_FRAGMENTED      0x01 
    #defineAF_ACK_REQUEST     0x10 //要求APS应答,这是应用层的应答,只在直接发送(单播)时使用。
    #defineAF_DISCV_ROUTE     0x20 //总要包含这个选项
    #defineAF_EN_SECURITY     0x40 
    #defineAF_SKIP_ROUTING    0x80 //设置这个选项将导致设备跳过路由而直接发送消息。终点设备将不向其父亲发送消息。在直接发送(单播)和广播消息时很好用。

参数8 uint8 radius 最大的跳数,取默认值AF_DEFAULT_RADIUS
返回值:afStatus_SE_BIT)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: