ZigBee协议中的规范(Profile)和簇(Cluester)的概念

ZigBee协议中的规范(Profile)和簇(Cluester)的概念

    1、规范(Profile):ZigBee网络中数据的收发是建立应用规范(Application  Profile)的基础上的。每个应用规范都有 一个ID;应用规范可分为公共规范(Public profile)且ID范围为0x0000`0x7FFF和制造商特定规范(Manufacturer Specific Profile)且ID范围为0xbF00~0xFFFF.其实,规范就是说一类建筑或场合使用某规范。比如:商业楼宇自动化有他自己的规范,且ID为0x0105,民宅要使用另一个ID号。很简单的吧。

    2、簇(Cluester):某一应用对象的一个特定对象。比如自动窗帘。(打开是一个命令、关闭要是另一个命令)。比如实验2中的点对点通信中

//Coordinator.h
#define GENERICAPP_MAX_CLUSTERS 1 //定义一个簇的大小,一个簇的大小为N
#define GENERICAPP_CLUSTERID 1 //定义一个簇中的一个一个命令ID

//Coordinator.c
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]= //GenericApp_ClusterList就是一个簇,他有GENERICAPP_MAX_CLUSTERS条命令,下面一一列出命令的ID号
{
GENERICAPP_CLUSTERID
};

    3、端口:使用一个节点就有一个网络地址,但在一个节点上可以有很多端口。在规范中使用简单描述符(SimpleDescriptionFormat_t结构)来描述一个端口。而在因为有很多端口,端口之间必需附加有任务切换使用的参数。结果就用endPointDesc_t结构来表示一个端口。endPointDesc_t定义如下:

[cpp] view plain copy
//AF.h
[cpp] view plain copy
typedef struct
{
byte endPoint;
byte *task_id; // Pointer to location of the Application task ID.
SimpleDescriptionFormat_t *simpleDesc; //关键是这个,见下面的结构体。
afNetworkLatencyReq_t latencyReq; //使用默认参数即可
} endPointDesc_t;

SimpleDescriptionFormat_t结构如下:
[cpp] view plain copy
//Filename: AF.h
[cpp] view plain copy
typedef uint16 cId_t;
// Simple Description Format Structure
typedef struct
{
byte EndPoint; //端口号
uint16 AppProfId; //应用规范ID
uint16 AppDeviceId; //应用设备ID
byte AppDevVer:4; //应用设备版本号 4bit 这里使用的是位域
byte Reserved:4; // AF_V1_SUPPORT uses for AppFlags:4.
byte AppNumInClusters; //输入簇包含的命令个数
cId_t *pAppInClusterList; //输入簇列表 可有GENERICAPP_MAX_CLUSTERS个输入命令
byte AppNumOutClusters; //输出簇包含的命令个数
cId_t *pAppOutClusterList;//输出簇列表 可有GENERICAPP_MAX_CLUSTERS个输出命令
} SimpleDescriptionFormat_t;

在协调器和终端节点都有一个SimpleDescripitonFormat_t类型定义的GenericApp_SipleDesc变量。(当然也可以定义多个变量。到底怎样应用到实例呢?还没想到)综合上面的所有,回看代码:

[cpp] view plain copy
//Coordinator.c
[cpp] view plain copy
//简单设备描述符(描述一个ZigBee设备节点)
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
GENERICAPP_ENDPOINT,
GENERICAPP_PROFID,
GENERICAPP_DEVICEID,
GENERICAPP_DEVICE_VERSION,
GENERICAPP_FLAGS,
GENERICAPP_MAX_CLUSTERS, //输入簇包含的命令个数
(cId_t*)GenericApp_ClusterList, //输入簇列表 可有GENERICAPP_MAX_CLUSTERS个输入命令
0,
(cId_t *)NULL
};

上面的宏是在下面的代码中定义的,这个宏也被终端节点引用
[cpp] view plain copy
//Coordinator.h
#define GENERICAPP_ENDPOINT 10 //端口在这里使用的是端口号10,可用的范围为(1~240)

#define GENERICAPP_PROFID 0x0F04 //
#define GENERICAPP_DEVICEID 0x0001 //

#define GENERICAPP_DEVICE_VERSION 0 //
#define GENERICAPP_FLAGS 0 /

#define GENERICAPP_MAX_CLUSTERS 1
#define GENERICAPP_CLUSTERID 1

终端节点代码:
[cpp] view plain copy
//Enddevice.c
[cpp] view plain copy
//初始化端口描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
GENERICAPP_ENDPOINT,
GENERICAPP_PROFID,
GENERICAPP_DEVICEID,
GENERICAPP_DEVICE_VERSION,
GENERICAPP_FLAGS,
0,
(cId_t*)NULL,
GENERICAPP_MAX_CLUSTERS, //输出簇包含的命令个数
(cId_t*)GenericApp_ClusterList //输出簇列表 可有GENERICAPP_MAX_CLUSTERS个输出命令
};

注意到没?这个协调器上的簇是输入命令,而终端节点是输出命令。对于通信双方来说,必须是一方是输入命令,另一方则是输出命令。(到底哪一方式输入,哪一方式输出则看看在说。对到目前只做过一个节点发送数据,另一个接受数据。都还没有做过两节点间的双向发送和接受通信)。
本文参考自:《ZigBee无线传感器网络设计与实现》 王小强等人编著化学工业出版社

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值