第一篇:基于云系统的无线接入网络
基于云系统的无线接入网络
【摘要】:云计算作为一种新兴的信息技术模型,已经在IT界引来了越来越多的关注。伴随手机的普及,手机用户对手机功能需求的增加,现有的手机功能已无法满足用户的要求。将云计算思想应用于在手机通信中,就可以很好地满足用户日益增长的需求,云计算在手机通信中有着良好的优势,将云计算应用在手机通信中会是一个理想的选择。本文主要介绍了基于云计算模型构架设计的移动通信服务云系统构架方案,结合当今3G移动通信网络和无线通信的主流技术WIFI进行研究,阐述了该项技术在5G系统中的适用环境,应用价值,国内外研究现状。
【关键词】:3G,5G,云计算,无线接入
导言
云计算已成为 IT 业界公认的核心科技和发展方向。
Gartner将云计算列为 2011 年 10 大战略科技之首,认为云计算将在 2?5 年内成为市场主流。而美国 IDG 也预测,到 2013 年,云计算将发展成为一个 440 亿美元的全球大市场,中国云计算产业链规模可达 750 亿元;而作为云计算与移动互联网的有效结合,移动云计算产业也将达到千亿级规模。
巨头逐鹿移动云
“云的魔力将改写移动互联网,移动互联网真正腾飞将更多地基于云的应用,当终端、应用、平台、技术及网络速度提升之后,将有更多具有魔力的应用和内容出现,世界 IT 产业格局将彻底改变,迎来‘移动云计算’新盛宴。”在 2011 全球移动互联网大会上,谷歌全球副总裁刘允非常看好移动云计算。正如刘允所言,包括微软、谷歌及中国移动等在内的业界巨头正纷纷转向云计算,而云计算和移动互联网结合也是被几乎所有人看好的“未来方向”。月 6 日,苹果全球开发者大会上,苹果 CEO 乔布斯把苹果带到了“云端”,发布了手机在线云存储服务“iCloud”,该解决方案可让 iPhone 或 iPad 如 PC 一样轻松处理电子邮件、记事本项目、相片等,用户所做的一切都会自动更新至 iPad、iPhone 等苹果终端设备。作为云计算的先行者,谷歌在 2010 年底推出了包括整合移动搜索、语音搜索、定点搜索及手机地图、Android 上的谷歌街景等基于移动终端和云计算的新应用。微软也推出了“LiveMesh”,将智能手机、Xbox、PC,甚至使用 Mac 系统的苹果电脑等终端整合在一起,通过互联网进行相互连接,让用户的不同设备和网络内容同步,并将数据存储在“云”中。而全新的 Windows Phone 操作系统也是主打云概念。此外,RIM 公司面向众多商业用户提供的黑莓企业应用服务器方案,也是具有云计算特征的移动互联网应用。该方案将企业应用、无线网络和移动终端连接在一起,让用户通过黑莓终端远程接入服务器访问自己的邮件账户,在线访问邮件、日历,查看附件和地址本、书写文档等。
而在中国市场,越来越多的中国企业也正在加入移动云计算的竞争。中国移动联合中科院推出了“大云计划”,中国电信发布了“星云计划”;而手机厂商宇龙酷派也推出了“酷云计划”,成为国内首个手机云计算服务平台。移动云计算时代正在到来。
IT 时代的新高峰 腾讯公司董事局主席马化腾曾说过:“云计算的价值在于利用公共网络设施,将计算能力、海量信息、数据存储与带宽资源像水和电一样融入人们的日常生活工作中,人们可以像使用水电一样租用信息化,而移动云计算将使信息‘更会飞’。”最近几年,GSM、WaveLAN、Wi-Fi 等移动网络技术的成熟和商业化,以及无线终端设备的发展,为实现更高端的移动应用做好了充分的基础准备。另一方面,由于用户需求的多样性,移动互联网的应用必须要有强有力的服务器资源做支撑。而在云计算平台的支持下,中小企业开发人员从大型服务商如谷歌、微软和中国电信等提供的公共云中就可以获取必要的计算资源。从运营角度来说,这也节省了中小企业的软硬件搭建成本和维护成本,可以让它们把精力更多地放在开发和服务上。而对于终端来说,云储存、云应用不需要过多消耗终端的计算能力,终端制造商、运营商只需要协调需求与搭配应用,用户也可以方便地获得需要的应用。到目前为止,发展移动互联网的三大“金刚”已经具备——智能手机和平板电脑提供了理想的终端;移动多媒体和应用提供了用户迫切需要的内容;而云计算提供了支持内容生产和展示的技术平台——移动互联网终于可以站在云端之上。
目前,国内一些主流 OA、CRM 及 ERP 等领域的企业正在积极利用云计算技术和移动互联技术的组合,使无线办公、移动管理、无线电子商务成为主流应用,而这也将成为未来利润新增长点。
挑战与风险尚存
当然,作为新兴技术,移动云计算目前仍然存在一些问题与短板,需要 IT 厂商改进和突破,并向系统化、标准化、规范化的方向转变。首先,业内对云计算的一大担忧就是安全问题。随着企业业务拓展到手机等移动终端,移动云计算的安全问题也将日益凸显。云计算基础架构具有多租户的特性,厂商们目前还无法确保A用户数据与B用户数据实现物理分隔,而数据在无线传输中也存着被截取、破译的可能。其次,无线商务应用的商业模式还不清晰。作为移动云计算之下最有“钱景”的应用,支持其业务的运行模式、信用体系、支付体系等细节仍缺乏标准和规范。此外,在云计算中,数据的归属权、管理权也是一个日益受到关注的话题。“移动云计算既不是天外飞仙,也不会水到渠成。云计算产业从概念产生到真正广泛地实际应用并产生效益,还需要 3~5 年时间预热、夯实,整个社会需要有持久战的准备。”工业和信息化部产业政策司相关负责人说。
如果说互联网的未来是移动互联网、计算机的未来是云计算的话,那么未来两者合二为一时,将彻底改写世界互联网历史,缔造一个全新电子信息化时代。本文第一部分主要介绍了云计算的理念和框架,第二部分引出了一种基于云计算模型的移动通信服务构架方案,以及如何从现有成熟网络构架到云系统方案实现的思路。
一、云计算
1.概念
云,集资源,网,即天下。
2006 年 8 月 9 日,Google 首席执行官埃里克·施密特(Eric Schmidt)在搜索引擎大会(SES San Jose 2006)首次提出“云计算”(Cloud Computing)的概念。云计算是一种通过网络统一组织和灵活调用各种ICT 信息资源,实现大规模计算的信息处理方式。云计算利用分布式计算和虚拟资源管理等技术,通过网络将分散的 ICT 资源集中起来形成共享的资源池,并以动态按需和可度量的方式向用户提供服务。用户可以使用各种形式的终端通过网络获取 ICT 资源服务,达到基础设施即服务、平台即服务、软件即服务的宗旨理念。云计算旨在通过网络把多个成本相对较低的计算实体整合成一个具有强大计算能力的系统,借助先进的商业模式把这强大的计算能力分布到终端一用户手中。
通过云计算模式,用户只需要一个云终端,就可以通过网络服务来实现其所需要的一切,甚至包括超级计算这样的任务,都可以通过云计算实现。云计算的应用包含这样的一种思想,把力量联合起来,给其中的每一个成员使用。
2.国外研究现状
“云计算”这个词率先在国外诞生,1984年云计算最初由Sun公司John Ellison提出“网络即计算机”。在技术飞速发展的IT时代,云计算概念是由Google提出的,这是一个美丽的网络应用模式。
目前云计算市场规模相对较小,全球云计算市场规模为160亿美元,但增长速度将相当快,IDC报告显示未来4年全球云计算市场平均每年将增长27%,2012年将增长至420亿美元。云计算在美国政府机构的IT政策和战略中扮演越来越重要的角色,政府正在大力推行云计算计划,第一大元素就是Apps.gov政府网站的改革,整合商业、社交媒体、生产力应用与云端IT服务。2010年美国联邦预算着重加强了对云计算的安排,资助众多试点项目,包括中央认证、目标架构与安全、隐私以及采购相关内容。此外,美国国防信息系统部门(DISA)正在其数据中心内部搭建云环境,而美国宇航局(NASA)下设的艾姆斯研究中心最近也推出了一个名为“星云”(Nebula)的云计算环境。
日本内务部和通信监管机构计划建立一个大规模的云计算基础设施,以支持所有政府运作所需的信息系统,这一系统被命名为“Kasumigaseki Cloud”的基础设施将在2015年完工,目标是巩固政府的所有IT系统到一个单一的云基础设施,以提高运营效率和降低成本。云计算是多种技术混合演进的结果,又有大公司推动,发展极为迅速。Amazon、Google、IBM、微软和Yahoo等大公司是云计算的先行者。云计算领域的众多成功公司还包括Sales force、Face book、You tube、Mys pace等。
云计算的技术和商业前景已使资金、人才与创新更加聚集。美国硅谷目前已经约有150家涉及云计算的企业,新的商业模式层出不穷,公开宣布进入或支持云计算技术开发的业界巨头包括微软、谷歌、IBM、亚马逊、Netsuite、NetApp、Adobe等。
微软加快进军云计算领域。2008年微软进军云计算的战略越来越清晰,相继发布了一系列产品,推出了新操作系统Azure,企业Exchange的网络版和Office网络版;计划在最短的时间内打造20个顶尖水准的数据中心,即“云计算中心”,每个中心预计耗资10亿美元。以微软在圣安东尼奥的数据中心为例,该中心的大部分建设仅用了9个月时间,微软希望借此速度在云计算领域快速超越竞争对手谷歌。
谷歌云计算布局日趋明朗。继推出Google App近两年后,App Engine服务平台问世,其基本功能是让外部开发者借助谷歌的App Engine开发新的WEB应用,而谷歌通过自己强大的云中心向用户提供上述应用的网络服务。Google当数最大的云计算的使用者。Google搜索引擎就建立在分布在200多个地点、超过100万台服务器的支撑之上,这些设施的数量正在迅猛增长。Google地球、地图、Gmail、Docs等也同样使用了这些基础设施。采用Google Docs之类的应用,用户数据会保存在互联网上的某个位置,可以通过任何一个与互联网相连的系统十分便利地访问这些数据。目前,Google已经允许第三方在Google的云计算中通过Google App Engine运行大型并行应用程序。Google值得称颂的是它不保守。它早已以发表学术论文的形式公开其云计算三大法宝:GFS、MapReduce和BigTable,并在美国、中国等高校开设如何进行云计算编程的课程。
IBM注重外部合作。2007年IBM推出了“蓝云(Blue Cloud)”计划,与政府机构、大学和互联网企业展开云计算计划方面的合作,并于2008年向客户正式推出第一套支持Power和x86处理器系统的“蓝云”产品。
亚马逊在云计算商业拓展方面保持领先。2008年亚马逊正式推出了运用于云计算服务EC2的弹性块存储技术(EBS),2008年财务报表显示其云计算业务收入已经超过1亿美元。Amazon使用弹性计算云(EC2)和简单存储服务(S3)为企业提供计算和存储服务。收费的服务项目包括存储服务器、带宽、CPU资源以及月租费。月租费与电话月租费类似,存储服务器、带宽按容量收费,CPU根据时长(小时)运算量收费。Amazon把云计算做成一个大生意没有花太长的时间:不到两年时间,Amazon上的注册开发人员达44万人,还有为数众多的企业级用户。有第三方统计机构提供的数据显示,Amazon与云计算相关的业务收入已达1亿美元。云计算是Amazon增长最快的业务之一。
云计算能够快速发展,学术界、企业间的密切联动与合作起到重要作用。谷歌与IBM在包括卡内基美隆大学、麻省理工学院、斯坦福大学、加州大学柏克莱分校及马里兰大学等,推广云计算计划,降低分布式计算技术在学术研究方面的成本,并为这些大学提供相关的软硬件设备及技术支持。
雅虎、惠普和英特尔的一项涵盖美国、德国和新加坡的联合研究计划,推出云计算研究测试床。该计划要与合作伙伴建立6个数据中心作为研究试验平台,每个数据中心配置1400个至4000个处理器,合作伙伴包括新加坡资讯通信发展管理局、德国卡尔斯鲁厄大学Steinbuch计算中心、美国伊利诺伊大学香宾分校。
3.国内研究现状
我国云计算建设尚在雏形阶段,处在学术层面以及试商用层面的云计算环境。云计算产业的发展以实践为着力点,从切合产业需求的角度将该新兴领域推动起来。政府聚焦云计算平台建设。
北京市计算中心与Platform软件公司共建联合实验室,推进“北京云”的建设。该公共云计算平台定位于工业计算,以IaaS和SaaS两种方式,为政府单位和广大中小企业提供最新的硬件和软件设施、虚拟原型制作、可视化技术、网络技术、数据挖掘等,增强工业企业的产品研发能力。
2010年1月13日,北京市科学技术研究院主持召开了北京云公共计算平台一期建设工程专家鉴定会,北京市计算中心建成的20万亿次公共云计算平台得到与会专家一致认可,顺利通过鉴定。
北京云公共计算平台基于Xen和KVM虚拟化技术及LSF和ISF云计算中间件,提供全局资源监控管理、全局资源调度和动态应用部署。在能耗管理上率先采用AMB节能内存芯片,可明显节省系统能耗。“北京云”提供服务化的Ansys、Fluent、Abaqus、BLAST、Gromacs等20余种工业计算、生物计算和科学计算应用软件,用户可基于Web Portal、命令行方式提交作业,实现应用服务定制。“北京云”已成功应用于国庆60周年天安门阅兵LED显示系统模拟、北京长城华冠汽车公司的汽车碰撞仿真、北京同仁医院的鼻腔病变研究、北京生命科学研究所的生物计算研究等项目。
随着黄河三角洲逐步上升为国家开发战略,山东省东营市政府与IBM一起筹建黄河三角洲云计算中心,主要建设内容包括:云计算基础资源平台、软件公共技术及测试管理服务平台、外包人才实训平台和企业创新服务平台等,未来还可提供电子政务、数字化城市、公共医疗、企业OA服务等应用服务,作为山东省内各个计算中心的上级管理、监控、调度和软件资产管理节点,完成全省运算能力、IT资产等资源的统一调度和统一管理,真正实现全省信息资源的共享。
广东东莞和佛山以政府为主导搭建本地化的公益性云计算平台。东莞松山湖的项目是国内首个具有自主产权的云计算平台,出自中科院计算所广东电子工业研究院,合作企业有中国新联通集团、网通研究院、北京汉唐教育集团等,而有意向使用该平台的企业就有三千多家,该平台建成后预计年产出将达到18亿元至30亿元。
江苏省无锡市联手IBM创建了世界第一个商业云计算中心,在无锡云计算中心二期建设规划中,IBM将帮助无锡加强云计算中心基础设施建设,重点搭建商务云平台、开发云平台和政务云平台三大云计算服务平台,IBM全球最新发布的云计算容量规划方案将应用于上述三大云计算服务平台。
IBM、谷歌、微软等国际IT巨头已纷纷在中国宣布自己的云计算战略。2008年IBM先后在无锡太湖新城科教产业园、北京IBM中国创新中心建立云计算中心。与之呼应的,中国IT企业也启动云计算工作,迄今为止,虽有瑞星、阿里巴巴等企业宣布了自己的“云计划”,但还未能达到打造一条完整产业链的地步。
上海电信与EMC公司合作,将分布在异构存储系统与平台中的数据进行虚拟化云存储,推出了面向家庭和个人用户的云信息服务“e云”,EMC提供云计算核心技术,存储和新服务平台及技术支持,上海电信负责日常运营,产品品牌策划、推广、营销,客户服务等一系列信息服务商所承担的工作。继推出“e云”云存储服务以后,上海电信正在筹划“云手机”业务,该业务将简化手机功能,利用未来3G高带宽的优势,将大量手机上的应用转移到运营商运营的云端,降低消费者支出成本。
阿里巴巴集团旗下子公司阿里软件与南京市政府签订了2009年战略合作框架协议,于2009年初在南京建立国内首个“电子商务云计算中心”,首期投资额将达上亿元人民币;世纪互联推出了CloudEx产品线,包括完整的互联网主机服务“CloudEx Computing Service”、基于在线存储虚拟化的“CloudEx Storage Service”和供个人、企业进行互联网云端备份等一系列互联网云计算服务;联想公司不仅将云计算架构用在自身的研发平台中,还通过软件研发,将云计算与客服系统结合起来,优化用户体验。而友友新创运用虚拟化技术做云计算中间件,通过关联传统硬件基础设施和平台,转成云计算架构的服务模式,从而使用户不需要更换硬件或操作系统平台就可以享受云计算的优越性。此外,国内企业创造的“云安全”概念,在国际云计算领域独树一帜,瑞星、江民科技、金山、360安全卫士等都推出了云安全解决方案。
中国移动“大云”研发和应用探索,随着社会信息化程度不断深化,单纯的通信服务已经无法满足用户全方位、多层地的信息消费的需求,中国移动适时提出了“从移动通信专家向移动信息专家转型”的战略,并预见到云计算在未来信息服务竞争中的重要地位,从2007年启动了“大云”云计算研究和开发计划,是国内最早介入云计算研发和实践的企业之一。
“大云”项目是中国移动为了打造高性能、低成本的信息处理平台,以满足IT支撑系统、移动互联网应用等需求的超前研究和系统开发项目。2007年,中国移动研究院开始对大规模机群环境中的云计算系统开展深入的研究和评估,并于2008年建成了256个PC服务器节点的 “大云”试验平台,2009年该试验平台扩容到1024个节点,是国内规模最大的云计算试验平台之一。
在Hadoop等开源软件基础上,中国移动研究院自主开发了“大云(Big Cloud)”云计算系统,包括弹性计算系统(BC-EC)、并行计算执行环境(Map Reduce)、结构化海量数据存储系统(Huge table)、并行数据挖掘系统(BC-PDM)、非结构化云存储系统(BC-NAS)和搜索引擎(BC-SE)等关键模块,并已申请10余项专利。
为了尽快推动新技术形成生产力,中国移动依托“大云”平台积极开展云计算领域的试验和试点,在多个省公司进行了数据挖掘、网络信令分析、话单/日志存储查询等试验,并与天津市经信委合作进行了基于“大云”的无线城市应用试点。实践证明,云计算技术与传统IT技术相比不但大大提高了系统的性能、可扩展性,而且具有极为明显的成本优势。
云计算技术的成功依赖产业链各环节的支持和合作,中国移动积极推动云计算在国内外的标准化和产业化工作。中国移动研究院广泛参与了DMTF、SNIA、CGF、TGG等组织的云计算标准化项目,活跃于Hadoop等开源组织的工作;作为中国大陆唯一成员加入了全球云计算开放实验室Open Cirrus,提供几十个云计算节点用于云计算产的教育和科研工作;2008年11月,中国移动战略咨询委员会名誉主任、前邮电部部长吴基传以及工程院院士李德毅、倪光南、中国移动研究院院长黄晓庆等专家牵头的“中国云计算专委会”在中国移动研究院召开大会正式成立,中国的产业界、学术界、科研机构开始了对云计算的广泛讨论与合作;
可以预见,未来几年,中国云计算产业必将迎来一个充满生机的全新发展时期。
4.云计算的基本原理
云计算的基本原理是,通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将更与互联网相似。这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。
基于云计算的发展和我们对云计算的理解,概括性给出云计算的基本原理为:利用非本地或远程服务器的分布式计算机为互联网用户提供服务。这使得用户可以将资源切换到需要的应用上,根据需求访问计算机和存储系统。云计算可以把普通的服务器或者PC连接起来以获得超级计算机计算机的计算和存储等功能,但是成本更低。云计算真正实现了按需计算,从而有效地提高了对软硬件资源的利用效率。云计算的出现使高性并行计算不再是科学家和专业人士的专利,普通的用户也能通过云计算享受高性能并行计算所带来的便利,使人人都有机会使用并行机,从而大大提高了工作效率和计算资源的利用率。云计算模式中用户不需要了解服务器在哪里,不用关心内部如何运作,通过高速互联网就可以透明地使用各种资源。
云计算的资源是动态易扩展而且虚拟化的,通过互联网提供。终端用户不需要了解“云”中基础设施的细节,不必具有相应的专业知识,也无需直接进行控制,只关注自己真正需要什么样的资源以及如何通过网络来得到相应的服务。
云计算的特点主要体现在:按需采用“即用即付费”的方式分配计算、存储和带宽资源;动态扩展功能和部署新服务的高可扩展性;各类资源的高利用率等。同时云计算集成了多种计算范例的特性:分布式计算中任务分解、分别执行、结果汇总的计算模式;网格计算中将地理上分布、系统异构的多种计算资源互连协同解决大型应用问题的作业模式;对等计算中计算资源的组织和发现方式;公用计算中将聚合计算资源封装成公共服务的资源高用率使用模式;虚拟计算环境iVCE下用户将富余资源按需聚合和自主协同的思想。
云计算是全新的基于互联网的超级计算理念和模式,实现云计算需要多种技术结合,并且需要用软件实现将硬件资源进行虚拟化管理和调度,形成一个巨大的虚拟化资源池,把存储于个人电脑、移动设备和其他设备上的大量信息和处理器资源集中在一起,协同工作。按照最大众化、最通俗理解云计算就是把计算资源都放到互联网上,互联网即是云计算时代的云。
二、基于云系统的无线网络接入
根据云系统理念设计的移动通信服务网络,如图(1)所示。
图(1)基于云系统的移动通信网络
系统构架主要分为运营商即提供服务端和用户感知端,这两个端口又可以互称为对方的云端,云端之间可以实现实时信息交互、资源共享和服务流程发起等功能。
1.云下无线通信的技术构想
由于大多数网站是针对台式机设计,这是非常不适合无线手持设备小屏幕和有限的用户界面浏览的的大页面。因此,设计一种适配小屏幕设备浏览是这些网页一种必要之举。此外,由于无线手持设备的有限计算能力和存储容量,部署适配现有网页引擎也是极具挑战性的。通过参考云计算基础设施巨大的运算能力和存储资源,我们提出了一种新的无线网络接入方式。首先,展示的是系统架构。随后,对系统的两个关键组成部分进行详细描述:一个是分布式网页的适配引擎,设计的目的是通过分布式和并行式云计算,另一种是分布式Web page blocks management基础云计算,这是建议的网页适应引擎可以部署合理的。此外,一个原型系统和评价组实验已得到执行。
随着无线电信技术和增量带宽的快速发展,更多的人正在使用他们的无线手持设备作为网络冲浪设备时。然而,无线手持设备存在限制功能,如小屏幕,有限的计算能力等,这些限制用户无线网络冲浪的质量。无线移动用户很难可以浏览那些为PC用户设计的大的网页。
研究人员已经提出了一些有效的算法,那就是将网页分为多块组合,非常适合在小屏幕装置上显示网页。同时,有必要把这些现有的网络的适配引擎付诸实践。大多数现有的引擎经由代理或服务器时得到实现。我们已经实现基于代理模式的适用于无线装置的网页适配引擎。而由实验中发现,当更多的无线终端出现时,代理模式下会变得更加无效。为了解决这个问题,对无线上网,我们提出了一个点对点的合作模式,在此模式下,无线设备互相连接。另外,形成一个P2P协作系统。当使用时,该系统中的每个器件都能发挥各自的计算功能和存储容量。与前者相反,该系统会随着更多的无线终端加入变得更有效率。然而,无线计算环境的特点,如流动性,高频率断线,网络条件的多样性和网络通信的不对称等,会导致系统在绝大部分时间里拥有几个同行,展出了低效率。
有一个强烈的愿望,那就是在分析新兴的云计算基础设施数据,这是具有很高的价值的方案。一个云计算基础设施,如Amazon(亚马逊)弹性计算云(AmazonEC2),提供了潜力巨大的计算能力,通常在虚拟机的形式下,来解决偏远用户对互联网的
需要。云带来许多有价值的解决方案,其中包括:云提供了环境中的抽象部分,这些用户不会明显察觉到;此外,目前云存储对数据和应用程序的存储,它像电流一样在开发商和用户之间进行传递转移。另外,由于拥有较大的规模和专业知识,云可以提供一个更加可靠和安全的基础设施,而这些成本是一般企业完全可以负担的。例如,Amazon(亚马逊)有多个数据中心,每个数据中心还拥有多个备份发电机。Amazon(亚马逊)还具有强大的安全防范措施,这些措施不仅可以对抗物理安全漏洞,而且可以防范黑客的攻击。
通过我们已经实现的对现有的网络匹配引擎,并参照云计算基础设施[28],参照现有企业的云计算服务平台,尝试性的给出新的无线网络接入方案。分布式网页适配引擎的设计,首先是为了实现这种引擎在分布式和并行式云计算条件下运行。然后提供一种基于云计算的分布式网页分块管理方法,并设计出一种具体算法,这种算法旨在分配引擎的处理任务,协调每个计算云之间的工作。
2.无线通信领域的云计算技术发展方向
电信行业重组,运营商的竞争加剧,促进现代无线通信技术呈现飞速发展的趋势,也给网络规划优化工作带来更大的压力。随着3G时代来临,移动通信网络大规模建设,且已从建设阶段逐步进入管理阶段,这就带来了如何深度优化网络,有效利用现有资源等问题。虽然移动愈来愈重视网络优化,但是由于设备来自不同厂商,将面对如何整合来自不同生产商的海量设备数据等问题。此外,网络优化采集、分析到数据亦存在着不确定性,也导致了网络优化方案的复杂性、繁琐性。而云计算的出现为移动通信网络优化工作,提供了崭新的、较为理想的思路和方法。主要包括以下几点:
1)网络优化的现状 2)处理数据的单一性 3)资源的独占性 4)数据管理的有限性 5)用户感知度不大
作为一种新兴的、倍受赞誉的技术,云计算一经推出,就得到了多方推崇。云计算模型的出现也为移动通信网络优化注入了新鲜血液,结合云计算的特点和网络优化工作的现状,云计算将给移动通信网络带来深刻变革。主要在以下几个方面:
1)模式改变
传统移动通信网络优化模式环境下,运营商不得不面对多系统应用和不同厂家生产的多种设备,为了增强系统的可用性,运营商必须对每种应用和设备分别提出要求,并不时向技术限制妥协。若采用云计算模型,则可获得众多服务的协作支持。无论设备是哪个厂商提供,运营商都无需关心整合的细节过程,只需享受服务。网络优化前期工作是调用、分析、处理各类数据库,而此项工作又最是冗长,如果采用云计算,网络优化工作则可以省略数据预处理过程,且优化采集的数据无需整合,大大提高了网优工作效率。
2)降低成本,超值服务
每个运营商都建立有一个专用的网络优化系统,要负担自身设备和人员的开销,这样成本是很高的。如果运营商将资源分享出去或者分享了其他运营商的资源,那么就只需负担部分系统费用。采用云计算模型,则运营商拥有的资源来自世界各地,负担的成本则会下降很多。
3)庞大的数据“云”
云计算的基本原理是通过云端的资源,如大型硬件平台、数据中心等,向互联网客户提供资源租用、应用托管、服务外包等。庞大的云端资源,刚好满足了移动通信网络优化所需的数据管理。网络优化工作除了对海量数据进行分析之外,还需大量经验的积累,也就是常说的建立优化方案库或加油站。采用云计算模型,则可分享优化方案库里的优化经验,寻求类似的案例,在很大程度上简化了优化程序。优化方案库的建立为网络优化工作人员提供了优化通信网络的实施依据。
3.云计算平台对未来无线通信网络的要求
当第三代移动通信的开发工作正在如火如荼地进行时,第四代移动通信的脚步声已经悄然响起。B3G/4G无线通信系统是指广泛应用于各种电信环境的无线系统的总和,包括蜂窝、固定无线接入、游牧(Nomadic)接入系统等。WiFi是目前无线接入的主流标准,在Intel的强力支持下,WiFi已经有了接班人。它就是全面兼容现有WiFi的WiMAX,现有通信系统的补充,可看作是3G的一种补充,未来的B3G/4G移动通信系统,将是多个现有系统的融合和发展,为用户提供全接入的信息服务。目前,从无线传输、系统、和“云业务传输”角度来看对新一代移动通信系统的共识主要有:
1)统一的无线接入,全球无缝覆盖以及全球漫游。2)高速、高效的空中接口和接入网结构。
3)动态支持各种传输类型、终端类型、无线环境、QoS类型和各种移动模式。4)基于路由的全IP网络,更多的多媒体应用业务。5)极大的系统容量,更高的频谱利用率。
面对全新的移动3G网络和高速传输的wifi等无线通信网络,云计算平台要做到以下几个方面:
1)大规模:由具备一定规模的多个节点组成的IT系统,系统规模几乎可以无限扩大。2)高度扩展性和弹性:系统具备高度的扩展性和弹性,可以以即插即用的方式方便、快速地增加和减少资源。
3)资源共享:计算、存储和网络等抽象为资源池,能够同时为多个用户、多种应用提供服务。
4)按需使用、按量计费:用户可通过自服务系统按需对所需资源量进行调涨,系统应能够提供使用量监控、管理和计费。
云计算是我国IT产业赶超世界先进水平的一个难得机遇,对于建设创新型、节能型的和谐社会具有非常大的推动作用。
4.系统框架
该系统的设计初衷是利用庞大的计算能力和存储能力云计算基础设施,以实现网页适应引擎的运行。图(2)显示了系统的整个框架。云的门户网站是一个无线终端用户和原始网站之间的接口。在这里,它代表着新的无线网络接入服务。从系统架构,我们可以得出结论:必须设计基于云计算的分布式网页匹配引擎和分布式网页区块管理方案,使引擎可以在分布式和并行式云计算下运行。
分布式网页适配引擎是由两个模块构成。他们分别是结构处理器和迭代网页拦截器。结构处理器分析正常网页并创建DOM树作为输出页面。迭代网页拦截器把网页分割成小块,并使这些分块的网页适配引擎在分布式和并行式云计算下运行。
图(2)基于云的移动通信系统的整个框架
5.云计算在手机通信应用中的优势
(1)客户端需求低
云计算对用户端的设备要求非常低,使用起来也很方便。用户可以通过浏览器中直接编辑存储在“云”的另一端的文档,你可以随时与朋友分享信息,无需客户端软件的安装。这一点非常适合于手机,因为手机的功能虽然在扩展,但现在仍然无法替代PC机。而且许多在PC机上客户端程序无法安装在手机上,那么通过云计算就可以很好地解决这一问题。
(2)数据安全可靠 云计算提供了可靠、安全的数据存储中心,用户不用再担心因为机器损坏而造成的数据丢失,植入木马病毒入侵等问题的出现。用户常常会把重要信息放在手机中,无形中加大了数据安全的风险。通过云计算用户可以将数据保存在云端的存储服务器中,服务器由专业的团队来管理信息,并且有严格的权限管理策略。
(3)轻松共享数据
云计算可以轻松实现不同设备间数据与应用的共享。在云计算的网络应用模式中,数据只有一份,保存在“云平台”中,用户的所有电子设备只需要连接互联网,就可以同时访问和使用同一份数据。
以手机联系人信息的管理为例,当使用网络服务来管理所有联系人的信息后,用户可以在任何地方用任何一部手机找到某个朋友的电话、电子邮件地址等等信息,可以在任何一部手机上直接拨通朋友的电话号码,也可以把某个联系人的电子名片快速分享给好几个朋友。
(4)良好的扩展性
通过云计算,网络可以提供很多的可能。可以为存储和管理数据提供空间,也可以为完成各类应用提供强大的计算能力。只要通过手机联入网络,就可以直接看到自己所在地区的卫星地图和实时的交通状况,可以快速查询自己预设的行车路线,可以请网络上的好友推荐附近最好的景区和餐馆,可以快速预订目的地的宾馆,还可以把刚刚拍摄的照片或视频剪辑分享给远方的亲人。
6.5G WiFi应对云计算终端爆发时代
数字内容的消费是一个陡峭的斜坡,根据2011年思科视觉网络指数预测,视频内容占用流量预计将达到全球消费量的大约70%。同时,互联网流量正在迅速转变,从有线到无线网络。对无线网络的日益依赖,视频消费和正在使用的无线设备越来越多的爆炸性增长都将给传统的802.11a/b/g/n网络巨大的压力。因此,消费者很容易体验到网络恶化的表现,断断续续的影片和加载时间的缓慢。
5G无线网络将克服这些数字内容和无线设备的挑战。5G无线与新的创新技术,更可靠的覆盖整个家庭,将让消费者更快的串流装置之间的数字内容,同时连接多个无线设备,家庭和企业网络,同时节省电池电量。速度
入门级5G WiFi产品将是450Mbps,这是至少3倍的速度相比最常见的设备,使用目前的无线系统,支持802.11n。因为新的标准,使制造商能够灵活地提供不同性能水平的产品,一些高速的802.11ac设备将提供超过1000Mbps的传输速度既有线网络最近几年才达到的速度。
可靠性
5G无线网络提供的无线可靠性和覆盖范围都有显著改善。家庭和公寓现在的“盲点”将极大地改善。打个比方说,在802.11ac接入点发射30 英尺的距离与802.11n发射10英尺的距离,会得到相同的数据吞吐量。5G无线网络的波束成形和其他创新技术,相比起过去的802.11n在穿透一切形式的建筑材料(包括混凝土)上会能更好的工作。
结束语
云计算技术目前还在不断发展中,很多概念还没有得到业界的公认,虽然有些关键技术已趋于成熟,但标准化工作相对滞后于应用的发展,通过引入这些新技术,在电信业务中进行应用和改造,可以实现资源共享、成本降低、架构优化和业务创新,为电信业务带来了新的发展机遇。随着互联网和电信融合的进一步加深,我们相信,未来的云计算技术将会为电信业务开辟一片新的蓝天。
本文在参考了国内外大量相关文献的基础上,研究了云计算及其相关理论。研究了基于无线通信的云计算服务平台,查阅3G、5G移动通信和无线wifi 与云计算技术结合服务的理论服务模式,由于云计算是一门新兴的技术,对于其发展和应用前景人们都报以众望,但是对云计算的关键技术掌握还不是特别熟练,3G、wifi等无线通信网络刚刚投入运营,5G还在理论领域,因此本人对云平台和无线网络的结合有一定欠缺,仅从云计算的建设架构和服务层次上进行研究,还不够具体全面,存在一些问题,有待与进一步的研究与完善。
参考文献 【1】吴勇毅.移动云计算迎来黄金期.计算机世界,2011.07,第 016 版 【2】张海望,杨波.云计算在手机通信中的应用研究.计算机安全,2011.01 【3】张楹.基于云计算模型的移动终端用户感知度提升研究.中国移动通信集团有限公司设计院上海分公司,上海,中国
【4】工信部电信研究院发布 2012 年移动终端和云计算白皮书.数据通信.2012.02 【5】Francesco Maria Aymerich,Gianni Fenu,Simone Surcis.云计算下无线网络接入技术的研究.北京科技大学本科生毕业设计
第二篇:《宽带无线接入技术》仿真实验报告 2
重庆交通大学信息科学与工程学院
综合性设计性实验报告
专业: 通信工程专业11级
学号:
姓名:
实验所属课程: 宽带无线接入技术
实验室(中心): 软件与通信实验中心
指 导 教 师 :
2014年3月
一、题目
OFDM系统的CFO估计技术
二、仿真要求
要求一:OFDM系统的数据传输
①传输的数据随机产生;
②调制方式采用16QAM;
要求二:要求对BER的性能仿真
设计仿真方案,比较两个CFO的性能(基于CP与基于训练符号 Moose),并画出不同SNR下的两种估计技术的均方差(MSE)性能。
三、仿真方案详细设计
1、首先OFDM技术的基本思想和现状了解。认真学习OFDM技术的基本原理,包括OFDM系统的FFT实现、OFDM系统模型、OFDM信号的调制与解调、OFDM信号的正交性原理,根据PPT及网上查阅资料加以学习。其次,了解OFDM的系统性能,包括OFDM系统的同步技术及训练序列等。
2、同步技术:接收机正常工作以前,OFDM系统至少要完成两类同步任务:
① 时域同步,要求OFDM系统确定符号边界,并且提取出最佳的采样时钟,从而减小载波干扰(ICI)和码间干扰(ISI)造成的影响。
② 频域同步,要求系统估计和校正接收信号的载波偏移。在OFDM系统中,N个符号的并行传输会使符号的延续时间更长,因此它对时间的偏差不敏感。对于无线通信来说,无线信道存在时变性,在传输中存在的频率偏移会使OFDM系统子载波之间的正交性遭到破坏。
3、载波频率的偏移会使子信道之间产生干扰。OFDM系统的输出信号是多个相互覆盖的子信道的叠加,它们之间的正交性有严格的要求。无线信道时变性的一种具体体现就是多普勒频移引起的CFO,从频域上看,信号失真会随发送信道的多普勒扩展的增加而加剧。因此对于要求子载波严格同步的OFDM系统来说,载波的频率偏移所带来的影响会更加严重,如果不采取措施对这种信道间干扰(ICI)加以克服,系统的性能很难得到改善。
OFDM系统发射端的基本原理图OFDM信号频谱
4、训练序列和导频及信道估计技术
接收端使用差分检测时不需要信道估计,但仍需要一些导频信号提供初始的相位参考,差分检测可以降低系统的复杂度和导频的数量,但却损失了信噪比。尤其是在OFDM系统中,系统对频偏比较敏感,所以一般使用相干检测。在系统采用相干检测时要进行信道估计。就要用训练序列和导频作为辅助信息,训练序列通常用在非时变信道中,在时变信道中一般使用导频信号。在OFDM
系统中,导频信号是时频二维的。为了提高估计的精度,可以插入连续导频和
分散导频,导频的数量是估计精度和系统复杂的折衷。导频信号之间的间隔取决于信道的相干时间和相干带宽,在时域上,导频的间隔应小于相干时间;在频域上,导频的间隔应小于相干带宽。在实际应用中,导频模式的设计要根据具体情况而定。
四、仿真结果及结论
Nfft=102
4五、总结与体会
总结:OFDM技术的优点是其它调制方式无法替代的。OFDM技术作为一种高效的调制技术,它的优势将决定OFDM成为第四代移动通信系统的关键技
术之一,它的性能直接影响到未来移动通信的通信质量,对OFDM的研究具有重大的现实意义。OFDM是一种能够对抗由多径衰落信道造成的符号间干扰的有效技术,可以在频率选择性衰落信道中实现高速率的无线通信。由于过程中会带来很大的频偏,所以,我们采取了训练符号进行信道估计,得到尽可能大的传输效率。
体会:经过本次实验,我从编程过程中重新领会了OFDM系统的工作原理,以及它所采用的训练符号和保护间隔的重要作用,但是实验结果还不是很理想,由于自己能力有限,没能完善实验代码。只能在有关论文中不断学习了解相关知识,通过自己在课外对相关论文的学习后觉得对着门技术有了新的认识,心中的迷惑渐渐明朗了起来。譬如,当时上课就不知道插入CP作用和它如何实现工作,而试验中在和老师及同学的教导下了解到了它是如何消除码间干扰的。试验还是差了一步,就是没能实现误码率的计算,并输出做一比较。
六、主要仿真代码
clear all;
clc;
CFO=0.1;
Nfft=256;%子载波个数
Nbps=4;
M=2^Nbps;%每个码符号的比特数(映射方式为16QAM)
Ng=Nfft/4;%加入的保护间隔
Nofdm=Nfft+Ng;
Nsym=3;
rand('state',0);randn('state',0);
x=[];%传输信号
for m=1:Nsym
msgint=randint(1,Nfft,M);
if m<=2
Xp=add_pilot(zeros(1,Nfft),Nfft,4);
Xf=Xp;
else
Xf=qammod(msgint,M);%映射
end
xt=ifft(Xf,Nfft);%傅立叶反变换
x_sym=[xt(end-Ng+1:end),xt];%添加CP
x=[x,x_sym];
end
y=x;%没有信道影响
SNRdBs=0:3:30;Maxlter=100;
for i=1:length(SNRdBs)
SNRdB=SNRdBs(i);
MSE_CFO_cp=0;MSE_CFO_Moose=0;
y_CFO=add_CFO(y,CFO,Nfft);%添加CFO
for iter=1:Maxlter
y_aw=awgn(y_CFO,SNRdB,'measured');%添加噪声CFO_est_cp=CFO_cp(y_aw,Nfft,Ng);%基带CP
MSE_CFO_cp=MSE_CFO_cp+(CFO_est_cp-CFO)^2;
CFO_est_Moose=CFO_Moose(y_aw,Nfft,Ng);%Moose
MSE_CFO_Moose=MSE_CFO_Moose+(CFO_est_Moose-CFO)^2;end
MSE_cp(i)=MSE_CFO_cp/Maxlter;
MSE_Moose(i)=MSE_CFO_Moose/Maxlter;
end
semilogy(SNRdBs,MSE_cp,'-',SNRdBs,MSE_Moose,'-x');
Xlabel('SNR[dB]');Ylabel('MSE');title('CFO estimation');legend('cp','Moose');
第三篇:基于无线传感网络的道路照明系统
基于无线传感网络的道路照明系统
杨兵
(徐州建筑职业技术学院,江苏 徐州 221116)
摘 要 :为了实现道路科学照明、绿色照明的关键问题是能够测量和控制到每一盏路灯,无线传感网络是解决这一问题最好的技术之一。选择Freescale公司MC13213芯片,设计了一种嵌入式无线通信模块,使整条道路的每一盏路灯自主联网,接受控制中心的指令,反馈路灯的各种状态,根据环境光强度和时段自动调节照明亮度,在保证道路照明质量和视觉舒适的情况下,节约电能。
关键词 :无线传感网络 ;道路照明;MC13213;ZigBee技术
中图分类号:TPXXX 文献标识码:A 文章编号:1234-567X(2010)一89—00XX—05
Road Lighting System Based on W ireless Sensor Networks
Yang Bing(Xuzhou Institute of Architectural Technology, Xuzhou, Jiangsu 221116)Abstract:The ability to measure and control each street—lamp is the key issue to realize road scientific lighting and green lighting.W ireless sensor network is one of the best technologies to solve this problem.MC13213 chip is used to design an embedded wireless communication module in this paper.Each street lamp on the whole road could independent network,receive instruction from control center,send various states feedback of street lamps and automatically adjust lighting levels according to the ambient light intensity.This technology could ensure the quality of road lighting.visual comfort and save energy 20%~30% .
Key words:wireless sensor network;road lighting;MC13213;ZigBee technology
0 引言
随着城市经济和规模的发展,各种类型的道路越来越长,机动车数量迅速增加,夜间交通流量也越来越大,道路照明质量直接影响交通安全和城市发展[1-2]。如何提高道路照明质量、降低能耗、实现绿色照明已成为城市照明的关键问题。道路照明的首要任务是在节约公共能源的基础上,提供安全和舒适的照明亮度,达到减少交通事故、提升交通运输效率的目的。由于基础设施的条件有限,目前普遍缺少路灯级的通信链路,路灯控制方式一般只能对整条道路统一控制,无法控制到每一盏灯[3]。本文基于无线传感网络,设计了一种嵌入式无线通信模块,实现了每盏路灯的无线自主组网,使每一盏路灯都能遥测和遥控,并达到路灯的亮度(或照度)在 30%~100%无级可调,可根据环境光强度和时段,在保证道路照明质量、辨认可靠且视觉舒适的情况下,节约电能 20%~30%。系统结构
基于无线传感网络道路照明系统的结构如图 1所示,通过在每盏路灯嵌入一个无线通信模块,使它们自组网络,接受控制中心的命令并将路灯的状态反馈给控制中心;HG-2控制箱采用ZigBee技术与所管辖道路的所有路灯通信,采用GPRS与控制中心通信,根据控制中心的指令或时间和照亮度对每盏路灯发出控制命令[路灯开启、关闭、照明度(功率大小)等],自动调节整条道路的功率平衡;控制中心由服务器、大屏显示、Center View中央控制系统软件平台等组成,Center View中央控制系统软件平台采用3D设计,通过缩放变换以俯视的角度观察和控制整个城市、一个街道、一条道路甚至一盏路灯的照明情况;移动计算工具(笔记本电脑、PDA、手机)和路灯维护车也能通过控制中心进行远程遥测和遥控。无线通信模块
无线通信模块的MCU为Freesclae公司MC13213,MC13213采用SiP技术在9mm×9ram的LGA封装内集成了MC9S08GT主控MCU和MC1320x射频收发器。MC13213拥有4kB的RAM、60kB的FLASH,具有1个串行外设接口SPI(Serial Peripheral Interface)、2个异步串行通信接口SCI(Serial Communications Interface)、1个键盘中断模KBI(Keyboard Interrupt)、2个定时器/脉宽调制模块TPM(Timer/PWM)、1个8通道10位的模数转换器ADC(Analog/Digital Converter)以及多达32个的GPIO口等,如图2所示。
无线通信模块采用ZigBee技术、IEEE 802.15.4协议,通信覆盖半径可达150m,能与在其覆盖范围内的任何路灯节点自组网络及进行通信。除了实现路灯的物物相联以外,还可调节电子镇流器的功率输出(30%~100%),实现节能和绿色照明,检测供电线路的电流、电压、功率因数以及每一盏灯的工作状态,当发生故障(如灯具损坏、灯杆撞击、人为破坏)时实时向监控中心和相关部门报警等。无线通信模块还进行了防雨、防潮、防雷电、防电磁干扰设计,并充分考虑了安装方便、维护简单和可恢复性(接入两根线就实现了路灯级的无线控制,拆除两根线又恢复到原来的状态),可以嵌入在路灯的不同位置(灯杆底部、灯杆内、灯罩内)。控制中心软件设计
控制中心的软件设计平台为Windows 2003,开发工具是微软Visual Studio6.0,数据库使用SQL Server 2005,与地理信息系统相结合,在获取了街道、建筑物以及路灯的位置、形状等特征信息后,设计以路灯为主体的3维虚拟城市,在控制中心大屏幕上动态显示道路的照明效果,并可以通过平移、放大、缩小等几何变换,观察整个城市、街道甚至每一盏路灯的照明情况。该软件主要有5个功能模块:系统设置、智能控制、电量核算、故障处理和紧急预案。系统设置中的区域设置有市、区、街道和电控箱4种;路灯设置有路灯的位置、型号、生产单位、施工单位、维护责任人、安装日期、清洗维护日期等;亮灯方式设置有全开、全关、单号路灯开、单号路灯关、双号路灯开、双号路灯关、1/3路灯开、1/3路灯关、1/4路灯开、1/4路灯关、智能控制等11种控制方式;时段设置可根据不同的城市不同的季节设置不同时段的亮灯方式。智能控制有两方面内容:①针对安装了电 子型路灯的路段,根据季节变化和天气状况,通过实时采样环境光强度,对路灯的照明亮度进行智能调节 ;② 在夜间,特别是深夜当检测到汽车和行人的流量十分稀少时,在不影响辨认可靠的情况下,适当降低道路的照明亮度,节约电耗。电量核算能对市、区、街道、电控箱甚至每盏路灯进行用电量的统计和核算。故障处理是对灯具损坏、断电、断相、过流、过压、三相不平衡以及人为破坏等情况,在第一时间向监控中心报警后迅速生成故障报告;故障处理的另一个功能是按路段和时段(年、季度、月)统计亮灯率、故障率、每次故障处理的效率
(平均修理时间)。紧急预案是对一些突发事件制定紧急预案,在特殊情况下,尽可能提供合适的道路照明,保证人民生命财产的安全。图3是控制中心软件的运行界面之一。实际应用
无线传感网络的道路照明系统自2009年5月以来在某国家级工业园区进行了安装和测试,安装环境为同一条道路两边的各100盏路灯,道路左边的100盏路灯采用无线传感智能控制,共增加成本8250.00元人民币,道路右边的100盏路灯采用常规的控制方式(半夜后单双号间隔开灯),测试结果如附表所示。
从附表中可以看出,采用无线传感网络的智能控制,100盏路灯在9l天中节约电能4506度,在产品投人的半年内就可以收回全部投资。使电耗降低的因素有以下几个方面:① 开启关闭时间的调整,道路右边的路灯控制方式是根据季节设定开闭时问(定时控制)并且是全功率开全功率闭(深夜半功率);道路左边的路灯控制方式是环境光强度和季节自动控制开闭时间,开启时,由于路面上尚有较强的环境光,路灯以补光的方式工作,逐渐增加照明强度,路灯关闭控制类似。② 由于深夜时居民用电负荷减少,低压电网电压升高,常规控制方式
下的路灯(道路右边)异常明亮、眩目,往往造成过度照明,不仅大大增加耗电,同时也导致灯具、电器实际使用寿命迅速下降,大量增加维护量和维护费用;深夜控制模式(道路左边),采用降功率照明,不但降低耗电,还能改善道路照明质量和视觉舒适度,延长灯具、电器的实际使用寿命。③ 道路照明的智能控制,对学校、居民密集的小区、道路转弯处、事故多发地带等特殊路段,适当提高照明亮度,其余路段则适当降低照明亮度。结 论
先进的道路照明不但可以提升城市的形象、提高交通运输效率、减少交通事故,还能节约大量的公共电能消耗。但对于大多数城市来说,由于缺少必需的基础设施(路灯级的通信链路),无法实现先进控制方法。无线传感网络(物联网)的出现和应用,有效地解决了以上问题。本文基于无线传感网络,选择Freescale公司的MC13213芯片,设计了一种嵌入式无线通信模块,使整条道路的每一盏路灯自主联网,实现了路灯的遥测、遥控,对节约公共资源,建设数字化和节约型城市有较高的实际应用价值。
参 考 文 献
[1]杨春宇,胡英奎,陈仲林.用中间视觉理论研究道路照明节能[J].照明工程学报,2008,19(4):44—47. [2]张惠玲,王晓雯.城市道路照明设置与节能探讨[J].重庆交通大学学报(自然科学版),2007,26(10):lO6—109 [3]卢秀和,王 琪,陈 军,等.城市照明智能调光方法的研究[J].电力电子技术,2007,41(10):34—36.
第四篇:无线传感网络学习心得
无线传感器网络学习心得
初次接触这个课程时,我无意地在课本中看到了对于无线传感器网络的基本概述:无线传感器网络是一种全新的信息获取平台,能够实时监测和采集网络分布区域内各种检测对象的信息,并将这些信息发送到网关节点,以实现复杂的指定范围内目标检测与跟踪。这让我联想到物联网体系的感知层与网络层,乍一想,这不就是物联网感知层与网络层的整体解决方案么?美国《商业周刊》与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分别编译并下载至两个节点上,打开节点,左右键选择
/* 功 能:查找字符在索引中的哪一个位置 */ /**************************************************************************************************/ 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 “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显示屏也会显示相应状态,进行信息反馈。