Zigbee入门

来源:互联网 发布:绿色建筑计算软件 编辑:程序博客网 时间:2024/06/05 09:47

Zigbee是一种新型的短距离无线通信技术。其特点是低功耗,低成本,组网灵活。Zigbee协议由zigbee联盟指定,包括应用层,和网络层,其下层采用IEEE802.15.4协议。

无论是学习zigbee技术,还是利用zigbee技术开发产品,都需要较好的掌握zigbee协议,并比较深入的了解IEEE802.15.4协议.然而仅zigbee协议就接近400页,而IEEE802.15.4协议多达600页,全部是英文。如果从来没有接触过无线通信的开发,要迅速掌握这么多内容确实有一些难度,笔者考虑到广大急切进入zigbee的同仁者,结合自己开发中总结出的理解协议的特定方法,从开发的角度,阐述协议内容,以达到抛砖引玉的效果,同时和广大同仁交流,共同提高,并希望zigbee技术能够在中国发扬光大。

协议从功能实现来讲,ZigBee协议层共包括物理层(又称实体层)、MAC层、数据链接层、网络层和应用支持层五个主要层次。在标准制定的分工上,ZigBee协议层是由ZigBee联盟和IEEE802.15.4的任务小组共同完成的。其中,物理层(又称实体层)、MAC层、数据链接层,以及传输过程中的资料加密机制等都是由IEEE所主导的。网络层和应用支持层则由ZigBee联盟来完成。IEEE802.15.4小组与ZigBee联盟共同针对ZigBee协议栈的发展进行研究,而未来还能依据系统客户的要求来修正其所需的应用界面。

Zigbee协议整体架构

作为理解协议,从开发者的角度来讲,这样学习协议是比较费时间的,也较难掌握。笔者从自己长期开发的经验来看,对无线通信,最重要的就是在发送端根据用户的要求,把数据能够扔出去,并且是扔到指定的设备,在接收端,能够把发送到该设备的数据捡起来。并根据用户要求的作特定的处理。如果考虑在一个无线网路中的话,就得首先建立网络,其他得设备加入网络。最后是才是一些其他的问题,如设备离开网络,设备重新加入网络,等等。

这样从通信过程去理解协议,将会使得协议的内容非常明了,也可以很好的知道利用协议开发产品,达到事半功倍的效果。

本人将根据这样的思路,分五期具体讲述协议内容:

第一期:设备建立网络过程

第二期:设备加入网络过程

第三期:数据发送过程

第四期:数据接收过程

第五期:其他的问题

zigbee设备建立网络过程

在一个zigbee网络中,只有协调器(coordinator)设备可以建立网络,在建立网络过程中,所有的实现过程都是通过原语实现的(具体在程序中,如用c语言,就是调用一个一个函数,或者是一个一个任务来实现(不要刻意最求这句话的准确性,本来好的协议就是只要达到这样的结果,不管具体实现)),首先协调器设备的应用层调用NLME_NETWORK_FORMATION.request原语,发出建立网络请求,网络层收到这个原语,就要求MAC层执行信道能量扫描(在IEEEE802.15.4协议中规定,在2.4G频段,共有16个信道,每个信道的带宽为5M,深入理解,可以看协议和通信原理的相关资料)。这调用MLME_SCAN.request,主要找到信道能量低于设定能量值的信道,并且标注这些信道是可用信道,下一步就在可用信道中执行活动情况扫描(active scan),就是在可接受的信道搜寻zigbeee设备,找到一个最好的信道,通过记录的结果,选择一个信道,该信道存在最少的zigbee网络,最好是没有zigbee设备。

如果没有合适的,将发送confirm原语,并告知上层结果;如果找到了合适的信道,将随机选择一个PAN(网络号,就是可以识别一个特定zigbee网络的标识号),不与原来的冲突,如果没有找到,也通过原语告诉上层结果,如果找到了,就通过原语在MAC层注册,这个ID号,然后选择网络地址,并发送MLME_START.request原语,获取PAN ID和信道扫描结果,将通过confirm原语告知上层。

收到PAN 开始的状态,NLME 将告知应用层,它要求的建立网络的状态,这通过NLME_NETWORK_FORMATION.confirm原语实现。

zigbee设备加入网络过程

在一个zigbee协调器设备建立网络后,路由器设备或者终端设备(end device),可以加入协调器建立的网络,具体加入网络有两种方式,一种是通过关联(association)方式,就是待加入的设备发起加入网络,具体实现方式后面讨论,另一种是直接(direct)方式,就是待加入的设备具体加入到那个设备下,作为该设备的子节点,由以前网络中的设备,想待加入的设备作为其子设备决定。

下面重点讨论第一种方式,也是实际中用的最多的方式.

方式一:关联加入

加入一个设备,是两个设备的事,即子设备和待定父设备

对于子设备,首先子设备调用NLME-NETWORK-DISCOVERY.request 原语,设定待扫描的信道,以及每个信道扫描的时间,网络层收到这个原语,将要求MAC层执行被动或主动扫描。

具体发送到设备外的是一个beconrequest 帧,当在这个信道中的设备收到该帧,将会发送becon帧,这是子设备通过BEACON-NOTIFY.indication 原语,告知该设备的MAC层,该becon帧包含了发送该帧的地址信息,以及是否允许其他设备以其子节点的方式加入。待加入的设备,在网络层,将检查该becon帧 协议 ID是否是zigbee ID 。如果不是,将 忽略;如果是,该设备将复制收到每个becon帧的相关信息到其关联表中(neighbor table)。

一旦MAC层完成了扫描,将发送 MLME-SCAN.confirm 原语,告知网络层,网络层将发送NLME-NETWORK-DISCOVERY.confirm 原语,告知应用层。

应用层收到该原语,应用层将根据情况,要么重新要求扫描,或者从关联表中选择所发现的网络加入。调用NLME-JOIN.request 原语,原语中各个参数的设置参看协议,非常容易。如果在关联表中找不到合适的准父节点,将调用原语告知应用层,如果由多个设备可以满足要求,将选择到协调器节点深度最低的设备,如果有几个设备的深度相同,且都是最小深度,将从中随机选择一个。

一旦潜在的父节点确定,网络层将调用MLME-ASSOCIATE.request 原语到MAC层。具体设置参看协议相关部分(213页),连接状态将通过MLME-ASSOCIATE.confirm 原语反馈。

如果试图加入不成功,网络层将收到MAC层通过MLME-ASSOCIATE.confirm告知的加入失败,如果收到的是潜在父节点拒绝该设备加入,这时候,网络层将会在关联表中,把该潜在父节点的相应部分,潜在父节点位(potential parent bit)置为零,确保网络层,不再给这个设备二次发送加入请求。

如果一次加入没成功,将选择另一个潜在的父节点加入,指导找到一个合适的设备加入或者所有的设备都不适合。

如果加入成功,网络层收到的MLME-ASSOCIATE.confirm 原语,将含有该设备可用的16 唯一的逻辑地址,

网络层将在关联表中设置与其父节点的关系,同时,这个父节点也会在其关联表中加入这个新设备。

如果是以路由器(router)形式成功加入网络,该设备的应用层将发送NLME-STAT_ROUTER. request 原语,网络层将发送MLME-STAT.request 原语到MAC层。收到了MLME-START.confirm 原语,网络层 将发送 NLME-START-ROUTER.confirm 原语,含有同样的状态值。

对于父节点设备:

只有协调器或路由器,可以加入设备,进行该操作,首先从MAC层开始,MAC接收到一帧(ASSOCIATE)数据 ,通过MLME_ASSOCIATE.indication原语传到网络层,潜在的父节点收到这帧数据,首先判断该设备是否已经存在其关联表中,如果找到,NLME将获取相应的16位网络地址,并发送 associationresponse 到MAC层,如果没有找到,将分配一个在这个网络中唯一的地址给待加入的设备,如果潜在父节点已经用完了地址分配,NLME将中止,通过MLME-ASSOCIATE.reponse 原语,告知该设备,不能接收子设备了,在多跳网络中,其他的设备还可以接收。

如果设备加入得到许可,这时候,将在关联表中创建一个表项,作为其子节点,并通过MLME-ASSOCIATE.reponse 原语,告知该设备,已经成功加入网络。

方式二:直接加入

直接方式加入网络(directly)

下面讲述如何一个子设备,在其潜在父节点预先指派的情况下加入网络.

以这种方式加入网络的过程中,首先由父节点发起,下面根据建网的过程来讲述。

父节点:

首先调用NLME-DIRECT-JOIN.requese 原语,在目的地址部分设置成要求加入网络设备的IEEE地址,当这个过程初始化后,在父节点的网络层要判断该子设备是否已经加入网络,如果在其关联表中找到了这个设备,将终止操作,并通过NLME-DIRECT-JOIN.confirm原语告诉应用层,设备已经加入网络,如果没有找到匹配的,在网络层,如果可能 ,将分配一个在这个 网络中唯一的16位网络地址,将在其关联表中为这个子节点创建一个表项,如果不可以,NLME-DIRECT-JOIN.confirm原语告诉应用层表已满,如果可以,NLME-DIRECT-JOIN.confirm原语告诉应用层创建成功.注意,这个过程父节点设备是没有向空中发射信息,只是在自己设备内处理.但是,在子设备要求加入时,以孤节点方式实现,因为该过程和孤节点方式重新加入实现方式一样.

子节点:

子节点通过孤节点方式加入

首先子设备调用NLME-JOIN.request原语,并在RejoinNetwork项设置为真,然后网络层要求MAC执行孤节点扫描,对设置的信道,该步由MLME-SCAN.request初始化,通过MLME-SCAN.comfirm原语返回结果.

如果扫描成功,网络层将通过调用NLME-JOIN.confirm 原语告之应用层,加入成功.

如果扫描没有成功,网络层将终止操作,并告之应用层,没有找到网络,该步通过调用NLME-JOIN.confirm原语实现.

子节点要求加入后,父节点将做如下处理:

在MAC层收到MLME-ORPHAN.indication原语,只有协调器或路由器将做进一步处理.

当这一过程完成后,网络层将首先查找看其子设备是否为孤节点,如果有,将比较IEEE地址,如果匹配,将获取相应的16位网络地址,通过MAC层MLME-ORPHAN.reponse原语告之子设备.

接收发送数据的总体过程

在前面已经讲述了zigbee网络的建立过程,以及设备设备加入网络,现在作为实质的网络通信的平台已经搭建好了,可以进行数据传输了,下面将讲述在zigbee网络中,数据从一个设备发送到另一个设备的整体过程,后面在讲述涉及到数据传输的路由发现以及路由过程。

传输:

只有设备加入到网络中,才可以传输数据,首先,按照协议中规定的帧形式,构建帧数据,该帧数据包括帧头,帧内容,其中帧头包括帧类型,源地址,目的地址,PAN,CLUSTERID,等等信息,详细参考协议,帧构建好后,然后调用MAC层的原语,MCPS-DATA.request,将收到结果通过MCPS-DATA.confirm

接收:

设备可以接收数据,首先必须使能接收,在协调器或路由器中,只要设备不发送数据就可以处于接收状态,对于end device,应用调用NLME-SYNC.request原语,网络层,调用MLME-POLL.request原语,去查看其父节点是否暂存数据,待发送到该节点,如果有,将使能接收。

在MAC层收到数据后,首先帧头控制部分的传输半径内容将减一,然后交到网络层,网络层判断目的地址是否是自己或者该帧是广播数据帧,将把该数据传到应用层,广播帧数据将通过后面(广播传输部分)继续传输,如果目的地址不是自己,该节点是路由器或协调器,将通过后面(路由传输部分)继续传输,否则,该帧数据将被丢弃。如果是路由发现帧,将会用路由回复帧,并继续发送路由发送帧,具体过程后面详细讨论。

zigbee设备收发数据的整体过程

发送数据:

只有加入了网络的设备才可以发送数据,首先,应用层将一帧数据打包好,然后调用网络层的原语,并在网络层按照协议的配置,加上帧头,如果考虑安全机制,还要做安全处理。

接收和再发送:

在非信标的网络中,只要设备不发送数据,就可以处于接收的状态,只要在接收使能的情况下,收到一帧数据,将把该帧数据帧头的传输半径减一。如果该值为零,将不会再传输到下一个设备,该帧数据,将被送到应用层,或在网络层做具体的处理。数据帧,如果目的地址是该接收设备,将会发送到应用层,如果是广播数据帧,也会发送到应用层,并且还会继续传播到其他设备。如果正在接收的设备是协调器或路由器设备,并且已经使能了路由,如果接收到的数据目的地址不是该设备,将中继该帧数据到其他设备,如果其他情况,将舍弃该帧数据。如果接收到的数据是路由应答,如果目的地址是该设备,将用后面讲到的方式处理,否则,将舍弃该帧数据,并且将发送路由错误帧。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脱发头发掉的厉害怎么办 宝宝四个月妈妈掉头发怎么办 产后四个月掉头发怎么办 洗头时严重掉发怎么办 头发老是掉得到处都是怎么办 短发洗完头头发向外外怎么办 20岁掉头发厉害怎么办 20岁老掉头发怎么办 20岁有点掉头发怎么办 20岁开始掉头发怎么办 20岁掉头发严重怎么办 20岁脱发很严重怎么办 手的纹路很深怎么办 20岁白头发很多怎么办 一天掉40根头发怎么办 烫完头发掉头皮怎么办 接发遗留的胶水怎么办 头发又干又卷怎么办 每天掉很多头发怎么办掉头发 植过发15天手抓植发区了怎么办 洗头梳头老掉头发怎么办 掉头发特别特别严重怎么办 哺乳期掉头发特别严重怎么办 最近掉头发特别严重怎么办 近掉头发特别严重怎么办 50多岁脱发严重怎么办 2岁宝宝掉发严重怎么办 生孩子后掉头发严重怎么办 有16岁孩孑教吾听怎么办 生完孩子后脱发怎么办 学生掉头发很厉害怎么办 35岁开始掉头发怎么办 高三学生玩手机怎么办 高三学生不学习怎么办 17岁经常掉头发怎么办 出汗后头皮很痒怎么办 头发老是掉怎么办会不会长出来 头发痒还掉头发怎么办 7个月宝宝入睡难怎么办 45天宝宝入睡难怎么办 两岁宝宝入睡难怎么办