基于Android平台的信息家电控制系统的设计与实现

ating 贡献于2014-05-26

作者 zhwy20  创建于2012-05-19 09:05:00   修改者zhwy20  修改于2012-05-22 05:56:00字数21897

文档摘要: 本系统使用的是友善之臂的ARM11开发板Tiny6410,可以利用该开发板上的USB接口,接上摄像头,再在网页上浏览摄像头拍摄到的图片,根据图片上显示的信息人工进行对家电的控制,从而实现远程监控的系统设计。本系统需要在开发板上安装一个Android操作系统,再将能完成摄像头监控的程序安装到开发板上,最后用Java语言编写一个对应的客户端安装到开发板上,这样就可以直接通过该客户端实现对摄像头以及家电的控制。
关键词:

 基于Android平台的信息家电控制系统的设计与实现 摘 要 随着网络技术的发展和广泛普及,PC作为网络第一接入设备的地位正在不断削弱,而集电脑、通信和消费类电子产品三者功能于一身的信息家电产品已经成为一个不可阻挡的发展潮流,同时Android操作系统已成为许多手机制造商的宠儿,将二者结合在一起,Android操作系统将为信息家电控制系统的开发提供更好的平台。 本系统使用的是友善之臂的ARM11开发板Tiny6410,可以利用该开发板上的USB接口,接上摄像头,再在网页上浏览摄像头拍摄到的图片,根据图片上显示的信息人工进行对家电的控制,从而实现远程监控的系统设计。 本系统需要在开发板上安装一个Android操作系统,再将能完成摄像头监控的程序安装到开发板上,最后用Java语言编写一个对应的客户端安装到开发板上,这样就可以直接通过该客户端实现对摄像头以及家电的控制。 关键词 信息家电;ARM11;Android ;控制 The Design and Implementation of Intelligent Appliances Control System Based on the Android Platform Abstract Along with the development of network technology and widely available, the PC as an Internet access equipment status of the first is increasingly weakened, and set the computer, communication, and consumer electronic products three functions in one information appliance product has become an irreversible trend, and Android operating system has become many mobile phone manufacturer's pet,bringing them together, the Android operating system for the development of information appliances control system can provide better platform. This system is using the ARM11development board, Tiny6410,of FriendlyARM , we can use the USB port of the development board, Connected to the camera, and then,we can browse the picture on the web, according to the information shown in the pictures,we can control our home appliance, so as to realize the remote monitor and control system design. This system needs to install a Android operating system,and then install the program that be able to complete the surveillance camera, finally we will use Java language to write a corresponding client setup to the development board, which can directly realize the control of cameras and home appliances through the client . Key words Intelligent appliances;ARM11;Android;Control 第一章 绪论 1.1信息家电概述 信息家电指带有嵌入式处理器的小型家用(个人用)信息设备,它的基本特征是与网络(主要指互联网)相连而有一些具体功能,可以是成套产品,也可以是一个辅助配件。信息家电利用先进的计算机、网络通信、人工智能等技术,将与家庭生活有关的各种家用电器应用子系统有机地结合在一起,通过综合家庭范围内的本地管理与控制以及来自家庭之外的远程管理与控制,特别是基于互联网的远程管理与控制,让家庭生活更舒适、有效和便捷。与普通家电相比,智能家电不仅具有传统功能,还能提供舒适、高效、便捷、具有高度人性化的控制方式;将一批原来死板的家居设备结合在一起转变为具有“智慧”的工具,提供全方位的信息交换功能,实现家电控制的实时畅通,优化人们的生活方式,帮助人们有效地安排时间,增强家庭生活的高效性,并为家庭节省能源费用等【1】。而将多个信息家电系统组成网络就构成了智能家居网络系统,它是将家庭中各种与信息有关的通讯设备、家用电器和家庭保安装置通过家庭总线技术连接到一个家庭智能化系统上进行集中的或者异地的监视、控制和家庭事务性管理, 并保持家庭设施与住宅环境的和谐与协调的系统【2】。 1.2Android平台概述 Android平台是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,受到众多开发者的欢迎,成为真正意义上的开放式操作系统。Android凭借其开放性和良好的人机界面,受到广大手机生产商的重视,随着3G时代的到来,Android平台凭借其优势,一方面,Android平台可为众多移动应用开发者提供良好的系统性平台,有利于移动应用的集合;另一方面,终端厂商可以针对自身的特殊需要进行“定制化开发”,Android有可能会改变现在智能手机市场的格局。 Android采用的是Java虚拟机技术,并具有强大的开发环境,包括一个设备模拟器、调试工具、内存和性能检测以及Eclipse IDE(Integrated Development Environment)集成开发环境的开发插件【3】。Android系统中文件系统采用的是一种针对 NAND设备的新型文件系统Yaffs2 J,读写速度更快,并支持大容量的NAND—Flash芯片【4】。 1.3课题的来源背景 目前,作为主流32位RISC嵌入式处理器ARM(Advanced RISC Machines),以其高性能、低功耗的优势占据很大的市场份额。ARM处理器家族大致分为如下系列:ARM7、ARM9、ARM9E、ARM10E、ARM11、SecurCore、和Cortex等。不仅有各大公司的微处理器芯片,还有用于学习和研发的各种配套开发包。目前低层系统和硬件平台经过若干年的研究,已经相对比较成熟,实现各种功能的芯片应有尽有。而且巨大的市场需求给我们提供了学习研发的资金和技术力量。 本论文的选题正是结合Android平台、信息家电这两个热点领域,在广州友善之臂计算机科技有限公司开发的Tiny6410开发板上安装Android操作系统,再通过Java语言编写一个关于信息家电的应用程序,本程序实现的功能是在网页上实现USB摄像头的控制。本系统可以应用于远程的系统监控,能在网页上实时的浏览家中家电的状态并加以控制。 1.4国内外的研究现状 随着网络技术的发展和广泛普及,PC作为网络第一接入设备的地位正在不断削弱,而集电脑、通信和消费类电子产品三者功能于一身的信息家电产品已经成为一个不可阻挡的发展潮流。 无论在国际还是在国内,这股潮流都已经得到了充分的验证。在美国,有94%的人通过个人电脑上网,而到2002年,这一比例将降到64%,30%的个人电脑市场将让位给信息家电。微软公司董事长兼首席执行官比尔·盖茨预言:TV型PC和“口袋”型PC将是下一代PC的代表。为适应这一发展趋势,微软中国研发中心针对国内用户的特点,开发出了适合中国家庭使用环境的维纳斯电脑。目前国内很多知名电子厂商如联想、方正、海尔等,都已经纷纷加入维纳斯阵营,推出了各自不同的基于维纳斯平台的信息家电产品。 目前,我国互联网用户目前已有1000万之多,而且还在以每年翻两翻的速度快速增长。国人对互联网的消费需求由此可见一斑。但由于价格和技术的障碍,我国家庭目前只有200多万台家用电脑;同时,却拥有世界上最大的家电市场:3.17亿台电视,电话普及率已达到25%,城市超过50%。这样的一种反差正好给信息家电留了一个巨大的发展空间。有理由相信,随着国内信息家电产品与技术的不断发展与成熟,信息家电走入千家万户只是迟早的事情。自2009年开始,中国信息家电市场发展迅速,产品产出持续扩张,国内企业新增投资项目投资逐渐增多,企业为了获得更大的投资收益,在生产规模和产品质量上不断提升。世界大的经济环境及国内针对信息家电行业推出的一系列新的政策,加上国家一批重大工程陆续开工建设,对信息家电市场需求必定产生极大的拉动作用。 1.5设计主要内容 利用ARM11开发板自带的USB接口,将摄像头采集到的图像信息在网页上显示出来,并根据这些信息在网页上做出对控制对象的操作,从而通过摄像头实现对家电的远程控制。本系统要实现的功能有 1. 开发板通过摄像头进行实时的视频采集,并将信息反映到互联网上。 2. 在电脑端或手机端能通过安装编写的客户端进行实时的视频监控。 3.客户端能对开发板上的硬件进行控制 第二章 系统分析 2.1研究目标 (1)学会在Linux操作系统上进行程序的编译﹑改写和运行,并熟练掌握Linux操作系统的使用,熟悉其基本的Shell命令,并能进行运用。 (2)在Android操作系统上实现“通过Web远程浏览并控制Tiny6410上的摄像头”,再用Java语言编写一个可以对开发板进行控制的客户端,从而实现在Android平台上控制信息家电系统的设计。 2.2系统框架图 2.3Tiny6410开发板简介 Tiny6410是一款以ARM11芯片(三星S3C6410)作为主处理器的嵌入式核心板,该CPU基于ARM1176JZF-S核设计,内部集成了强大的多媒体处理单元,支持Mpeg4, H.264/H.263等格式的视频文件硬件编解码,可同时输出至LCD和TV显示;它还并带有3D图形硬件加速器,以实现OpenGL ES 1.1 & 2.0加速渲染,另外它还支持2D图形图像的平滑缩放,翻转等操作。 Tiny6410采用高密度6层板设计,尺寸为64 x 50mm,它集成了128M/256M DDR RAM,SLC NAND Flash(256M/1GB)或MLC NAND Flash(2GB)存储器,采用5V供电,在板实现CPU必需的各种核心电压转换,还带有专业复位芯片,通过2.0mm间距的排针,引出各种常见的接口资源,以供不打算自行设计CPU板的开发者进行快捷的二次开发使用。 Tiny6410SDK是采用Tiny6410核心板的一款参考设计底板,它主要帮助开发者以此为参考进行核心板的功能验证以及扩展开发。该底板具有三LCD接口、4线电阻触摸屏接口、100M标准网络接口、标准DB9五线串口、Mini USB 2.0接口、USB Host 1.1、3.5mm音频输入输出口、标准TV-OUT接口、SD卡座、红外接收等常用接口;另外还引出4路TTL串口,另1路TV-OUT、SDIO2接口(可接SD WiFi)接口等;在板的还有蜂鸣器、I2C-EEPROM、备份电池、AD可调电阻、8个中断式按键等。 在布局上安排上,我们尽量考虑把常用尺寸的LCD模块能够固定在底板上,比如3.5”,4.3”LCD, 7”LCD等,这样用户在使用时不至于把各种电线搅在一起,更增加了开发套件的便携性 2.3.1 Tiny6410核心板资源特性如下: Item Description CPU Samsung S3C6410A, run at 533Mhz ARM1176JZF-S, up to 667Mhz RAM 256 DDR RAM(128M is option), default: 256M Flash 128/256M/512M/1GB/2GB Nand Flash, default: 2GB MLC Nand Flash Interface 4 x User Leds 10 pin 2.0mm space Jtag connector Reset button on board Connector - 2 x 60 pin 2.0mm space DIP connector - 2 x 30 pin 2.0mm space GPIO connector Power Supply Supply Voltage from 2.0V to 6V Size 64 x 50 x 12mm (L x W x H) 2.3.2 Tiny6410SDK开发板资源特性如下: Item Description CPU Samsung S3C6410A(ARM1176JZF-S) 频率 运行频率533Mhz, 最高可达667Mhz RAM 128M DDR RAM,可升级至256M Nand Flash 128M/256M/512M/1GB, 缺省为256M 多媒体 支持Mpeg4, H.264, H.263, VC1硬件编解码,高达30fps@SD 3D 支持3D硬件加速处理 2D 支持图形图像无极缩放,旋转,翻转 调试口 COM0 + JTAG + USB Slave PCB尺寸 180 x 130 mm 供电 5V 指示灯 4 x User LED(在核心板), 1 x Power LED 测试按键 8 x User Buttons,中断式按键 USB Slave 1 x mini USB(底板没有设计OTG功能) USB Host 通过USB HUB芯片,实现4个USB Host接口 网络接口 10/100M MB以太网, RJ-45接口 第三章 系统开发环境及相关技术 3.1 Android开发环境介绍 Android的上层应用程序是用Java语言开发,同时还需要基于Dalvik虚拟机,所以,Google公司推荐使用主流的Java继承开发环境Eclipse。只有Eclipse还不够,因为是使用Java语言进行开发,还应该有由SUN公司提供的Java SDK(其中包括JRE:Java Runtime Environment)。此外,Android的应用程序开发和Java开发有较大区别的,所以还需要有Google提供的Android SDK。同时,还需要在Eclipse安装ADT,为Android开发提供开发工具的升级或者变更,是Eclipse下开发工具的升级下载的工具。简言之,需要以下软件,才能搭建Android开发环境,从而进行Android应用程序的开发。 (1) Java SDK (2) Eclipse (3) Android SDK (4) ADT 3.2 Eclipse简介 Eclipse就像软件开发者的『打铁铺』,它一开始备有火炉、铁钻与铁锤。就像铁匠会用现有的工具打造新的工具,也能用 Eclipse 打造新工具来开发软件-这些新工具可扩充 Eclipse 的功能。(Eclipse其中一个卖点就是它的扩充性) 3.2.1 Eclipse的历史背景 Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开发源码项目,它其实是Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。 Eclipse已经成为开放原始码计划(Open Source Project),大部分的开发扔然掌握在IBM手中,但是有一部份由 eclipse.org 的软件联盟主导。 Eclipse项目由Project Management Committee(PMC)所管理,它综观项目全局,Eclipse项目分成 3个子项目: 1.平台-Platform 2.开发工具箱-Java Development Toolkit(JDT) 3.外挂开发环境-Plug-in Development Environment(PDE) 这些子项目又细分成更多子项目。例如 Platform子项目包含数各组件,如Compare、Help与Search。JDT子项目包括三各组件:User Interface(UI)、核心(Core)及除错(Debug)。PDE子项目包含两各组件:UI与Core 3.2.2 Eclipse 版本介绍 可以从eclipse.org网站(http://www.eclipse.org/downloads)下载,可以发现『最新』与『最好』的版本,这两种版本通常不一样,基本上有四种版本或建置(build)可供下载:  1.释出版(Release builds):由Eclipse开发团队所宣称的主要稳定版本。Release builds经过完整测试,并具有一致性、定义清楚的功能。它的定位就跟上市的商业软件一样。 2.稳定版(Stable builds):比Release build新一级的版本,经由Eclipse开发团队测试。并认定它相当稳定。新功能通常会在此过渡版本出现。它的定位就跟商业软件的beta版一样。 3.整合版(Integration builds):此版本的各个独立的组件已经过Eclipse开发团队认定具稳定度,但不保证兜在一起没问题。若兜在一起够稳定,它就有可能晋级成Stable build。  4.当日最新版(Nightly builds):此版本显然是从最新的原始码产生出来的。可想而知,此版本当然不保证它跑起来没问题,搞不好还有严重的bug。 3.2.3 Eclipse特点--跨语言、跨平台 多数人认为Eclipse是Java IDE,不过,当下载Eclipse之后,除了有Java IDE(就是JDT),还有 PDE。然而Eclipse是万用工具平台。JDT实际上是Eclipse的添加品,也就是外挂程序。Eclipse本身实际上是指Eclipse平台(Eclipse Platform),除了下载时能取得Java工具集以外,还提供各种工具的支持,所以平台本身只是相当小的ㄧ组软件。 如果想开发Java程序,用的是Eclipse随附的JDT外挂程序。如果想开发其它语言的程序,就需要拿到其它外挂程序,诸如CDT(C Development Toolkit)就可以开发C/C++程序。 Eclipse跨计算机语言,也跨人类的语言。相同的外挂机制可用来增加对不同语言的支持,这里使用一种特殊的外挂,叫做外挂程序片断(plug-in fragment)。IBM以捐出一个语言套件,支持中文(繁体与简体)、法文、德文、意大利文、日文、韩文、葡萄牙文(巴西)与西班牙文。 照理说Eclipse以Java写成,应该可以在任何的平台执行。但严格来说Eclipse不是跨平台的,因为它使用作业平台的原生图形来建置。因此要等SWT(Standard Widget Toolkit)移植到该平台,Eclipse才能在那个平台执行。但就现实而言到不是什么大问题,因为SWT已经被移植到数个常见平台上了,包括Windows、Linux/Motif、Linux/GTK2、Solaris、QNX、AIX、HP-UX 与 Mac OS X。 3.2.4 Eclipse平台架构 Eclipse 平台的目的,是提供多种软件开发工具的整合机制,这些工具会实作成 Eclipse 外挂程序,平台必须用外挂程序加以扩充才有用处。Eclipse 设计美妙之处,在于所有东西都是外挂,除了底层的核心以外。这种外挂设计让 Eclipse 具备强大扩充性,但更重要的是,此平台提供一个定义明确的机制,让各种外挂程序共通合作(透过延伸extension points)与贡献(contributions)),因此新功能可以轻易且无缝地加入平台。Eclipse 平台由数种组件组成:平台核心(platform kernel)、工作台(workbench)、工作区(workspace)、团队组件(tram component)以及说明组件(help)。 3.3 Android开发平台搭建 Android开发平台搭建步骤为: 1.并安装JDK (Java SE Development Kit) 由于Android SDK和Eclipse都是用Java编写的,因此需要先在Windows 7上安装JDK,JDK可按以下方法下载: 访问网站http://www.oracle.com/technetwork/java/javase/downloads/index.html,在页面中点击JDK: 在打开的页面中,选中Accept License Agreement: 接着根据平台选择jdk下载链接,Windows7 32bit版本是点击jdk-7u4-windows- i586.exe下载JDK的安装程序,下载完成后,双击安装程序,根据向导的提示完成安装即可。 安装完成后,需要将JDK命令添加到Path环境变量中,通过下面的方法将JDK命令所在的路径添加到Path环境变量中: 1) 右击“我的电脑”->属性 ,再选择左边导航的“高级系统设置”选项。 2) 点击右下角的“环境变量”选项。 3) 在"系统变量"中,找到Path 环境变量,双击它,在变量值前面追加以下内容:“C:\Program Files\Java\ jdk1.7.0_03\;”,注意后面有一个分号 4) 点击“确定”完成环境变量设置。 2.下载并安装Android SDK 首先,前往从网站http://developer.android.com/sdk/获取Windows 平台的 最新的Android SDK 套件,下载完成会得到一个安装文件,下载页面如下图所示,请下载符合电脑系统的文件: 双击下载得到的安装程序installer_r11-windows.exe,根据安装向导的提示安装即可,默认将安装在 C:\Program Files\Android\android-sdk目录下,安装完成后,SDK Manager默认会自动启动。 如果安装过程中出现找不到JDK的错误提示,只要Back回去一次再点Next即可。 SDK Manager启动时,由于我们还没有下载任何的Packages,因此会弹出一个Choose Packages to Install的对话框,询问你是否安装所有可用的Packages,由于我只想安装Android 2.3相关的Packages,因此,这里我点击Cancel关闭对话框,回到Android SDK and AVD Manager的主界面。 以后可以通过在开始菜单中找到Android SDK Tools,然后点击SDK Manager来启动SDK Manager,如下图所示: 由于默认SDK是安装在C盘,所以最好将SDK Manager以管理员身份运行,否则在下载并安装Packages时会因为无法往C盘写入数据而导致失败,通过以下方法设置在每次启动SDK时,都以管理员身份启动: 1) 在开始菜单中右击 SDK Manager 的快捷方式,点属性 2) 在SDK Manager 快捷方式的属性对话框,点击“兼容性”的选项卡,选中“以管理员身份运行此程序”,如下图所示: 以后每次点击快捷方式运行SDK时,都会弹出权限确认对话框,点击“是”即可以管理员身份运行程序。 3.下载并安装Android 2.3的相关Packages 用管理员身份启动SDK Manager,在Android SDK and AVD Manager的主界面上,选择 “Available Packages”,点击Android Repository前面的“>”图标展开选项,参考下图选中Android 2.3.3相关的选项: 在上面的对话框中点击“Install Selected”按钮,在弹出的Choose Packages to Install”对话框中,选中“Accept All”单选框,点击“Install”按钮,将进入下载过程,下载速度视你的网速而定,请耐心等待下载完成。 下载完成后,会弹出询问是否重启ADB的对话框,点击Yes即可。 4. 安装 Eclipse 集成开发环境 Android 推荐的 IDE 为 Eclipse,访问以下地址下载Eclipse: http://www.eclipse.org /downloads /: 在下载页面中,参考下图,选择Windows类别,然后下载Eclipse IDE for Java Developers版本(下载32bit还是64bit版本则根据你的Windows7版本的实际情况而定),如下图所示: 下载后会得到一个名为eclipse-java-helios-SR2-win32.zip的压缩包(随着eclipse版本的更新,文件名可能有所不同),Eclipse是不需要安装的,直接解压就可以用了,推荐在D:\根目录下解压这个压缩包,解压后进入eclipse目录,双击eclipse.exe即可启动eclipse。 启动时,首先会让你设置Workspace的路径,这个路径用于保存你所创建所有程序的源代码,你可以自行修改,启动后Eclipse的主界面如下所示: 5.安装Android Development Tools 插件 在上面的步骤中,我们分别安装了Android SDK和Eclipse,但要在Eclipse中使用Android SDK,还需要在Eclipse中安装一个ADT插件,安装方法如下: 访问网址 http://developer.android.com/sdk/eclipse-adt.html#installing ,在网页中找到ADT的下载链接下载它,如下所示: 下载后得到文件ADT-10.0.1.zip,解压后得到如下文件: 先退出Eclipse,然后将这些文件复制并覆盖Eclipse目录下即可完成安装。 6.配置Eclipse 启动Eclipse,在Eclipse主界面上点击Window菜单,选择Preferences,在Preferences对话框中,在左侧选中“Android”,在右侧的SDK Location右边点击Brower按钮,选择SDK的安装路径,默认的路径为C:\Program Files\Android\android-sdk,如下图所示: 7.创建Android模拟器 在开始菜单中找到Android SDK Tools,然后点击SDK Manager来启动SDK Manager,将弹出“Android SDK and AVD Manager”对话框,点击“New...”按钮,将弹出“Create new Android Virtual Device(AVD)”对话框,在Name中输入:Android-AVD,Target中选择: Android 2.3.3 - API Level 10,SD Card输入512, 其它选项默认,点击“Create AVD”按钮即可,如下图所示: 创建完成后,将在列表中列出该模拟器,如下图所示: 可在列表中选中它,然后点击Start,在弹出的Launch Option对话框中点击Launch启动模拟器,效果如下所示: 第四章 Android程序设计及最终效果 4.1Android系统架构 Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。作为一个层次结构的软件集,一定有一个层次的系统构架,下图为Android的构架图: 从图4.1中明显的可以看出该系统从下到上包括Linux内核层、Libraries和运行时环境层、应用程序框架层、应用程序层四层结构。在Android的最下层的操作系统基于Linux2.6内核,往上的中间件包括Libraries和运行时环境层和应用程序框架层两个层次,最上层则是应用程序层【5】。 在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:python、lua、tcl、php等等),还有其他诸如:Qt(qt for android)、Mono(mono for android)等一些著名编程框架也开始支持Android编程,甚至通过MonoDroid,开发者还可以使用C#作为编程语言来开发应用程序。另外,谷歌还在2009年特别发布了针对初学者的Android Simple语言,该语言类似Basic语言。而在网页编程语言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等都已经支持Android开发。 而在Android系统底层方面,Android使用C/C++作为开发语言。 操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari 浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。 Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。 Android 使用skia 为核心图形引擎,搭配OpenGL/ES。skia与Linux Cairo功能相当,但相较于Linux Cairo, skia 功能还只是雏形的。2005年Skia公司被Google收购,2007年初,Skia GL源码被公开,目前Skia 也是Google Chrome 的图形引擎。 Android的多媒体数据库采用SQLite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类(Column)取得共用数据库。 Android的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。 Dalvik虚拟机可以有多个实例(instance), 每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik 虚拟机并非运行Java字节码(Bytecode),而是运行一种称为.dex格式的文件。 4.2 Android的应用 任何一个Android应用程序,都可由四个部分组成,这四个组成部分分别是①Activity;②Intent Receiver;③Service;④Content Provider【6】。对于一个应用程序来说,不一定这四个部分都需要。其中,Activity、Intent Receiver和Service是Android最基本的三个组件。其实,这四个部分全部或者其中几个的相互协调工作组成了我们平时见到的应用程序。 4.2.1Activity Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页。在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。 一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button 按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。 当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,应为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。 4.2.2 、Service Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。Service 是一种程序,它可以运行很长时间,但是它却没有用户界面。这么说有点枯燥,来看个例子。打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android 浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束,或者用户按下了停止音乐播放的快捷键等。service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。 开启service有两种方式: (1) Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次 );stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可多次调用) --> onDestroy。 (2) Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了 。 4.2.3、 BroadcastReceiver 在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver 进行处理。例如,当下载一个程序成功完成的时候,仍然可以利用BroadcastReceiver 进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager 来通知用户这些事情发生了。BroadcastReceiver 既可以在AndroidManifest.xml 中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast () 将它们自己的intent broadcasts广播给其他应用程序。 注册BroadcastReceiver有两种方式: (1)在AndroidManifest.xml进行注册。这种方法有一个特点即使你的应用程序已经关闭了,但这个BroadcastReceiver依然会接受广播出来的对象,也就是说无论你这个应用程序时开还是关都属于活动状态都可以接受到广播的事件; (2)在代码中注册广播。 第一种俗称静态注册,第二种俗称动态注册,这两种注册BroadcastReceiver的区别: 动态注册较静态注册灵活。实验证明:当静态注册一个BroadcastReceiver时,不论应用程序是启动与否。都可以接受对应的广播。 动态注册的时候,如果不执行unregisterReceiver();方法取消注册,跟静态是一样的。但是如果执行该方法,当执行过以后,就不能接受广播了。 4.2.4、 Content Provider Content Provider 是Android提供的第三方应用数据的访问方案。 在Android中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据库、文件、等等内容,都是不允许其他直接访问的。Andorid当然不会真的把每个应用都做成一座孤岛,它为所有应用都准备了一扇窗,这就是Content Provider。应用想对外提供的数据,可以通过派生ContentProvider类, 封装成一枚Content Provider,每个Content Provider都用一个uri作为独立的标识,形如:content://com.xxxxx。所有东西看着像REST的样子,但实际上,它比REST 更为灵活。和REST类似,uri也可以有两种类型,一种是带id的,另一种是列表的,但实现者不需要按照这个模式来做,给你id的uri你也可以返回列表类型的数据,只要调用者明白,就无妨,不用苛求所谓的REST。 另外,Content Provider不和REST一样只有uri可用,还可以接受Projection,Selection,OrderBy等参数,这样,就可以像数据库那样进行投影,选择和排序。查询到的结果,以Cursor(参见:reference/android/database/Cursor.html)的形式进行返回,调用者可以移动Cursor来访问各列的数据。 Content Provider屏蔽了内部数据的存储细节,向外提供了上述统一的接口模型,这样的抽象层次,大大简化了上层应用的书写,也对数据的整合提供了更方便的途径。Content Provider内部,常用数据库来实现,Android提供了强大的Sqlite支持,但很多时候,你也可以封装文件或其他混合的数据。 在Android中,ContentResolver是用来发起Content Provider的定位和访问的。不过它仅提供了同步访问的Content Provider的接口。但通常,Content Provider需要访问的可能是数据库等大数据源,效率上不足够快,会导致调用线程的拥塞。因此Android提供了一个AsyncQueryHandler(参见:reference/android/content/AsyncQueryHandler.html),帮助进行异步访问Content Provider。 在各大组件中,Service和Content Provider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而Content Provider不论效率如何,都提供的是约定的同步访问接口。 在Android中每个应用程序都需要一个XML配置文件Android Manifest.xml,该配置文件用于定义我们的应用程序组件和组件的功能以及一些必要条件等。因此当我们使用到任何一个组件时都需要在这个配置文件中进行登记,否则就算是你在代码中使用了这个组件,但是Android系统也是找不到该组件的。 4.3 Android客户端程序的开发 根据本系统的设计要求,我们在设计该程序时,应该包含的操作的控件有用于显示摄像头所拍摄的照片的窗口,用于对开发板做出控制的按键,用于对所摄像片做操作的按键等。将该程序命名为Tiny6410Activity.java(程序附在附录中) 将编写的程序写入到开发板中得到的客户端情况如图: 4.4 mipg-stream的移植 除了在Android平台上安装客户端用于更好的控制开发板以外,还需在开发板上安装一能通过Web远程浏览和控制摄像头的程序,该功能可使用一个开源软件mipg-stream来实现。 4.4.1 安装交叉编译器 移植该程序需要在Ubuntu操作系统中对该程序进行修改参数﹑编译﹑再打包成可执行文件。但是我们所需的程序是要在ARM开发板上运行的,故而需要生成可以在开发板上运行的程序,这就需要在Ubuntu操作系统中安装一交叉编译器。 我使用的编译器版本是arm-linux-gcc-v6, 该编译器的安装过程如下: 将编译器的安装软件拷贝到/opt目录下,输入解压命令:tar xvzf /opt /arm-linux-gcc-v6-vfp-20101103.tgz 交叉编译器会直接解压到 /opt/FriendlyARM/toolschain/4.5.1/ 目录下,接下来要将编译器路径添加到 PATH 环境变量中:export /opt /FriendlyARM /toolschain /4.5.1 /bin/:$PATH 或者修改/etc目录下的profile文件: 先进入vi编辑器:vi /etc/profile 进入编辑界面后在文件中加入以下命令:export PATH="$PATH: /opt /au1200_rm /build_tools/bin" 修改好路径后可以通过以下命令来验证看交叉编译器是否安装成功:arm-linux-gcc –v,若执行该命令后会显示编译器版本信息表明编译器已安装成功。 4.4.2 在Ubuntu系统中配置并编译mjpeg-stream程序 该程序的移植过程如下: 1.获取并修改mjpeg-stream的源代码 在 /opt/mini6410目录下创建目录 webcamera 来作为我们本次移植工作的工作目录,输入以下命令创建:mkdir /opt/Tiny6410/webcamera 创建好文件后,进入该文件中,指令如下:cd /opt/mini6410/webcamera/ 将下载下来的文件解压到该文件中,并进入解压后的文件夹: tar xvzf mjpg-streamer-mini2440-read-only cd mjpg-streamer-mini2440-read-only 接下来就是对相关文件的修改了, 1) 用vi编辑start_uvc_yuv.sh, 将内容: ./mjpg_streamer -o "output_http.so -w ./www" -i "input_uvc.so -y" 修改成 ./mjpg_streamer -o "output_http.so -w ./www" -i "input_uvc.so -d /dev/video2" 2) 用vi编辑Makefile a) 在clean:处删除 make -C plugins/input_s3c2410 $@ b) 再删除以下内容: input_s3c2410.so: mjpg_streamer.h utils.h make -C plugins/input_s3c2410 all CC=$(CC) cp plugins/input_s3c2410/input_s3c2410.so . c) 再到package:处删除以下两行: input_s3c2410.so \ start_s3c2410.sh \ 2. 交叉编译mjpeg-stream 修改好相应的参数后就可以对该程序进行交叉编译并打包了,命令如下: export CC=arm-linux-gcc make make package 在当前目录下会生成 mjpg-streamer-mini2440-bin.tar.gz,将它拷入SD卡备用。 4.4.3 在Tiny6410上安装编译好的程序mjpg-streamer-mini2440-bin.tar.gz 将SD卡插到开发板上,在开发板的终端上输入以下命令安装mjpeg-stream: mkdir /mjpg-streamer cd /mjpg-streamer tar xvzf /sdcard/mjpg-streamer-mini2440-bin.tar.gz 在开发板的终端上输入以下命令启动: mjpeg-stream: cd /mjpg-streamer ./start_uvc_yuv.sh 此时可以在终端看到如下的输出信息,这说明已经成功启动mjpeg-stream程序: 接下来在电脑上打开网页,输入网址: http://192.168.1.230:8080 /stream_ simple .html 就可以看到摄像头拍摄的图像了,还可以通过下面的控件控制开发板上的LED灯。 第五章 总结 经过数个月的努力,我终于将基于Android平台的信息家电系统完成了。由于对嵌入式技术的浓厚兴趣引发了我对Android的好奇心,从一开始的连Linux操作系统都不会不了解,经过我不断地学习摸索,现在我基本上能运用Linux操作系统,安装Android系统,编写简单Java程序,从而慢慢实现的该系统的设计。 在这个过程中,我学会了很多知识,比如Android环境的搭建、Android应用程序的开发,Android程序的模块分Intent、Activity、Service、ContentProvider、SQLite等,除了知识上的学习,我还学会了最重要的一点,能利用现有的资源去解决问题,在图书馆、在网络上,向老师寻找答案。同时在设计过程中不断发现问题和解决问题,真正体会到了独立完成一向工作的艰辛和成功的喜悦。 本系统在完成后虽然运行较为良好,但是我编写的软件在运行界面上的控件仍显简单,仅仅能控制开发板上的LED灯,还不能控制较大型的设备,这是一大缺陷,希望能在今后解决这一缺陷。 参考文献 【1】田峰.智能家电远程控制系统的设计与实现.电子工程系 【2】郑君刚,吴成东,文茂龙,彭宇.无线传感器网络在智能家居中的应用.INTELLIGENT BUILDING.2005.8 【3】王智超,王 敏.基于Android平台的MP3播放器分析与设计基于Android平台的MP3播放器分析与设计.武昌理工学院信息工程学院 湖北·武汉 【4】温 敏,艾丽蓉,王志国.Android智能手机系统中文件实时监控的研究与实现.西北工业大学计算机学院 西安 【5】李 浩.Google Android手机嵌入式系统的研究与开发.四川大学计算机学院 【6】公磊,周聪.基于Android 的移动终端应用程序开发与研究[J].计算机与现代化,2008(8):86-89. 【7】靳岩,姚尚朗. Google Android 开发入门与实战.人民邮电出版社 致谢 在本次项目设计中,我要特别感谢蔡利民老师在繁忙的工作之余抽出大量的时间指导我们,从前期的准备工作到具体的时间安排,从开始的资料的搜集到最后的毕业设计论文的写作,蔡老师都倾注了大量的精力。在老师精心指导下,我们顺利的完成 “基于Android平台的信息家电系统”的设计以及论文的撰写工作。在此,我要衷心说声:“老师辛苦了!谢谢您的帮助!” 最后,向所有关心帮助过我的同学老师表示最真诚的谢意! 附录 客户端部分源程序: //刷新摄像头拍摄的图片 private Runnable m_RefreshImage = new Runnable() { public void run() { // TODO Auto-generated method stub RefreshImage(); if (AutoRefresh_flag == 1) m_Handler.postDelayed(m_RefreshImage, 100); else m_Handler.removeCallbacks(m_RefreshImage); } private void RefreshImage() { // TODO Auto-generated method stub try { URL m_URL = new URL("http://" + Board_IP + ":8080/?action=snapshot"); URLConnection m_URL_Connection = m_URL.openConnection(); m_URL_Connection.connect(); InputStream m_InputStream = m_URL_Connection.getInputStream(); m_Bitmap = BitmapFactory.decodeStream(m_InputStream); myImageView.setImageBitmap(m_Bitmap); m_InputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; //接收LED灯控件信号 public class StatusListener implements OnClickListener { public void onClick(View v) { // TODO Auto-generated method stub String display_info = ""; // 以后此处可以通过发送http请求查询硬件状态 HttpSendCmd("5840FFFF"); if (LED_flag[0] % 2 == 1) display_info += "LED0:开"; else display_info += "LED0:关"; display_info += " "; if (LED_flag[1] % 2 == 1) display_info += "LED1:开"; else display_info += "LED1:关"; display_info += " "; if (LED_flag[2] % 2 == 1) display_info += "LED2:开"; else display_info += "LED2:关"; display_info += " "; if (LED_flag[3] % 2 == 1) display_info += "LED3:开"; else display_info += "LED3:关"; showMessage(display_info); } } //将接收到的信号传到网上 public void HttpSendCmd(String cmd) { // TODO Auto-generated method stub HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://" + Board_IP + "/mjpg-streamer/post_data.php"); try { List nameValuePairs = new ArrayList(3); nameValuePairs.add(new BasicNameValuePair("user", "root")); nameValuePairs.add(new BasicNameValuePair("passwd", "shiguang")); nameValuePairs.add(new BasicNameValuePair("para", cmd)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String tmpString = EntityUtils.toString(response.getEntity()); System.out.println(tmpString); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void showMessage(String str) { Toast toast = Toast.makeText(this, str, Toast.LENGTH_SHORT); toast.setGravity(Gravity.TOP, 0, 550); toast.show(); } }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档