Z-Stack协议——发送函数AF_DataRequest 下载本文

By:Adam

Z-Stack协议——发送函数AF_DataRequest

Z-Stack 中发送数据通过在应用层调用函数

void SampleApp_SendFlashMessage( uint16 flashTime )完成,其中flash Time 为发送的数据,这个函数在应用中通过调用 [AF.c]

afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP, uint16 cID, uint16 len, uint8 *buf, uint8 *transID, uint8 options, uint8 radius ) 函数完成数据的发送。如果熟悉了其中的每个参数的含义,就可以很灵活的使用发送函数发送自己的数据。

第一个参数 dstAddr,在文件AF.h中,该参数是一个结构体的指针。在该参数中除了指定了网络地址外,还需要指定目的地址的模式参数。

[AF.h]

typedef struct {

union {

uint16 shortAddr; } addr;

afAddrMode_t addrMode; //afAddrMode_t是一个枚举类型模式参数

byte endPoint; //指定的端点号 端点241—254保留端点 范围 1-240 } afAddrType_t;

下面的是 afAddrMode_t结构体的定义 目的地址模式可以设置为以下几个值:

[AF.h]

typedef enum {

afAddrNotPresent = AddrNotPresent,//间接传送(Indirect) afAddr16Bit = Addr16Bit,//指定地址单点传送(Unicast) 16位 afAddrGroup = AddrGroup,//组寻址(Group Addressing) afAddrBroadcast = AddrBroadcast//广播传送(broadcast) } afAddrMode_t;

下面详细解释各种地址模式 单点传送(Unicast)

Uicast 是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设 备。将 afAddrMode 设置为 Addr16Bit 并且在数据包中携带目标设备地址。

间接传送(Indirect)

当应用程序不清楚数据包的最终目标的时候使用间接传送。将模式设置为

By:Adam

AddrNotPresent 并且不指定目标地址。取而代之的是,从发送设备的栈的绑定表中查找到的目标。这种特点称之为源绑定(在后面的绑定一节详细介绍)。当数据向下发送到栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。

上一个版本的 ZigBee(ZigBee04),有一个选项可以讲绑定表保存在协调器 (Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)。 广播传送(broadcast)

当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为 AddrBroadcast。目标地址可以设置为下面广播地址的一种:NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点 直到查询到它或者消息超时(NWK_INDIRECT_MSG_TIMEO在f8wConifg.cfg 中)。 NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有的打开接收的空闲设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。 NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。

组寻址(Group Addressing)

当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模 式设置为 afAddrGroup 并且 addr.shortAddr 设置为组 ID。

在使用这个功能之前,必须在网络中定义组。(参见 Z-stack API 文档中的 aps_AddGroup()函数)。

注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。下面的代码是一个设备怎样加入到一个 ID 为 1 的组当中: aps_Group_t group;

// Assign yourself to group 1 group.ID = 0x0001;

group.name[0] = 0; // This could be a human readable string aps_AddGroup( SAMPLEAPP_ENDPOINT, &group );

[ZComDef.h] enum {

AddrNotPresent = 0, AddrGroup = 1, Addr16Bit = 2,

Addr64Bit = 3, // 指定IEEE地址进行单播传输 64位

AddrBroadcast = 15 };

By:Adam

注意:ZigBee设备有两种类型的地址。一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。

64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。

16为网络地址是当设备加入网络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。

第二个参数endPointDesc_t *srcEP,也是一个结构体的指针,目的网络地址描述,每个终端都必须要有一个ZigBee的简单描述。 [AF.h]

typedef struct {

byte endPoint; //端点号

byte *task_id; // Pointer to location of the Application task ID.

SimpleDescriptionFormat_t *simpleDesc; //设备的简单描述

afNetworkLatencyReq_t latencyReq; //枚举结构 必须用 noLatencyReqs 填充

} endPointDesc_t;

目标设备的简单描述结构 [AF.h]

typedef struct {

byte EndPoint; //EP ID (EP=End Point)

uint16 AppProfId; // profile ID(剖面ID)

uint16 AppDeviceId; // Device ID

byte AppDevVer:4; //Device Version 0x00 为 Version 1.0

byte Reserved:4; // AF_V1_SUPPORT uses for AppFlags:4.

byte AppNumInClusters; //终端支持的输入簇的个数

cId_t *pAppInClusterList; //指向输入Cluster ID列表的指针

byte AppNumOutClusters; //输出簇的个数

cId_t *pAppOutClusterList; //指向输出Cluseter ID列表的指针