矿井无线传感网络基于LEACH路由协议的改进方案

时间:2019-05-15 01:53:55下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《矿井无线传感网络基于LEACH路由协议的改进方案》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《矿井无线传感网络基于LEACH路由协议的改进方案》。

第一篇:矿井无线传感网络基于LEACH路由协议的改进方案

矿井无线传感网络基于LEACH路由协议的改进方案

摘要:

针对我国煤矿井下特殊的环境,基于LEACH路由协议提出新的高效,能量均衡的分簇 路由协议。簇首节点选取将以邻居节点的平均剩余能量与节点本身的剩余能量的比值,与邻 居节点的距离作为节点竞争簇头的参数,簇内节点均加入距离自己最近的簇头节点;经数据 融合后的簇首节点之间通过多跳方式通信,最终将融合后的信息通过网关节点,由有线网络 发送到地面的监控系统。利用NS2进行仿真,实验结果证明,改进后的协议能够均衡网络节点能耗,延长网络生命时间,适应煤矿井下特殊环境。1 前言

目前,我国煤矿采用的检测系统都以工业总线作为基础,井下检测系统与地面信息中心一般通过电缆或者光纤连接,构成有线的检测系统。但有线系统对线路依赖性强,受布线局 限,且需要专业人员维护,一旦设备出现故障,会使局部区域失去监测能力。因此,有线通 信其扩展性,网络覆盖率,灵活性存在不足,成本较高。但无线传感网络的出现给煤矿监控带来前所未有的希望,无线传感器网络具有放置灵活、扩展简便、移动性强、具有自组织性等特点,因此建立基于无线传感网络的煤矿无线监测系统可以对有线监控系统起到强大的补充功能,无线与有线的结合,将极大的提高全煤矿的安全监控水平。

但是,通常传感器节点的通信距离有限,在10~100 m范围内,节点只能与其射频覆盖范围内的邻居直接通信,因此限制了无线传感器网络在大规模范围的应用。现有的路由协议具有良好的自组织性,在一定程度上提高了网络的自组织性能,延长了网络寿命,但大多数适合小规模网络,节点的能耗分布不均衡,不适用于工作面有限异质可变空间,并且工作面的不断向前推进,信息流量不均衡,对网络的自组织性也提出了更高的要求。2 LEACH路由协议

路由协议按网络的拓扑结构可分为2类:平面路由协议和分簇路由协议。在平面路由协议中,各节点地位平等,通过局部操作和反馈信息来生成路由。平面路由缺乏对通信资源的优化管理,对网络动态变化的反应速度较慢。在分簇路由协议中,通常对网络中的节点进行层次划分,若干地理位置相邻的节点构成一个簇,每个簇内选举一个簇首。簇首节点负责簇内信息的收集、融合及簇间数据的转发。

分簇路由便于管理,能对系统变化做出快速反应,为网络提供高质量的通信服务。

典型的分簇路由协议LEACH(low energy adaptive clustering hierarchy)协议是Heinzelman 等人2002年提出的基于分簇的层次性路由协议,它采用分簇的网络结构,各节点独立地按照一定概率决定自己是否做簇首,周期性地进行簇首选举和网络重组,避免簇首节点能耗过 多,影响网络寿命。相比一般的平面协议或静态分簇协议,LEACH可以减少网络能量损耗,延长网络生命周期。在此基础上,很多人基于不同应用提出了改进方案,如Stephanie Lindsey等人提出的PEGASIS(power-efficient gathering in sensor information systems)协议,就是对LEACH协议的改进,其基本思想是使节点仅和它们最近的邻节点进行通信,增加网络生命时间。

研究发现,这些分簇路由协议具有很好的自组织特性,一定程度上提高了网络性能,延 长了网络寿命。但在工作面上无线传感网络是由信息采集端向外单向传输,组成的网络节点是一种带状分布、信息流量不均衡的网络,会造成节点的功耗分布不均,接近出口的汇聚节 点数据流量大,负载重,寿命短等现象。另外,随工作面的不断向前推进,网络结构将随之变化。现有的路由协议无法满足矿井下这种特殊环境。因此在LEACH路由协议的基础上,本文提出了一种能量平衡的大规模无线传感器网络分簇路由协议,以实现节能和均衡能耗相结合。3 网络模型

3.1 假设

为增加模拟工作面的真实性,我们将仿真场景大小设置为长带状区域,N个节点随机的布置在该区域。节点需满足以下条件: 所有的节点具有相同的且与无线电信号在各个方向上能耗相同,各节点的初始能量相等且能量有限,能感知自己的剩余能量,且具有功率控制能力可以改变发射功率,从而控制发送的距离,每个节点都具有足够的计算能力支持不同的MAC协议和数据处理。2 所有节点的通信距离不超过节点的有效通信距离 sink节点是固定放置在巷道的末端,且有持续的电源供给 4 相邻节点采集的数据具有较高的相关性,可进行数据融合 5 所有节点时间同步 3.2具体的能量公式

该模型考虑了发射电路的发射能量、接收电路接收能量, 且能量损耗与传输距离有关。发射机发射m比特消息消耗的能量为:

2mEelecmEfsd,dd0ETx(m,d)

(1)4mEelecmEmpd,dd0接收机接收m比特消息消耗的能量为:

ERx(m)mEelec

(2)ETx(m,d)为发射m比特数据所消耗的能量,ERx(m)为收到m比特数据所消耗的能量,d为传输距离,Eelec为每发送或接收1比特数据传输所消耗的能量,Efs为自由空间常数,Emp为多路径衰落传输常数,Efs和Emp与所采用的输信道模型有关。d0为传输距离的门限值d0Efs,当传输距离大于d0时数据传输的消耗相当大。Emp4分簇路由协议改进方案 4.1 簇形成过程

在LEACH协议中,簇首的产生具有很大的随机性,不能均衡能耗。矿井工作面的特殊 地形,各个簇都是相邻的,LEACH协议没有考虑节点的剩余能量,地理位置等因素。因此,我们根据工作面的特殊环境,设计改进的LEACH协议LEACH—IM 协议。在LEACH的基础上,簇头节点的个数为N,我们假设理想的成簇概率为P,最终成簇的数目为K=NP。簇 首节点选取将以邻居节点的平均剩余能量与节点本身的剩余能量的比值,担任簇首节点的总个数及邻居节点个数作为节点竞争簇头的参数。将能量的比值转化成时延,比值越小,时延越小,反之时延越大。网络所有节点在成为簇头之前,均等待一个时延,时延先到达的节点优先成为簇首节点。

在描述算法之前,先规定每个节点保存各自信息(节点ID,初始能量,节点剩余能量)及邻居节点信息(节点ID,剩余能量)。每轮分簇开始时,规定获取邻居节点信息时段为 TD。每个节点将以通信半径r,广播自身信息(节点ID,节点剩余能量Er)然后接收邻居节点信息,并更新本节点信息中邻居节点的平均剩余能量Ea和邻居节点的个数d。任取某节点Vi,邻居节点Vj,则Vi节点的平均剩余能量为:

1dEaEr

dj1当Vi节点的剩余能量Er>Ea时:

(3)t1Ea1TD

Erd(4)当Vi节点的剩余能量ErEa时:

t2TDET(1r)D

2E

2(5)在上式中的E是节点的初始能量,ρ是一个均匀分布在[0.9,1]之间的一个随机实数,其作用是减小两个节点可能取相同t值的概率。

在LEACH协议中簇首的选择还考虑到该节点在过去的操作中担当簇首节点的次数,在LEACH—IM协议中,我们将节点担当簇首节点的总时间作为衡量参数。我们将采用基于加权的分簇算法。

节点i的权值计算公式表示为:

Wiwt1w2T(to)

(6)其中,w1、w2是加权因子且满足w1w21。t表示由上式邻居节点的平均剩余能量与节点本身的剩余能量的比值转化成的时延;T(to)表示该节点从网络运行开始当过簇首的总时间。若节点的剩余能量较多,担任簇首节点的时间较短,则时延先到达的节点将优先成为簇头节点。

簇首确定后,其他节点从睡眠中醒来,接收簇首节点广播的信息,依据距离远近选择要加入的簇,并向簇首发送个人信息。簇首在接到节点加入信息后,将根据加入节点的数目,为簇内每个节点分配一个通信时隙,告知节点何时发送数据,至此就形成整个网络。簇形成之后就不再改变,当簇首节点低于预设的门限值后,将在簇内重新选择簇首节点,选择依据依然参照公式(6)。4.2 数据传输

形成簇之后,簇首节点将对采集到的数据进行必要处理和融合,随后进入数据传输阶段。数据传输包括簇内传输和簇间传输。簇内传输采用TDMA模式,可有效的防止信道冲突,节约能量;而簇间传输,传输数据量大,能耗大,考虑到工作面的特殊环境和采集检测数据的冗余性,我们采用最小生成树算法的多跳路由,实现簇头节点与sink节点的通信。5仿真结果

为了比较LEACH及其改进协议LEACH-IM的性能,将这两个算法在NS2中仿真。假 设仿真环境为400m * 10m,节点总数N=200个,节点的初始能量为2J,sink节点位于原点(0,0),理想的成簇概率为P=8%,能量模型参数参照文献[y]:Eelec50nJ/bit,Efs10nJ/bit/m2,Emp0.013nJ/bit/m2,代入公式可以得到有效通信距离

d087.7m,但参照文献[y],依照具体的应用环境,有效通信距离为d050m。最优簇首节点个数Kp*N16。簇内簇间数据融合率设置为0.7。

0.80.70.60.50.40.30.20.10——LEACH+-+-LEACH-IM节点死亡概率050010001500工作周期轮数200025003000

图1

图1显示了网络中节点死亡率随工作周期数的变化情况。从图中结果可以看出,LEACH-IM在延长网络生存时间方面性能突出。此外,从第一个节点开始死亡的时间点来看, LEACH-IM也具有明显的优势。结果还表明,LEACH-IM死亡速率变化相当缓慢。表明CEUC使整个网络的能耗分布趋于平均,使各节点的能量几乎同时耗尽,避免了某些节点被过度使用。

——LEACH+-+-LEACH-IM21.5节点平均能耗10.50050010001500工作周期轮数200025003000

图2 图2在能耗指标上对LEACH和LEACH-IM进行了比较。可以看到,LEAC-IM方法

使得簇内节点能耗均衡,每轮的能耗都比LEACH协议少很多;而LEACH簇内节点能耗与簇首位置分布及数目相关,当簇首分布均匀时簇内节点能耗均衡,反之不均衡,因此每轮的性能十分不稳定。新的算法比LEACH有了显著改进。4结束语

本文通过对LEACH协议的分析,并针对矿井下的实际环境对协议进行改进。仿真结果显示,改进后的协议能更好地平衡网络负载、节约能量消耗且具有更高的能量使用效率,实现了多方面的优化。参考文献

[1] 孙利民,李建中,陈 渝,等.“无线传感器网络”[M].北京:清华大学出版社,2005:3-4.Sun [2] 徐卫克.LEACH协议成簇机制的改进计算机与现代化[A] 2010年第11期:72—79 Xu Weike.[3] 吴 征,朱 军,韩永远。一种新的基于LEACH的WSN分簇协议[J],计算机技术与发展.2010.Vol.20 No.5:29—33

[4] 周莉娟,陈光柱,罗成名.采煤工作面无线传感器网络的无线通信信道建模,传感技术学报。2010 Vol 23 No.5: 722—726

[5] Soojung Hur,Jaehyen Kim,Jeonghee Choi,Yongwan Park.“An Efficient Addressing Scheme and Its Routing Algorithmfor a Large-ScaleWireless Sensor Network” EURASIP Journal onWireless Communications and Networking.Volume 2008,1—13 [6] Neeraj Kumar, Manoj Kumar, R.B.Patel.“Coverage and Connectivity Aware Neural Network Based Energy Efficient Routing in Wireless Sensor Networks” International jouenal on applications of graph theory in wireless ad hoc networks and sensor networks,Vol.2,No1,2010:45—60 [7] Adeel Akhtar, Abid Ali Minhas, and Sohail Jabbar.“Energy Aware Intra Cluster Routing for Wireless Sensor Networks” International Journal of Hybrid Information Technology Vol.3, No.1, January, 2010 :29—47 [8] 曲文虎,谷雨,屈玉贵 管彬“WSN中一种最优的汇聚节点移动方案”通信技术。Vol.43,No.08,2010 9—11

[9] 王晓喃,高德民,徐 江“高效节能的无线传感器网络路由协议设计与实现” 计算机应用研究,2010 Vol.27 No.8 :3107—3109 [10] 刘 昕 王全玉 金旭亮.“基于能量感知的数据汇聚和路由协议”计算机研究与发展:83—89 [11] 郭敏, 贺鹏.“一种基于的无线传感器网络路由改进算法” 电脑知识与技术.Vol.6,No.8,March 2010, pp.1977-1979

第二篇:无线传感网络学习心得

无线传感器网络学习心得

初次接触这个课程时,我无意地在课本中看到了对于无线传感器网络的基本概述:无线传感器网络是一种全新的信息获取平台,能够实时监测和采集网络分布区域内各种检测对象的信息,并将这些信息发送到网关节点,以实现复杂的指定范围内目标检测与跟踪。这让我联想到物联网体系的感知层与网络层,乍一想,这不就是物联网感知层与网络层的整体解决方案么?美国《商业周刊》与MIT技术评论分别将无线传感器网络列为改变世界的10大技术之一。作为一名物联网工程专业的大学生,了解于此,内心燃起了一团火焰,因为觉得这个将成为我们将以时代推动者的身份参与到人类21世纪的建设中。

学习无线传感器网络这个课程,分3个阶段,第一个阶段是分别讲解无线传感器网络里面的各个组成部分,包括物理层,信道接入技术,路由协议,拓扑技术,网络定位与时间同步技术等等。第二个阶段是整合零碎的知识,总结出无线传感器网络的工作原理。第三阶段是利用现有知识理解无线传感器网络在物联网环境下的应用并且能够根据现实需求设计出符合要求的一个整体的无线传感器网络。

第一阶段知识总结,(1)无线传感器网络物理层是数据传输的最底层,它需要考虑编码调制技术,通信速率,通信频段等问题。信道接入技术中有IEEE 802.11MAC协议,S-MAC协议,Sift协议,TDMA技术,DMAC技术,CDMA技术。在物理层和信道接入技术主要有2个标准,一个是IEEE 802.15.4标准,一个是ZigBee标准,它们各有优劣,可根据现实情况采用不同标准。(2)无线传感器网络路由协议的作用是寻找一条或或多条满足一定条件的,从源节点到目的节点的路径,将数据分组沿着所寻找的路径进行转发。路由协议中有Flooding协议,Gossiping协议,SPIN协议,DD协议,Rumor协议,SAR协议,LEACH协议,PEGASIS协议等协议。(3)动态变化的拓扑结构是无线传感器网络最大特点之一,拓扑控制策略为路由协议、MAC协议、数据融合、时间同步和目标定位等多方面都奠定了基础。在无线传感器网络中,拓扑控制将影响整个网络的生存时间,减小节点间通信干扰,提高网络通信效率,为路由协议与时间同步提供基础,影响数据融合与弥补节点失效的影响。(4)无线传感器网络主要有两种基本感知模型,而这又跟覆盖问题直接相关。根据无线传感器网络不同的应用,覆盖需求通常不同。根据覆盖目标不同,目前覆盖算法可以分为面覆盖,点覆盖及栅栏覆盖。(5)无线传感器网络的定位是指自组织的网络通过特定方法提供节点位置信息。这种自组织网络定位分为节点自身定位和目标定位。节点自身定位是确定网络中节点的坐标位置的过程。目标定位是确定网络覆盖范围内目标的坐标位置。定位过程中把定位算法分为基于测距和无需测距的定位算法。基于测距的定位算法需要测量相邻节点之间的绝对距离或者访方位,并利用节点间的实际距离或者方位来计算位置节点的位置,常用的测距技术用RSS(到达信号强度)测量法,TOA(到达时间)测量法,TDOA(到达时间差)测量法,RSSI(到达信号强度)测量法等。(6)无线传感器网络上的目标跟踪与其定位不同,主要目的不是追求定位的精度,而是需要对移动的目标或者时间进行动态的监测。基于无线传感器网络的目标跟踪过程大致包括3个阶段:检测、定位和通告。检测阶段:无线传感器网络中的节点周期性地通过传感器模块检测是否有目标出现。定位阶段:为了节省能量,只有距离跟踪目标比较近的节点才会对目标进行定位,如果节点接受到另外两个或者两个以上的节点到跟踪目标的距离,则可选用三边定位法或者多边极大似然估计法计算跟踪目标的位置。通告阶段:计算出跟踪跟踪目标的运动轨迹后,传感器网络要通知跟踪目标周围的节点启动进入跟踪状态。(7)无线传感器网络中的时间同步技术有两大时间同步模型,时钟模型与通信模型。时间同步协议中有经典的LTS协议,RBS协议,TPSN协议,DMTS协议和FTSP协议等协议。(8)在无线传感器网络中间件应用中,无线传感器网络中间件体系结构是无线传感器网络中间件的核心,它决定着无线传感器网络的运行及组织方式。(9)传感器网络以数据中心的特点使得其设计方法不不同于其他计算机网络,传感器网络应用系统的设计以感知数据管理和处理为中心,把数据库技术和网络技术紧密结合,从逻辑概念和软、硬件技术两个方面实现一个高性能的以数据为中心的网络系统。(10)无线传感器网络数据不能局限于网络内部传输,这样不利于无线传感器网络的普及应用,必须让终端用户能够通过外部网络(如Internet)便捷地访问无线传感器网络采集的环境数据。这就需要物联网环境下的无线传感器网络接入技术了。多网融合的无线传感器网络是在传统的无线传感器网络的基础上,利用网关接入技术,实现无线传感器网络与以太网、无线局域网、移动通信网等多种网络的融合。处于特定应用场景中的、高效组织组织的节点,在一定的网络调度与控制策略驱动下,对其所部属的区域开展监控与传感;网关节点设备将实现对其所在的无线传感器网络的区域管理、任务调度、数据聚合、状态监控与维护等一系列功能。经网关节点融合、处理并经过相应的标准化协议处理和数据转换之后的无线传感器网络信息数据,将有网关节点设备聚合,根据其不同的业务需求及所接入的不同网络环境,经由TD-SCDMA和GSM系统下的地面无线接入网、Internet环境下的网络通路及无线局域网网络下的无线链路接入点等,分别接入TD-SCDMA与GSM核心网、Internet主干网及无线局域网等多类型异构网络,并通过各网络下的基站或主控设备,将传感信息分发至各终端,以实现针对无线传感器网络的多网远程监控与调度。(11)无线传感器网络具有很强的应用相关性,起硬件需要满足轻量化、扩展性、灵活性、稳定性、安全性与低成本等要求。

学习的第二个阶段,对零碎的知识点进行整合,总结出对无线传感的工作原理的自我理解。

上图就是一个典型的无线传感器网络应用系统的简易示意图,它拥有着无线传感器网络所应该拥有的最基本的三种类型的节点,即传感器节点(sensor node),汇聚节点(sink),用户的管理节点(User)以及互联网或通信卫星。传感器节点(sensor node)分布于监测区域的各个部分(sensor field),用于收集数据,并且将数据路由至信息收集节点(sink),信息收集节点(sink)与信息处理中心(User)通过广域网络进行通信,从而对收集到的数据进行处理。

学习的第三阶段:利用现有的知识体系,理解无线传感器网络在现实中的应用,并且可以根据现实的需求设计出合理的应用体系。结合无线传感器网络在农业中的应用进行探究:(1)在体系结构选择方面,其体系结构选择通性化的网络体系结构,跟上图体系相符。(2)节点选择方面,由于农业监测的复杂性及监测环境对于外来设备的敏感性,要求传感器节点体积尽可能小,为了获取到确切的监测信息,要求传感器节点装备多种高精度传感器。为了延长传感网的使用寿命,需要传感器节点具有尽可能长的生命周期。(3)能量管理:实际情况下的传感器网络应用可能需要长达多个月的环境监控,而单个节点的能量非常有限。为了节省能量,在发生传感任务时,只有相邻区域的节点处于传感通信状态,其余节点不需要传感和转发数据包,应当关闭无线通信系统,使其休眠节省能量。(4)数据采集方面,在无线传感器网络中,靠近基站的节点要为其他节点转发数据,能量消耗较大,边缘节点只要进行数据收集,能耗较少,所以边缘节点应当采取一定的算法对数据进行融合,降低通信量,校正采样数据之后再进行发送。(5)通信机制方面,包括路由协议、MAC协议及通信部件的控制访问机制等,路由协议负责将数据分组从源节点通过网络发送到目的节点,寻找源节点和优化节点间的路径,将数据分组沿优化的路径正确转发。MAC协议决定无线信道的使用方式,在节点间分配有限的通信资源,无线通信模块在发送状态消耗能量最多,睡眠状态消耗最少,接受和侦听状态下消耗稍小于发送状态(6)远程任务控制主要是在对环境监控一段时间后,调整网络的任务,这需要向基站发出命令,基站通过发送广播消息发出指令,还要对节点的能量、通信等状态进行监控,不断进行任务调整,延长传感器网络的使用寿命。

根据现实的需求设计出合理的应用体系分这几步:(1)根据客户的要求,分析现实的需求,书写需求文档。(2)设计出无线传感器网络的整体框架体系,选择与设计各项通信协议与通信机制。(3)分别对框架中的软硬件进行分析与设计(4)进入开发状态(5)测试,交付,维护

以上就是我对无线传感器网络课程的学习心得了,在此课程中,虽然我对其中的知识体系有所了解,但是缺少实际的操作与开发,只是停留在了浅显的认识层面,只有通过实际的操作,才能更深入地去了解它其中的核心,而这一点却恰恰是我们这个课程的学生所缺少的,基于此,我非常地希望在这个专业、这个课程中,有专业的实验室让我们这群学生能够进行实打实的器械操作,这样才能真正地达到“格物致知”,“学为实用”啊。

第三篇:无线传感网络课程设计

无线传感网络 课程设计报告

姓名:胡韶辉 胡衎

2017

学号:139074377 139074376 班级:物131班 指导教师:卫琳娜

年1月1日

无线传感网络课程设计

实验

一、无线传感网络点对点通信实验

1.实验内容

此实验为验证实验,根据实验步骤进行实验,观察结果是否与预期相符

2.实验步骤

用IAR8.1打开路径:C:UsersxsDesktop无线传感器网络课程设计无线传感网实验资料201604感知RF2-2530WSNV1.2代码和例子程序Light_SwitchIDELight_Switchsrf05_cc2530IarLight_Switch.eww分别编译并下载至两个节点上,打开节点,左右键选择/,选择完成后按中间键确认,观察LED灯显示情况。3.实验代码及分析

/* 功 能:查找字符在索引中的哪一个位置 */ /**************************************************************************************************/ static u16 lookforChar(u8 ch){ uint16 i;for(i = 0;i < FONTLISTCOUNT;i ++){

if(fontList[i] == ch)

return i;} return i;}

//查中文

static u16 lookforChar16(u16 ch){ uint16 i,j;u16 temp16;for(i = 0;i < fontChar16ListCount;i ++){

j = i*2;

temp16 = fontChar16List[j + 1];

temp16 <<= 8;

temp16 |= fontChar16List[j];

if(temp16 == ch)

return i;} return i;}

/**************************************************************************************************/ /* 功 能:在指定位置输出8*8 */ /**************************************************************************************************/ static void LcdPutChar8(u8 x,u8 y,u8 ch){ LcdBuf[y][x] = ch;} /**************************************************************************************************/ /* 功 能:在指定位置输出16*16 */ /**************************************************************************************************/

/*static void LcdPutChar16(u8 x,u8 y,u16 ch){ LcdBuf[y][x] =(u8)ch;

//低前高后

LcdBuf[y+1][x] =(u8)(ch>>8);}

void LcdPutString8(u8 x,u8 y,u8 *ptr u8 len,u8 op){

u8 i,*tptr = ptr,xx = x,yy = y;u16 m;if(x > 95)

return;if(y > 1)

return;for(i = 0;i < len;i ++){

m = lookforChar(*tptr ++);

if(m!= FONTLISTCOUNT)

{

m = m * 8;

}

else

return;

xx += 8;

if(xx > 88)

return;} } */

void LcdClearRam(void){ u8 i;for(i = 0;i < 96;i ++){

LcdBuf[0][i] = 0;} for(i = 0;i < 96;i ++){

LcdBuf[1][i] = 0;} } void LcdClearScrean(void){ LcdClearRam();PutPic((void *)LcdBuf);}

void LcdPutString16_8(u8 x,u8 y,u8 *ptr,u8 len,u8 op){ u8 i,j,*tptr = ptr,xx = x,yy = y;u16 m;if(xx > 95)

return;if(yy)

return;

for(i = 0;i < len;i ++){

m = lookforChar(*tptr ++);

if(m!= FONTLISTCOUNT)

{

m = m * 16;

for(j = 0;j < 8;j ++)

{

if(op)

{

LcdPutChar8((xx + j),yy,font[m+j]);

LcdPutChar8((xx + j),yy+1,font[m+j+8]);

}

else

{

LcdPutChar8((xx + j),yy,~font[m+j]);

LcdPutChar8((xx + j),yy+1,~font[m+j+8]);

}

}

}

else

break;

xx += 8;

if(xx > 96)

return;} PutPic((void *)LcdBuf);} //显示16*16字符

void LcdPutString16_16(u8 x,u8 y,u8 *ptr,u8 len,u8 op){ u8 i,j,*tptr = ptr,xx = x,yy = y;u16 m;if(xx > 95)

return;if(yy)

return;

for(i = 0;i < len;i ++){

m = lookforChar(*tptr ++);

if(m!= FONTLISTCOUNT)

{

m = m * 32;

for(j = 0;j < 16;j ++)

{

if(op)

{

LcdPutChar8((xx + j),yy,font[m+j]);

LcdPutChar8((xx + j),yy+1,font[m+j+16]);

}

else

{

LcdPutChar8((xx + j),yy,~font[m+j]);

LcdPutChar8((xx + j),yy+1,~font[m+j+16]);

}

}

}

else

break;

xx += 16;

if(xx > 80)

return;} PutPic((void *)LcdBuf);}

static void LcdPrint8(u8 x,u8 y,u8 vl,u8 op){ u8 j;u16 m;m = lookforChar(vl);if(m!= FONTLISTCOUNT){

m = m * 16;

for(j = 0;j < 8;j ++)

{

if(op)

{

LcdPutChar8((x + j),y,font[m+j]);

LcdPutChar8((x + j),y+1,font[m+j+8]);

}

else

{

LcdPutChar8((x + j),y,~font[m+j]);

LcdPutChar8((x + j),y+1,~font[m+j+8]);

}

} } } static void LcdPrint16(u8 x, u8 y, u16 val, u8 op){ u8 j;u16 m;m = lookforChar16(val);if(m!= fontChar16ListCount)

{

m = m * 32;

for(j = 0;j < 16;j ++)

{

if(op)

{

LcdPutChar8((x + j),y,fontChar16[m+j]);

LcdPutChar8((x + j),y+1,fontChar16[m+j+16]);

}

else

{

LcdPutChar8((x + j),y,~fontChar16[m+j]);

LcdPutChar8((x + j),y+1,~fontChar16[m+j+16]);

}

}

} }

void LcdPutDispBuf(u8 x,u8 y,OledCodeDataType *ptr,u8 op){ u8 tcount = x;OledCodeDataType *tptr = ptr;u16 temp16;if(x > 88)

return;if(y > 1)

return;while((*tptr!= '')&&(tcount <= 88)){

if(*tptr < 127)

//显示ASIC码

{

}

else //显示汉字

{

LcdPrint8(tcount,y,*tptr,op);tptr ++;tcount += 8;

temp16 = tptr[1];temp16 <<= 8;temp16 |= tptr[0];LcdPrint16(tcount,y,temp16,op);tptr += 2;

tcount += 16;

} } PutPic((void *)LcdBuf);}

//实现中英文混合显示

void LcdPutDisp(u8 x,u8 y,OledCodeDataType *ptr,u8 op){ u8 tcount = x;OledCodeDataType *tptr = ptr;u16 temp16;if(x > 88)

return;if(y > 1)

return;while((*tptr!= '')&&(tcount <= 88)){

if(*tptr < 127)

{

LcdPrint8(tcount,y,*tptr,op);

tptr ++;

tcount += 8;

}

else

//显示汉字

{

temp16 = tptr[1];

temp16 <<= 8;

temp16 |= tptr[0];

LcdPrint16(tcount,y,temp16,op);

tptr += 2;

tcount += 16;

} } PutPic((void *)LcdBuf);} //从右往左输出一组字符并移运显示

void LcdPutScDispRtoL(OledCodeDataType *ptr,u8 op,u16 dl){ OledCodeDataType *tptr = ptr;u16 temp16;// LcdClearRam();

//显示ASIC

while(*tptr!= ''){

if(*tptr < 127)码

//显示ASIC

{

memcpy(LcdBuf[0],&LcdBuf[0][8],88);

memcpy(LcdBuf[1],&LcdBuf[1][8],88);

LcdPrint8(88,0,*tptr,op);

tptr ++;

}

else

//显示汉字

{

memcpy(LcdBuf[0],&LcdBuf[0][16],80);

memcpy(LcdBuf[1],&LcdBuf[1][16],80);

temp16 = tptr[1];

temp16 <<= 8;

temp16 |= tptr[0];

LcdPrint16(80,0,temp16,op);

tptr += 2;

}

PutPic((void *)LcdBuf);

LcdDelay(dl);} }

void LcdPutScDispRtoL12(OledCodeDataType *ptr,u8 op,u16 dl){ OledCodeDataType *tptr = ptr;u16 i,temp16;for(i = 0;i < 12;){

if(*tptr < 127)

//显示ASIC码

{

memcpy(LcdBuf[0],&LcdBuf[0][8],88);

memcpy(LcdBuf[1],&LcdBuf[1][8],88);

LcdPrint8(88,0,*tptr,op);

tptr ++;

i ++;

}

else

//显示汉字

{

memcpy(LcdBuf[0],&LcdBuf[0][16],80);

memcpy(LcdBuf[1],&LcdBuf[1][16],80);

temp16 = tptr[1];

temp16 <<= 8;

temp16 |= tptr[0];

LcdPrint16(80,0,temp16,op);

tptr += 2;

i +=2;

}

PutPic((void *)LcdBuf);

LcdDelay(dl);} }

//从左往右

void LcdPutScDispLtoR12(OledCodeDataType *ptr,u8 op,u16 dl){ OledCodeDataType *ttptr,*tptr = ptr;u16 temp16;u8 i,len,tempbuf[2][96];

len = 12;

tptr = ptr+11;for(i = 0;i < len;){

if(*(tptr)< 127)

ASIC码

{

memcpy(&tempbuf[0][0],&LcdBuf[0][0],96);

memcpy(&tempbuf[1][0],&LcdBuf[1][0],96);

memcpy(&LcdBuf[0][8],&tempbuf[0][0],88);

memcpy(&LcdBuf[1][8],&tempbuf[1][0],88);

LcdPrint8(0,0,*tptr,op);

tptr--;

i ++;

}

else

//显示汉字

{

memcpy(&tempbuf[0][0],&LcdBuf[0][0],96);

memcpy(&tempbuf[1][0],&LcdBuf[1][0],96);

memcpy(&LcdBuf[0][16],&tempbuf[0][0],80);

memcpy(&LcdBuf[1][16],&tempbuf[1][0],80);

ttptr = tptr;

//显示

temp16 = *ttptr;

temp16 <<= 8;

ttptr = tptr-1;

temp16 |= *ttptr;

LcdPrint16(0,0,temp16,op);

tptr-= 2;

i += 2;

}

PutPic((void *)LcdBuf);

LcdDelay(dl);} } void LcdPutScString(OledCodeDataType *ptr,u8 op,u8 rl,u16 dl){

switch(rl){

case LIFT_SC:

LcdPutScDispLtoR12(ptr,op,dl);

break;

case RIGHT_SC:

LcdPutScDispRtoL12(ptr,op,dl);

break;

default:break;

} }

void LcdPutPic(u8 x, u8 y,u8 w,u8 h,OledCodeDataType *ptr,u8 op){ u8 i;OledCodeDataType *tptr = ptr;if((x > 95)||((x + w)> 96))

return;if((y > 1)||((y + h)> 2))

return;

for(i = 0;i < w;i ++)

{

if(op)

{

LcdBuf[y][x + i] = *tptr;

if(h == 2)

LcdBuf[y+1][x + i] = *(tptr+w);

tptr ++;

}

else

{

LcdBuf[y][x + i] = ~*tptr;

if(h == 2)

LcdBuf[y+1][x + i] = ~*(tptr+w);

tptr ++;

} } PutPic((void *)LcdBuf);}

//整屏滑动显示

void LcdPutScPic(OledCodeDataType *ptr, u8 op,u8 qp,u16 dl){ u8 i,j;u8 tempbuf[2][96];if(qp){

for(i = 0;i < 96;i ++)

{

tempbuf[0][i] = *ptr++;

}

for(i = 0;i < 96;i ++)

{

tempbuf[1][i] = *ptr++;

}

} else {

for(i = 0;i < 96;i ++)

{

tempbuf[0][i] = ~*ptr++;

}

for(i = 0;i < 96;i ++)

{

tempbuf[1][i] = ~*ptr++;

}

}

switch(op){

case RIGHT_SC:

//右边

for(i = 0;i < 8;i ++){

for(j = 0;j < 84;j ++)

{

LcdBuf[0][95-j] = LcdBuf[0][83j];

}

for(j = 0;j < 12;j ++)

{

LcdBuf[0][11-j] = tempbuf[0][95j];

}

for(j = 0;j < 84;j ++)

{

tempbuf[0][95-j] = tempbuf[0][83j];

}

PutPic((void *)LcdBuf);

} LcdDelay(dl);break;case LIFT_SC:

//左边

for(i = 0;i < 8;i ++){

for(j = 0;j < 84;j ++)

{

LcdBuf[0][j] = LcdBuf[0][j + 12];

LcdBuf[1][j] = LcdBuf[1][j + 12];

}

for(j = 0;j < 12;j ++)

{

LcdBuf[0][95-j] = tempbuf[0][11-j];

LcdBuf[1][95-j] = tempbuf[1][11-j];

}

for(j = 0;j < 84;j ++)

{

tempbuf[0][j] = tempbuf[0][j+12];

tempbuf[1][j] = tempbuf[1][j+12];

}

PutPic((void *)LcdBuf);

} LcdDelay(dl);break;default:

break;} }

void LcdPutString16_8_R(u8 *ptr,u8 op){ u8 i,x=0;

for(i=0;i<12;i++){ x=88-i*8;LcdPutString16_8(x,0,ptr,i+1,op);LcdDelay(100);} } 4.实验总结

此实验室实现两个节点间的通信,可以输出中文或英文,或中英文混合输出。其主要原理是通过ASIC将中英文转换,通过字符串的拼凑输出。

实验

二、光照传感器实验

1.实验内容

1.了解光照采集的原理

2.学习CDS 光照传感器从而掌握光照传感器的原理 3.掌握“传感器节点板”模块的原理和使用方法。2.实验步骤

第一步:把“代码和例子程序Zigbee2007 多传感器”内文件夹 “ZStack-CC2530-2.2.0-1.3.0MS”“”复制至 IAR 安装盘根目录(如 C: Texas Instruments)下。使用 IAR7.51 打开“ProjectszstackSamplesSampleAppCC2530 DB”中工程文件“SampleApp.eww”。

第二步:打开工程后选择对应的设备类型 打开工程后如下右图所示选择当前要烧写设备的类型。

打开后的工程文件 工程名称 ZigBee 网络功能 CC2530-WSN 节点功能 CoordinatorEB-Pro 协调器 网关 RouterEB-Pro 路由器 路由器节点、传感器节点 EndDeviceEB-Pro 终端节点 传感器节点

第三步:编译工程并下载到目标板。点击菜单 Project,选择“Rebuild All”,等待一会儿工程文件编译完成。等 待一会儿工程文件编译完成把仿真器与网关通过仿真器下载线连接起来。确保仿 真器与计算机、仿真器与网关底板连接正确,ZigBee 无线模块正确地插在网关 底板后。点击菜单 Project,选择“Debug”,或点击如下图标,等待一会儿即完成程 序下载 重复进行第二步和第三步,将“RouterEB-Pro”设备对应的程序下载到带传 感器模块的传感器节点底板中(SMBD-V11-1)第四步:修改 IEEE 地址。在物理地址烧写软件中首先通过“Read IEEE”把物 理地址(IEEE 地址)读出来,如果节点物理地址为“0XFF FF FF FF FF FF FF FF” 或在网络中有相同地址,则需要通过“Write IEEE”修改 ZigBee 网络节点的物 理地址,在此例中,我们把网关的物理地址修改“0x31,0x30,0x30,0x30,0x30,0x30, 0x30,0x30”。按照第二步至第四步的方法下载传感器节点模块的程序,选择 “RouterEB”或“EndDevice”,如有多组在同一实验室进行实验,请修改为各 不相同的 IEEE 地址。第五步:获取和查看光照传感器数据 用 USB 线连接上 PC 机跟网关,打开“代码和例子程序Zigbee2007 多传感 器无线龙 ZigBee 演示软件 V1.21(串口用)”目录下“无线龙 ZigBee 演示软件 V1.21(串口用).exe”软件。通过设备管理器查看对应设备的串口号是多少,如图所示为 COM3。在监控 软件中选择“COM 端口”COM3,波特率:38400,点击“打开串口”。正确打开串口后,选择网络拓扑图,确保网关与计算机的正确连接。3.实验代码与分析

case 4://普通温度、光敏、蜂鸣器 if(DispState == 0){ LcdPutString16_8(0, 0,(void*)“ Temp/Light ”, 12 , 1);} else if(DispState == 1){ temp = ReadTc77();//读取温度 sprintf(msg,“TEMP:%2d ”,temp);LcdPutString16_8(0, 0,(void*)msg, 12 , 1);} else if(DispState == 2)//读取光照 { temp = ReadSensorAdc(1);sprintf(msg,“Light:%03d ”,temp);LcdPutString16_8(0, 0,(void*)msg, 12 , 1);}

break;通过 ADC 读取光敏传感器值:

temp = ReadSensorAdc(1);//读取光敏传感器值

ReadSensorAdc 子函数位于“ ComponentshaltargetCC2530EB”目录下的 Sensor.c 文件中

temp = HalAdcRead(channel,HAL_ADC_RESOLUTION_8);channel 光敏传感器对应的 AD 通道 P01

HAL_ADC_RESOLUTION_8 采集分辨率 8Bit

ADC 采 集 子 函 数 在 在 “ComponentshaltargetCC2530EB ” 目 录 下 的

“ hal_adc.c”文件

/****************************************************************************** ******************** * @fn HalAdcRead * * @brief Read the ADC based on given channel and resolution * * @param channelthe resolution of the value * * @return 16 bit value of the ADC in offset binary format.* Note that the ADC is “bipolar”, which means the GND(0V)level is mid-scale.******************************************************************************* *******************/ uint16 HalAdcRead(uint8 channel, uint8 resolution){ int16 reading = 0;#if(HAL_ADC == TRUE)uint8 i, resbits;uint8 adctemp;volatile uint8 tmp;uint8 adcChannel = 1;/* * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.The code * does NOT disable the pin at the end of this function.I think it is better to leave the pin * enabled because the results will be more accurate.Because of the inherent capacitance on

* pin, it takes time for the voltage on the pin to charge up to its steady-state level.If * HalAdcRead()has to turn on the pin for every conversion, the results may show a lower voltage * than actuality because the pin did not have time to fully charge.*/ if(channel < 8){ for(i=0;i < channel;i++){ adcChannel <<= 1;} } /* Enable channel */ ADCCFG |= adcChannel;/* Convert resolution to decimation rate */ switch(resolution){ case HAL_ADC_RESOLUTION_8: resbits = HAL_ADC_DEC_064;break;case HAL_ADC_RESOLUTION_10: resbits = HAL_ADC_DEC_128;break;case HAL_ADC_RESOLUTION_12: resbits = HAL_ADC_DEC_256;break;case HAL_ADC_RESOLUTION_14: default: resbits = HAL_ADC_DEC_512;break;} /* read ADCL,ADCH to clear EOC */ tmp = ADCL;tmp = ADCH;/* Setup Sample */ adctemp = ADCCON3;adctemp &= ~(HAL_ADC_CHN_BITS | HAL_ADC_REF_BITS);adctemp |= channel | resbits | HAL_ADC_REF_VOLT;/* writing to this register starts the extra conversion */ ADCCON3 = adctemp;/* Wait for the conversion to be done */ while(!(ADCCON1 & HAL_ADC_EOC));/* Disable channel after done conversion */ ADCCFG &=(adcChannel ^ 0xFF);/* Read the result */ reading =(int16)(ADCL);reading |=(int16)(ADCH << 8);/* Treat small negative as 0 */ if(reading < 0)reading = 0;switch(resolution){ case HAL_ADC_RESOLUTION_8: reading >>= 8;break;case HAL_ADC_RESOLUTION_10: reading >>= 6;break;case HAL_ADC_RESOLUTION_12: reading >>= 4;break;case HAL_ADC_RESOLUTION_14: default:

HAL_ADC_DEC_BITS |

break;} #else // unused arguments(void)channel;(void)resolution;#endif return((uint16)reading);}

4.实验总结

通过串口助手,配置正确的串口号和波特率,填入测试的数据指令,点击发送就可以获取网关返回的读取到节点的数据。

实验

三、气压传感器实验

1.实验内容

1.了解气压采集的原理

2.学习MPX5010 气压传感器从而掌握气压传感器的原理 3.掌握“ 传感器节点板” 模块的原理和使用方法。2.实验步骤

同“实验二十四 光照传感器实验 实验步骤第一步至第四步”

第五步:获取和查看大气气压传感器数据用 USB 线连接上 PC 机跟网关,打开“ 软件工具及驱动无线龙 ZigBee 演示软件 V1.11”目录下“无线龙 ZigBee 演示软件 V1.11.exe”软件。通过设备管理器查看对应设备的串口号是多少,如图所示为 COM3。在监控软件中选择“ COM 端口” COM3,波特率: 38400,点击“打开串口”。在 RSS 曲线部分中的下拉选择框中选择节点压力(如下图),鼠标左键单击选中要查看的节点模块。点击“开始”按钮,就可开始显示节点空气压力的曲线了(注:这时“开始”

按钮将变为“关闭”按钮)。为了使显示曲线效果明显,可以通过电扇吹气方式来达到明显效果。点击“关闭”按钮,则曲线停止,但曲线不会消失,这时“关闭”按钮将变为“开始”按钮,这时在点击“开始”按钮会弹出一格对话框,选择“是”则不清空曲线,继续在图上画曲线。选择“否”则清空曲线,再 在图上画曲线。点击“保存”按钮,可将曲线图以 RSS 格式的数据保存在电脑上,点击“载入”按钮,可以载入保存了曲线数据的 RSS 文件,将曲线显示在曲线图上。3.实验代码与分析

传感器采集的函数在 void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)中

if((RfRx.RXDATA.HeadCom[1] == 'P')&&(RfRx.RXDATA.HeadCom[2] == 'R'))//压力传感器 { if(SensorNum == 5)//压力传感器板 { memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);temp = ReadSensorAdc(0);RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;temp = temp%100;RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;RfHaveTxDara = 1;} } //调用子函数 ReadSensorAdc 完成读取

//---------------------------//Read Sensor ADC value //读取 AD 值 //输入:通道名

//返回: 8 位 AD 值

//---------------------------INT8U ReadSensorAdc(INT8U channel){ INT8U temp;temp = HalAdcReadSen(channel,HAL_ADC_RESOLUTION_8);return temp;} 通过 ADC 读取大气压力传感器值:

temp = HalAdcReadSen(channel,HAL_ADC_RESOLUTION_8);/读取空气压力传感器值 channel 气体压力传感器对应的 AD 通道

HAL_ADC_RESOLUTION_8 采集分辨率 8Bit

ADC 采 集 子 函 数 在 在 “ComponentshaltargetCC2530EB ” 目 录 下 的 “ hal_adc.c”文件

/****************************************************************************** ******************** * @fn HalAdcRead * * @brief Read the ADC based on given channel and resolution * * @param channelthe resolution of the value * * @return 16 bit value of the ADC in offset binary format.* Note that the ADC is “bipolar”, which means the GND(0V)level is mid-scale.******************************************************************************* *******************/ uint16 HalAdcRead(uint8 channel, uint8 resolution)int16 reading = 0;#if(HAL_ADC == TRUE)uint8 i, resbits;uint8 adctemp;volatile uint8 tmp;uint8 adcChannel = 1;/* * If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.The code * does NOT disable the pin at the end of this function.I think it is better to leave the pin * enabled because the results will be more accurate.Because of the inherent capacitance on the * pin, it takes time for the voltage on the pin to charge up to its steady-state level.If * HalAdcRead()has to turn on the pin for every conversion, the results may show a lower voltage * than actuality because the pin did not have time to fully charge.*/ if(channel < 8){ for(i=0;i < channel;i++){ adcChannel <<= 1;} } /* Enable channel */ ADCCFG |= adcChannel;/* Convert resolution to decimation rate */ switch(resolution){ case HAL_ADC_RESOLUTION_8: resbits = HAL_ADC_DEC_064;break;case HAL_ADC_RESOLUTION_10: resbits = HAL_ADC_DEC_128;break;case HAL_ADC_RESOLUTION_12: resbits = HAL_ADC_DEC_256;break;case HAL_ADC_RESOLUTION_14: default: resbits = HAL_ADC_DEC_512;break;} /* read ADCL,ADCH to clear EOC */ tmp = ADCL;tmp = ADCH;/* Setup Sample */ adctemp = ADCCON3;adctemp &= ~(HAL_ADC_CHN_BITS | HAL_ADC_DEC_BITS | HAL_ADC_REF_BITS);adctemp |= channel | resbits | HAL_ADC_REF_VOLT;/* writing to this register starts the extra conversion */ ADCCON3 = adctemp;/* Wait for the conversion to be done */ while(!(ADCCON1 & HAL_ADC_EOC));/* Disable channel after done conversion */ ADCCFG &=(adcChannel ^ 0xFF);/* Read the result */ reading =(int16)(ADCL);reading |=(int16)(ADCH << 8);/* Treat small negative as 0 */ if(reading < 0)reading = 0;switch(resolution){ case HAL_ADC_RESOLUTION_8: reading >>= 8;break;case HAL_ADC_RESOLUTION_10: reading >>= 6;break;case HAL_ADC_RESOLUTION_12: reading >>= 4;break;case HAL_ADC_RESOLUTION_14: default: break;} #else // unused arguments(void)channel;(void)resolution;#endif return((uint16)reading);} 4.实验总结

打开“ EXPLORERF-CC2530 增配传感器光盘 V1.1软件工具及驱动” 中工具 “ 串口调试助手.exe”配置正确的串口号和通讯波特率,填入测试的数据指令,点击发送就可以获取网关返回的读取到节点的数据。

实验

四、综合实验

1.实验原理

以一LED灯,LED显示屏作为工具。当LED灯显示时,LED显示屏上也显示信息灯亮。将LED灯作为协调器,LED显示屏作为终端,当LED灯亮时,会通过组网将信息传给终端,即此时LED显示屏显示灯亮,即LED显示屏给予LED灯亮的一个信息反馈。2.实验步骤

选择烧取设备的类型为CoordinatorEB-pro, 点击菜单 Project,选择“ Rebuild All”,等待一会儿工程文件编译完成。等待一会儿工程文件编译完成把仿真器与网关通过仿真器下载线连接起来。确保仿真器与计算机、仿真器与网关底板连接正确,ZigBee 无线模块正确地插在网关底板后。点击菜单 Project,选择“ Debug”,或点击如下图标,等待一会儿即完成程序下载.将烧取设备类型改为EndDeviceEB-pro,重复上述步骤。当LED亮时,此时显示屏也将有相应反应。4.实验代码

#include “OSAL.h” #include “ZGlobals.h” #include “AF.h” #include “aps_groups.h” #include “ZDApp.h”

#include “SampleApp.h” #include “SampleAppHw.h”

#include “OnBoard.h”

/* HAL */ #include “hal_lcd.h” #include “hal_led.h” #include “hal_key.h” #include “string.h” #include #include “MT_UART.h” #include “HAL_ADC.h”

#include “sensor.h” #include “SHT10.h” #include “ugOled9616.h” #include “LcdDisp.h” #include “TMP006.h” #include “hal_timer34.h” /********************************************************************* * MACROS */

/********************************************************************* * CONSTANTS */ /********************************************************************* * TYPEDEFS */

/********************************************************************* * GLOBAL VARIABLES */

// This list should be filled with Application specific Cluster IDs.const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] = { SAMPLEAPP_PERIODIC_CLUSTERID, SAMPLEAPP_FLASH_CLUSTERID };

const SimpleDescriptionFormat_t SampleApp_SimpleDesc = { SAMPLEAPP_ENDPOINT, // int Endpoint;SAMPLEAPP_PROFID, // uint16 AppProfId[2];SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2];SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4;SAMPLEAPP_FLAGS, // int AppFlags:4;SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;(cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList;SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters;(cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList;};

// This is the Endpoint/Interface description.It is defined here, but // filled-in in SampleApp_Init().Another way to go would be to fill // in the structure here and make it a “const”(in code space).The // way it's defined in this sample app it is define in RAM.endPointDesc_t SampleApp_epDesc;

/********************************************************************* * EXTERNAL VARIABLES */ extern unsigned char SensorNum;extern INT8U DispNum;unsigned char DispState = 0;unsigned char Relay1State = 0;unsigned char Relay2State = 0;extern INT16U LEDDispNum;/********************************************************************* * EXTERNAL FUNCTIONS */

/********************************************************************* * LOCAL VARIABLES */ uint8 SampleApp_TaskID;// Task ID for internal task/event processing // This variable will be received when // SampleApp_Init()is called.devStates_t SampleApp_NwkState;

uint8 SampleApp_TransID;// This is the unique message ID(counter)uint8 *ieeeAddr;//物理地址

unsigned char LCDUPDATA = 0;//LCD刷新标致位 unsigned char Shakeflag = 0;unsigned char InfraredState = 0;unsigned char InfraredCount = 0;unsigned char InfraredInitFlag = 0;unsigned char HallState = 0;union f1{ uint8 RxBuf[32];struct UARTCOMBUF { uint8 Head;//头 uint8 HeadCom[3];//命令头 uint8 Laddr[8];//物理地址 uint8 Saddr[2];//网络地址 uint8 DataBuf[16];//数据缓冲区 uint8 CRC;//校验位

uint8 LastByte;//帧尾 }RXDATA;}UartRxBuf;//从串口接收到的数据帧

union e{ uint8 TxBuf[32];struct UARTBUF { uint8 Head;//头 uint8 HeadCom[3];//命令头 uint8 Laddr[8];//物理地址 uint8 Saddr[2];//网络地址 uint8 DataBuf[16];//数据缓冲区 uint8 CRC;//校验位

uint8 LastByte;//帧尾 }TXDATA;}UartTxBuf;//从串口发送数据帧

union h{ uint8 RxBuf[32];struct RFRXBUF { uint8 Head;//头

uint8 HeadCom[3];//命令头 uint8 Laddr[8];uint8 Saddr[2];uint8 DataBuf[16];//数据缓冲区

uint8 CRC;//校验位

uint8 LastByte;//帧尾 }RXDATA;}RfRx;//无线接收缓冲区

union j{ uint8 TxBuf[32];struct RFTXBUF { uint8 Head;//头

uint8 HeadCom[3];//命令头

uint8 Laddr[8];uint8 Saddr[2];uint8 DataBuf[16];//数据缓冲区

uint8 CRC;//校验位

uint8 LastByte;//帧尾 }TXDATA;}RfTx;//无线发送缓冲区

uint16 Ultrasonic_Count;//超声波计数

/***************************************************************************** void WaitUs(uint16 microSecs)

延时uS函数.*****************************************************************************/ void WaitUs(uint16 microSecs){ while(microSecs--){ /* 32 NOPs == 1 usecs */ asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);asm(“nop”);} }

/***************************************************************************** uint8 SendData(uint16 addr, uint8 *buf, uint8 Leng)

发送一组数据.*****************************************************************************/ uint8 SendData(uint16 addr, uint8 *buf, uint8 Leng){ afAddrType_t SendDataAddr;

SendDataAddr.addrMode =(afAddrMode_t)Addr16Bit;SendDataAddr.endPoint = SAMPLEAPP_ENDPOINT;SendDataAddr.addr.shortAddr = addr;if(AF_DataRequest(&SendDataAddr, &SampleApp_epDesc, 2,//SAMPLEAPP_PERIODIC_CLUSTERID, Leng, buf, &SampleApp_TransID, AF_DISCV_ROUTE, // AF_ACK_REQUEST, AF_DEFAULT_RADIUS)== afStatus_SUCCESS){

return 1;} else {

return 0;// Error occurred in request to send.} } case 1://DAC 输出

if(DispState == 0)

{

DAC_OUT_CON(0x07ff, 0x07ff);

LcdPutString16_8(0, 0,(void*)“ DAC-OUT ”, 12 , 1);

}

else if(DispState == 1)

{

DAC_OUT_CON(0x03ff, 0x03ff);

sprintf(msg,“OUT:0.5MA/V ”,temp);

LcdPutString16_8(0, 0,(void*)msg, 12 , 1);

}

else if(DispState == 2)

{

DAC_OUT_CON(0x0Bff, 0x0Bff);

sprintf(msg,“OUT:1.5MA/V ”,temp);

LcdPutString16_8(0, 0,(void*)msg, 12 , 1);

}

break;case 2://高亮LED控制

if(DispState == 0)

{

ChangT3Cmp0Val(0xff);

P1_6 = 0;

LcdPutString16_8(0, 0,(void*)“ LED-LIGHT ”, 12 , 1);

}

else if(DispState == 1)

{

ChangT3Cmp0Val(230);

LcdPutString16_8(0, 0,(void*)“LEVEL:10% ”, 12 , 1);

}

else if(DispState == 2)

{

ChangT3Cmp0Val(25);

LcdPutString16_8(0, 0,(void*)“LEVEL:90% ”, 12 , 1);

}

break;

} void SampleApp_Init(uint8 task_id){ SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;

// Device hardware initialization can be added here or in main()(Zmain.c).// If the hardware is application specificThis app will handle all key events RegisterForKeys(SampleApp_TaskID);

#ifdef WXL_COORD

MT_UartRegisterTaskID(SampleApp_TaskID);

#endif } void SampleApp_Init(uint8 task_id){ SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;

// Device hardware initialization can be added here or in main()(Zmain.c).// If the hardware is application specificThis app will handle all key events RegisterForKeys(SampleApp_TaskID);

#ifdef WXL_COORD

MT_UartRegisterTaskID(SampleApp_TaskID);

#endif }

/********************************************************************* * @fn SampleApp_ProcessEvent * * @brief Generic Application Task event processor.This function * is called to process all events for the task.Events * include timers, messages and any other user defined events.* * @param task_idevents to process.This is a bit map and can * contain more than one event.* * @return none */ uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events){ afIncomingMSGPacket_t *MSGpkt;uint16 temp1;

#if(defined(WXL_ROUTER)|| defined(WXL_RFD))//ROUTER OR RFD uint16 SrcSaddr;#endif

(void)task_id;// Intentionally unreferenced parameter

if(events & SYS_EVENT_MSG){

MSGpkt =(afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID);

while(MSGpkt)

{

switch(MSGpkt->hdr.event)

{

// Received when a key is pressed

case KEY_CHANGE:

SampleApp_HandleKeys(((keyChange_t *)MSGpkt)->state,((keyChange_t *)MSGpkt)->keys);

break;

// Received when a messages is received(OTA)for this endpoint

case AF_INCOMING_MSG_CMD:

SampleApp_MessageMSGCB(MSGpkt);

break;

// Received whenever the device changes state in the network

case ZDO_STATE_CHANGE:

SampleApp_NwkState =(devStates_t)(MSGpkt->hdr.status);

if((SampleApp_NwkState == DEV_ZB_COORD)

||(SampleApp_NwkState == DEV_ROUTER)

||(SampleApp_NwkState == DEV_END_DEVICE))

{

HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);#ifdef WXL_COORD

ugOled9616int();LcdPutString16_8(0, 0,(void*)“ COORD ”, 12 , 1);

//osal_start_timerEx(SampleApp_TaskID,//SAMPLEAPP_RUN__EVT,//SAMPLEAPP_RUN_TIMEOUT);//启动超时定时器

#endif

#ifdef WXL_RFD

memset(RfTx.TxBuf,'x',32);

RfTx.TXDATA.Head = '&';

RfTx.TXDATA.HeadCom[0] = 'J';

RfTx.TXDATA.HeadCom[1] = 'O';

RfTx.TXDATA.HeadCom[2] = 'N';

ieeeAddr = NLME_GetExtAddr();

memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);

SrcSaddr = NLME_GetShortAddr();

RfTx.TXDATA.Saddr[0] = SrcSaddr;RfTx.TXDATA.Saddr[1] = SrcSaddr>>8;

RfTx.TXDATA.DataBuf[0] = 'R';

RfTx.TXDATA.DataBuf[1] = 'F';

RfTx.TXDATA.DataBuf[2] = 'D';

NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]);temp1 = NLME_GetCoordShortAddr();RfTx.TXDATA.DataBuf[11] =(unsigned char)(temp1>>8);RfTx.TXDATA.DataBuf[12] =(unsigned char)(temp1);

RfTx.TXDATA.DataBuf[13] = SensorNum;

RfTx.TXDATA.LastByte = '*';

SendData(0x0000, RfTx.TxBuf, 32);//发送自己的节点信息到主机

if((SensorNum == 1)||(SensorNum == 2))//点阵屏或数码管屏

{

init_T3();//打开定时器3开始扫描

}

else if(SensorNum == 9)//振动传感器

{

IEN1 |= 0x20;//Port 0 interrupt enable

}

osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_1000MS_TIMEOUT);//每秒检测一次红外传感器 #endif

#ifdef WXL_ROUTER

memset(RfTx.TxBuf,'x',32);

RfTx.TXDATA.Head = '&';

RfTx.TXDATA.HeadCom[0] = 'J';

RfTx.TXDATA.HeadCom[1] = 'O';

RfTx.TXDATA.HeadCom[2] = 'N';

RfTx.TXDATA.Saddr[1] SrcSaddr>>8;

temp1 NLME_GetCoordShortAddr();RfTx.TXDATA.DataBuf[11](unsigned char)(temp1>>8);RfTx.TXDATA.DataBuf[12](unsigned char)(temp1);

RfTx.TXDATA.DataBuf[13] SensorNum;

RfTx.TXDATA.LastByte = '*';

息到主机

if((SensorNum == 2))//点阵屏或数码管屏

ieeeAddr = NLME_GetExtAddr();memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);SrcSaddr = NLME_GetShortAddr();RfTx.TXDATA.Saddr[0] = SrcSaddr;= RfTx.TXDATA.DataBuf[0] = 'R';RfTx.TXDATA.DataBuf[1] = 'O';RfTx.TXDATA.DataBuf[2] = 'U';NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]);= = = = SendData(0x0000, RfTx.TxBuf, 32);//发送自己的节点信== 1)||(SensorNum { init_T3();//打开定时器3开始扫描 } else if(SensorNum == 9)//振动传感器 { IEN1 |= 0x20;//Port 0 interrupt enable }

osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_1000MS_TIMEOUT);//每秒检测一次红外传感器

#endif

}

break;

case SPI_INCOMING_ZTOOL_PORT:

UartRxComCallBack();//串口收到一帖数据的处理

break;

default:

break;

}

// Release the memory

osal_msg_deallocate((uint8 *)MSGpkt);

// NextThis event is generated by a timer //(setup in SampleApp_Init()).if(events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT)//发送数据超时

{

if(SensorNum == 8)

{

if(InfraredInitFlag == 0)//人体红外传感器需要初始化20秒

{

if(++InfraredCount > 20)

{

InfraredInitFlag = 1;

}

}

else

{

if(P0_0 == 1)

{

if(InfraredState == 0)

{

InfraredState = 1;

RfTx.TXDATA.Head = '&';

RfTx.TXDATA.HeadCom[0] = 'A';

RfTx.TXDATA.HeadCom[1] = 'I';

RfTx.TXDATA.HeadCom[2] = 'N';

ieeeAddr = NLME_GetExtAddr();

memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);

temp1 = NLME_GetShortAddr();

RfTx.TXDATA.Saddr[0] = temp1;

RfTx.TXDATA.Saddr[1] = temp1>>8;

RfTx.TXDATA.LastByte = '*';

SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据

}

}

else

{

InfraredState = 0;

} if(DispState!= 0)//每一秒自动采集一次传感器

{

LCDUPDATA = 1;

}

}

}

else if(SensorNum == 9)//振动传感器

{

if(Shakeflag)

{

Shakeflag = 0;

P0IEN |= 0x01;//Port 0, inputs 0 interrupt enable.P0IFG &= 0xfe;//Clear any pending interrupts

RfTx.TXDATA.Head = '&';

RfTx.TXDATA.HeadCom[0] = 'A';

RfTx.TXDATA.HeadCom[1] = 'S';

RfTx.TXDATA.HeadCom[2] = 'H';

ieeeAddr = NLME_GetExtAddr();

memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);

temp1 = NLME_GetShortAddr();

RfTx.TXDATA.Saddr[0] = temp1;

RfTx.TXDATA.Saddr[1] = temp1>>8;

RfTx.TXDATA.LastByte = '*';

SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据

BEEPState2 = 2;} if(BEEPState2 == 1){

BEEPState2 = 2;

P1_4 = 1;} else if(BEEPState2 == 2){

BEEPState2 = 1;

P1_4 = 0;} } else if(SensorNum == 16)//霍尔传感器板 { if(P0_0 == 0){

if(HallState == 0)

{

HallState = 1;

RfTx.TXDATA.Head = '&';

RfTx.TXDATA.HeadCom[0] = 'A';

RfTx.TXDATA.HeadCom[1] = 'H';

RfTx.TXDATA.HeadCom[2] = 'A';

ieeeAddr = NLME_GetExtAddr();

memcpy(RfTx.TXDATA.Laddr,ieeeAddr,8);

temp1 = NLME_GetShortAddr();

RfTx.TXDATA.Saddr[0] = temp1;

RfTx.TXDATA.Saddr[1] = temp1>>8;

RfTx.TXDATA.LastByte = '*';

SendData(0x0000, RfTx.TxBuf, 32);//发送报警数据

}

}

else

{

HallState = 0;

}

}

else if(SensorNum == 4)

{

if(DispState!= 0)//每一秒自动采集一次传感器

{

LCDUPDATA = 1;

}

if(BEEPState1 == 1)

{

BEEPState1 = 2;

P1_6 = 1;

}

else if(BEEPState1 == 2)

{

BEEPState1 = 1;

P1_6 = 0;

}

}

else if((SensorNum == 3)||(SensorNum == 5)||(SensorNum == 7)||(SensorNum == 10)||(SensorNum == 11)||(SensorNum == 13))

{

if(DispState!= 0)//每一秒自动采集一次传感器

{

LCDUPDATA = 1;

}

}

LCDDispFun();

// Setup to send message again in normal period(+ a little jitter)

osal_start_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_1000MS_TIMEOUT);

return(events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);} // Discard unknown events return 0;} void SampleApp_HandleKeys(uint8 shift, uint8 keys){(void)shift;// Intentionally unreferenced parameter

if(keys & HAL_KEY_UP){

P1_1 =!P1_1;

if(++DispState >= 3)DispState = 0;

LCDUPDATA = 1;} if(keys & HAL_KEY_DOWN){

P1_1 =!P1_1;

if(--DispState >= 200)DispState = 2;

LCDUPDATA = 1;} }

/********************************************************************* * LOCAL FUNCTIONS */

/********************************************************************* * @fn SampleApp_MessageMSGCB * * @brief Data message processor callback.This function processes * any incoming data-probably from other devices.So, based * on cluster ID, perform the intended action.* * @param none * * @return none */ void SampleApp_MessageMSGCB(afIncomingMSGPacket_t *pkt){ #ifdef WXL_COORD uint8 i;

memcpy(RfRx.RxBuf,pkt->cmd.Data,32);//读出无线按收到的数据

osal_stop_timerEx(SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT);//停止超时计数器

if((RfRx.RXDATA.Head == '&')&&(RfRx.RXDATA.LastByte == '*')){

memcpy(UartTxBuf.TxBuf,RfRx.RxBuf,32);

for(i=0;i<8;i++)

{

UartTxBuf.TXDATA.Laddr[i] = RfRx.RXDATA.Laddr[i];//长地址

}

for(i=0;i<2;i++)

{

UartTxBuf.TXDATA.Saddr[i] = RfRx.RXDATA.Saddr[1-i];//短地址

}

UartTxBuf.TXDATA.CRC = CheckUartData(&UartTxBuf.TxBuf[1],29);

HalUARTWrite(HAL_UART_PORT_0, UartTxBuf.TxBuf, 32);//从串口输出

} #endif

#if(defined(WXL_ROUTER)|| defined(WXL_RFD))//ROUTER OR RFD uint8 temp;uint16 temp1,temp2;uint8 RfHaveTxDara = 0;//无线有数据需要发送

ieeeAddr = NLME_GetExtAddr();memcpy(RfRx.RxBuf,pkt->cmd.Data,32);memset(RfTx.TxBuf,'x',32);switch(RfRx.RXDATA.HeadCom[0]){

case 'R'://读

if((RfRx.RXDATA.HeadCom[1] == 'A')&&(RfRx.RXDATA.HeadCom[2] 'S'))//读传感器

{

if(SensorNum == 4)//高精温湿度传感器

{

==

memcpy(RfTx.TxBuf, RfRx.RxBuf, 16);

if((RfRx.RXDATA.DataBuf[0] == 'G')&&(RfRx.RXDATA.DataBuf[1] == 'M'))//读光敏

{

temp = ReadSensorAdc(1);//显示值转换

RfTx.TXDATA.DataBuf[2] = temp/100 + 0x30;

temp = temp%100;

RfTx.TXDATA.DataBuf[3] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[4] = temp%10 + 0x30;

RfHaveTxDara = 1;;

}

else if((RfRx.RXDATA.DataBuf[0] == 'W')&&(RfRx.RXDATA.DataBuf[1] == 'D'))//读温度

{ //WriteTc77(1);//唤醒温度传感器

//Sensor_Delay(10000);//必须延时后才能读

temp = ReadTc77();//读取温度

//WriteTc77(0);//温度传感器休眠

//显示值转换

RfTx.TXDATA.DataBuf[2] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[3] = temp%10 + 0x30;

RfHaveTxDara = 1;

}

}

}

else if((RfRx.RXDATA.HeadCom[1] == 'S')&&(RfRx.RXDATA.HeadCom[2] == 'H'))//读取高精温湿度传感器

{ // 读取的温湿度为16位浮点数,在上位机上转换。if(SensorNum == 3)//高精温湿度传感器 { memcpy(RfTx.TxBuf, RfRx.RxBuf, 16);SHT1X_INT();if((RfRx.RXDATA.DataBuf[0] == 'W')&&(RfRx.RXDATA.DataBuf[1] == 'D'))

{

temp1 = Read_SHT1X(3);

RfTx.TXDATA.DataBuf[2] =(uint8)(temp1>>8);

RfTx.TXDATA.DataBuf[3] =(uint8)(temp1&0xff);

RfHaveTxDara = 1;

}

else if((RfRx.RXDATA.DataBuf[0] == 'S')&&(RfRx.RXDATA.DataBuf[1] == 'D'))

{

temp1 = Read_SHT1X(5);

RfTx.TXDATA.DataBuf[2] =(uint8)(temp1>>8);

RfTx.TXDATA.DataBuf[3] =(uint8)(temp1&0xff);

RfHaveTxDara = 1;

}

}

}

else if((RfRx.RXDATA.HeadCom[1] == 'P')&&(RfRx.RXDATA.HeadCom[2] == 'R'))//压力传感器

{ if(SensorNum == 5)//压力传感器板 {

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

temp = ReadSensorAdc(0);

RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;

temp = temp%100;

RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;

RfHaveTxDara = 1;} }

else if((RfRx.RXDATA.HeadCom[1] == 'R')&&(RfRx.RXDATA.HeadCom[2] == 'A'))//雨滴传感器

{ if(SensorNum == 7)//雨滴传感器板 {

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

temp = ReadSensorAdc(0);

RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;

temp = temp%100;

RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;

RfHaveTxDara = 1;} } else if((RfRx.RXDATA.HeadCom[1] == 'A')&&(RfRx.RXDATA.HeadCom[2] == 'D'))//控制加速度传感器

{

if(SensorNum == 10)//加速度传感器板 { //P1_4 = 1;if(RfRx.RXDATA.DataBuf[0] == 'X')

{

temp = ReadSensorAdc(XOUT);

}

else if(RfRx.RXDATA.DataBuf[0] == 'Y')

{

temp = ReadSensorAdc(YOUT);

} else if(RfRx.RXDATA.DataBuf[0] == 'Z')

{

temp = ReadSensorAdc(ZOUT);

}

//P1_4 = 0;

memcpy(RfTx.TxBuf, RfRx.RxBuf, 15);RfTx.TXDATA.DataBuf[1] = temp/100 + 0x30;

temp = temp%100;

RfTx.TXDATA.DataBuf[2] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[3] = temp%10 + 0x30;

RfHaveTxDara = 1;

}

}//end

else if((RfRx.RXDATA.HeadCom[1] == 'G')&&(RfRx.RXDATA.HeadCom[2] == 'A'))//可燃气体传感器 { if(SensorNum == 11)//可燃气体传感器板 {

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

temp = ReadSensorAdc(0);

RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;

temp = temp%100;

RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;

RfHaveTxDara = 1;} } else if((RfRx.RXDATA.HeadCom[1] == 'U')&&(RfRx.RXDATA.HeadCom[2] == 'L'))//超声波传感器 { if(SensorNum == 14)//超声波传感器板 {

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

P1_4 = 1;

WaitUs(20);

P1_4 = 0;

Ultrasonic_Count = 0;

while(!P0_0)//等待返回高电平 {

WaitUs(20);

if((++Ultrasonic_Count)>= 1000)//超时自动退出

{

break;

} }

Ultrasonic_Count = 0;while(P0_0)

{

WaitUs(20);

Ultrasonic_Count++;

if(Ultrasonic_Count >= 600)//超时退出

{

Ultrasonic_Count = 0;

break;

}

}

temp1 = Ultrasonic_Count;

if((temp1 > 1)&&(temp1 <550)){

RfTx.TXDATA.DataBuf[0] = temp1/100 + 0x30;

temp = temp1%100;

RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;

RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;

}

else

{

RfTx.TXDATA.DataBuf[0] = 'E';

RfTx.TXDATA.DataBuf[1] = '0';

}

RfHaveTxDara = 1;} }

else if((RfRx.RXDATA.HeadCom[1] == 'N')&&(RfRx.RXDATA.HeadCom[2] == 'S'))//读模块连接状态

{

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

temp = pkt->LinkQuality;

RfTx.TXDATA.DataBuf[0] = temp/100 + 0x30;temp %= 100;RfTx.TXDATA.DataBuf[1] = temp/10 + 0x30;RfTx.TXDATA.DataBuf[2] = temp%10 + 0x30;NLME_GetCoordExtAddr(&RfTx.TXDATA.DataBuf[3]);temp1 = NLME_GetCoordShortAddr();RfTx.TXDATA.DataBuf[11] =(INT8U)(temp1>>8);RfTx.TXDATA.DataBuf[12] =(INT8U)(temp1);

RfHaveTxDara = 1;

}//end 读模块连接状态 break;

case 'T'://测试

if((RfRx.RXDATA.HeadCom[1] == 'L')&&(RfRx.RXDATA.HeadCom[2] == 'D'))//LED测试

{

if(RfRx.RXDATA.DataBuf[0] == 'C')

{

if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '1'))

{

if(RfRx.RXDATA.DataBuf[3] == '1')

{

HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);//开

}

else if(RfRx.RXDATA.DataBuf[3] == '0')

{

HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF);//关

}

}

else if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '2'))

{

if(RfRx.RXDATA.DataBuf[3] == '1')

{

HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);//开

}

else if(RfRx.RXDATA.DataBuf[3] == '0')

{

HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);//关

}

}

} else if(RfRx.RXDATA.DataBuf[0] == 'T'){ if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '1'))//控制LED1

{

if(RfRx.RXDATA.DataBuf[3] == '1')

{ HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);

}

else if(RfRx.RXDATA.DataBuf[3] == '0')

{ HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF);

}

}

else if((RfRx.RXDATA.DataBuf[1] == 'D')&&(RfRx.RXDATA.DataBuf[2] == '2'))//控制LED2

{ if(RfRx.RXDATA.DataBuf[3] == '1')

{ HalLedSet(HAL_LED_2, HAL_LED_MODE_FLASH);

}

else if(RfRx.RXDATA.DataBuf[3] == '0')

{ HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);

}

}

}

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

RfHaveTxDara = 1;

}//end LED测试

else if((RfRx.RXDATA.HeadCom[1] == 'D')&&(RfRx.RXDATA.HeadCom[2] == 'A'))//

{

if(SensorNum == 12)//DAC输出 { temp1 = RfRx.RXDATA.DataBuf[0];temp1 <<= 8;temp1 += RfRx.RXDATA.DataBuf[1];

temp2 = RfRx.RXDATA.DataBuf[2];temp2 <<= 8;temp2 += RfRx.RXDATA.DataBuf[3];

DAC_OUT_CON(temp1, temp2);

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

RfHaveTxDara = 1;}

}//end DAC_OUT测试

else if((RfRx.RXDATA.HeadCom[1] == 'M')&&(RfRx.RXDATA.HeadCom[2] == 'O'))//

{

if(SensorNum == 15)//电机测试 {

if((RfRx.RXDATA.DataBuf[0] == 'M')&&(RfRx.RXDATA.DataBuf[1] == '1'))

{

if(RfRx.RXDATA.DataBuf[2] == '0')//停止

{

MOTOR_Con(1, 0x8F);

}

else if(RfRx.RXDATA.DataBuf[2] == '1')//正转

{

MOTOR_Con(1, 0x80);

}

else if(RfRx.RXDATA.DataBuf[2] == '2')//反转

{

MOTOR_Con(1, 0x88);

}

}

else if((RfRx.RXDATA.DataBuf[0] == 'M')&&(RfRx.RXDATA.DataBuf[1] == '2'))

{

if(RfRx.RXDATA.DataBuf[2] == '0')//停止

{

MOTOR_Con(2, 0x8F);

}

else if(RfRx.RXDATA.DataBuf[2] == '1')//正转

{

MOTOR_Con(2, 0x80);

}

else if(RfRx.RXDATA.DataBuf[2] == '2')//反转

{

MOTOR_Con(2, 0x88);

}

}

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

RfHaveTxDara = 1;

}

}//end MOTOR电机测试

else if((RfRx.RXDATA.HeadCom[1] == 'E')&&(RfRx.RXDATA.HeadCom[2] == 'D'))//点阵屏测试

{

if(SensorNum == 1)//点阵屏板 {

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

if((RfRx.RXDATA.DataBuf[0] >= '0')&&(RfRx.RXDATA.DataBuf[0] <= '9')){

LCDUPDATA = 1;

DispNum = RfRx.RXDATA.DataBuf[0]-0x30;

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';} else {

RfTx.TXDATA.DataBuf[0] = 'E';

RfTx.TXDATA.DataBuf[1] = '0';

} RfHaveTxDara = 1;} } else if((RfRx.RXDATA.HeadCom[1](RfRx.RXDATA.HeadCom[2] == 'U'))//数码管屏测试

{

if(SensorNum == 2)//数码管屏板 {

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

temp1 = RfRx.RXDATA.DataBuf[0];

temp1 <<= 8;

temp1 += RfRx.RXDATA.DataBuf[1];

if(temp1 <= 9999)

{

LEDDispNum = temp1;

LEDDISPFUN();//显示数据

LCDUPDATA = 1;

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

}

else

{

RfTx.TXDATA.DataBuf[0] = 'E';

RfTx.TXDATA.DataBuf[1] = '0';

} RfHaveTxDara = 1;}

== 'N')&& }

else if((RfRx.RXDATA.HeadCom[1] == 'B')&&(RfRx.RXDATA.HeadCom[2] == 'L'))//测试电池电压

{

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

temp = ReadSensorAdc(4);

RfTx.TXDATA.DataBuf[0] = temp;

RfHaveTxDara = 1;

} else if((RfRx.RXDATA.HeadCom[1] == 'B')(RfRx.RXDATA.HeadCom[2] == 'E'))//测试蜂鸣器

{

if((SensorNum == 4)||(SensorNum == 9))

{

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

if(RfRx.RXDATA.DataBuf[0] == '1'){

if(SensorNum == 4)

{

BEEPState1 = 2;

}

else

{

BEEPState2 = 2;

} }

else if(RfRx.RXDATA.DataBuf[0] == '0'){

if(SensorNum == 4)

{

BEEPState1 = 0;

P1_6 = 1;

}

else

{

BEEPState2 = 0;

P1_4 = 1;

} }

&&

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

RfHaveTxDara = 1;

}

} else if((RfRx.RXDATA.HeadCom[1] == 'R')&&(RfRx.RXDATA.HeadCom[2] == 'E'))//控制继电器

{

if(SensorNum == 6)//继电器板

{

if((RfRx.RXDATA.DataBuf[0] == 'K')&&(RfRx.RXDATA.DataBuf[1] == '1'))

{

if(RfRx.RXDATA.DataBuf[2] == '1')

{

Relay1State = 1;

P1_4 = 1;

}

else if(RfRx.RXDATA.DataBuf[2] == '0')

{

Relay1State = 0;

P1_4 = 0;

}

}

else if((RfRx.RXDATA.DataBuf[0] == 'K')&&(RfRx.RXDATA.DataBuf[1] == '2'))

{

if(RfRx.RXDATA.DataBuf[2] == '1')

{

Relay2State = 1;

P1_5 = 1;

}

else if(RfRx.RXDATA.DataBuf[2] == '0')

{

Relay2State = 0;

P1_5 = 0;

}

}

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

RfHaveTxDara = 1;

}

}//end 控制继电器

else if((RfRx.RXDATA.HeadCom[1] == 'L')&&(RfRx.RXDATA.HeadCom[2] == 'L'))//控制高亮LED

{

if(SensorNum == 17)//高亮LED板

{

memcpy(RfTx.TxBuf, RfRx.RxBuf, 14);

ChangT3Cmp0Val(RfRx.RXDATA.DataBuf[0]);

RfTx.TXDATA.DataBuf[0] = 'O';

RfTx.TXDATA.DataBuf[1] = 'K';

RfHaveTxDara = 1;

}

}//end 控制高亮LED

break;

}//end if(RfHaveTxDara)//如果有数据要发送

{

RfTx.TXDATA.Head = '&';

RfTx.TXDATA.LastByte = '*';

SendData(0x0000, RfTx.TxBuf, 32);//发送数据

RfHaveTxDara = 0;} #endif } 4.实验总结

主要是通过组网来使协调器与终端器进行数据的交流与反馈,当LED灯显示时,LED显示屏也会显示相应状态,进行信息反馈。

第四篇:无线传感网络研究应用

无线传感网络研究应用

应用前景

无线传感网络是面向应用的,贴近客观物理世界的网络系统,其产生和发展一直都与应用相联系。多年来经过不同领域研究人员的演绎,无线传感网络技术在军事领域、精细农业、安全监控、环保监测、建筑领域、医疗监护、工业监控、智能交通、物流管理、自由空间探索、智能家居等领域的应用得到了充分的肯定和展示。

在环境监控和精细农业方面,WSN系统最为广泛。2002年,英特尔公司率先在俄勒冈建立了世界上第一个无线葡萄园,这是一个典型的精准农业、智能耕种的实例。杭州齐格科技有限公司与浙江农科院合作研发了远程农作管理决策服务平台,该平台利用了无线传感器技术实现对农田温室大棚温度、湿度、露点、光照等环境信息的监测。

在民用安全监控方面,英国的一家博物馆利用无线传感器网络设计了一个报警系统,他们将节点放在珍贵文物或艺术品的底部或背面,通过侦测灯光的亮度改变和振动情况,来判断展览品的安全状态。中科院计算所在故宫博物院实施的文物安全监控系统也是WSN技术在民用安防领域中的典型应用。

现代建筑的发展不仅要求为人们提供更加舒适、安全的房屋和桥梁,而且希望建筑本身能够对自身的健康状况进行评估。WSN技术在建筑结构健康监控方面将发挥重要作用。2004年,哈工大在深圳地王大厦实施部署了监测环境噪声和震动加速度响应测试的WSN网络系统。

在医疗监控方面,美国英特尔公司目前正在研制家庭护理的无线传感器网络系统,作为美国“应对老龄化社会技术项目”的一项重要内容。另外,在对特殊医院(精神类或残障类)中病人的位置监控方面,WSN也有巨大应用潜力。

在工业监控方面,美国英特尔公司为俄勒冈的一家芯片制造厂安装了200台无线传感器,用来监控部分工厂设备的振动情况,并在测量结果超出规定时提供监测报告。西安成峰公司与陕西天和集团合作开发了矿井环境监测系统和矿工井下区段定位系统。

在智能交通方面,美国交通部提出了“国家智能交通系统项目规划”,预计到2025年全面投入使用。该系统综合运用大量传感器网络,配合GPS系统、区域网络系统等资源,实现对交通车辆的优化调度,并为个体交通推荐实时的、最佳的行车路线服务。目前在美国的宾夕法尼亚州的匹兹堡市已经建有这样的智能交通信息系统。

无线传感网络应用前景广阔,特别是我国西部地区的一些山区,需要对山地滑坡、泥石流、大桥位移、景区环境监测,但是无线传感器网络的生存时间却要求长达数月甚至数年,因此,如何在不影响功能的前提下,尽可能节约无线传感器网络的电池能量成为无线传感器网络软硬件设计中的核心问题,也是当前国内外研究机构关注的焦点。本文研究基于分布式压缩感知算法的无线传感网络节能模型研究,用以降低无线传感网络的耗电量,具有极高的应用价值。

第五篇:无线传感器网络典型路由协议分类比较

无线传感器网络典型路由协议分类比较

常清

摘 要:无线传感器网络是继因特网之后对人类生活产生重大影响的技术,它在逻辑上将虚

幻的信息和真实的物理世界联系起来。无线传感器网络是由大量无处不在的、具有通信与计 算能力的微小传感器节点密集地布设在无人值守的监控区域而构成的能够根据环境自主完 成指定任务的智能自治测控网络系统。它能为人类生活带来不可估量的好处,所以,传感器 网络的路由协议的设计也是对人类的一项挑战,需要利用节点有限的能量更好的为人类服 务。目前已有多种路由协议,但其分类方式不是很清晰,本文以节点的传播方式为出发点,对几种典型的路由协议给予重新分类,并对其进行分析,最后选出相对好的类别。

1.引言

随着微电子技术、计算技术和无线通信技术的进步,多功能传感器快速发展,进而使无 线传感器网络(wireless sensor network, WSN)成为目前研究热点。WSN 是由部署在检测区域内的大量廉价微型传感器节点组成,形成一个多跳的自组织网络系统,使其在小体积内集成信息采集、数据处理和无线通信等功能,其目的是协作地感知、采集和处理网络覆盖区域中感知对象的信息,并提供给终端用户。WSN 能够广泛应用于军事、环境检测和预报、健康护理、智能家居、建筑物状态监控、复杂机械监控、城市交通、空间探索、大型车间和仓库管理、以及机场、大型工业园区的安全检测和其他商业等领域,且将逐渐深入到人类生活的各个领域。本文首先简要说明衡量路由协议的四个标准,然后就WSN 中路由协议的几种路由协议提出新的分类方法并利用标准加以比较。

2.路由协议的衡量标准

无线传感器网络的路由协议不同于传统网络的协议,它具有能量优先、基于局部的拓扑 信息、以数据为中心和应用相关四个特点,因而,根据具体的应用设计路由机制时,从四个 方面衡量路由协议的优劣【1】:(1)能量高效

传统路由协议在选择最优路径时,很少考虑节点的能量问题。由于无线传感器网络 中节点的能量有限,传感器网络路由协议不仅要选择能量消耗小的消息传输路径,更要 能量均衡消耗,实现简单而且高效的传输,尽可能地延长整个网络的生存期。(2)可扩展性

无线传感器网络的应用决定了它的网络规模不是一成不变的,而且很容易造成拓扑 结构动态发生变化,因而要求路由协议有可扩展性,能够适应结构的变化。具体体现在 传感器的数量、网络覆盖区域、网络生命周期、网络时间延迟和网络感知精度等方面。(3)鲁棒性

无线传感器网络中,由于环境和节点的能量耗尽造成传感器的失效、通信质量的降 低使网络变得不可靠,所以在路由协议的设计过程中必须考虑软硬件的高容错性,保障 网络的健壮性。

4)快速收敛性

由于网络拓扑结构的动态变化,要求路由协议能够快速收敛,以适应拓扑的动态变 化,提高带宽和节点能量等有限资源的利用率和消息传输效率。

3.路由协议的分类

针对不同传感器网络的应用,研究人员提出了不同的路由协议,目前已有的分类方式主 要有两种:按网络结构可以分为平面路由协议、分级网络路由协议和基于位置路由协议;按 协议的应用特征可以分为基于多径路由协议、基于可靠路由协议、基于协商路由协议、基于 查询路由协议、基于位置路由协议和基于QoS 路由协议。但这种分类方式太过分散,没有 整体概念,本文就各个协议的不同侧重点提出一种新的分类方法,把现有的代表性路由协议 按节点的传播方式划分为广播式路由协议、坐标式路由协议和分簇式路由协议。下面进行详 细的介绍和分析。

4.广播式路由协议

4.1 扩散法(Flooding)

扩散法是一种传统的网络通信路由协议。它实现简单,不需要为保持网络拓扑信息和实 现复杂的路由算法消耗计算资源,适用于健壮性要求高的场合。但是,扩散发存在信息爆炸 问题,即能出现一个节点可能得到数据多个副本的情况,而且也会出现部分重叠的现象,此 外,扩散法没有考虑各节点的能量,无法作出相应的自适应路由选择,当一个节点能量耗尽,网络就死去。

具体实现:节点 A 希望发送数据给节点B,节点A 首先通过网络将数据的副本传给其 每一个邻居节点,每一个邻居节点又将其传给除A 外的其他的邻居节点,直到将数据传到B 为止或者为该数据设定的生命期限变为零为止或者所有节点拥有此副本为止。

4.2 定向路由扩散DD(Directed Diffusion)

C.Intanagonwiwat【2】等人为传感器网络提出一种新的数据采集模型,即定向路由扩散。它通过泛洪方式广播兴趣消息给所有的传感器节点,随着兴趣消息在整个网络中传播,协议 逐跳地在每个传感器节点上建立反向的从数据源节点到基站或者汇聚节点的传输梯度。该协 议通过将来自不同源节点的数据聚集再重新路由达到消除冗余和最大程度降低数据传输量 的目的,因而可以节约网络能量、延长系统生存期。然而,路径建立时的兴趣消息扩散要执 行一个泛洪广播操作,时间和能量开销大。

具体实现:首先是兴趣消息扩散,每个节点都在本地保存一个兴趣列表,其中专门存在 一个表项用来记录发送该兴趣消息的邻居节点、数据发送速率和时间戳等相关信息,之后建 立传输梯度。数据沿着建立好的梯度路径传输。

4.3 谣传路由(Rumor Routing)

D.Braginsky【3】等人提出的适用于数据传输量较小的无线传感器网络高效路由协议。其 基本思想是时间监测区域的感应节点产生代理消息,代理消息沿着随机路径向邻居节点扩散 传播。同时,基站或汇聚节点发送的查询消息也沿着随机路径在网络中传播。当查询消息和 代理消息的传播路径交叉在一起时就会形成一条基站或汇聚节点到时间监测区域的完整路 径。

具体实现:每个传感器节点维护一个邻居列表和一个事件列表,当传感器节点监测到一 个事件发生时,在事件列表中增加一个表项并根据概率产生一个代理消息,代理消息是一个 包含事件相关信息的分组,将事件传给经过的节点,收到代理消息的节点检查表项进行更新 和增加表项的操作。节点根据事件列表到达事件区域的路径,或者节点随机选择邻居转发查 询消息。

4.4 SPIN(Sensor Protocols for Information via Negotiation)

W.Heinzelman【4】等人提出的一种自适应的SPIN 路由协议。该协议假定网络中所有节 点都是Sink 节点,每一个节点都有用户需要的信息,而且相邻的节点拥有类似的数据,所 以只要发送其他节点没有的数据。SPIN 协议通过协商完成资源自适应算法,即在发送真正 数据之前,通过协商压缩重复的信息,避免了冗余数据的发送;此外,SPIN 协议有权访问

每个节点的当前能量水平,根据节点剩余能量水平调整协议,所以可以在一定程度上延长网 络的生存期。

具体实现:SPIN 采用了3 种数据包来通信:ADV 用于新数据的广播,当节点有数据 要发送时,利用该数据包向外广播;REQ 用于请求发送数据,当节点希望接收数据时,发 送该报文;DATA 包含带有Meta-data 头部数据的数据报文;

当一个传感器节点在发送一个 DATA 数据包之前,首先向其邻居节点广播式地发送ADV 数据包,如果一个邻居希望接收该DATA 数据包,则像该节点发送REQ 数据包,接着节点向其邻居节点发送DATA 数据包。

4.5 GEAR(Geographical and Energy Aware Routing)

Y.Yu 等人提出了GEAR 路由协议,即根据时间区域的地址位置,建立基站或者汇聚节 点到时间区域的优化路径。把GEAR 划分为广播式路由协议有点牵强,但是由于它是在利 用地理信息的基础上将数据发送到合适区域,而且又是基于DD 提出,这里仍然作为广播式 的一种。具体实现:首先向目标区域传递数据包,当节点收到数据包时,先检查是否有邻居比它更接近目标区域。如有就选择离目标区域最近的节点作数据传递的下一跳节点。如果数据包已经到达目标区域,利用递归的地理传递方式【3】和受限的扩散方式发布该数据。

5.坐标式路由协议

5.1 GEM(Graph Embedding)

J.Newsome 和D.Song 提出了建立一个虚拟极坐标系统(VPCS, Virtual Polar 的

Coordinate System)GEM 路由协议,用来代表实际的网络拓扑结构。整个网络节点形成一 个以基站或汇聚节点为根的带环树(Ringed Tree)。每个节点用距离树根的跳数距离和角度 范围两个参数表示。

具体实现:首先建立虚拟极坐标系统,主要有三个阶段:由跳数建立路由并扩展到整个 网络形成生成树型结构,再从叶节点开始反馈子树的大小,即树中包含的节点数目,最后确 定每个子节点的虚拟角度范围。建立好系统之后,利用虚拟极坐标算法发送消息,即节点收 到消息检查是否在自己的角度范围内,不在就向父节点传递,直到消息到达包含目的位置角 度的节点。另外,当实际网络拓扑结构发生变化时,需要及时更新,比如节点加入和节点失效

5.2 GRWLI(Geographic Routing Without Location Information)

A.Rao【3】等人提出了建立全局坐标系的路由协议,其前提是需要少数节点精确位置信 息。首先确定节点在坐标系中的位置,根据位置进行数据路由。关键是利用某些知道自己位 置信息的信标节点确定全局坐标系及其他节点在坐标系中的位置。

具体实现:A.Rao 等人提出了3 中策略确定信标节点。一是确定边界节点都为信标节 点,则非边界节点通过边界节点确定自己的位置信息。在平面情况下,节点通过邻居节点位 置的平均值计算。二是使用两个信标节点,则边界节点只知道自己处于网络边界不知道自己 的精确位置消息。引入两个信标节点,并通过边界节点交换信息建立全局坐标系。三是使用 一个信标节点,到信标节点最大的节点标记自己为边界节点。

6.分簇式路由协议

6.1 LEACH(Low Energy Adaptive Clustering Hierarchy)

MIT 的Chandrakasan【5】等人为无线传感器设计的一种分簇路由算法,其基本思想是以 循环的方式随机选择簇首节点,平均分配整个网络的能量到每个传感器节点,从而可以降低 网络能源消耗,延长网络生存时间。簇首的产生是簇形成的基础,簇首的选取一般基于节点 的剩余能量、簇首到基站或汇聚节点的距离、簇首的位置和簇内的通信代价。簇首的产生算

法可以被分为分布式和集中式两种【6】,这里不予介绍。

具体实现:LEACH 不断地循环执行簇的重构过程,可以分为两个阶段:一是簇的建立,即包括簇首节点的选择、簇首节点的广播、簇首节点的建立和调度机制的生成。二是传输数 据的稳定阶段。每个节点随机选一个值,小于某阈值的节点就成为簇首节点,之后广播告知 整个网络,完成簇的建立。在稳定阶段中,节点将采集的数据送到簇首节点,簇首节点将信 息融合后送给汇聚点。一段时间后,重新建立簇,不断循环。

6.2 GAF(Geographic Adaptive Fidelity)

Y.Xu【3】等人提出的一种利用分簇进行通信的路由算法。它最初是为移动Ad Hoc 网络 应用设计的,也可以适用于无线传感器网络。其基本思想是网络区被分成固定区域,形成虚 拟网格,每个网格里选出一个簇首节点在某段时间内保持清醒,其他节点都进入睡眠状态,但是簇首节点并不做任何数据汇聚或融合工作。GAF 算法即关掉网络中不必要的节点节省 能量,同样可以达到延长网络生存期的目的。

具体实现:当划分好固定的虚拟网格之后,网络中每个节点利用 GPS 接受卡指示的位 置信息将节点本身与虚拟网格中某个点关联映射起来。网格上同一个点关联的节点对分组路 由的代价是等价的,因而可以使某个特定网格区域的一些节点睡眠,且随着网络节点数目的 增加可以极大地提高网络的寿命,在可扩展性上有很好的表现。

7.比较与分析

经过上面的简单介绍,每个协议在其设计的时候都有各自的侧重点和最优的方面,按照 衡量标准可以把以上协议做简略的比较并找出相对较好的一类协议。其中,如何提供有效的 节能,即能量有效性是无线传感器网络路由协议最首要注重的方面,可扩展性和鲁棒性是路 由协议应该满足的基本要求,而快速收敛性和网络存在的时间有紧密的联系。依据上述四个 标准,对本文所列举的路由协议的比较见表1。

由上表可见,广播式总是存在一种矛盾,当具有好的扩展性时势必以差的鲁棒性和能量 高效为代价,即以牺牲鲁棒性换取扩展性和高能量,这同时也严重影响了节点的快速收敛性。而坐标式弥补了广播式的不足,可以同时达到四个衡量标准。分簇式相对于前两种方式来说,具备了较好的性能,可以满足人们对传感器网络的一般要求。所以,以能量高效、可扩展性、鲁棒性和快速收敛性四个基本标准来衡量路由协议,分簇式是最佳的选择。

8.总结

本文首先确定了四个衡量路由协议的标准,并按一种新的方法把现有一些协议分成三 类,之后进行比较,最后得出分簇式是相对来讲最优的路由协议类。但是,分簇式只是相对 较好的协议类别,由于分簇式总是依附簇首节点的能量,即使簇首在不断的更替选出,仍有 最后某个簇首节点能量耗尽的情况,因此势必影响整体网络的生存时间。再者,由于衡量标 准的局限性,本文未能考虑安全性等方面的要求,因此得出的结论仅仅是一定的范围内比较 结果。由此,一种尽可能考虑多方面要求的路由协议仍是被期望的。参考文献

[1] 孙利民,李建中,陈渝,朱红松著.无线传感器网络[M].北京:清华大学出版社,2006.[2] 周东清,葛午未,朱娜.基于QoS 的无线传感器网络路由[J].计算机工程与应用.2007,43(23):157-160.[3] 宋文,王兵,周应宾等著.无线传感器网络技术与应用[M].北京:电子工业出版社,2007.[4] 范武,李力.无线传感器网络SPIN 路由协议改进的方法[J].计算机与现代化.2007,139:93-96.[5] 于海斌,曾鹏等著.智能无线传感器网络系统[M].北京:科学出版社,2006.[6] 沈波,张世永,钟亦平.无线传感器网络分簇路由协议[D].上海:复旦大学,2006.

下载矿井无线传感网络基于LEACH路由协议的改进方案word格式文档
下载矿井无线传感网络基于LEACH路由协议的改进方案.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    无线传感器网络GEAR协议的一种改进方案

    [摘要]:无线传感器网络(WSNs)被认为是未来改变世界的十大技术之首,但有限的计算、存储和通信能力,尤其是严重受限的能量使其应用前景面临巨大挑战,WSNs在应用之前需要解决许多关键......

    无线传感网络课程作业(精选5篇)

    物联网之未来的智能家居系统 ——House Stage 不知不觉中时光在悄悄的流逝,转眼之间,我选择这个专业已经两年了。从一开始的不知物联网为何物的懵懂少年,成长为了一名热爱物联......

    基于无线传感网络的道路照明系统

    基于无线传感网络的道路照明系统 杨兵 (徐州建筑职业技术学院,江苏 徐州 221116) 摘 要 :为了实现道路科学照明、绿色照明的关键问题是能够测量和控制到每一盏路灯,无线传感网络......

    WLAN网络 H3C无线工程实施部署方案

    工程部署作为WLAN项目中的关键环节,是对前期勘测、方案设计的阶段性工作检验,工程部署质量好坏将直接影响用户的使用效果和体验!随着网络应用方案的日趋丰富、覆盖范围的扩大,......

    SET协议系统缺陷及其改进方案

    SET协议系统缺陷及其改进方案 摘要:文章对近年来流行的安全电子交易协议SET标准进行研究,指出该协议不能满足商品交易原子性和确认发送原子性。该文在原有协议的基础上对其进......

    IMS网络应用SIP协议的时延改进策略探析(范文)

    论文关键词:3G;IP多媒体子系统;会话初始协议;时延;OPNET 论文摘要:介绍了IMS网络系统与SIP协议在IMS网络中的应用,在设定的网络仿真环境前提下,设计并且建立了IMS网络会话的仿真模......

    网站托管服务协议方案合同样本-26克网络

    26克网络-网站托管协议书 网站托管协议书(2013年范本) 甲方: 乙方:26克网络 就乙方向甲方提供网站托管维护事宜,经双方友好协商,达成如下协议。一、服务范围及费用: 1、域名维护......