本文主要介绍zigbee中profile、cluster、attribute、command的概念,以及zigbee的一些基本思想。zigbee联盟为了不同厂商的zigbee设备之间能够互联互通,于是制订了的zigbee协议标准,到今天(2016.3.28)已经到了版本3.0。要了解zigbee就要先了解下面这些关键词的概念:
1. 节点(node)
节点 Node 也可以理解为一个容器,包含一组zigbee设备,分享一个无线信道。每个节点有且只有一个无线信道。一个节点除了64位的IEEE地址,16位的网络地址,每个节点还提供了8位应用层入口地址(端点:EndPoint),对应于用户应用对象。
2. 端点(Endpoint)
端点EndPoint是协议栈应用层的入口,即入口地址,也可以理解应用对象(ApplicationObject)存在的地方,它是为实现一个设备描述而定义的一组群集。每个Zigbee设备可以最多支持240这样的端点,端口0用于整个Zigbee设备的配置和管理,应用程序可以通过端点0与Zigbee堆栈的其他层通信,从而实现对这些层的初始化和配置。附属在端点0的对象被称为Zigbee设备对象(ZDO)。端点255用于向所有端点的广播,端点241~254是保留端点。
3. 配置文件(profile)
配置文件Profile可以理解为共同促进交互式应用的多个设备描述项的集合。定义了属性ID与群集(簇)ID,使之看起来就像设备的某种特性,以家庭智能控制系统为例,灯配置文件设定了远程控制设备的群集OnOffDRC含有一种属性OnOff,且该属性为无符号8位值,值0xFF意味着"开",0x00为"关",0xF0则为无效。通常,配置文件也为设备定义了,哪些群集是强制托管,哪些群集是可选择的。
另外,配置文件还定义了一些可选择的zigbee协议托管服务。每一个应用都对应一个配置文件(Profile),配置文件内容包括:设备ID(DeviceID)、群集ID(Cluster ID)、属性ID(AttributeID),及AF(应用框架)使用何种服务类型等信息。在zigbee协议中,一个配置文件中允许最多216个设备,28个群集,每个群集支持最多2^16个属性。
现在zigbee已经被应用的各个领域如智能家居、智能楼宇、智能能源、智能照明等等,profile用2个字节(16位)来表示某一应用领域,如智能家居profileID为0x0104;个人医疗为0x0108;智能能源为0x0109。
3. 群集,或称为簇(cluster)
群集Cluster是包含一个或多个属性(attribute)的群集。简单的说,群集就是属性的集合。每个群集都被分配一个唯一群集ID且每个群集最多有65536个属性。比如一个群集包含了不同情况下的开关、不同情况下的灯、不同情况下的温度值、不同情况下的百分比等等。
通常按功能划分成不同的类,在不同的profile下所包含的cluster也不同,cluster用两个字节(16位)来表示。
如在智能家居下有on-offcluster(0x0006)、door lock cluster(0x0101)、color controlcluster(0x0300)等针对家庭使用的一些功能而划分的。所以一个特定的设备通常会包含一个特定的类,如zigbee门锁那么它肯定包含了doorlock这个cluster,调色灯会包含color control这个cluster。
4. 属性
属性Attribute是一个反映物理数量或状态的数据值,比如开关值(On/Off)、灯的状态值(On/Off)、温度值、百分比等等.
属性它表示设备的某种状态或限制,它是在cluster下面,每个cluster包含不同的属性,它由两个字节(16位)表示在同一cluster下的各个attribute是唯一的。如在doorlock下有lock state attribute(0x0000)这个用来表示门的状态(开或者关),lock typeattribute(0x0001)这个用来表示锁的类型。
5. 设备描述
设备描述DeviceDescription是指一个大型目标应用的一部分,包括一个或多个群集。
6. 命令(command)
command是对设备进行操作的各种命令,它也是在cluster下,每个cluster包含不同的命令,它由一个字节(8位)表示,同一cluster下的各个command是唯一的。如在doorlock下有lock door、unlock door、set pin、getpin等命令,commad通常与attribute联系在一起,一个command通常是改变某个attribute的值。unlock、lock命令就是改变了锁状态属性lockstate。
为了互联互通zigbee联盟规定了所有profile、cluster、atrribute和command,相当于定制了一个虚拟硬件层,它规定了lockstate为0时为关锁状态,为1时为开锁状态,当发开锁unlock 指令时lock state变为1,发关锁指令lock时lockstate变为0,这个时候制造商只要根据lock state的值通过实际硬件实现开关锁就可以了,如此即使各个厂家具体的硬件实现不同,但是在虚拟硬件层的统一就可以。
7. 对象属性分类
7.1 DeviceID
以前觉得DeviceID和ClusterID有隶属关系,其实不是了!DeviceID与ClusterID没有隶属关系!DeviceID是各种设备(传感器、控制器)在ZHA协议中被编订一个对应数值!客户端通过这个值来识别这个设备!
DeviceID在zstack里被zcl_ha.h文件、zcl_ll.h(lightlink)或zba.h(Building Automation)文件定义
7.2 ClusterID
一个ClusterID是一群AttributeID的集合!ClusterID是一个容器,容纳了许多AttributeID!他两是有隶属关系的!任何设备是通过ClusterID和AttributeID来描述设备的属性!
7.3 AttributeSet
将相近的attribute集合到一个成为AttributeSet,每个AttributeSet有16个attributeID
这个集合Set就像中国行政中的地市,尽管存在着市管县,但是官方文件确明确表示我们是省/县/乡三级行政机构!故这个SetID没有在协议体现出来!
不过也有联系,AttributeID的十六进制的前三个数实为其所在的AttributeSet编码,比如0x0001其所在的Set编码为0x000,0x0011其所在的Set编码为0x001
同样从侧面反映出为啥一个Set最多只可包含16个attribute了!从0到F嘛!
7.4 AttributeID
AttributeID是每个设备的一项属性!比如把人看做一个设备,那么其身高,发型,籍贯等等都可以作为其一个Attribute,并编订一个ID来表示这个属性!客户端接收这个ID即知道这个是什么属性,表述何种信息!任何设备是通过ClusterID和AttributeID来描述设备的属性!
AttributeID在zstack里被zcl_hvac.h、zcl_lighting.h文件定义。
8. 绑定(Bindling)
Zigbee定义了一个称为端点绑定的特殊过程。绑定即在源节点的某个端点(EndPoint)和目标节点的某个端点之间创建一条逻辑链路。绑定可以发生在两个或多个设备之间。协调器节点维护一个基本上包括两个或多个端点之间的逻辑链路的绑定表。
在绑定表中,包含如下信息,源节点和目标节点的IEEE地址、端点号、群集号。对于可以建立绑定关系的两个节点,它们的群集的属性必须一个选择"输入",另一个选择"输出",而且群集号必须相等,只有这样,它们彼此才能建立绑定。如果目标设备的扩展地址是已知的,则调用zb_BindDeviceRequest()函数可以创建一个绑定条目。
9. 寻址(Addressing)
在Zigbee网络中,使用两种地址:一种是64位的IEEE地址,也叫物理地址,64位地址在所有zigbee设备之中是唯一的,其中包含一个由IEEE分配、也是全球唯一的24位制造商特定组织标识符OUI(OrganizationallyUqique Identifier)。
另一种是16位的网络地址(NWKAddress),当设备加入zigbee网络时,从允许其加入的父设备上获取16位网络地址。该地址在zigbee网络中唯一,用于数据传输和数据包路由。在zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传输(broadcast),所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送个一组设备,而广播数据则要发送给整个网络的所有节点。当应用程序需要将数据包发送给网络上的一组设备时,还可以使用组寻址方式(GroupAddrssing)。