-
1 教学导航
-
2 项目任务
-
3 项目分析与设计
-
4 关键技术与相关知识
-
5 项目实施
■ 智能家居系统的分析
■ 智能家居系统应用层设计
■ 基于Android环境开发智能家居系统上位机端应用程序
■ 智能家居系统关键代码编写和调试
【项目开发目的与意义】
80年代末,由于通信与信息技术的发展,出现了对住宅中各种通信、家电、安保设备通过总线技术进行监视、控制与管理的商用系统,这在美国称为Smart Home,也就是现在智能家居的原型。
智能家居系统是以住宅为平台,家居电器及家电设备为主要控制对象,利用先进的计算机技术、网络通讯技术、综合布线技术、将与家居生活有关的各种子系统,有机地结合在一起,通过统筹管理,让家居生活更加舒适、安全、有效。
由于智能家居是一个多行业交叉覆盖的系统工程,各个设备厂商按照不同的接口标准与协议生产设备,其结果是不同设备之间的互连、互通变得非常困难。这种问题实际上就是由家居设备的通信协议标准没有统一造成的。在整个智能家居系统中,家庭网络是智能家居实现通信的基础,是住宅内部的神经系统,通信协议是其精髓所在,因此在智能家居系统的设计中,采用具有良好发展前景的通信协议具有重要的意义。
智能家居(smarthome) 系统组成如图2-1所示。
图2-1 智能家居组成
【项目开发的背景】
智能家居系统是放眼于家庭,对家庭中用户的具体要求进行的具体产品化实现,使人们在日常生活中享受高科技带来的便捷,提高生活质量。具有功能易扩展、设备易维护、具有良好人机交互界面的智能家居系统,实现家庭工作智能化管理,从而提高人们的学习、工作、生活的质量,让人们在紧张的社会步伐中享受过程
智能家居系统利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施进行高效集成,构建高效的住宅设施与家庭日程事务的控制管理系统,提升家居智能、安全、便利、舒适,并实现环保节能的综合智能家居网络控制系统平台。
智能家居系统的网络化功能可以提供遥控、家电(空调,热水器等)控制、照明控制、室内外遥控、窗帘自控、防盗报警、电话远程控制、可编程定时控制及计算机控制等多种功能和手段,使生活更加舒适、便利和安全。由于智能家居系统布线简单、功能灵活,扩展容易而被人们广泛接受和应用。
智能家居结构如图2-2所示。智能家居核心是整个系统中央的智能家居应用层系统,负责管理和控制所有子系统。
智能家居结构如图2-2所示
智能家居目前的发展还处于物联网应用的初级阶段,出现部分“智能”的家居设备,如远程抄表系统、自动窗帘系统等,实现初步的“家庭自动化”,但距离真正实现智能家居还有很长的路要走,尤其是对目前很多传统家居改造工作非常重要。完全推倒重建,可以直接步入智能家居时代,但其花费过大,而且容易造成资源浪费。所以,对目前传统家居进行改良,使其能够实现智能家居系统的基本功能,具有重要的意义。
智能家居
【项目需求分析】
1.现状与市场需求分析
目前,智能家居行业还处于一个初始发展阶段,国际社会暂时还没有形成一个公认的标准。智能家居的目标是:舒适丰富的生活环境,使用户身心健康,个性化;建立安全有效的防御体系,实现防火、防盗、防毒等方面的安全防范;提供智能化、方便灵活的生活方式,实现 单一监控与操作,远程监控;高效、可靠的工作模式,实现信息采集、整理、分析、决策 一体的数据自动处理智能平台。家居智能系统让用户随时随地获取家内的安全情况和舒适度信息,让用户更好地管理整个家庭,创造更安全和更舒适的家庭环境。
家居智能系统主要发展趋势:
(1)多媒体更多地介入智能家居,并逐渐将占主要地位。
(2)综合的体系结构是未来智能家居的主要体系。
(3)系统的标准化和市场的规范化是智能家居发展的基础。
2.系统功能需求分析
不同的实际环境对智能家居提出了不同的要求与解决办法。此外,不同的用户对智能家居有着不同的要求,有些用户比较注重家电的智能控制,有些用户可能更加关心家庭安全防范,还有些用户希望建立相对全面的智能家居系统,满足多方面的需求。
智能家居系统常见包括中央控制子系统、智能窗帘子系统、智能照明子系统、智能家电系统、环境监控子系统、智能安防子系统、智能门禁子系统、远程抄表子系统等。
此外,为进一步提升生活品质,一些住宅还配有家庭影院系统、家用中央吸尘及新风系统、宠物设备、智能卫浴系统、车库智能换气系统、自动浇花系统、自动给排水系统等智能家居系统。
智能家居系统应该具有以下特点:
①系统构成灵活。从总体上看,智能家居系统是由各个子系统通过网络通信系统组合而成的,可以根据需要,减少或者增加子系统,以满足需求。
②操作管理便捷。智能家居系统的所有设备可以通过手机、平板电脑、触摸屏等人一机接口操作,方便、快捷。
③场景控制功能丰富。可以设置各种控制模式,如回家模式,夜晚模式,安全模式、报警模式等,满足生活品质需求。
④安装,调试方便。即插即用,特别是采用无线的方式,可以快速部署系统。
3.技术需求分析
随着新技术和自动化的发展,传感器的使用数量越来越多,功能越来越强,各种传感器已经标准化、模块化,给智能家居系统的设计提供了极大方便。在技术方面,在智能家居系统中,无线网络技术应用于家庭网络是势不可挡的趋势,这不仅仅因为无线网络可以提供更大的灵活性、流动性,省去了花在综合布线上的费用和精力,而且它更符合于家庭网络的通信特点;同时,无线网络技术a进-步发展,必将促进家庭环境智能化、网络化的进程。
为了实现智能家居系统的功能,系统设计要求如下所述。
硬件设计要求
(1)小型化:为了保证设备外观漂亮,应尽量保证节点的体积小型化;
(2)低功耗:由于设备需要长期在无人值守的情况下工作,所以要使用低功耗的器件以节约能源延长使用寿命;
(3)可靠性:为了保障各监测节点能够正常工作,必须提高硬件的可靠性;
(4)可扩展性:当有新的监测对象引入该系统时,不同类型的传感器模块的信号形式与大小可能制约系统的兼容性,系统的硬件设计时必须具有较高的可扩展性。
软件设计需求
(1)模块化结构:保证软件设计的各部分采用模块化结构设计,各模块之间的通信按照规定接口进行,任何一个模块的更新何改进都不会影响到其他模块;
(2)数据格式统一:任何两个模块在通过接口传输数据时的格式要统一,便于通信传输,提高传输性能。模块内部可根据需要对数据格式进行数据转化。
开发平台需求
智能家居系统一般宜采用智能移动终端为应用对象,采用基于Android或iOS为开发平台,同时结合计算机平台。
其他需求分析
性能:系统响应时间应该足够短,及时处理和响应相关操作。
安全性:不允许以明文方式保存用户卡号等各类密码相关信息,保证数据的安全性。
可靠性:整个系统应能够连续24个小时不间断工作,出现故障应能及时告警。系统发生故障时能具备相应恢复措施,进行快速的恢复正常运行。同时,应用软件要防止消耗过多的系统资源而使系统崩溃。
通用性:整个系统应尽可能使用通用接口设备,兼容广泛的连接技术。
【系统的总体设计】
智能家居系统的设计成功与否,取决于系统的设计和配置是否经济合理并且系统能否成功运行,系统的使用、管理和维护是否方便,系统或产品的技术是否成熟适用,换句话说,就是如何以最少的投入、最简便的实现途径来换取最大的功效,实现便捷高质量的生活。
智能家居系统设计时要遵循以下原则:
1.实用性便利性
智能家居最基本的目标是为人们提供舒适、安全,方便和高效的生活环境。对智能家居产品来说,最重要的是以实用为核心,摒弃那些华而不实,只能充作摆设的功能,产品要以实用性、易用性和人性化为主。
2.可靠性
整个建筑的各个智能化子系统应能24小时运转,系统的安全性、可靠性和容错能力必须高度重视。对于各个子系统,在电源、系统备份等方面采取相应的容错措施,保证系统正常、安全使用,质量、性能良好,具备应付各种复杂环境变化的能力。
3.标准性
智能家居系统方案的设计应依照国家和地区的有关标准,确保系统的扩充性和扩展性。在系统传输上,采用标准的TCP/IP协议网终技术,保证不同产商系统之间可以兼容与互联。系统的前端设备是多功能的、开放的、可以扩展的设备。例如,系统主机、终端与模块采用标准化接口设计,为家居智能系统外部厂商提供集成的平台,而且其功能可以扩展,当需要增加功能时,不必再开挖管网,简单、可靠、方便、节约。设计选用的系统和产品能够使本系统与未来不断发展的第三方受控设备互通互连。
4.方便性
布线安装是否简单,直接关系到成本、可扩展性,可维护性的问题。一定要选择布线简单的系统,施工时可与小区宽带一起布线,简单、容易;在设备方面,应容易学习、掌握,操作和维护简便。
系统便于安装、调试,也非常重要。家庭智能化有一个显著的特点,就是安装、调试与维护的工作量非常大,需要大量的人力、物力投入,成为制约行业发展的瓶颈。针对这个问题,系统在设计时,就应考虑安装与维护的方便性,比如系统可以通过Intemet远程调试与维护。
通过网络,不仅使用户能够实现家庭智能化系统的控制功能,还允许工程人员在远程检查系统的工作状况,诊断系统出现的故障。这样,系统设置与版本更新可以在异地进行,大大方便了系统的应用与维护,提高了响应速度,降低了维护成本。
5.先进性
在满足用户现有需求的前提下,设计时应充分考虑各种智能化技术迅猛发展的趋势,不仅在技术上保持最先进和适度超前,更注重采用最先进的技术标准和规范, 以适应未来技术发展的趋势,使整个系统随着技术发展和进步,具有更新,扩充和升级的 能力。系统设计应遵循开放性原则,软件、硬件、通信接口、网络操作系统和数据库管理系统等符合国际标准,使系统具备良好的兼容性和扩展性。
本系统的总体设计有以下内容:
1 系统网络结构
在智能家居系统组网结构中,家居设备,移动终端以及其他域设备通过网关实现信息互通、协议转换、信息共享和交互;借助有线网络与无线互联,各种智能家居设备可以自动、无须任何配置地接入系统,极大提高了系统的灵活性、易用性及可扩展性。
基于物联网的智能家居系统采用分层体系架构,分别为感知层、网络传输层、融合服务层3个层面。
智能家居感知层:包括了各种与家电、家居有关的传感器、控制器、执行器及识别装置等,以及有线网络结合无线泛在网络的物理连接。这一层还包括不同接入方式的MAC子层和链路控制子层,作用包括:对上层网络层提供统一的接口,屏蔽异构网络之间的差异;进行不同形式家庭通信网络间的MAC协议数据单元(PDU)映射,以便不同网络间互通;支持动态、智能的有线网络及多种无线网络的接入及选择。
智能家居网络传输层:主要包括家庭内部网络和骨干网络接入两部分。家庭内部组网支持的有线方式包括以太网IEEE802.3、802.3u、串行USB和IEEE1394等;无线方式包括无线局域网、家庭射频技术、ZigBee等。网络接入层通过家庭网关与业务网关,实现不同应用协议规范的互联、互通、互操作,并与骨干网络实现无缝连接。
智能家居融合服务层:以用户为中心的融合业务层提供用户接口和不同制式的智能家居服务。通过智能家居组网多层协作的自适应QoS,自适应匹配已购网络终端设备,充分保证端到端多种业务服务。
本项目中设计的智能家居系统示例的无线传感网络采用星型连接,主要包括了一个基于Android的控制中心、一个家庭网关、若干个无线通信子节点以及一台服务器。家庭网关上有一个ZigBee无线收发主模块,而其他终端设备上安装ZigBee无线通信模块,通过这些ZigBee无线模块,数据就在主节点和子节点之间进行传输。
智能家居中的无线传感网络结构如图2-3所示
图2-3 智能家居系统网络结构
2 主要功能模块
本系统坚持模块化的设计原则,保持各个模块功能的独立性,以便在系统有新的模块加入或旧模块退出时保持系统稳定;同对,为了保证节点长期工作,必须减少节点的功耗。
作为智能家居系统示例,设计的模块包括:智能门禁模块、环境监控模块、火灾报警模块和智能窗帘模块,结构如图2-4所示:
图2-4 智能家居系统模块结构
⑴ 智能门禁模块
智能门禁模块突破了传统的只有钥匙才可以开锁的观念,其智能化体现在识别率、准确率、安防性和人性化等方面。
⑵ 环境监控与消防报警模块
该模块将采集的环境数据通过多种方式呈现给用户。环境监控模块通过无线传感网实时采集房间内的环境信息。通过该模块,用户可以直接在房间内的终端中实时获知居住环境的信息,如温湿度、光线明暗程度、有害气体浓度、火灾信息等,分析室内环境舒适度。
当房间内发生火灾等特殊情况时,通过烟雾、火焰传感器,将紧急情况(系统中表示为火灾)警报发送给小区物业保安室的PC端,提示相关人员注意。当烟雾报警器或火焰报警器侦测到烟雾或火焰时,将连接小区物业监控程序,发送报警命令给小区物业保安,寻求相关人员的后续处理。
⑶ 智能窗帘模块
智能窗帘模块通常是由遮阳窗帘、电机及控制子模块组成。控制子模块软件是智能遮阳模块的一个组成部分,与智能窗帘模块硬件配套使用。在智能家居系统中,控制软件通常属于智能家居控制主机软件的一部分。一个完整的智能遮阳系统能根据周围自然条件的变化,通过系统线路,自动调整帘片角度或做整体升降,完成对遮阳百叶的智能控制功能,既阻断辐射热、减少阳光直射,避免产生眩光,又充分利用自然光,节约能源。
3 系统的数据库
智能家居系统示例的数据库设计了用户表和RFID卡表,
用户表包括用户的ID、用户名和所对应的RFID卡号字段,用于门禁管理,识别合法用户,管理登录验证。
RFID卡表包括用户卡的ID、用户卡的状态字段,用于门禁验证查询用户卡相关信息。
4 系统的业务流程
智能门禁模块业务流程:系统初始化→用户刷卡→系统读卡。如果是有效卡,则查询数据库,验证用户合法性;如果不是有效卡,要重新注册。如果是合法用户,验证结束。
具体流程如图2-5所示
图2-5 智能门禁模块业务流程图
环境监控与火灾报警模块业务流程:系统初始化→实时从传感器采集数据→与阈值匹配验证是否正常。如果环境数据在正常范围内,则在用户界面显示;如果环境数据不在正常范围内,则在用户界面告警,并将告警信息传输到服务器。
具体流程如图2-6所示
图2-6 环境监控与火灾报警模块业务流程图
智能窗帘控制模块业务流程:系统初始化→获取窗帘状态信息→获取按钮动作(开、关或停)→与当前窗帘状态匹配。如果不匹配,则将窗帘状态改为按钮对应状态,对窗帘进行控制,完成当前动作
具体流程如图2-7所示
图2-7智能窗帘控制模块业务流程图
射频识别即RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电信号识别特定目标并读写相关数据,无须识别系统与特定目标之间建立机械或光学接触。常用的有低频(125k—134. 2kHz)、高频(13. 56MHz)、超高频、微波等技术。RFID读写器分移动式的和固定式的。目前RFID技术应用很广,如物流和供应管理、生产制造和装配、航空行李处理、邮件或快运包裹处理、文档追踪或图书馆管理、动物身份标识、运动计时、门禁控制或电子门票、道路自动收费、一卡通、仓储中的塑料托盘及周转管理等。
一套完整的RFID系统是由阅读器(Reader)、电子标签(TAG)(也就是所谓的应答器( Transponder))及应用软件系统三个部分组成,其工作原理是:阅读器发射一个特定频率的无线电波给应答器,用以驱动应答器电路将内部的数据送出,此时阅读器依序接收、解读数据,并送给应用程序做相应的处理。
应答器由天线、耦合元件及芯片组成。一般情况下,都是用标签作为应答器,每个标签具有唯一的电子编码,附着在物体上标识目标对象。
阅读器由天线、耦合元件及芯片组成,是读取(有时还可以写入)标签信息的设备,可设计为手持式RFID读写器(如C5000w)或固定式读写器。
应用软件系统是应用层软件,主要是进一步处理收集的数据,使之为人们所使用。
RFID技术的基本工作原理并不复杂:标签进入磁场后,接收解读器发出的射频信号,凭借感应电流获得的能量发送存储在芯片中的产品信息(Passive Tag,无源标签或被动标签),或者由标签主动发送某一频率的信号(Active Tag,有源标签或主动标签),解读器读取信息并解码后,送至中央信息系统进行有关的数据处理。
RFID的性能特点如下所述:
①快速扫描。RFID辨识器可同时辨识、读取数个RFID标签。
②体积小型化、形状多样化。RFID在读取上不受尺寸大小与形状限制,不需为了读取精确度而配合纸张的固定尺寸和印刷品质。此外,RFID标签向小型化与多样形态发展以应用于不同产品。
③抗污染能力和耐久性。传统条形码的载体是纸张,因此容易受到污染,但RFID对水、油和化学药品等物质具有很强的抵抗性。此外,由于条形码附于塑料袋或外包装纸箱上,所以特别容易受到折损;RFID卷标是将数据存在芯片中,因此可以免受污损。
④可重复使用。现今的条形码印刷上去之后就无法更改,RFID标签则可以重复地新增、修改、删除RFID卷标内存储的数据,方便信息更新。
⑤穿透性和无屏障阅读。在被覆盖的情况下,RFID能够穿透纸张、木材和塑料等非金属或非透明的材质,并能够进行穿透性通信。而条形码扫描机必须在近距离而且没有物体阻挡的情况下,才可以辨读条形码。
⑥数据的记忆容量大。一维条形码的容量是50字节,二维条形码最多可存储2000-3000字节,RFID的最大容量有数兆字节。随着记忆载体的发展,数据容量不断扩大。未来物品所需携带的资料量越来越大,对卷标扩充容量的需求相应增加。
⑦安全性。由于RFID承载的是电子式信息,其数据内容由密码保护,使其内容不易被伪造及变造。RFID产品的工作频率包含低频、高频和超高频。
低频RFID技术首先在低频得到广泛的应用和推广。该频率主要是通过电感耦合的方式工作,也就是在读写器线圈和感应器线圈间存在变压器耦合作用。通过读写器交变场的作用,在感应器天线中感应的电压被整流,用作供电电压。磁场区域能够很好地被定义,但是场强下降得太快。
高频RFID的感应器不再需要线圈绕制,可以通过腐蚀或者印刷的方式制作天线。感应器一般通过负载调制的方式工作,也就是通过感应器上负载电阻的接通和断开,促使读写器天线上的电压发生变化,实现用远距离感应器对天线电压进行振幅调制。如果通过数据控制负载电压接通和断开,这些数据能够从感应器传输到读写器。
值得关注的是,在13.56MHz频段中主要有IS0 14443和IS0 15693两个标准。符合ISO 14443标准的产品俗称Mifare 1系列产品,其识别距离近、价格低、保密性好,常作为公交卡、门禁卡使用。IS0 15693产品的最大优点在于其识别效率,通过较大功率的阅读器,可将识别距离扩展至1.5m以上,由于波长的穿透性好,在处理密集标签时优于超高频的读取效果。
超高频RFID系统通过电场来传输能量。电场的能量下降得不是很快。该频段的读取距离比校远,无源可达lOm左右,主要通过电容耦合方式实现。
ZigBee技术前面项目1已介绍。ZigBee译为“紫蜂”,它与蓝牙类似,是一组基于IEEE 802. 15.4无线标准研制开发的有关组网、安全和应用软件方面的通信技术。ZigBee有自己的无线通信标准,可在数千个微小的节点之间协调通信,这些节点只需要很少的能量,以接力的方式通过无线电波将数据从一个节点传到另一个节点,通信效率非常高。
ZigBee技术具有以下几个显著特点:
①节点功耗低。
节点的收发距离短,所需功耗低。另外,ZigBee技术配合芯片采用多种节能工作模式,确保两节五号电池支持长达6个月到1年半左右的使用时间。
②网络的自组织强。
ZigBee具有自组织功能,网络节点工作无须人工干预,并能够感知其他节点的存在,并确定连接关系,组成结构化网络。
③网络容量大。
一个ZigBee网络可容纳多达65000个节点,每个节点容纳最多254台从设备,一个区域内可以同时存在200多个ZigBee网络。
④延时短。典型搜索设备延时为30ms,休眠激活延时为15ms,活动设备信道接入延时为15ms
⑤开发成本低。ZigBee网络协议简单.开发时间成本较低,而且ZigBee协议免除专利费,ZigBee的工作频率采用ISM频段,选择灵活。同时,各大半导体公司设计出适合ZigBee技术规范的芯片,价格较低廉。
SQLite是一个非常流行的嵌入式数据库,它支持SQL语言.并且只利用很少的内存就有很好的性能。此外,它是开源的,任何人都可以使用它。许多开源项目( Mozilla,PHP、Pyphon)都使用SQLite。
SQLite由以下几个组件构成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟器和数据库引擎(VDBE),使调试、修改和扩展SQLite的内核更加方便。
SQLite基本符合SQL-92标准,和其他的主要SQL数据库没什么区别。其优点就是高效,Aridroid运行时环境包含了完整的SQLite。
SQLite和其他数据库最大的不同就是对数据类型的支持。创建一个表时,可以在GREATE TABLE语句中指定某列的数据类型,但是用户可以把任何数据类型放入任何列种。当某个值插入数据库时,SQLite将检查其类型。如果该类型与关联的列不匹配,SQLite会尝试将该值转换成该列的类型。如果不能转换,该值将作为其本身具有的类型存储。比如,可以把一个符串(String)放在INTEGER到。SQLite称之为“弱类型”(manifest typing)。
此外,SQLite不支持一些标准的SQL功能.特别是外键约束(FOREIGN KEY con-strains),嵌套transcaction、RIGHT OUTER JOIN 和FULL OUTER JOIN,还有一些ALTER TABLE功能。SQLite是一个完整的SQL系统,拥有完整的触发器、交易等。
1.Android开发平台搭建
准备工作
Android应用开发环境平台使用的是Eclipse开发环境,Android环境平台的搭建一般包括以下几个部分安装与配置:
1.JDK(Java(TM) SEDevelopment Kit)安装配置。
2.集成eclipse和ADT的adt-bundle-windows安装。
3.ADT安装与配置。
环境配置
1.JDK安装配置
2.集成eclipse和ADT的adt-bundle-windows安装。
3.ADT安装与配置。
Android开发平台的搭建步骤如下:
(1)第一步:JDK安装配置
①双击jdk-7u60-windows-i586.exe,单击“下一步”按钮如图2-8所示,选择安装的JDK路径如图2-9所示,单击“下一步”完成安装。
图2-8 JDK安装
图2-9 JDK安装路径设置
②配置JDK环境变量。在桌面上鼠标右击“计算机”图标,在快捷菜单中选择“属性”命令,在打开的窗口中单击左边侧栏里的“高级系统设置”选项,弹出“系统属性”对话框,如图2-10所示。
图2-10 环境变量设置页面
③在“系统属性”的“高级”选项卡中,单击“环境变量”按钮,出现如图2-1l所示的“环境变量”配置
④单击“新建”按钮,在系统变量中添加一项JAVA_HOME,值为jdk的安装路径,如图2-12所示。
⑤ 单击“确定”按钮,返回到图2-11所示的对话框。继续单击“新建”按钮,添加一项系统变量classpath,值为“,;%JAVA_HOME%\lib; %JAVA_HOME%\lib\tools.jar”(注:在最前面有一个点,且变量值之间用“;”隔开,这些都是英文半角符号),如图2-13所示。
⑥单击”确定”按钮,选择系统变量的Path项,单击”“编辑”按钮,进行配置用户变量。在变量值前增加“%jAVA_HOME%\bin;%JAVA_HOME%\jre\bin;”,参考步骤⑤完成。
⑦检验JDK安装是否成功。单击“开始”→“运行”命令,在“运行”窗口中输入DOS命令“javac-version”并回车,出现命令列表,JDK安装成功,如图2-14所示。或者输入javac或者java命令,出现帮助信息,也证明JDK安装成功。
(2)第二步:安装集成eclipse和ADT的adt-bundle-windows安装
图2-11 环境变量配置
图2-12 添加“JAVA_HOME”系统变量
图2-13 添加“classpath”系统变量
图2-14 检验JDK安装是否成功
①登录安卓的开发网站http://developer. android. com/sdk/index.html下载与操作系统(32位或者64位的操作系)相对应的adt-bundle-windows安装文件,下载成功后解压缩软件包任意盘符下,如“D:”盘。 ②在解压后的文件夹中,单击运行eclipse.exe启动Eclip IDE ,打开eclipse,然后在菜单栏单击Window → Preferences命令,在弹出的窗口中展开左侧General→Workspace路径,然后在右边下端设置编码格式为UTF-8,然后单击Apply按钮,如图2-15所示。
图2-15 设置UTF-8编码格式
注:不设置这个编码格式也能编写代码,不过UTF-8是国际通用的编码格式,有助于以后代码的移植。
(3)第三步:ADT安装与配置
①在上一步解压的相应目录下,运行eclipse.exe启动Eclipse IDE ,在Eclipse的菜单中,单击Window→
Android SDK Manager 命令或单击工具栏上的 图标,出现Android SDK Manager 命令或单击工具栏上的 图标,出现Android SDK Manager窗口,如图2-16所示。
图2-16 “Android SDK Manager”系统变量
②更新Android SDK。 在图2-16对话框选择需要下载的版本(建议android4.2、android4.1、android4.0、android2.3、android2.2等主流版本),然后单击右下方的In-stall packages按钮,进行下载安装。
③创建AVD虚拟设备。在Eclipse的菜单中,选择Window→Android Virtual DeviceManager命令或单击工具栏上的 图标,出现Android SDK Manager窗口,单击右侧的New按钮,弹出建立一个虚拟设备的对话框,如图2-17所示。
④在Create new Android Virtual Device对话框中完成各选项配置,如图2-18所示,单击OK按钮完成。
⑤在Android Virtual Device Manager窗口中,选择一个设备,单击右侧的Start按钮,将启动虚拟设备,选中Scale Display选项,调整虚拟机屏幕大小。启动后的AVD界面如图2-19所示。
图2-17 创建AVD
图2-18 配置AVD
图2-19 启动后的AVD界面
2.创建Android工程示例
(l)第一步:创建一个简单的Android工程
①打开Eclipse IDE,依次单击File→New→Project命令,弹出New Project对话框,选择Android Application Project项,弹出New Android Application对话框,如图2-20所示。
图2-20 “New Android Application”对话框
②按图2-20所示填写必要的参数。Project Name为包含这个项目的文件夹的名称。Package Name 为“包名”,用包名来区分不同的类是很重要的,如使用com. helloworld. test。
③单击Next按钮,使用默认设置;再单击Next按钮,弹出Create Activity对话框,选择Activity类型;再单击Next按钮,弹出如图2-21所示,修改Activity Name、Lay-outName、Title的内容。Activity Name是项目的主类名,这个类型将会是Android的Activity 类的子类。
图2-21 “Creat Activity”对话框
④单击Finish按钮,完成工程创建。在Eclipse中,可见如图2-22所示的android应用程序目录结构。
Android应用程序目录结构解释如下:
src目录:存放该项目的源代码,其内部结构根据用户所声明的包自动组织
gen目录:该目录的文件是ADT自动生成的,实际上只定义了一个R.java文件。
该文件相当于项目的字典,项目中用户界面、字符串、图片、声音等资源都会在该类中创建其唯一的ID。当项目中使用这些资源时,通过该类得到资源引用。
R.java文件中默认有attr、drawable、layout、string 4个静态内部类,每个静态内部类分别对应一种资源,如layout静态内部类对应layout中的界面文件。每个静态内部类中的静态常量分别定义一条资源标识符,如“publistatic final int main= Ox7f030000;”对应的是layout目录下的main.xml文件。
R.Java文件除了有自动标识资源的“索引”功能之外·还有另一个主要的功能,即若res目录中的某个资源在应用中没有被使用到,在该应用被编译时,系统不会把对应的资源编译到该应
用的APK包中,这样可以节省Android手机的资源。
●android 4.2.2目录:该目录中存放的是该项目支持的JAR包,同时包含项目打包时需要的META-INF目录。
●assets目录:用于存放项目相关的资源文件,例如视频文件、MP3等媒体文件。
●res目录:res是resource的缩写,存放应用程序中经常使用的资源文件,如存放一些图标、界面文件、应用中用到的文字信息。
res目录下有3个dawable文件夹-draw-able -* dpi,区别只是将图标按分辨率高低来放入不同的目录。drawable -hdpi用来存放高分辨率的图标,drawable -mdpi用来存放中等分辨率的图标,drawable -ldpi用来存放低分辨率的图标。程序运行时,根据手机分辨卒的高低选取相应目录下的图标。
layout子目录的文件main. xml是布局文件。
values子目录下有个strings. xml文件,用来定义字符串和数值等文字内容。在Activity中使用getResources().getString (resourceld)或getResources().getText (re一sourceld)取得资源。 raw子目录存放应用程序用到的声音等资源。 图2-22 Android应用程序目录结构
values子目录存放所有XML格式的资源描述文件。
●AndroidManifest. xml:该文件是应用程序系统功能配置清单文件,列出了应用中使用的所有组件。
AndroidManifest. xml主要有以下功能:
★命名应用程序Java应用包,这个包名用来唯一标识应用程序。
★描述应用程序的组件--活动、服务、广播接收者、内容提供者;命名实现每个组件和公布其功能(比如,能处理哪些意图消息)的类。这些声明使得Android系统了解这些组件,以及它们在什么条件下可以被启动。
★决定应用程序组件运行在哪个进程里。
★声明应用程序必须具备的权限,用以访问受保护的部分API,以及和其他应用程序交互。
★声明应用程序其他的必备权限,用于组件之间的交互
★列举测试设备Instrumentation类,用来提供应用程序运行时所需的环境配置及其他信息。这些声明只在程序开发和测试阶段存在,发布前将被删除。
★声明应用程序所要求的Android API的最低版本级别。
★列举application所需要链接的库。
ProjecL properites配置文件在创建项目时自己就配置了版本信息。
⑤展开res—layout,打开activity_main.xml文件。切换到Craphical Layout 视图,
添加一个按钮,按表2-3所示修改activity_main.xml布局文件。
表2-3 activity_main.xml控件
控件类型ID | 属性Text | 属性值 | 说明 |
Button | buttonl | 单击按钮 | 触发事件 |
TextView | textView2 | Hello world! | helloworld文本 |
备注:也可以切换到activity_main. xml视图下,通过直接编辑XML文件内容来修改界面布局。
修改后的activity_main. xml布局如图2-23所示。
⑥展开src→com.helloworld,打开MainActivity. java文件。编辑该文件,添加An-
droid单击事件。实现单击命令按钮时,弹出提示信息框,提示内容与textViwe2控件的
文本内容相同,即“HeIIoWorld!”。
在 activity_main. xml文件添加描述文档 ,代码如下所示:
1. <RelativeLayout xmlns : android = " http : //schemas. android.com/apk/res/android"
2. xmlns : tools = "http: //schemas. android. com/tools"
3. android : layout_width = " match_parent"
4. android : layout_height = " match_parent"
5. android : paddingBottom = " @ dimen/activity_vertical_margin"
6. android : paddingLeft = " @dimen/activity_horizontal_margin"
7. android : paddingRight = " @ dimen/activity_horizontal_margin"
8. android : paddingTop = " @dimen/activity_vertical_margin"
9. tools:context=".MainActivity">
图2-23 编辑activity_main.xml
10. <TextView
11. android : id = " (@ + id/textViewl"
12. android : layout_width = " wrap_content"
13. android : layout_height = " wrap_content"
14. android: text = " @ string/hello_world" />
15. <Button
16. android : id = " @ + id/buttonl"
17. android : layout_width = " wrap_content"
18. android : layout_height = " wrap_content"
19. android : layout_alignLeft = " @ + id/textViewl"
20. android : layout_below = " @ + id/textViewl"
21. android : layout_marginLeft = "44dp"
22. android : layout_marginTop = "34dp"
23. android : text = " @ string/button" />
24. <TextView
25. android : id = " @ + id/textView2"
26. android : layout_width = " wrap_content"
27. android : layout_height = " wrap_content"
28. android : layout_alignLeft = " @ + id/textViewl"
29. android : layout_below = " @ + id/buttonl"
30. android : layout_marginLeft = " 23dp"
31. android : layout_marginTop = " 34dp"
32. android: ems = "1O"
33. android : text = "@string/str" >
34. <requestFocus />
35. </TextView>
36. </RelativeLayout
打开strings. xml文件,添加完整代码如下所示,
1. <?xml version= "1.O' encoding ="utf - 8"?>
2. <resources>
3. <string name = "app_name">My first HelloWorld</string>
4. <string name ="action_settings">Settings</string>
5. <string name =" hello_world">Hello world! Hello Android!/string>
6. <string name = "button" >单击按钮 </string>
7. <string name = "str" >Hello world! </string>
a. </resourcea>
打开MainActivity.java文件,添加完整代码如下所示:
1. package com. helloworld. test;
2. import android. os. Bundle;
3. import android. app. Activity;
4. import android. view. Menu;
5. import android. view. View;
6. import android. widget. Button;
7. import android. widget TextView;
8. import android. view. View. OnClickListener;
9. import android. widget. Toast;
1O. public class MainActivity extends Activity{
11. private TextView textView2
12. @ Override
13.pretected void onCreate(Bundle savedInstanceState){
14. super. onCreate( savedInstanceState);
15. setContentView(R.layout.activity_main);
16. //获取textView2文件控件
17. textView2= (TextView)findViewById(R.id.button1);
18. //获取buttonl按钮控件
19. Button but=(Button)this.findViewById(R.id.button1);
20. //添加按钮侦听事件
21. but. setOnClickListener(new OnClickListener(){
22. public void onClick(View v){
23. String str=textView2.getText().toString();
24. Toast,makeText(getApplicationContext(),str,Toast.LENGTH_SHORT).show();
25. }
26. });
27. }
28. @ Override
29. public boolean onCreateOptionsMenu(Menu menu) {
30. // Inflate the menu; this adds items to the action bar if it is present.
31. getMenuInflater(). inflate(R.menu.main,menu);
32. return true;
33. }
34. }
(2)第2步:测试Hello World 项目
在Eclipse中,右击“Hello World”项目,在弹出的菜单上执行Run AS→Android Application命令,
创建一个新的配置文件;设置右侧Android选项中的Name项,并指定Project项目,如图2-24所示。
图2-24 配置“Android”选项卡
①单击Target选项卡,如图2-25所示。在Target选项卡右侧列表中,选择创建的模拟器。
②勾选已创建的AVD模拟器,单击Apply按钮后,再单击Run按钮,运行该程序。单击命令按钮时.将弹出文本相同的内容提示信息框。运行结果如图2-26所示。
图2-25 配置“Target”选项卡
图2-26 “HelloWorld”运行结果