AF_DataRequest(
fAddrType_t *dstAddr, //目标设备地址
endPointDesc_t *srcEP, //端口描述符
uint16 cID, //命令号
uint16 len, //数据长度
uint8 *buf, //数据
uint8 *transID, //发送数据包序列号
uint8 options, //有效 位掩码的发送选项,一般设为AF_DISCV_ROUTE.
uint8 radius //传送跳数或半径,一般设为AF_DEFAULT_RADIUS
)
目标设备的地址,我们用地址结构体来表示
typedef struct
{
union
{
uint16 shortAddr; //网络地址,该地址是设备在加入网络时由协议栈分配的
ZLongAddr_t extAddr; //64位扩展地址,全球唯一
}addr;
afAddrMode_t addrMode; //地址模式(广播,组播,单播)
byte endPoint; //端口号,可供范围1~240
uint16 panId; //一个无线网络的网络号
}afAddrType_t;
三、发送模式结构体
typedef enum
{
afAddrNotPresent = AddrNotPresent, //当前地址不存在
afAddr16Bit = Addr16Bit, //用于单播
afAddr64Bit = Addr64Bit, //用于单播
afAddrGroup = AddrGroup, //用于组播
afAddrBroadcast = AddrBroadcast //用于组播
}afAddrMode_t;
四、端口描述符
typedef struct
{
byte endPoint; //端口号
byte *task_id; //指定哪一个任务
SimpleDescriptionFormat_t *simpleDesc; //设备简单描述符
afNetworkLatencyReq; //延时请求
}endPointDesc_t;
这里单独看一下设备简单描述符
typedef struct
{
byte EndPoint; //端口号
uint16 AppProfId; //规范号,一个规范定义一个应用领域,如,智能家居,工业厂房监控,商业楼宇自动化等
uint16 AppDeviceId; //设备类型ID
byte Reserved:4; //保留位
byte AppNumInClusters; //输入簇的个数
cId_t *pAppInClusters; //输入簇的列表
byte AppNumOutClusters; //输出簇的个数
cId_t *pAppOutClusterList; //输出簇的列表
}SimpleDescriptionFormat_t;
可以看到上面有一个规范号,那么规范是什么呢?
规范:在ZigBee网络中进行数据收发都是建立在应用规范基础上,每个应用规范都有一个ID来标识,应用规范又可以分为公共规范和制造商特定规范,公共ID的范围是0x0000 —0x7FFF, 制造商特定规范ID的范围是0xbF00~0xFFFF
在一个规范下,又提出了簇的概念,簇是一个应用领域下的一个特定对象,例如:智能家居中有这个调光器就需要一些命令,如开灯、关灯、变亮、变暗等,实现这些操作需要不同的命令,多个操作命令的集合叫做簇
在设备简单描述符中需要填充输入簇和输出簇,填充时需要注意:
消息发送方需要把命令放在输出簇里,那么消息接收方需要把同样的命令放在输入簇里,之前的设备间第一次对话,由于输入输出簇是一样的,所以协调器和终端设备间也能正常通信。