郑重声明:如下文章内容适合初学Zigbee的童鞋们,大神请略过……网络
1 原因:app
工做中据说过Zigbee技术,只是知道是一种无线通信技术,具体技术细节及使用都不是很清楚。不料,一个项目中须要使用Zigbee技术,这下但是要好好看下Zigbee是啥子东东了。这里写下我对Zigbee技术的一些理解。函数
2 啥是Zigbee呀?学习
Zigbee是一种无线通信技术。无线,顾名思义,就是经过无线电波(像WIFI,手机)做为信息载体的一种通信方式。通信,也就是指一个设备和另外一个设备之间须要沟通、交流。人和人之间须要沟通,沟通就须要使用语言,那这个语言可能存在语法,说白了就是双方都要理解对方说的是啥,要是一个只懂中文,另外一个只懂英文,那他两个沟通就可能须要一个翻译。设备之间也同样,它们之间须要遵循必定的规定。两个设备都要按照这个规定进行收发信息,那这个规定就是协议。对于Zigbee通信技术来讲就是Zigbee协议。其实啊,计算机的技术有两个大的方面,一个是计算机自己(硬件技术上的进步),一个是不一样设备之间的沟通。类比咱们人类来讲,一个是 人 自己的问题,一个是社会问题。说了这么多废话,下面总结一下:Zigbee通信就是设备和设备之间进行沟通的一种方式,这种方式规定了传输信息须要什么物理介质,传输的信息格式是什么样子的,谁先发送信息,信息传输过程当中被干扰了怎么办,对方要是没收到怎么办等等一系列问题。翻译
算了,仍是看看官方怎么定义的吧:ZigBee是基于IEEE802.15.4标准的低功耗局域网协议。根据国际标准规定,ZigBee技术是一种短距离、低功耗的无线通讯技术。设计
另外附上Zigbee、WIFI、bluetooth之间的区别和联系图:指针
3 和Zigbee打个招呼(混个脸熟)blog
咱们把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家庭图:
图二: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。仍是上个图吧。
在这个例子里,左边是两个开关(可能装在走廊里),两个开关共用一个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协议栈设计时采用了分层的设计思想。仍是上个图:
能够看到,Physical (PHY) Layer和MAC Layer是IEEE 802.15.4定义的。
分层模式下Zigbee通信的示意图:
在802.15.4和Zigbee协议中,用“原语”的概念来描述相邻两个层间的服务,层间调用函数或者传递信息,均可以用原语来表示。虽然,在整个系统中,有不少不一样的层,可是层间的通信方式是很是类似的。好比PHY、MAC与NWK层都为他们的上一级提供数据服务,其请求数据服务的机制相似:高层经过D-SAP向下级请求传输,下级传输成功后将状态返回给上级。
正是因为这种类似性,才让“服务原语”这种方式显得格外重要。每个原语要么执行一个指令,要么返回一个以前指令的运行结果。原语也会带着指令运行须要的参数。
上图描述了某层为其上层提供服务的通常方法,如图所示,有四种类型的原语:请求、指示、响应和确认。换句话说,在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