本科毕业设计(论文)
基于Android平台的 即时通讯系统的研究与设计
基于 A n d r o I d平台的即时通讯系统的研究与设计
自动化学院
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作 者 签 名: 日 期: 指导教师签名: 日 期:
使用授权说明
本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名: 日 期:
学位论文原创性声明
本人郑重声明:所呈交的论文是本人在导师的指导下进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
作者签名: 日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名: 日期: 年 月 日
导师签名: 日期: 年 月 日
指导教师评阅书
指导教师评价: 一、撰写(设计)过程 1、学生在论文(设计)过程中的治学态度、工作精神 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、学生掌握专业知识、技能的扎实程度 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生综合运用所学知识和专业技能分析和解决问题的能力 □ 优 □ 良 □ 中 □ 及格 □ 不及格 4、研究方法的科学性;技术线路的可行性;设计方案的合理性 □ 优 □ 良 □ 中 □ 及格 □ 不及格 5、完成毕业论文(设计)期间的出勤情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 指导教师: (签名) 单位: (盖章) 年 月 日
评阅教师评阅书
评阅教师评价: 一、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 评阅教师: (签名) 单位: (盖章) 年 月 日
教研室(或答辩小组)及教学系意见
教研室(或答辩小组)评价: 一、答辩过程 1、毕业论文(设计)的基本要点和见解的叙述情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、对答辩问题的反应、理解、表达情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生答辩过程中的精神状态 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 评定成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 教研室主任(或答辩小组组长): (签名) 年 月 日 教学系意见: 系主任: (签名) 年 月 日
I
摘 要
随着Android系统的发展,越来越多的移动设备开始使用Android作为操作系统。Android系统内核基于Linux而来,应用层则使用基于Java代码的Dalvik虚拟机,因此Android代码的主要编程语言是Java。
即时通讯(Instant Messenger,简称IM),指基于互联网的即时交流信息的业务。即时通讯是当今互联网用户主要通讯方式之一,能够为互联网用户带来直观、便捷的信息交换服务。蓝牙,一种支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。
本文主要对Android系统、蓝牙协议进行研究,通过分析Android的一个蓝牙即时通讯实例,达到基于Android即时通讯系统的研究目的。在这些研究的基础上,设计出能够实现Android系统上基于蓝牙、能够进行文件发送的即时通讯软件。
首先,本文分析Android系统的框架以及功能特征,讲述了Android系统的基本运作方式。其次,讲述了在Android系统上如何使用蓝牙协议,研究了Android系统上的蓝牙工作方式以及关键代码。最后,分析蓝牙的工作实例,在此基础上在Eclipse开发出能够实现即时通讯的Android实例,并且能够传送文件。
关键词:即时通讯; 蓝牙; Android
II
Abstract
With the development of the Android system, more and more mobile devices start using Android as the operating system. Android system is based on the Linux kernel and the application layer is using Java-based code Dalvik virtual machine, therefore, the major programming language of Android system is Java.
Instant Messenger (Abbreviated IM), refers to Internet-based real-time information exchange service. IM is the main way to communicate of Internet users; one can provide Internet users with an intuitive and convenient information exchange service. Bluetooth, one that supports short-range communication device radio technology, can include mobile phone, PDA, wireless headsets, laptop computers, related peripherals and other wireless information exchange between devices.
This paper mainly research on the Android system and the Bluetooth protocol, by analyzing of a Bluetooth Android IM instance, to achieve the purpose of researching Android-based instant messaging system. Design an Android system based on Bluetooth, with the capable of instant messaging and file sending.
Firstly, this paper analyzes framework and functional characteristics of Android system, and tells the basic operation of Android system. Secondly, Using Bluetooth protocol on the Android system and tells some key-codes. Finally, design an IM program through Eclipse based on the analysis of Bluetooth working examples which have the ability to transfer files.
Keywords: Instant Messaging; Bluetooth; Android
III
目 录
摘 要 ..................................................................................................................................... 1 ABSTRACT ......................................................................................................................... III
1 绪论 ........................................................................................................................... 1
1.1 关于ANDROID系统的背景以及研究目的 ................................................ 1 1.2 国内外研究状况 ............................................................................................ 1 1.3 通过GOOGLE Android SDK以及ECLIPSE进行开发 ............................. 2 1.4 本论文研究的目的及意义 ............................................................................ 3 1.5 本论文主要结构 .............................................................................................. 4 2 ANDROID系统的研究与设计 ...................................................................................... 5
2.1 Android系统的功能特征 ................................................................................. 5 2.2 Android系统的编程环境的搭建 ..................................................................... 6 2.3 Android系统的架构 ......................................................................................... 7
2.3.1 Android操作系统 .................................................................................... 8 2.3.2 Android应用程序 .................................................................................... 9 2.4 Android程序开发 ........................................................................................... 10
2.4.1 Android用户界面(UI) ...................................................................... 10 2.4.2 Android 控制层开发 ............................................................................. 11 2.4.3 Android任务和进程/线程模型 ............................................................. 13 2.4.4 Android 持久层开发 ............................................................................. 14 2.5 Bluetooth .......................................................................................................... 14
2.5.1 Bluetooth 简介 ...................................................................................... 14 2.5.2 Bluetooth有关基本概念 ....................................................................... 16 2.5.3如何在Android系统中操作Bluetooth ................................................ 23 3程序主要架构与模块 ............................................................................................... 26
3.1 需求分析 ........................................................................................................ 26
3.1.1引言 ........................................................................................................ 26 3.1.2系统功能 ................................................................................................ 26 3.1.3设计分析 ................................................................................................ 27 3.1.4运行环境说明 ........................................................................................ 28 3.2程序主要架构以及流程 ................................................................................. 29
3.2.1 BluetoothChat 例程分析 ....................................................................... 29 3.2.2 Bluetooth模块 ....................................................................................... 31 3.2.3 文件读取以及存储模块 ....................................................................... 38
4程序的调试与结果 .......................................................................................................... 41
4.1虚拟机的搭建以及使用 ................................................................................. 41 4.2 ADB调试 ........................................................................................................ 43
IV
4.3 DEBUG调试 ................................................................................................... 44 4.4 运行结果 ........................................................................................................ 45
总 结 ................................................................................................................................... 48 参考文献 ............................................................................................................................. 50 致 谢 ................................................................................................................................... 51
V
1 绪论
1.1 关于Android系统的背景以及研究目的
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。
Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android[2]。
蓝牙协议Bluetooth。蓝牙是一种短距离的无线通信技术,它最初提出的是用来取代电缆连线,也可以用于各种移动设备的互联,组建个人无线局域网[4],蓝牙无线通信技术的主要特点[5]有:低成本、低功率;短标称的蓝牙无线通信距离,以节省电池能量;永外加的功率放大器扩展的无线通信距离;在全球可用并且无的2.4GHZ ISM(工业、科学、医疗)频段内。
随着,人们对于即时通讯的需求越来越多样化,产生了各种各样不同用途的协议。即时通讯(Instant Messenger,简称IM),是指能够即时发送和接收互联网消息等的业务。自1998年面世以来,特别是近几年的迅速发展,即时通讯的功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能。即时通讯不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。是一种终端连往即时通讯网络的服务。即时通讯不同于e-mail在于它的交谈是即时的。大部分的即时通讯服务提供了状态信息的特性——显示联络人名单,联络人是否在在线与能否与联络人交谈[3]。
在这样的背景之下,发展Android系统上的即时通讯软件已经成为一个非常主流性的问题,如何实现,以及如何提供更加优质的服务将会是Android开发的一个非常重要的问题。 1.2 国内外研究状况
目前Android最新的版本是4.2 JellyBean, 中文名是“果冻豆”,该系统是
Android 4.0.x Ice Cream Sandwich \"(冰激凌三明治)\" 的升级版, Android 5.0的代号将是\"Key Lime Pie(酸橙派)\"。在今年的2013 Google I/O 大会上,从Google Play到Map、Game API,再到Android Studio开发工具,Android在移动端的全面系统升级,这也让Android之前和iOS相对较弱的部分全面追上。
Android发行的版本:Android在正式发行之前,最开始拥有两个内部测试版本,并且以著名的机器人名称来对其进行命名,它们分别是:阿童木(AndroidBeta),发条机器人(Android 1.0)。后来由于涉及到版权问题,谷歌将其命名规则变更为用甜点作为它们系统版本的代号的命名方法。甜点命名法开始于Android 1.5发布的时候。作为每个版本代表的甜点的尺寸越变越大,然后按照26个字母数序:
阿童木(AndroidBeta)
发条机器人(Android 1.0),2008年9月发布。
纸杯蛋糕(Android 1.5)Cupcake,2009年4月30日发布。 甜甜圈(Android 1.6)Donut,2009年9月15日发布。 松饼(Android 2.0/2.1)Éclair,2009年10月26日发布。 冻酸奶(Android 2.2)Froyo,2010年5月20日发布。 姜饼(Android 2.3)Gingerbread,2010年12月7日发布。 蜂巢(Android 3.0)Honeycomb,2011年2月2日发布。
冰激凌三明治(Android 4.0)Ice Cream Sandwich,2011年10月19日在发布。
果冻豆(Jelly Bean,Android4.1和Android 4.2)Jelly Bean,2012年6月28日发布,Android 4.2 Jelly Bean:2012年10月30日发布。
对于基于Android系统的即时通讯软件,国内比较著名的软件有QQ(Android版)、微信。国外比较著名的有MSN、LINE ME等等。 1.3 通过GOOGLE Android SDK以及ECLIPSE进行开发
早期的Android应用程序开发中,通常通过在Android SDK(Android软件开发包)中使用Java作为编程语言来开发应用程序。开发者亦可以通过在Android NDK(Android Native开发包)中使用C语言或者C++语言来作为编程语言开发应用程序。同时Google还推出了适合初学者编程使用的Simple语言,该语言类
似微软公司的Visual Basic语言。此外,Google还推出了Google App Inventor开发工具,该开发工具可以快速地构建应用程序,方便新手开发者。
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。Eclipse的插件机制是轻型软件组件化架构。在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java以外的其他语 言。 已有的分离的插件已经能够支持C/C++(CDT)、Perl、Ruby,Python、telnet和数据库开发。插件架构能够支持将任意的扩展加入到 现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言[6]。 1.4 本论文研究的目的及意义
早期的即时通讯是属于Unix用户的专利,随着个人电脑与互联网的普及,即时通讯成为人与人沟通的另一条管道。
即时通讯在2003年后与万维网、电子邮件共同成为互联网使用的主流。 2007年之后,由于智能手机普遍流行起来。传统上电信运营商所建构SMS、MMS信息服务系统,逐渐被以网络架构的第三方服务商所瓜分移动设备的加值营收。
而对于Android系统,这方面的发展有5年,相比起其他平台的发展已经短了很多,而对于这种新兴的移动设备系统,有更加多的信息可以利用,例如GPS信息、照片信息,手机联系人信息等等。这些开发能够使移动设备之间的通讯更加人性化、更加便利,有利于提高通讯效率。
即时通讯除了能加强网络之间的信息沟通外,最主要的是可以将网站信息与聊天用户直接联紧在一起。通过网站信息向聊天用户群及时群发送,可以迅速吸引聊天用户群对网站的关注,从而加强网站的访问率与回头率;
即时通信利用的是互联网线路,通过文字、语音、视频、文件的信息交流与互动,有效节省了沟通双方的时间与经济成本;
即时通信系统不但成为人们的沟通工具,还成为了人们利用其进行电子商务、工作、学习等交流的平台。
1.5 本论文主要结构
本文章主要分为5个部分:绪论、Android系统的研究与设计、程序主要架构与模块、程序的调试、程序运行结果。
1、绪论
本章主要介绍Android系统、Bluetooth的背景以及开发现状,以及本系统的设计意义。
2、Android系统的研究与设计
本章主要介绍Android系统的框架与特征,介绍Android系统的运作方式与特征函数,以及蓝牙的术语定义以及Android中如何运用蓝牙。
3、程序主要架构与模块
本章主要介绍程序的需求分析,介绍系统的逻辑运行流程,介绍实例关键代码。
4、程序的调试以及运行结果
本章主要介绍Eclipse中如何调试及其过程,以及程序的运行结果。
2 Android系统的研究与设计
2.1 Android系统的功能特征
1、应用程序架构:在应用程序架构内已经具备多种不同的基础组件,在开发应用程序时,就可以直接调用这些组件来使用,可以节省开发应用程序的心力及时间。
2、Dalvik虚拟机器:在Android平台上所使用Java虚拟机,不是Sim公司的标准Java虚拟机,而是使用Google自主开发的代号为Dalvik的虚拟机,它在保证API方面的兼容的同时,针对移动手机进行了大幅优化,占用资源更小,运行效率更高。
3、集成的浏览器:集成的浏览器是Android内建的浏览器,是以WebKit的浏览引擎为基础所开发成的。WedKit是一个开源浏览器网页排版引擎,目前使用WebKit引擎的浏览器主要有:Safari,Midori,Epiphany等。配合Android手机的功能,可以在浏览网页时,达到更好的效果,例如:局部性的缩放网页上的资讯、触控式的操作等效果。
4、优化的绘图能力:在程序里可以用到的绘图功能分为2D与3D两个方面。在2D方面,Android提供了一套特有的类库,而在3D方面则是使用OpenGL ES1.0(openGL for Embedded systems)规范的类库。它们是一种非常快的图形引擎,并且支持硬件加速。
5、SQLite数据库:SQLite提供结构化的数据存取。SQLite是一款轻型的数据库,它的设计目标是嵌入式的,目前已经在很多嵌入式产品中使用了它,它占用的资源非常低。它能够支持Windows/Linux/Unix等主流的操作系统,同时能够跟很多程序语言相结合,比如PHP,Java等,还有ODBC接口,同样比起Mysql,PostgreSQL来讲,它的处理速度比它们都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小只有250KB但支持数据库大小至2TB。它虽然很小巧,但是支持的SQL语句毫不逊色于其它开源数据库。同时它还支持事务功能和并发处理等等。SQLite也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。
6、多媒体的支持能力:主要用于播放媒体文件。这同时包括对音频(如播放
MP3或其他音乐文件等)和视频(如播放从网上下载的视频)的支持,并支持“播放URI地址”(Note:URI即是统一资源识别地址)模式—在网络上直接播放的流媒体。另外支持各种通用的静态图像格式,如JPG、PNG、GIF等格式。
7、GSM技术:Global System for Mobile Communications,即全球移动通讯系统,俗称“全球通”,是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。GSM技术是属于手机硬件方面的展现,也是在开发Android应用程序时可以突出的特点之一。
8、蓝牙:蓝牙是一种新型、开放、低成本、短距离的无线连接技术,可取代短距离的电缆,实现话音和数据的无线传输。EDGE(Enhanced Data Rate for GSM Evolution),即增强型数据速率GSM演进技术。EDGE是一种从GSM到3G的过渡技术,它主要是在GSM系统中采用了一种新的调制方法,即最先进的多时隙操作和SPSK调制技术。由于8PSK可将现有GSM网络采用的GMSK调制技术的信号空间从2扩展到8,从而使每个符号所包含的信息是原来的4倍。Wi-Fi(Wireless Fidelity),即无线保真技术,与蓝牙技术一样,同属于在办公室和家庭中使用的短距离无线技术。该技术使用的是2.4GHz附近的频段,该频段目前尚属没用许可的无线频段。其目前可使用的标准有两个,分别是IEEE802.lla和IEEE802.11b。这些通讯能力也是属于手机硬件方面的展现,也是在开发Android应用程序时可以突出的特点之一。
9、GPS: Global Positioning System,即全球定位系统,它是一个由覆盖全球的24颗卫星组成的卫星系统。这个系统可以保证在任意时刻和任何地点都可以同时观测到4颗卫星,以保证卫星可以采集到该观测点的经纬度和高度,以便实现导航、定位、授时等功能。这项技术可以用来引导飞机、船舶、车辆以及个人。同样也是属于手机硬体方面的体现,也是在开发Android应用程序是可以突出的特点之一。
2.2 Android系统的编程环境的搭建
所需开发环境:JDK 5或者JDK 6 (仅有JRE不够) 、Eclipse 3.5 (galileo)。 下载用于在Eclipse 开发android应用的ADT 插件,在企业开发中,很多程序员使用Eclipse IDE作为应用的开发环境。为了使得Android应用的创建,运
行和调试更加方便快捷。Android的开发团队专门针对Eclipse IDE定制了一个插件:Android Development Tools(ADT)
安装 Eclipse 插件 (ADT),启动 Eclipse,选择 Help > Install New Software,在出现的对话框里,点击Add按钮,在对话框的name一栏输入“ADT”, 然后点击Archive...,浏览和选择已经下载的ADT插件压缩文件。点击 OK.。返回可用软件的视图,会看到这个插件,然后选择Developer Tools (会选中下面的“Android Developer Tools”和 “Android Editors””),点击 Next,最后重启 Eclipse。
下载安装Android SDK:Android SDK包含了开发Android应用所依赖的jar文件、运行环境及相关工具。下载完SDK后,把.zip文件解压到电脑上合适位置。启动 Eclipse,选择window->preferences,在打开的视图左边点击android,在右边的SDK Location中选择Android SDK所在位置。
在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为D:AndroidDevelopandroid-sdk-windows ools)。
新建一个新的项目[7]:通过File -> New -> Project菜单,建立新项目\"Android Project\"然后填写必要的参数, (注意这里我勾选的是Google APIs,可以选喜欢的,但要创建相应的AVD),相关参数的说明: Project Name: 包含这个项目的文件夹的名称。
Package Name: 包名,遵循JAVA规范,用包名来区分不同的类是很重要的,我用的是helloworld.test。 Activity Name: 这是项目的主类名,这个类将会是Android的Activity类的子类。一个Activity类是一个简单的启动程序和控制程序的类。它可以根据需要创建界面,但不是必须的。 Application Name: 一个易读的标题在的应用程序上。
在\"选择栏\"的 \"Use default location\" 选项,允许选择一个已存在的项目。 点击Finish后,点击Eclipse的Run菜单选择Run Configurations„
选择“Android Application”,点击在左上角(按钮像一张纸上有个“+”号)或者双击“Android Application”, 有个新的选项“New_configuration”(可以改为我们喜欢的名字)。 在右侧Android面板中点击Browse,选择HelloWorld 2.3 Android系统的架构
2.3.1 Android操作系统
第一层:Linux操作系统和驱动(Linux kernel):由C语言实现。Android核心系统服务依赖于Linux2.6内核,包括:安全性、内存管理、进程管理、网络协议、驱动模型。Linux内核也作为硬件和软件栈之间的抽象层。除了标准的Linux内核外,Android还增加了内核的驱动程序:Binder(IPC)驱动、显示驱动、输入设备驱动、音频系统驱动、摄像头驱动、WiFi驱动、蓝牙驱动、电源管理。
第二层:本地框架和Java运行环境(LIBRARIES 和 ANDROID RUNTIME)本地框架是有C/C++实现。包含C/C++库,被Android系统中不同组件使用,它们通过Android应用程序框架为开发者进行服务。系统C库:(libc)从BSD继承过来的标准的C系统函数库,专门是为基于嵌入式Linux的设备定制的库。多媒体库:基于PackerVideo的OpenCore;该库支持多种常用的音频、视频格式回放和录制,支持多种媒体格式的编和解码格式。Suface Manager:显示子系统管理器,并且为多个应用程序提供2D和3D图层的无缝融合。LibWebCore:一个最新的Web浏览器引擎,支持Android浏览器,以及一个可嵌入式的Web视图。SGL:Skia图形库,底层的2D图形引擎。
3D libraries:基于OpenGL ES1.0 API的实现;该库可以使用硬件3D加速(如果可用),或者使用高度优化的3D软加速。FreeType:位图(bitmap)和矢量(vector)字体显示。
Android运行环境(ANDROID RUNTIME):提供了Java编程语言核心库的大多数功能,由Dalvik Java虚拟机和基础的Java类库组成。Dalvik是Android中使用的Java虚拟机,每个Android应用程序都在自己的进程中运行,都拥有一个的Dalvik虚拟机实例。Dalvik被设计成一个可以同时高效运行多个虚拟机实例的虚拟系统。执行后缀名为.dex的Dalvik可执行文件,该格式的文件针对小内存使用做出了优化。同时虚拟机是基于寄存器的,所有的类都是有Java编译器编译,然后通过SDK中的“dx”工具转化为.dex格式由虚拟机执行。Dalvik虚拟机依赖于Linux内核的一些功能,比如线程机制和底层内存管理机制。
第三层:Android应用框架(ANDROID FRAMEWORK): 在Android系统中,开发人员也可以完全访问核心应用程序所使用的API框架。包含的框架入上图(不在陈述)
第四层:Android应用程序(APPLICATIONS) Android应用程序都是有Java语言编写的。用户开发的Android应用程序和Android的核心应用程序是同一层次的,它们都是基于Android的系统API构建的。
图2.1 Android系统架构图
2.3.2 Android应用程序
src/ java原代码存放目录 gen/ 自动生成目录
gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据res目录的xml界面文件、图标与常量,同步更新修改R.java文件。因为R.java文件是由开发工具自动生成的,应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。[8]
res/ 资源(Resource)目录:
在这个目录中可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。
assets资源目录:
Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp
AndroidManifest.xml 项目清单文件:
这个文件列出了应用程序所提供的功能,以后开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),还需在该文件中声明使用权限。
default.properties 项目环境信息,一般是不需要修改此文件。 2.4 Android程序开发 2.4.1 Android用户界面(UI)
对于一个Android手机应用来说,一个好看有简介的界面,是相当重要的。技能提高使用者的体验,又能保证应用的搞笑执行。Android SDK已经为用户提供了一套完善的界面设计功能,有丰富的组件供我们使用,如果还不能满足我们的界面需求,还可以对它们进行扩展。为了达到这样的目标,就要对Android SDK中提供的界面生成技术进行全面深入的学习,做到应用自如。Android实现用户界面的基本知识,包括构建屏幕的基本组件,怎样使用XML定义屏幕并把它加载到代码中、以及需要为用户界面处理的各种任务。[9]
我们写任何一段程序,都是需要有UI的,因为程序最终是给用户去用的,即使写了一个工具,没有任何显示输入、输出,也还是需要暴露不要的方法来提供别人使用,在此情景下,这些方法似乎也可以看作是UI。对于Android开发来说,用户界面的视线是比较重要的和复杂的一环,如果有HTML设计经验,或者说有Swing、Flash等图形设计经验,那么理解Android的UI设计会容易得多,甚至会有似曾相识的感觉。
图2.2 用户界面的树形结构
对于一个Android应用来说,android.app.Activity类实例是一个最基本的功能单元。一个Activity实例可以做很多事情,但它本身无法显示在屏幕上,而是借助于视图组(ViewGroup)和视图(View),这两个才是Android平台上最基本的用户界面表达单元。 2.4.2 Android 控制层开发
Android控制层包括:Activity、Intent & Intent Filter、Broadcast Receiver、Service、NotificationManager、AlarmManager。
Activity是Android最基本的应用程序组件。在应用程序中,一个Activity通常就是一个单独的屏幕,用于呈现数据和与用户进行交互,每个屏幕可以有1个或者多个组件布局。几乎所有的Activity都要和用户打交道,所以Activity类创建了一个窗口,开发人员可以通过setContentView(View)方法吧UI防盗Activity创建的窗口中。尽管Activity经常被用来当作全屏窗口使用,但也可以通过其他方式来使用,比如作为浮动窗口(通过设置代windowsFloating标签的主体),或者嵌入到其他的Activity(通过ActivityGroup)中。Activity类是Android应用生命周期的重要部分,而且,Activity的启动方式及Activity间的调度关系是Android平台应用模型的一个重要组成部分。
在Android系统中,Activity被一个Activity栈所管理,当一个新的Activity启动时,其被放置到栈顶,成为运行中的Activity,前一个Activity则被保存在栈中,不再放到前台,知道新的Activity退出为止。我们可以通过回退操作回到
以前打开过的Activity,也可以选择性地移除一些没有必要保留在Activity栈中的Activity。
Broadcast Receiver是一个专门用来接收广播通知消息,并做出相应处理的组件。很多广播是源自于系统本身的——比如,通知时区改变、电池电量低、拍摄照片、来电、发短信或者用户改变了语言环境等。应用程序也可以进行广播——比如说,通知其他应用程序下载完成并处于可用状态。
Service:服务没有可视化的用户界面,而是一段时间内在后台运行。比如,一个服务可以在用户做其他事情的时候在后台播放背景音乐,从网络上获取或者计算一些数据提供给需要这个运算结果的Activity使用。每个服务都继承自Service基类。媒体播放器播放列表中的曲目是一个经典例子。播放器应用程序可能有1个或多个Activity来给用户选择歌曲并进行播放。然而,音乐播放这个任务本身不应该为任何Activity所处理,因为用户期望在做别的事情时,音乐仍在继续播放。为打到这个目的,媒体播放器Activity应该启用一个运行于后台的服务,系统在这个Activity不再可见时,仍维持音乐播放服务运行。用户可以连接(或者叫绑定)一个正在运行的服务(如果服务没有运行,则启动之)。连接之后,可以通过服务器提供的借口与服务器进行通讯。对于音乐服务来说,这个借口可以允许用户暂停、回退、停止、以及重新开始播放等。如同Activity和其他组件一样,服务运行于应用程序进程的主线程内,所以不会对其他组件或用户界面有任何干扰。服务一般会派生一个新的线程来进行一些耗时的任务(比如音乐回放)。
Android系统使用类NotificationManager来通知用户后台所发生的事情。实例必须使用方法Context.getSystemService(NOTIFIVCATION_SERVICE)来获得,而不能直接对NotificationManager进行实例化。AlarmManager经常结合Service来使用,用来显示后台Service的运行状态等。
一个Android应用主要由4中组件组成:Activity、Service、BroadcastReceiver以及ContentProvider,这四种组件是的,他们之间可以互相调用、协调工作,最终组成一个完整的Android应用。其中,Activity、Service、BroadcastReceiver组件之间的通信,主要是由Intent来协助完成的。Intent负责对应用中操作的动作、动作涉及数据及附加数据进行描述,Android则根据此Intent的描述,找到
对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent也可以通过广播的形式,来描述并广播某些已经发生的时间。因此,Intent在这里起到一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
Android控制层最重要的机制是Intent。围绕着Intent,可以协调Activity、Service、BroadcastReceiver之间的通信,并可以使用NotificationManager和AlermManger通知UI和用户底层时间的发生。所有的组件在manifest文件中配置,通过代码为组件添加逻辑处理,降低了组件和逻辑处理之间的耦合性,体现了翻转控制的优势(IoC)。 2.4.3 Android任务和进程/线程模型
一个Activity可以启动另外一个Activity,甚至可以启动与他不处于同一应用程序的Activity。举个例子来说,假设想让用户看到某个地方的接到地图,并且已经存在了一个具有此功能的Activity,那么Activity所需要做的工作就是把请求信息放到一个Intent对象里,并把它传递给startActivity()。于是,地图浏览器就会显示那个地图,而且用户按下BACK键的时候,Activity又会再一次显示在屏幕上。
对于用户来说,这看起来就像是地图浏览器,是的Activity所在的应用程序的一个组成部分,其实它是在另外一个应用程序中定义的,并运行在那个应用程序的进程中。Android是将这两个Activity放在同一个任务重来维持一个完整的用户体验的。简单地说,“任务”就是用户所一眼道的“应用程序”。一个Task通常会涵盖多个Activity,而这些Activity可能分别属于不同的Application,因此,属于同一个Task的Activity通常会在不同的进程里(可能会并行)执行。例如,提个Application会去启动手机里的浏览器去网络上下载歌曲,这个Task就会涵盖apk里的Activity和Browser apk里的Activity。这两个Activity分别在不同的进程里,由不同的UI Thread(可能会并行)执行。Task是安排在一个对战中的一组相关的Activity,对战中的根Activity就是启动了整个任务的那个Activity——一般情况下,它就是用户在应用程序夹在其中所能选择的。堆栈最上方的Activity则是当前运行的用户直接对其进行操作的Activity。当一个Activity启动另外一个Activity的时候,新的Activity就被压入栈顶,并成为当前
运行的Activity,而父Activity扔保持在堆栈之中。当用户按下BACK键的时候,当前Activity出栈,而父Activity恢复为当前运行的Activity。
对战中保存的其实是对象实例,如果发生了诸如需要多个地图浏览器的情况,就会使得一个任务重同时存在多个同一Activity的实例,堆栈会为每个实例单独开辟一个入口。堆栈中的Activity不能重排列,只能压入或弹出。
任务其实就是Activity的堆栈,而不是manifest文件中的一个组件或者元素,所以用户无法撇开Activity而随意为一个任务设置值。事实上整个任务使用的值是在根Activity中设置的。
任务中的所有Activity事作为一个整体进行移动的。整个任务(即Activity堆栈)可以移到前台或退至后台。举个例子,比如当前任务在堆栈中存有4个Activity——3个处在当前Activity的栈下面。当用户按下HOME 键的时候,回到了应用程序加载器,然后选择了一个新的应用程序(也就是一个新任务),则当前任务遁入后台,而新任务的根Activity显示出来。然后,用户再次回到了应用程序加载器而选择了前一个应用程序(上一个任务)。于是,那个任务带着它堆栈中所有的4个Activity,再一次回到了前台。当用户按下BACK键的时候,屏幕不会显示出用户刚才离开的Activity
(上一个任务的根Activity)。取而代之,当前任务的堆栈中最上面的Activity被弹出,而同一任务重之前的那个Activity显示了出来。 2.4.4 Android 持久层开发
Android SDK持久层用于管理数据的读写,主要分为4个功能模块: SharedPreferences,通过键值二元组存储简单数据,如Activity存储UI状态以保证程序切换不会带来各个程序UI的改变;
文件,存储规模较大的数据;
数据库,内置SQLite数据库,用于存储结构化数据;
ContentProvider,通过定义一组抽象借口,为数据源的封装提供了标准,可用于应用程序之间的数据共享。 2.5 Bluetooth 2.5.1 Bluetooth 简介
蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输。[10]
ISM频带是对所有无线电系统都开放的频带,因此使用其中的某个频段都会遇到不可预测的干扰源。例如某些家电、无绳电话、汽车开门器、微波炉等等,都可能是干扰。为此,蓝牙特别设计了快速确认和跳频方案以确保链路稳定。跳频技术是把频带分成若干个跳频信道(hop channel),在一次连接中,无线电收发器按一定的码序列(即一定的规律,技术上叫做“伪随机码”,就是\"假\"的随机码)不断地从一个信道\"跳\"到另一个信道,只有收发双方是按这个规律进行通信的,而其他的干扰不可能按同样的规律进行干扰;跳频的瞬时带宽是很窄的,但通过扩展频谱技术使这个窄带宽成百倍地扩展成宽频带,使干扰可能的影响变成很小。
蓝牙技术是一种无线数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。其程序写在一个9 x 9 mm的微芯片中。与其它工作在相同频段的系统相比,蓝牙跳频更快,数据包更短,这使蓝牙比其它系统都更稳定。FEC(Forward Error Correction,前向纠错)的使用抑制了长距离链路的随机噪音。应用了二进制调频(FM)技术的跳频收发器被用来抑制干扰和防止衰落。蓝牙基带协议是电路交换与分组交换的结合。在被保留的时隙中可以传输同步数据包,每个数据包以不同的频率发送。一个数据包名义上占用一个时隙,但实际上可以被扩展到占用5个时隙。蓝牙可以支持异步数据信道、多达3个的同时进行的同步话音信道,还可以用一个信道同时传送异步数据和同步话音。每个话音信道支持kb/s同步话音链路。异步信道可以支持一端最大速率为721kb/s而另一端速率为57.6kb/s的不对称连接,也可以支持433.9kb/s的对称连接。
蓝牙技术优势,Bluetooth 无线技术是在两个设备间进行无线短距离通信的
最简单、最便捷的方法。它广泛应用于世界各地,可以无线连接手机、便携式计算机、汽车、立体声耳机、MP3 播放器等多种设备。由于有了“配置文件”这一独特概念,Bluetooth 产品不再需要安装驱动程序软件。此技术现已推出第四版规格,并在保持其固有优势的基础上继续发展 — 小型化无线电、低功率、低成本、内置安全性、稳固、易于使用并具有即时联网功能。其周出货量已超过五百万件,已安装基站数超过 5 亿个。全球可用Bluetooth无线技术规格供我们全球的成员公司免费使用。许多行业的制造商都积极地在其产品中实施此技术,以减少使用零乱的电线,实现无缝连接、流传输立体声,传输数据或进行语音通信。Bluetooth 技术在 2.4 GHz 波段运行,该波段是一种无需申请许可证的工业、科技、医学 (ISM) 无线电波段。正因如此,使用 Bluetooth 技术不需要支付任何费用。但必须向手机提供商注册使用 GSM 或 CDMA,除了设备费用外,不需要为使用 Bluetooth 技术再支付任何费用。设备范围Bluetooth 技术得到了空前广泛的应用,集成该技术的产品从手机、汽车到医疗设备,使用该技术的用户从消费者、工业市场到企业等等,不一而足。低功耗,小体积以及低成本的芯片解决方案使得 Bluetooth 技术甚至可以应用于极微小的设备中。请在 Bluetooth 产品目录和组件产品列表中查看各类产品大全。
易于使用Bluetooth 技术是一项即时技术,它不要求固定的基础设施,且易于安装和设置。不需要电缆即可实现连接。新用户使用亦不费力,只需拥有 Bluetooth 品牌产品,检查可用的配置文件,将其连接至使用同一配置文件的另一 Bluetooth 设备即可。后续的 PIN 码流程就如同在 ATM 机器上操作一样简单。外出时,可以随身带上您的个人局域网(PAN),甚至可以与其它网络连接。全球通用的规格
Bluetooth 无线技术是当今市场上支持范围最广泛,功能最丰富且安全的无线标准。全球范围内的资格认证程序可以测试成员的产品是否符合标准。自 1999 年发布 Bluetooth 规格以来,总共有超过 4000 家公司成为 Bluetooth 特别兴趣小组 (SIG) 的成员。同时,市场上 Bluetooth 产品的数量也成倍的迅速增长。产品数量已连续四年成倍增长,安装的基站数量在 2005 年底也可能达到 5 亿个。 2.5.2 Bluetooth有关基本概念
1、RFCOMM协议: [11]
一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,为上层业务(如传统的串行线缆应用)提供了传送能力。RFCOMM是一个简单传输协议,其目的是针对如何在两个不同设备上的应用之间保证一条完整的通信路径,并在它们之间保持一通信段。RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM协议提供对基于L2CAP协议的串口仿真,基于ETSI07.10。可支持在两个BT设备之间同时保持高达60路的通信连接。RFCOMM只针对直接互连设备之间的连接,或者是设备与网络接入设备之间的互连。通信两端设备必须兼容于RFCOMM协议,有两类设备:DTE (Data Terminal Endpoint,通信终端,如PC,PRINTER)和DCE (Data Circuit Endpoint,通信段的一部分,如Modem)。此两类设备不作区分。
2、MAC硬件地址
MAC(Medium/MediaAccess Control, 介质访问控制)MAC地址是烧录在NetworkInterfaceCard(网卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique,是识别LAN(局域网)节点的标识.24-47位是由厂家自己分配。其中第40位是组播地址标志位。网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的是传输数据时真正赖以标识发出数据的电脑和接收数据的主机的地址。
3、即时网络
一种通常以自发方式创建的网络。即时网络不要求架构,受时空。 4、活动从设备广播 (ASB)
ASB 逻辑传输可用于向微微网中的所有活动设备传输 L2CAP 用户通信。 5、信标列
基础或适应型微微网物理信道中的保留时隙的一种模式。这些时隙中发起的传输用于同步休眠的设备。
6、Bluetooth 无线技术
Bluetooth 无线技术是一种无线通信链路,通过跳频收发器在无需申请许可
证的 2.4 GHz ISM 波段上工作。它支持在 Bluetooth 主机间进行实时 AV 和数据通信。链路协议基于时隙。
7、Bluetooth 基带
这是 Bluetooth 系统中用于指定或实施媒体接入及物理层程序,以支持在 Bluetooth设备间进行实时语音、数据信息流交换及建立即时网络的部分。
8、启用 Bluetooth 的设备
启用 Bluetooth 的设备(或称 Bluetooth 设备)是可以使用 Bluetooth 系统进行短距离无线通信的设备。
9、Bluetooth 设备地址
用于识别每个 Bluetooth 设备的 48 位地址。这在技术规格中通常被称为 BD_ADDR。
10、BD_ADDR
Bluetooth设备地址,BD_ADDR 用于识别 Bluetooth 设备。 11、Bluetooth HCI
Bluetooth HCI 为基带控制器和链路管理器提供了命令接口,并可以访问硬件状态和控制寄存器。此接口提供了访问 Bluetooth 基带功能的统一方法。
12、Bluetooth 主机
Bluetooth 主机可以是一个计算设备、外围设备、蜂窝电话、PSTN 网络或 LAN 接入点等等。附加至 Bluetooth 控制器的 Bluetooth 主机可以与其它附加至其各自 Bluetooth 控制器的 Bluetooth 主机进行通信。
13、Bluetooth 配置文件
Bluetooth 配置文件表达了一般行为,Bluetooth 设备可以通过这些行为与其它设备进行通信。Bluetooth 技术定义了广泛的配置文件,描述了许多不同类型的使用案例。为了使用 Bluetooth 无线技术,设备必须能够翻译特定 Bluetooth 配置文件。配置文件定义了可能的应用。
14、信道
可以是物理信道或是L2CAP信道,具体取决于上下文。 15、连接(至服务)
建立至某项服务的连接。如果尚未建立,这还包括建立物理链路、逻辑传输、
逻辑链路、以及 L2CAP 信道。
16、可连接设备
位于可发现范围内的 Bluetooth 设备,它定期监听其寻呼扫描物理信道并响应该信道上的寻呼。
17、正在连接
设备间通信的一个阶段,表示设备间正在建立连接。(连接阶段发生在链路建立阶段完成之后。)
18、连接
两个对等应用程序或映射至 L2CAP 信道上的较高层协议之间的连接。 19、建立连接
创建一个映射至信道的连接的程序。 20、覆盖区域
两个 Bluetooth 设备可以在其中交换具有合格质量和性能的消息的区域。 21、创建安全连接
建立包括验证和加密在内的连接的程序。 22、创建信任关系
将远程设备标记为信任设备的程序。这包括存储供将来验证和配对使用的通用链路密钥(如果没有链路密钥)。
23、设备发现
从可发现设备上检索 Bluetooth 设备地址、时钟、设备类别字段及使用的寻呼扫描模式的程序。
24、可发现设备
位于可发现范围内的 Bluetooth 设备,它定期监听其查询扫描物理信道并响应该信道上的查询请求。正常情况下,可发现设备都可以连接。
25、加密
数据编码方法,可以防止其他人破译信息。 26、扩展服务发现配置文件 (ESDP)
ESDP 定义了通用即插即用设备如何通过 Bluetooth 无线连接运行。 27、文件传输配置文件 (FTP)
FTP 定义了客户端设备如何浏览服务器设备上的文件夹和文件。一旦客户端找到了文件或位置,客户端即可从服务器拉取文件,或通过 GOEP 从客户端推送文件至服务器。
28、通用访问配置文件 (GAP)
GAP 是所有其它配置文件的基础,它定义了在 Bluetooth 设备间建立基带链路的通用方法。此配置文件定义了一些通用的操作,这些操作可供引用 GAP 的配置文件以及实施多个配置文件的设备使用。GAP 确保了两个 Bluetooth 设备(不管制造商和应用程序)可以通过 Bluetooth 技术交换信息,以发现彼此支持的应用程序。不符合任何其它 Bluetooth 配置文件的 Bluetooth 设备必须与 GAP 符合以确保基本的互操作性和共存。
29、查询设备
执行查询程序的 Bluetooth 设备。 30、查询
Bluetooth 设备传输查询消息并监听响应以试图发现覆盖区域内其它 Bluetooth 设备的程序。
31、查询扫描
Bluetooth 设备监听其查询扫描物理信道上接收到的查询消息的程序。 32、干扰
流中的信息实体均按时间关系与其前行和后续实体捆绑在一起的情况。 33、等时数据
流中的信息,在该流中,信息实体均按时间关系与其前行和后续实体捆绑在一起。
34、已知设备
至少已存储其 BD_ADDR 的 Bluetooth 设备。 35、L2CAP 信道
两台设备在 L2CAP 层上建立的一种逻辑连接,为单应用或更高层协议服务。
36、建立 L2CAP 信道
在 L2CAP 层上建立逻辑连接的程序。
37、建立链路
在设备间建立默认 ACL 链路、链路层级及信道的程序。 38链路
逻辑链路的简写。 39、链路密钥
两个设备都知道并用于验证彼此的密钥。 40、LMP 验证
验证远程设备实体的 LMP 层步骤。 41、LMP 配对
验证两个设备并创建共用链路密钥的程序,共用密钥是信任关系或(单一)安全连接的基础。
42、逻辑信道
同 L2CAP 信道一样,但由于在 Bluetooth 版本 1.1 中有其它意义,所以不赞成使用。
43、逻辑链路
最低架构层,用于为 Bluetooth 系统客户端提供数据传输服务。 44、逻辑传输
这在 Bluetooth 无线技术中用于表示因存在共享确认协议和链路标识符,两个不同逻辑链路具有的通用性。
45、名称发现
搜索可连接设备的用户友好名称(Bluetooth 设备名称)的程序。 46、数据包
在物理信道上传输的集合比特的格式。 47、寻呼
连接程序的初始阶段,设备在此阶段发出一系列寻呼消息,直到从目标设备接收到响应或发生超时。
48、寻呼扫描
设备监听其寻呼扫描物理信道上接收到的寻呼消息的程序。 49、寻呼设备
执行寻呼程序的 Bluetooth 设备。 50、已配对设备
已与其交换了链路密钥的 Bluetooth 设备(在请求建立连接之前或在连接阶段中)。
51、配对
在两个 Bluetooth 设备间建立新关系的过程。此过程中将交换链路密钥(在请求建立连接之前或在连接阶段)。
52、休眠设备
设备在已同步至主设备的基础模式微微网中运行,但放弃了其默认的ACL逻辑传输。
53、密码
配对设备时,强烈建议您使用密码验证即将进行的连接。另外,在某些连接情况下,您需要确保连接到正确的设备或个人。密码通常是按键(字母或数字)的任意组合。使用时请注意,某些设备映射字符的方式不同。密钥仅在连接时有效,用于不同设备或用户的密钥可以不同。
、物理信道
表现为由一个或多个设备同步占用一系列射频载波。有许多种物理信道类型,其各自的特征由其不同的用途决定。
55、物理链路
两个设备间通过寻呼创建的基带层连接。 56、PIN
一种用户友好号码,可用于在配对发生前验证设备的连接。 57、休眠从设备广播 (PSB)
休眠从设备广播逻辑传输,用于在主设备和休眠设备间通信。 58、范围
Bluetooth无线电信号可以覆盖的区域。此区域可能会受到多种因素的影响。 59、串行端口配置文件 (SPP)
SPP 定义了如何设置虚拟串行端口及如何连接两个 Bluetooth 设备。 60、服务层协议
使用 L2CAP 信道传输 PDU 的协议。 61、服务发现
查询和浏览由或通过其它 Bluetooth 设备提供的服务的程序。 62、服务发现应用配置文件 (SDAP)
SDAP描述了应用程序如何使用 SDP 发现远程设备上的服务。SDAP 要求任何应用程序都应能够发现它要连接的其它 Bluetooth 设备上的可用服务。
63、静默设备
如果 Bluetooth 设备未响应远程设备发出的查询,将对远程设备显示为静默状态。
、未知设备
没有存储有关其任何信息(Bluetooth 设备地址、链路密钥或其它)的 Bluetooth 设备。
2.5.3如何在Android系统中操作Bluetooth
Android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备、寻找局域网内可能或者匹配的设备、连接设备和设备之间的数据传输。以下是建立蓝牙连接的所需要的一些基本类:
BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交互的的入口点。利用它可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。
BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态(其信息是封装在BluetoothSocket中)。
BluetoothSocket类:代表了一个蓝牙套接字的接口(类似于TCP中的套接字),它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。
BlueboothServerSocket类:代表打开服务连接来监听可能到来的连接请求(属于server端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接到了的时候,BlueboothServerSocket类将会返回一个BluetoothSocket。
BluetoothClass类:描述了一个蓝牙设备的一般特点和能力。它的只读属性集定义了设备的主、次设备类和一些相关服务。然而,它并没有准确地描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。
要操作蓝牙,先要在AndroidManifest.xml里加入权限: [12]
1、BluetoothAdapter蓝牙适配器,直到我们建立BluetoothSocket连接之前,都要不断操作它。BluetoothAdapter里的方法很多,常用的有以下几个:
cancelDiscovery()取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索
disable()关闭蓝牙。
enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,以下两行代码同样是打开蓝牙,但会提示用户: Intentenabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler,reCode); //同startActivity(enabler); getAddress()获取本地蓝牙地址
getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter getName()获取本地蓝牙名称
getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备 getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要) isDiscovering()判断当前是否正在查找设备,是则返回true isEnabled()判断蓝牙是否打开,已打开返回true,否则返回false listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步
startDiscovery()开始搜索,这是搜索的第一步
2、BluetoothDevice 描述了一个蓝牙设备
createRfcommSocketToServiceRecord(UUIDuuid)根据UUID创建并返回一个BluetoothSocket,这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket
这个类其他的方法,如getAddress()、getName()等,同BluetoothAdapter。 3、BluetoothServerSocket
如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,这个类一种只有三个方法: 两个重载的accept(),accept(int timeout)
两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行。还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接
close() 关闭
4、BluetoothSocket是客户端,跟BluetoothServerSocket相对 一共5个方法,不出意外,都会用到
close() 关闭 connect() 连接
getInptuStream() 获取输入流 getOutputStream() 获取输出流
getRemoteDevice() 获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备
3程序主要架构与模块
3.1 需求分析 3.1.1引言
1、编写目的
这份软件为Android系统提供基于蓝牙协议的即时通讯功能,使两个具备蓝牙模块的Android设备之间能够进行简单的字符串以及文件的相互发送的功能。
2、背景
软件系统名称:蓝牙聊天
任务来源:毕业设计,开发者:张京,用户实现软件的平台:Android系统、蓝牙模块。 3、术语定义 此略(见本文2章) 3.1.2系统功能
1、系统功能模块图
图3.1 系统功能模块图
2、功能描述 (1)蓝牙模块
蓝牙模块是这个系统最主要的模块,主要负责两台设备之间的互相搜索,
在搜索之后建立连接,并且在需要数据发送的时候提供信息发送方式。设备之间所有的数据交流都要经过这一个模块,这一个模块主要分为两个部分,一个是搜寻其他设备,另外一个是建立这两个设备之间的连接。
(2)文件存储模块
文件存储模块主要负责文件的读取、写入功能,为程序的文件发送功能作服务层,此模块有两个主要功能:保存文件和读取文件。
(3)发送
发送为此程序的主要UI层,用户在这个界面上输入文字,按下发送按钮,就可以实现整个程序的功能。 3.1.3设计分析 1、用户界面设计
图3.2 用户界面设计图
2、系统流程图
图3.3 系统运行流程图
3.1.4运行环境说明
本程序运行于Android系统,最低系统Android 1.5 Cupcake,设备需要有蓝牙模块。
3.2程序主要架构以及流程 3.2.1 BluetoothChat 例程分析
Google 提供的关于 Bluetooth 开发的例程为 Bluetoothchat。除去配置及 UI定义等文件,主程序文件共三个:BluetoothChat.java 、 BluetoothChatService.java 以及 DeviceListActivity.java ,详细功能可见下面的描述。
图3.4 BluetoothChat流程图
1.BluetoothChat.java
此为例程的主Activity。onCreate() 得到本地 BluetoothAdapter 设备,检查是否支持。 onStart() 中检查是否启用蓝牙,并请求启用,然后执行 setupChat()。 setupChat() 中先对界面中的控件进行初始化增加点击等,然创建 BluetoothChatService 对象,该对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。 2.BluetoothChatService.java public synchronized void start() :
开启 mAcceptThread 线程,由于样例程序是仅 2 人的聊天过程,故之前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
public synchronized void connect(BluetoothDevice device) :
取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程。
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :
开启一个 ConnectedThread 来管理对应的当前连接。之前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,然后开启新
mConnectedThread ,传入当前刚刚接受的 socket 连接。最后通过 Handler
来通知 UI 连接 OK 。
public synchronized void stop() :停止所有相关线程,设当前状态为 NONE 。 public void write(byte[] out) :在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。
private void connectionFailed() :连接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
private void connectionLost() :当连接失去的时候,设为 STATE_LISTEN 状态并通知 UI 。
内部类:
private class AcceptThread extends Thread :创建监听线程,准备接受新连接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。
private class ConnectThread extends Thread :这是定义的连接线程,专门用来对外发出连接对方蓝牙的请求和处理流程。构造函数里通过 BluetoothDevice.createRfcommSocketToServiceRecord(),从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。
private class ConnectedThread extends Thread :这个是双方蓝牙连接后一直
运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 然后 post 到UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。 3.DeviceListActivity.java
该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。
BluetoothDevice 类,此为对应的远程蓝牙 Device
createRfcommSocketToServiceRecord() :创建该 Device 的 socket 。 BluetoothSocket 类
connect() :请求连接蓝牙。
getInputStream() :得到输入流,用于接收远程方信息。 getOutputStream() :得到输出流,发送给远程方的信息。 close() :关闭蓝牙连接。 InputStream 类:
read(byte[]) :以阻塞方式读取输入流。 OutputStream 类:
write(byte[]) :将信息写入该输出流,发送给远程。 3.2.2 Bluetooth模块 1.启动蓝牙功能:
首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器
BluetoothAdapter,以后就可以使用该对象了。如果返回为空,则无法继续执行了。例如:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth } 其次,调用isEnabled()来查询当前蓝牙设备的状态,如果返回为false,则表示蓝牙设备没有开启,接下来需要封装一个ACTION_REQUEST_ENABLE请求
到intent里面,调用startActivityForResult()方法使能蓝牙设备,例如: if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } 2. 查找设备:
使用BluetoothAdapter类里的方法,可以查找远端设备(大概十米以内)或者查询在手机上已经匹配(或者说绑定)的其他手机了。当然需要确定对方蓝牙设备已经开启或者已经开启了“被发现使能”功能(对方设备是可以被发现的是能够发起连接的前提条件)。如果该设备是可以被发现的,会反馈回来一些对方的设备信息,比如名字、MAC地址等,利用这些信息,设备就可以选择去向对方初始化一个连接。
如果是第一次与该设备连接,那么一个配对的请求就会自动的显示给用户。当设备配对好之后,他的一些基本信息(主要是名字和MAC)被保存下来并可以使用蓝牙的API来读取。使用已知的MAC地址就可以对远端的蓝牙设备发起连接请求。
匹配好的设备和连接上的设备的不同点:匹配好只是说明对方设备发现了的存在,并拥有一个共同的识别码,并且可以连接。连接上:表示当前设备共享一个RFCOMM信道并且两者之间可以交换数据。也就是是说蓝牙设备在建立RFCOMM信道之前,必须是已经配对好了的。 3. 查询匹配好的设备:
在建立连接之前必须先查询配对好了的蓝牙设备集(周围的蓝牙设备可能不止一个),以便选取哪一个设备进行通信,例如可以可以查询所有配对的蓝牙设备,并使用一个数组适配器将其打印显示出来:
Set new 4. 扫描设备: 扫描设备,只需要简单的调用startDiscovery()方法,这个扫描的过程大概持续是12秒,应用程序为了ACTION_FOUND动作需要注册一个BroadcastReceiver来接受设备扫描到的信息。对于每一个设备,系统都会广播ACTION_FOUND动作。例如: // Create a BroadcastReceiver for ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // Add the name and address to an array adapter to show in a ListView mArrayAdapter.add(device.getName() + \"\\n\" + device.getAddress()); } } }; // Register the BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy = 注意:扫描的过程是一个很耗费资源的过程,一旦找到需要的设备之后,在发起连接请求之前,确保程序调用cancelDiscovery()方法停止扫描。显然,如果已经连接上一个设备,启动扫描会减少通信带宽。 5. 使能被发现:Enabling discoverability 如果想使的设备能够被其他设备发现,将ACTION_REQUEST_ DISCOVERABLE动作封装在intent中并调用startActivityForResult(Intent, int)方法就可以了。它将在不使应用程序退出的情况下使的设备能够被发现。缺省情况下的使能时间是 120 秒,当然可以可以通过添加 EXTRA_DISCOVERABLE_DURATION字段来改变使能时间(最大不超过300秒,这是出于对设备上的信息安全考虑)。例如: Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); 运行该段代码之后,系统会弹出一个对话框来提示启动设备使能被发现(此过程中如果蓝牙功能没有开启,系统会帮开启),并且如果准备对该远端设备发现一个连接,不需要开启使能设备被发现功能,因为该功能只是在应用程序作为服务器端的时候才需要。 6. 连接设备: 在应用程序中,想建立两个蓝牙设备之间的连接,必须实现客户端和服务器端的代码(因为任何一个设备都必须可以作为服务端或者客户端)。一个开启服务来监听,一个发起连接请求(使用服务器端设备的MAC地址)。当他们都拥有一个蓝牙套接字在同一RFECOMM信道上的时候,可以认为他们之间已经连接上了。服务端和客户端通过不同的方式或其他们的蓝牙套接字。当一个连接监听到的时候,服务端获取到蓝牙套接字。当客户可打开一个FRCOMM信道给服务器端的时候,客户端获取到蓝牙套接字。 注意:在此过程中,如果两个蓝牙设备还没有配对好的,android系统会通过一个通知或者对话框的形式来通知用户。RFCOMM连接请求会在用户选择之前阻塞。如下图: 图3.5 蓝牙配对界面 7. 服务端的连接: 当想要连接两台设备时,一个必须作为服务端(通过持有一个打开的BluetoothServerSocket),目的是监听外来连接请求,当监听到以后提供一个连接上的BluetoothSocket给客户端,当客户端从BluetoothServerSocket得到BluetoothSocket以后就可以销毁BluetoothServerSocket,除非还想监听更多的连接请求。 建立服务套接字和监听连接的基本步骤: 首先通过调用listenUsingRfcommWithServiceRecord(String, UUID)方法来获 取BluetoothServerSocket对象,参数String代表了该服务的名称,UUID代表了和客户端连接的一个标识(128位格式的字符串ID,相当于PIN码),UUID必须双方匹配才可以建立连接。其次调用accept()方法来监听可能到来的连接请求,当监听到以后,返回一个连接上的蓝牙套接字BluetoothSocket。最后,在监听到一个连接以后,需要调用close()方法来关闭监听程序。(一般蓝牙设备之间是点对点的传输) 注意:accept()方法不应该放在主Acitvity里面,因为它是一种阻塞调用(在没有监听到连接请求之前程序就一直停在那里)。解决方法是新建一个线程来管理。例如: private class AcceptThread extends Thread { private final BluetoothServerSocket mmServerSocket; public AcceptThread() { // Use a temporary object that is later assigned to mmServerSocket, // because mmServerSocket is final BluetoothServerSocket tmp = null; try { // MY_UUID is the app's UUID string, also used by theclient code tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); } catch (IOException e) { } mmServerSocket = tmp; } public void run() { BluetoothSocket socket = null; // Keep listening until exception occurs or a socket is returned while (true) { try { socket = mmServerSocket.accept(); } catch (IOException e) { break; } // If a connection was accepted if (socket != null) { // Do work to manage the connection (in a separate thread) manageConnectedSocket(socket); mmServerSocket.close(); break; } } } /** Will cancel the listening socket, and cause the thread to finish */ public void cancel() { try { mmServerSocket.close(); } catch (IOException e) { } } } 8. 客户端的连接: 为了初始化一个与远端设备的连接,需要先获取代表该设备的一个BluetoothDevice对象。通过BluetoothDevice对象来获取BluetoothSocket并初始化连接,具体步骤: 使 用 BluetoothDevice 对 象 里 的 方 法 createRfcommSocketToServiceRecord(UUID)来获取BluetoothSocket。UUID就是匹配码。然后,调用connect()方法来。如果远端设备接收了该连接,他们将在通信过程享RFFCOMM信道,并且connect()方法返回。例如: private class ConnectThread extends Thread { private final BluetoothSocket mmSocket; private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) { // Use a temporary object that is later assigned to mmSocket, // because mmSocket is final BluetoothSocket tmp = null; mmDevice = device; // Get a BluetoothSocket to connect with the given BluetoothDevice try { // MY_UUID is the app's UUID string, also used by the server code tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } mmSocket = tmp; } public void run() { // Cancel discovery because it will slow down the connection mAdapter.cancelDiscovery(); try { // Connect the device through the socket. This will block // until it succeeds or throws an exception mmSocket.connect(); } catch (IOException connectException) { // Unable to connect; close the socket and get out try { mmSocket.close(); } catch (IOException closeException) { } return; } // Do work to manage the connection (in a separate thread) manageConnectedSocket(mmSocket); } 注意:conncet()方法也是阻塞调用,一般建立一个的线程中来调用该方法。在设备discover过程中不应该发起连接connect(),这样会明显减慢速度以至于连接失败。且数据传输完成只有调用close()方法来关闭连接,这样可以节省系统内部资源。 9. 管理连接(主要涉及数据的传输): 当设备连接上以后,每个设备都拥有各自的BluetoothSocket。现在就可以实现设备之间数据的共享了。 (1) 首先通过调用getInputStream()和getOutputStream()方法来获取输入输出流。然后通过调用read(byte[]) 和write(byte[]).方法来读取或者写数据。 (2) 实现细节:以为读取和写操作都是阻塞调用,需要建立一个专用现成来管理。 private class ConnectedThread extends Thread { private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) { mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; // Get the input and output streams, using temp objects because // member streams are final try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { } mmInStream = tmpIn; mmOutStream = tmpOut; } public void run() { byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read() // Keep listening to the InputStream until an exception occurs while (true) { try { // Read from the InputStream bytes = mmInStream.read(buffer); // Send the obtained bytes to the UI Activity mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget(); } catch (IOException e) { break; } } } /* Call this from the main Activity to send data to the remote device */ public void write(byte[] bytes) { try { mmOutStream.write(bytes); } catch (IOException e) { } } /* Call this from the main Activity to shutdown the connection */ public void cancel() { try { mmSocket.close(); } catch (IOException e) { } } } 3.2.3 文件读取以及存储模块 1、服务层 Context类中openFileOutput()函数的使用 函数声明: FileOutputStream openFileOutput (String name,int mode) 作用:可以方便地在手机中创建文件,并返回文件输出流,用于对文件做写入操作。name:用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,Android会自动创建它。创建的文件保存在/data/data/ 使用FileOutputStream openFileOutput 函数,就能够实现文件的存储功能,而具体需要读取的文件则会交给下一节的控制层来进行信息收集。 另: (1)FileInputStream openFileInput(String name)返回文件输入流,用于对文件的读操作。 (2)Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data/ (3)在此文件中,使用的是MODE_PRIVATE。 2、控制层 在点击发送文件按钮之后,应该弹出一个Activity,以供用户选择需要发送的文件。这个Activity是一个ListView并且具备按键监听,这个Activity能够遍历预设路径的文件夹,让其内部的文件名依次排列在ListView里,并且当用户点击某一个文件时,这个Activity能够向主Activity送出用户所点击的文件名称,然后关闭。这样主进程就能够获得返回的值进行文件管理的操作。 图3.6 文件存储模块控制层流程 具体实现方式: 首先在主进程BluetoothChat.java中的菜单按键MENU中添加Intent调用: Intent serverIntent = new Intent(this, FileSelect.class); startActivityForResult(serverIntent, SENDING_FILE); 这样,执行文件选择的FileSelect这个Activity就会被开启,在执行完所有 的工作之后,在FileSelect中下列代码: Intent intent = new Intent(); intent.putExtra(FILE_SENT, songPath); // Set result and finish this Activity setResult(FILE_SEND, intent); finish(); 这样FileSelect执行完毕后,会返回BluetoothChat所需要的值,其中SENDING_FILE为requestcode,FILE_SEND为resultcode,用于Activity之间区分所求信息与所需信息的标志。 3、关于遍历读取算法 public void findNewSongs(String mediaPath){ File home = new File(mediaPath); if (home.listFiles().length>0){ for(File file:home.listFiles()){ if(file.isDirectory()){ findNewSongs(file.getAbsolutePath()+\"/\"); System.out.println(file.getAbsolutePath()+\"/\"); } } } if(home.listFiles(new MP3Fliter()).length>0){ for(File file:home.listFiles(new MP3Fliter())){ songs.add(file.getName()); hashMap.put(file.getName(),file.getName()); ListAdapter songList = new ListAdapter (this,android.R.layout.simple_list_item_1,songs); setListAdapter(songList); } }; } 这个函数的作用是反复读取文件夹内文件的名字,并且设置hashMap,以键值来对应String流,区分出每个String流的标志,方便以后调用所需要的文件名。 设置按键监听后,在onClick()方法里加入 String songPath = (String)hashMap.get(songs.get(currentPosition)); 这样就能从之前的hashMap中找到需要的信息,存储在songPath的String流里,再通过Intent回调给BluetoothChat,BluetoothChat再根据传回的信息交给服务层读取文件。 4程序的调试与结果 4.1虚拟机的搭建以及使用 Google Android SDK工具包中提供了AVD虚拟设备模拟模块,可以利用此模块加载一个虚拟机。 打开SDK文件夹中的AVD Manager.exe。显示如图: 图4.1 AVD Manager程序界面 可以单击New…来新建虚拟机,供Eclipse使用。 点击New…后出现虚拟机的配置选项,如图4.2所示: 图4.2 AVD Manager虚拟机详细配置界面 在Eclipse使用虚拟机: 在所要运行的项目上单击右键,选择Run As→Android Application,如图4.3所示: 图4.3 Eclipse使用AVD设备 点击后出现选择设备的界面,如下图所示: 图4.4 Eclipse选择AVD设备 选择要使用的虚拟机设备,点击OK就可以看到设备运行程序了。结果 如下图所示: 图4.5 虚拟机界面 由于设备原因虚拟机上无法设置蓝牙模块,因此无法使用虚拟机进行程序调试。应该采用另外一种方式进行程序调试,将在下一节讲述。 4.2 ADB调试 Google提供了可以直接在实体机上调试的功能,只需要打开手机设置→开发人员选项→USB调试,如图4.6所示。把安卓设备接在电脑上就可以使用Eclipse进行调试。 图4.6 手机设置界面 此时选择Run As→Android Application之后,选择设备的界面如图所示: 图4.7 Eclipse选择界面 4.3 DEBUG调试 Eclipse给出了一套非常完整的DEBUG途径 点击右上角的按钮就能进入DEBUG界面,如下图所示: 图4.8 Eclipse Debug界面 在此可以设立断点,进行程序更进一步的调试。 4.4 运行结果 运行程序后,按下设备上的menu键,程序显示如下图: 图5.1 程序主界面 点击“使蓝牙可见”则会出现以下蓝牙可见申请,如图所示: 图5.2 申请蓝牙可见 点击“连接到设备”显示如下窗口,如图所示: 图5.3 连接设备界面 选择可以连接的设备,如果没有设备可以点击搜索设备连接成功之后如下显示,如图所示: 图5.4 设备已连接 成功连接之后就可以发送消息,如图所示: 图5.5 对话界面 点击menu菜单的“发送文件”可以自动发送test.txt文件,成功发送,如图所示: 图5.6 文件发送成功界面 test.txt储存于/data/data/com.example.android.BluetoothChat/files/里,如图所示: 图5.7 文件发送结果 总 结 本文从Android系统、Bluetooth协议介绍入手,分析了Google Android SDK中的BlueChat例程,介绍了Android编程环境的搭建。说明如何在Android系统下通过Bluetooth协议进行即时通讯功能,以及在Eclipse软件中的调试过程。通过研究与学习,实现一个基于Android系统的蓝牙软件,可以进行文字、文件的传输功能。 在Android系统中利用Bluetooth协议进行即时通讯主要需要以下3个模块: 1、Bluetooth模块 (1)启动蓝牙 通过静态调用方法,获取蓝牙适配器,就可以调用此蓝牙对象,如果返回为空,则代表该设备不能使用蓝牙设备。 (2)设备搜索 在蓝牙进行连接之前,先要搜索附近有没有可以连接的蓝牙设备,这个步骤可以查询出有效范围内开启可见性的等待连接设备。 (3)查询匹配好的设备 在建立连接之前会查询已经配对完毕的蓝牙设备集,供选择具体要与哪一个设备进行通讯连接。 (4)连接设备进行传输 在两个设备之间建立C-S连接,并且在此基础上进行数据传输。 2、界面与服务层的通讯模块 在Bluetooth层收到了接受到的信息之后,还需要打印到屏幕上供用户阅览,也需要读取用户输入的文字进行发送准备。这个模块为整个程序的主Activity 3、文件读取与存储模块 此模块提供了程序访问手机内部存储空间的功能。 经过这次学习实践操作,也让我更加熟悉Android编程以及Eclipse软件使用,以及如何调试Android程序,对Bluetooth协议也有更加深入的认识。深入研究了蓝牙即时通讯程序,最后实现了文字以及文件的传输,让我收获很多。从需求分析,到寻找案例,再通过研究案例更加深入理解Android系统与蓝牙协议,加上导师、师兄、前辈的指导,最后才能有此成果。 Android作为一个市场占有率如此高的手机,其即时通讯软件的开发必然将会是一个非常有吸引力的题目。本文所论述的即时通讯软件是基于蓝牙协议,但即时通讯软件并不一定局限于蓝牙协议,因为蓝牙的小范围特性,了其利用范围。但若此程序是基于互联网Socket的话,就可以对互联网上任意的设备进行数据通讯以及文件收发,但是所需要的设备以及成本也会增加,需要有固定IP的设备作为服务器端,由于中国网络运营商的特殊性,这样会造成非常大的建设成本。因此,这会成为本人以后的研究方向,在此文中不做讨论。本文中所提到的文件存储模块,在此程序中只实现了文件的传输的功能,但同样也可以用作消息记录模块,记录下对话信息。 参考文献 [1] wiki. Android 系统维基百科[EB\\OL]http://zh.wikipedia.org/wiki/Android [2] 杨丰盛. Android应用开发揭秘[M]. 机械工业出版社,2010. [3] 钟亚雷.基于AVS的即时通讯系统的设计与实现[D]. 江西:江西师范大学,2008 [4] 林挺.蓝牙核心协议栈的研究[D] .北京:北京交通大学,2006 [5] 朱刚,谈振辉.《蓝牙技术原理与协议》[M].北方交通大学出版社,2002 [6] 中国Linux联盟. 25个让Java程序员更高效的Eclipse插件[EB\\OL] [7] 张立国,龚海平,王植萌编著.《Android移动开发入门与进阶》[M].人民邮电出版社,2009 [8] 罗震.Android平台环境下应用程序架构的设计与实现[D]. 武汉:华中科技大学,2009 [9] 何孟翰 著,王世江 改编.《Google Android SDK 开发实战演练》[M].人民邮电出版社,2009 [10] 王文喜.《蓝牙技术研究》[D].大连:大连理工大学,2007 [11] [EB\\OL]http://developer.android.com/guide/topics/wireless/bluetooth.html 致 谢 大学四年匆匆而过,在这即将结束大学生活的时候,不禁想起过往与老师、同学一起度过的时光,老师的教诲,同学的无私帮助,都深深的刻在我的记忆里,成为挥之不去的一部分。 首先我想感谢我的导师郑日荣老师,半年的时间里,一直在指导着我们如何去完成这次毕业设计,当我在接到题目毫无头绪的时候,郑老师给了我方向,建议了一些书籍让我去查阅。在写论文的时候也给出许多帮助非常大的建议,让我在写论文的时候少了许多疑问。 然后我想感谢曾绳涛师兄,虽然与他的交流次数不多,但是在我构思程序的时候给了我非常大的灵感,整篇文章的主体思路就是受到师兄的启发而形成的,在此我想感谢他的提点。 此外我还想感谢我的友人Darcy,他协助我调试程序,整个程序的实现也离不开他的帮助。 最后我要感谢广东工业大学,给了我这么好的学习的机会与环境。 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。 学位论文作者(本人签名): 年 月 日 学位论文出版授权书 本人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入CNKI《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。 论文密级: □公开 □保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此协议) 作者签名:_______ 导师签名:_______ _______年_____月_____日 _______年_____月_____日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。 作者签名: 二〇一〇年九月二十日 毕业设计(论文)使用授权声明 本人完全了解滨州学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定) 作者签名: 二〇一〇年九月二十日 致 谢 时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。 首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。 首先,我要特别感谢我的知道郭谦功老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。郭谦功老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。 其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。 另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。 最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢我的导师赵达睿老师、和研究生助教熊伟丽老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名: 日 期: 指导教师签名: 日 期: 使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名: 日 期: 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 指导教师评阅书 指导教师评价: 一、撰写(设计)过程 1、学生在论文(设计)过程中的治学态度、工作精神 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、学生掌握专业知识、技能的扎实程度 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生综合运用所学知识和专业技能分析和解决问题的能力 □ 优 □ 良 □ 中 □ 及格 □ 不及格 4、研究方法的科学性;技术线路的可行性;设计方案的合理性 □ 优 □ 良 □ 中 □ 及格 □ 不及格 5、完成毕业论文(设计)期间的出勤情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 指导教师: (签名) 单位: (盖章) 年 月 日 评阅教师评阅书 评阅教师评价: 一、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 评阅教师: (签名) 单位: (盖章) 年 月 日 教研室(或答辩小组)及教学系意见 教研室(或答辩小组)评价: 一、答辩过程 1、毕业论文(设计)的基本要点和见解的叙述情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、对答辩问题的反应、理解、表达情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生答辩过程中的精神状态 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 评定成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 教研室主任(或答辩小组组长): (签名) 年 月 日 教学系意见: 系主任: (签名) 年 月 日 1 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。 学位论文作者(本人签名): 年 月 日 学位论文出版授权书 本人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入****《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。 论文密级: □公开 □保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此协议) 作者签名:_______ 导师签名:_______ _______年_____月_____日 _______年_____月_____日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。 作者签名: 二〇一〇年九月二十日 毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定) 作者签名: 二〇一〇年九月二十日 致 谢 时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。 首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。 首先,我要特别感谢我的知道***老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。***老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。 其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。 另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。 最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢我的导师***老师、和研究生助教***老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务