郑重声明:以下文章内容适合初学Zigbee的童鞋们,大神请略过……


1 缘由:

  工作中听说过Zigbee技术,只是知道是一种无线通讯技术,具体技术细节及使用都不是很清楚。不料,一个项目中需要使用Zigbee技术,这下可是要好好看下Zigbee是啥子东东了。这里写下我对Zigbee技术的一些理解。

2 啥是Zigbee呀?

  Zigbee是一种无线通讯技术。无线,顾名思义,就是通过无线电波(像WIFI,手机)作为信息载体的一种通讯方式。通讯,也就是指一个设备和另一个设备之间需要沟通、交流。人和人之间需要沟通,沟通就需要使用语言,那这个语言可能存在语法,说白了就是双方都要理解对方说的是啥,要是一个只懂中文,另一个只懂英文,那他两个沟通就可能需要一个翻译。设备之间也一样,它们之间需要遵循一定的规定。两个设备都要按照这个规定进行收发信息,那这个规定就是协议。对于Zigbee通讯技术来说就是Zigbee协议。其实啊,计算机的技术有两个大的方面,一个是计算机本身(硬件技术上的进步),一个是不同设备之间的沟通。类比我们人类来说,一个是 人 本身的问题,一个是社会问题。说了这么多废话,下面总结一下:Zigbee通讯就是设备和设备之间进行沟通的一种方式,这种方式规定了传输信息需要什么物理介质,传输的信息格式是什么样子的,谁先发送信息,信息传输过程中被干扰了怎么办,对方要是没收到怎么办等等一系列问题。


  算了,还是看看官方怎么定义的吧:ZigBee是基于IEEE802.15.4标准的低功耗局域网协议。根据国际标准规定,ZigBee技术是一种短距离、低功耗的无线通信技术。

     另外附上Zigbee、WIFI、bluetooth之间的区别和联系图:

     wKiom1WfNXyTtX3eAAIdd-v2aVA157.jpg

3 和Zigbee打个招呼(混个脸熟)

  我们把Zigbee通讯和人之间沟通做个类比,然后以不断提问的方式来阐述一下Zigbee是怎么实现不同设备之间通讯的。前面说啦,Zigbee一般用于局域网通讯(有同学举手了,“啥是局域网呀?”“那个同学,你先把手放下,举着怪累的”“局域网就是局部使用的网络,也就是说小范围内的通讯,你像你家里需要不同设备通讯,就可以使用Zigbee技术” “我们都使用Internet上网、聊天,它是基于TCP/IP协议的,TCP/IP可以组成局域网,也可以组成Internet”),那我们就以你家里人之间沟通作为类比的例子。下面假设以下场景:你家里有3口人,你、爸爸、妈妈|类比Zigbee网络里有3个Zigbee设备。你现在大概知道我会以什么方式来聊聊这个Zigbee了吧。

  64 bit MAC地址(全球唯一地址)

  哎呦,我们的目的是想让Zigbee设备之间能相互沟通。那首先最先摆在我们面前的问题是怎么保证Zigbee设备的唯一性呐?在你家里,你肯定是要认识爸爸、妈妈的,同样爸爸、妈妈也要认识你。你是怎么认识爸爸、妈妈的?现在给你1S思考时间,恩,你记住了爸爸、妈妈的身高、长相等特征。也就是说爸爸、妈妈有一定的外貌特征,两个人长的完全一模一样还真是不多见。现在医学说是DNA不一样,所以每个人就不一样,对人来说是DNA就是你在地球上的唯一标示。那Zigbee设备是以什么来确定其唯一性的呐,这个好说,Zigbee设备都是我们人类制造的,我们可以人为地给它们分配一个唯一的地址。我是这么想的,查下资料(稍等5分钟…………)。唯一标示Zigbee设备的物理地址是64bit的一串数字,比如:000124B00028B679,前面24bit代表公司代码,后40bit代表地址段。这些地址需要向IEEE委员会申请。

  16 bit 网络地址(用于标示Zigbee网络内部一个设备)

  你可能会想,我在家里,一般只喊“爸爸”、“妈妈”就可以区分他们了,不用每次都去看他们的身高、长相等等一系列特征我就可以唯一确定我要找的人。在一个给定的Zigbee网络内,唯一确定Zigbee设备有其他方法吗?我想应该是有的,Zigbee设备之间组成网络后,每个设备会分配一个16bit的短地址,设备之间可以通过这个短地址进行通讯。局域网内,范围小了,可以使用一个更简短的地址区分不同设备。

 Zigbee网络建立、设备加入

 在你们的家庭中,你的爸爸、妈妈和你都有着不同的角色。有时间找出你家的户口本,户口本一般是有编号的(在户口本的左上角或者右上角)。你的爸爸有可能是户主,你是父母的子女(这不是废话吗?我只是让你知道,在家庭中不同的人有不同的角色)。那你可能要问了,Zigbee设备中都有哪些角色,不同的角色都做哪些工作?Zigbee设备里分为Coordinator、Router、Enddevice三种角色。Coordinator负责建立Zigbee网络,并为这个Zigbee网络分配一个唯一的ID(他们都叫这个ID,PANID),Router可以加入Coordinator建立的网络,同时它可以转发数据,也就是作为数据中继,用来延长Zigbee无线通讯距离。Enddevice是终端设备,加入Zigbee网络,只能接收、发送数据。

来张Zigbee家庭图:

wKiom1WfZ1XD7KTeAAFk9gxHXiM376.jpg

wKiom1WfcFayKd86AAHMS5N9G9s507.jpg

图二:Zigbee网络拓扑图

    ***,你妈喊你回家吃饭啦!

    你和爸爸、妈妈在家里,你玩游戏累了,想点东西。你可以选择以下方式和你的爸爸、妈妈沟通。

1:直接扯开嗓子大喊:“我饿啦,赶紧给我做点吃的”。这种情况下,爸爸、妈妈都听见了,可能出现以下情形:a,爸爸比较忙,回了句:“我忙着,找你妈妈”,妈妈回了句“我给你做个蛋炒饭”。b,爸爸妈妈一起回:“好孩子,我们这就给你做饭”,然后出现爸爸、妈妈一起做饭的恩爱场景。c,爸爸妈妈都比较忙,回到“熊孩子,整天打游戏,还有脸说饿,自己做饭去,我们还要看电视剧呐”,当然这种情况下,你可以考虑你自己是不是冲电话费送的。不过,话说回来啦,你扯开嗓子喊,其实有个更专业的通讯术语,广播。对,Zigbee设备之间通讯的其中一种方式就是广播,一个设备广播,其他网内的设备都能听到。

普及一下Zigbee规定的广播地址小知识:

0xFFFF -这个一个对全网络中设备进行广播的广播地址

0xFFFD -如果在命令中将目标地址设为这个地址的话那么只对打开了接收的设备进行广播

0xFFFC -广播到协调器和路由器

0xFFFE -如果目的地址为这个地址的话,那么应用层将不指定目标设备,而是通过协议栈读取绑定表来获得相应目标设备的短地址

此外的0x0000到0xFFF8都是有效的目的地址。每一个地址就只是了一个目标设备。


2:悄悄滴走到妈妈身边,单独跟妈妈说:“妈妈,我饿了”。这种情况下,极有可能是爸爸做的饭菜实在是太难吃了。想这种,在Zigbee里就是点对点的通讯方式。在这种方式下,通讯双方都要指定目标地址。

3:和爸爸约定个暗号,大声咳嗽三声。这种方式,你不用考虑什么原地址、目标地址这些琐碎的事情。你只要发出这个暗号,老爸就知道你额了,还知道你想吃啥。高明啊,这招,但是这个也要看爸爸当时的心情咋样啊。这种在Zigbee里,叫绑定(Bonding)。通讯双方绑定后,双方通讯时就不需要过多的信息,只要发送暗号,就能完成相应的功能。

知识领域 VS Endpoint

  通过上面的描述,我们知道了,设备短地址是用于标示一个Zigbee设备的。就相当于在家里面你、爸爸、妈妈一样,不同称谓表示不同的人。但是,又一个问题随之浮出水面,那就是小孩和大人拥有的生活经历和涉足的知识领域不太一样啊,你把你儿子(6岁)叫过来,给他说:“儿子,妈妈不在家,今天下午我们去吃肯德基,好吧?”。“好的”儿子高兴地回答。双方沟通愉快。那下面的场景你想下,“儿子,你知道C语言里指针变量是一种存储内存地址的变量吗?”,儿子一脸茫然,“??????”。剩下的场面脑补下吧。上面的故事告诉我们双方能够愉快地沟通,交流的内容需要双方都要了解。在Zigbee通讯里有一个概念和这类似,叫Endpoit,一个Zigbee设备上可以存在好多Endpoit。还是上个图吧。

wKiom1Wfc6WBJyWcAALP4I6iR3s832.jpg


 在这个例子里,左边是两个开关(可能装在走廊里),两个开关共用一个Zigbee节点“Z1”(相当于开发板上的两个按键,这点应该不难理解吧),他们一起控制右边的三个灯泡(也是接在同一个节点上的--“Z2”)。Z1的key1控制Z2的lamp1,而key2则控制Z2的lamp2与lamp3。

上图中有几个没见过的概念:cluster ID 、Binding Table,其实还有一个profile、attribute。下面我们慢慢来说这些都是什么东东。

  Binding Table最好理解,上面说了,为了沟通方便,我们可以建立绑定关系,建立绑定关系的双方的短地址、Endpoit等信息都存储在Binding Table中。

 Profile ID, 这个是由Zigbee组织来分配的应用ID号,比如无线开关用0x0001,智能电表用ox0002,万用遥控器用0x0003等等。在这个例子里,这个ID号是专门用来做电灯开关的。为什么要这么做呢?这里就体现了“标准”的意义,不同厂家功能的设备,由于有了这个ID就能互相间使用了,正泰的开关一样可以控制Philips的灯。。。
 Endpoint,这个名字看起来容易误解,以为是设备的序号了,其实不然。在这个例子中,Z1有key1/key2两个Endpoint,分别做不同的事情。其对应了同一个"application"中的0-240个不同的“子应用”,其中0号endpoint是用"ZDO"预留的,不能占用。如果你熟悉TCP/IP,你可能感觉Endpoit和port(端口号)有点相似之处。
 Cluster ID,这个怎么叫呢?叫信息簇ID吧。。。我的理解是,“这是个哪类的信息”,发送端和接收端一定要对应,但是具体这个“类”怎么分,是我们可以自己决定的。比如说这个例子,我可以这样定:Cluster ID=1代表开关一次,Cluster ID=2代表连续闪烁。。。或者定义Cluster ID=1代表点对点控制,而Cluster ID=2代表全部控制,等等。。。

  attribute,在Zigbee协议栈中,每一个标准的profile(例如HA,专门用于智能家居的应用层规范)都定义了很多的Cluster ID,而每一个Cluster ID都有一些规定好的attribute及动作。

什么?太难理解了,好吧,还是来个生活中的例子吧。

以大学一年级流行的友好寝室为例:
男宿舍8个人构成开发板A, 女宿舍8个人构成开发板B.
男宿舍8个人就是开发板A上的8个EndPoint。
男宿舍5个人喜欢学习,3个爱玩,分为具有不同行为爱好的两个集团,也就是两个Profile.
女宿舍8个人3个喜欢学习,2个爱玩,剩下4个爱吃,分为3个集团,也就是三个Profile。
爱学习的Profile = 0x0010; 爱玩的Profile = 0x0011; 爱吃的Profile = 0x0012;
以上定义结束,现在来看绑定过程:
某男同学(爱玩)打个电话给女宿舍说要出去玩,8个女同学中的6个因为爱好不同(Profile值不同),直接拒绝。剩下的2个女生有一个因为讨厌该男同学(脑子中没有注册该男同学的任何示好),也拒绝了,另外一个女生暗恋该男生(脑子中已经填满该男同学的任何示好,随时准备...), 于是绑定成功。
这样以后该男生就会直接拨这位女生的手机了。
假设这位男生排名老3, 那并不一定要求这位女生也排名老3。

4 小结:

 我瞎白扯了半天,不知各位看官能不能看到这个地方。上面讨论的内容也基本涵盖了初学者最疑惑,也是最想弄清楚的概念。

5 Zigbee协议栈结构

 Zigbee协议栈设计时采用了分层的设计思想。还是上个图:

wKiom1Wfek3CNwzoAAbh0qcZ-_4740.jpg可以看到,Physical (PHY) Layer和MAC  Layer是IEEE 802.15.4定义的。

分层模式下Zigbee通讯的示意图:

wKioL1WffgPyPfsNAAGp-AcLv6k022.jpg在802.15.4和Zigbee协议中,用“原语”的概念来描述相邻两个层间的服务,层间调用函数或者传递信息,都可以用原语来表示。虽然,在整个系统中,有很多不同的层,但是层间的通讯方式是非常相似的。比如PHY、MAC与NWK层都为他们的上一级提供数据服务,其请求数据服务的机制类似:高层通过D-SAP向下级请求传输,下级传输成功后将状态返回给上级。

  正是由于这种相似性,才让“服务原语”这种方式显得格外重要。每一个原语要么执行一个指令,要么返回一个之前指令的运行结果。原语也会带着指令运行需要的参数。

wKioL1WffjXwMeTYAAEouwS5kUE415.jpg  上图描述了某层为其上层提供服务的一般方法,如图所示,有四种类型的原语:请求、指示、响应和确认。换句话说,在802.15.4和Zigbee标准中的所有服务都可以归类为上述四种原语之一。原语用下面的格式来描述:
(注:出于本文读者多数为现在或者未来的软件工程师,后面直接用英文名称来表述四种原语)
<The primitive>.request
<The primitive>.indication
<The primitive>.response
<The primitive>.confirm

  首先,由N+1层向N层用request原语申请一个服务,比如说MAC层向PHY层请求一个MPDU传输服务,它必须要向PHY层申请一个PD-Data.request的原语。

  而N层会向其服务用户(经常是N+1层)发出一个indication的原语,用来指示一个对N+1层很重要的事件。比如说,PHY层接收到一组数据,需要将此数据传递给MAC层,那么它就向MAC层产生发出一个PD_Data.indication的原语,用来向其传递数据。

  如果这个indication原语要求对其做出响应,那么N+1层就会发出一个response原语。值得注意的是,PHY和NWK层没有任何response原语,而只有MAC和APL层有。

  而confirm原语是由N层发出,用来最终确认最初N+1层申请的request服务已经完成。比如在上例中,数据发送完成后,PHY层会告诉MAC层,传输已经成功完成。

注:本文只是用一种浅显易懂的方式,让读者了解原语的基本概念,如果读者需要深入了解每层提供的原语细节,请直接阅读802.15.4和Zigbee的协议文档。

 ZigBee设备在工作时,各种不同的任务在不同的层次上执行,通过层的服务,完成所要执行的任务。每一层的服务主要完成两种功能:根据它的下层服务要求,为上层提供相应的服务;另一则是根据上层的服务要求,对它的下层提供相应的服务。各项服务通过服务原语来实现。可以把原语看作是API函数 是ZigBee中最基本的操作, 一般协议都有对原语进行程序实现 在自己开发系统时,只需要调用,设定参数就好了 。如果要自己实现底层的细节那就必须在开源的协议栈中,深入到原语的级别。也就是说,对于原语我们只需要了解就行,真正开发程序只知道我们给系统哪些参数就行了。

6 总结

  有了上面的基础,我们就可以根据实际的实验平台做做实验。我们就大致上理解了什么是Zigbee协议了,当然这只是从应用层了解了,如果你只是使用Zigbee技术实现你项目中的用户需求,那你根据实际的协议栈(比如Z-Stack,TI提供的Zigbee开发平台)提供的API来进行应用层开发就可以了。如果你想深入研究Zigbee协议栈或者想学习Zigbee协议栈设计思想,建议阅读开源的Zigbee协议栈源代码(freakz协议栈、TinyOS等)。

记得阅读 ZIGBEE SPECIFICATION 哦。

官方资料:Zigbee specification