android蓝牙开发简介(精选11篇)
一.BC6145 1.连接spi板和BC6145,电脑并口连接到spi下载板上,bc6145要开机,如下图:
2.打开Headset Config Tool BC6145软件,修改pskey
1 硬件设备介绍
1.1 Arduino UNO R3开发板
本次研究平台基于开源Arduino UNO R3开发板。Arduino UNO R3是2012年最新推出的一款易用型开源控制器,硬件上与之前Arduino UNO相比并没有大的变动,最大不同在于USB转串口电路部分,改用的是一块ATMega16U2单片机。除了之前所有的特点外,这块板可以使用ATmega16U2替代了8U2。这允许更快的转换速度和更大内存,Linux或者Mac不需要驱动程序,并且有能力外接键盘、鼠标、摇杆等。
Arduino是一个基于开源的、有简单的I/O接口的物理计算平台。Arduino可以用于独立做项目开发的控制核心,也可以与PC进行直接的USB连接完成与电脑间的互动。Arduino开源IDE开发环境可以通过相关文档的链接直接免费下载(支持Window,Linux以及Max系统)。
1.2 HC-05蓝牙模块
本次研究使用HC-05主从一体蓝牙串口模块作为Ardui⁃no UNO R3开发板和ANDROID手机进行无线通信的设备。
HC-05是一款主从一体可以设置的蓝牙芯片,具有传统蓝牙技术的功能,模块的接口有串口、spi接口和usb接口。HC-05经过测试在室内可达10m以内的通信距离。在实际使用的过程中,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
2 ANDUINO开发板C语言代码原理
本次研究是利用开发板串口连接蓝牙接口,当接上到AN⁃DROID上位机发来指令为1时让LED1变换状态(如果原来是亮状态则切换为灭状态,反之为亮状态),发送的指令为2时让LED2变换状态。
首先是LED灯宏定义,让LED1和LED2分别连接开发板第4和第5引脚。
#define LED1 4
#define LED2 5
其次是开发板串口宏定义,使用开发板的串口10作为发送端口,串口11作为接收端口。
#define TX 10
#define RX 11
通过给定的函数库来定义蓝牙模块,New Soft Serial blue⁃tooth(TX,RX);
使用setup函数对LED1、LED2和蓝牙模块进行初始化。
pin Mode(LED1,OUTPUT);//将LED1设置为输出模式
pin Mode(LED2,OUTPUT);//将LED2设置为输出模式
bluetooth.begin(9600);//设置蓝牙接收数据波特率
最后编写loop函数,接收ANDROID上位机的指令,通过判断接收的指令来让改变LED1状态还是LED2状态。
3 ANDROID移动端代码原理
ANDROID移动端代码主要分三个部分,一个部分设计ANDROID界面,其次是是寻找到ARDUINO开发板的蓝牙并连接,最后一个部分是向ARDUINO开发板发送指令。
本研究只是上位机和下位机蓝牙连接,所以界面设计比较简单。通过XML布局文件设置两个按钮,分别命名为LED1和LED2,通过点击LED1和LED2发出事件,通过事件函数由手机自带蓝牙向ARDUINO开发板发送指令。同时增加一个列表,用于列出ANDRODI移动端平台搜索到的附近蓝牙设备。
接下来定义类Bluetooth Utils,在构造函数中编写搜索附近蓝牙设备。
其次是使用套接字socket连接搜索蓝牙设备。
最后是编写发送指令函数,通过socket套接字发送。
在Activity中主要是相应的处理函数。
添加界面相关代码比较简单,这里省略。这里主要讲解向开发板发送指令。
4 连接测试
在ECLIPSE开发平台中将编写的ANDROID程序打包成APK文件,然后拷贝到手机中进行安装。Arduino UNO R3通过面包板与蓝牙模块相连,Android手机打开自带的蓝牙,搜索到HC-5蓝牙模块后进行连接匹配。连接匹配成功后即可实现二者蓝牙通信。本次连接实现只是进行简单测试通信,通过手机安装的ANDROID软件由蓝牙向Arduino UNO R3开发板发送指令,当点击ANDROID软件界面上的LED1按钮时则向开发板发送1,此时与开发板相连的LED1会变换状态;,当点击AN⁃DROID软件界面上的LED2按钮时则向开发板发送2,此时与开发板相连的LED1会变换状态。硬件连接测试见图2。
5 结语
本论文针对当前流行的Arduino UNO R3硬件开发板,介绍该开发板的相关特点,着重论述如何用代码实现上位机连接下位机,并通过蓝牙向下位机发送指令,同时介绍下位机如何接收上位机的指令来控制LED灯的状态。通过相关阐述,并最终实现预想的设计方案。
但是本次研究只能实现上位机向下位机发送指令,不能实现下位机的相关状态信息反馈给上位机并显示出来,希望以后多做这方面的研究。
参考文献
[1]Simon Monk.Arduino+Android互动智作[M].科学出版社,2013.
[2]博希莫.学Arduino玩转Android应用[M].人民邮电出版社,2014.
SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。
SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。
File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作,
PS: URI由3个部分组成:“content://”、数据的路径、标识ID(可选)。
SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是:
NULL: 空值
INTEGER: 整数
REAL: 浮点数
TEXT: 字符串
BLOB: 大数据
在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显示,为了能方便的操作DATE类型,SQLite提供了一组函数,详见:www.sqlite.org/lang_datefunc.html。这样简单的数据类型设计更加符合嵌入式设备的要求。关于SQLite的更多资料,请参看:www.sqlite.org/
在Android系统中提供了android.database.sqlite包,用于进行SQLite数据库的增、删、改、查工作。其主要方法如下:
beginTransaction: 开始一个事务。
close(): 关闭连接,释放资源。
今天要给大家分享的是Android开发入门,小青青_Lo是我的微博昵称,如果觉得我讲得好,求互粉(*^__^*)嘻嘻~~
讲解大纲
这个是今天讲解的大纲,首先通过著名Hello world程序对Android开发有一个感性的认识,之后上升到理性认识,了解android开发的重要组成部分和基本开发流程。Android开发主要包括App组件,App资源和App的配置文件。App组件主要负责和用户交互,处理用户请求;而App Res主要负责用户界面的视图;App Manifest文件主要用来声明App运行所需环境,比如App包含哪些功能模块,API最低最高版本要求,比如Android操作系统版本要求运行设备的性能要求,比如屏幕分辨率,内存空间大小等,用户是否有权限访问一些系统应用程序和系统数据,比如通讯录,GPS位置信息,本地通知服务等。
在讲解Android开发的重要组成部分的过程中会涉及一些简单的实例现场演示来讲述Android开发的基本流程。
欢迎提问
因为我本身是一个Android开发的新手,在加上本身写代码写得少,所以难免会有一些错误和讲得不清楚得地方,欢迎大家提出疑问,提问有奖。如果我答不出来,记下来分享后查资料给大家回答。
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better
为什么要学习Android开发?(此段可以精简下)
Android操作系统目前占移动操作系统78%的市场份额,这个充分说明了android开发市场大需求广。现在大家都知道移动互联网是大势所趋,每天坐公交地铁,一眼望去大家都在忙于刷手机ipad就已经充分说明这点,随着移动互联网的兴起,App开发自然是大势所趋。Android操作系统之所以发展如此迅速,和其开源有着密不可分的关系,开源意味着便于扩展和学习,以及使用。
之后我们简单介绍下Android系统架构,一共分为四层,最下层的是linux内核,负责内存管理,进程调度,网络协议以及各种设备驱动等,再上面是各种系统运行库,其主要是应用框架层和linux内核的重要纽带,而我们下载的android SDK处于应用框架层,主要负责给android应用开发提供各种基础服务,我们平时使用的微博,微信等app应用程序就处于应用层。简要介绍了android系统,我们现在开始anroid开发之旅。部署Android开发环境
Android开发第一步就是部署android开发环境,部署android开发环境有两种方式:方法一是JDK+android studio, 方法二是JDK+SDK+Eclipse。我们现在比较下这两种的特性,首先从部署便捷性来看AndroidStudio要比安装SDK步骤少,更方便简单。之前小超分享框架的时候说应用性和性能一般成反比,Android Studio的IDE好用,这同样意味着其性能比SDK的要低,所以其编译运行速度Eclipse显然比Android Studio快,内存消耗低。运行Android Studio一般将我可怜本本拖垮。如果从开发效率来看,方法一显然要高于方法先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 二,从代码架构来看,AS的Java/resoure/Manifest三个文件夹就一一映射了Android开发的三个重要组成部分,而Eclipse的代码架构相比之下稍显混乱。而且Android Studio的UI可视化也比Eclipse的更为强大好用。对于运行机器要求,显然Android Studio比JDK的要求高。
综上所述,AS作为google的官方开发工具,再者从大家最关心的开发效率来看,AS是Android开发的IDE最佳之选
AS是基于IDEA的,好好看看AS好在哪!
http://java.dzone.com/articles/why-idea-better-eclipse
首先创建工程(1)建立一个工程
FileNewAndroid Application Project
运行程序,选中app,右键点击菜单选择run asAndroid Application.注意此时需要将Android手机通过usb接口连接到电脑上,而且选择允许调试,即可在手机上安装运行的app,从而看到运行效果。
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better
(2)分析代码架构(src/res/Manifest File)
src: java code, 主要负责实现App的组件(Activity,Broadcast,ContentProvider,Service etc)和数据存储(文件存储,db存储,shared Preference),完成用户界面内的相关交互。
res: layout,values,drawable etc, 主要负责UI布局,都是xml格式的文件。Manifest File:主要是配置App的运行环境。Api的版本需求,App的访问权限,App所包含的组件,设备特征的相关权限等(3)建立并运行一个activity 先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better PS:首先注意到此处有一个黄色感叹号,说明此程序有警告,如果是一把红叉叉,就是程序包含错误,需要修复。此处有警告,是因为使用了低版本的类ActionBarActivity,所以类名上面有横线,在此处我们修改为Activity类,然后按快捷键ctrl+shift+O,自动import该类的命名空间。此时发现import android.app.Activity;并且黄色的感叹号消失了。
Android开发重要组成部分
接下来我们进一步了解Android开发,Android开发的重要组成部分。Android组件主要包括活动,广播,服务和内容提供器。这四大组件是组成App的基础功能模块,而intent和intent-filters是用来衔接各个功能模块组件,负责组件之间的交互和通信。
如果是组件是负责逻辑控制,那么App Res主要负责用户界面视图,在此会介绍构成视图的资源类型,以及各个资源的组成方式;之后还会介绍如何在代码中访问资源。由于运行app的设备分辨率不同,语言不同,操作系统版本不同等原因,需要考虑到资源如何对各种不同设备的硬软件兼容。
最后我们简单介绍下配置文件的作用。Manifest文件主要是用来声明App运行环境要求,支持什么版本的api,app包含哪些组件,需要哪些用户权限等。Activity的定义
首先我们来看四大组件中最常见的Activity, 在SDK的官方文档是这样定义Activity的,其主要是提供一个可以让用户进行交互完成某些请求的用户界面。比如说用户在拨打电话,拍照,发送邮件,看地图的时候都需要一个用户界面,通过这个界面用户可以和app进行对话,发出请求,app响应请求。同样在刷先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 微博的时候我们也可以处处看到Activity,微博feed流,点击消息进入消息箱。简而言之,Acivity是承载某个功能的UI和交互的一个容器,在app中看到的是一个用户交互界面。Activity状态和生命周期
Activity一共有三种状态,当Activity处于前端的时候,也就是获取用户焦点的时候,其状态为Resumed,此时处于前端生命周期,而当其失去用户焦点,但是还是部分可见的时候,其状态为paused,此时不属于前端生命周期,而属于可见生命周期范围内,而当其失去用户焦点,又不可见的时候,此时就是stoped。从创建到stop整个过程为完整生命周期。
我们可以看一个例子。
主界面获取用户焦点
主界面不可见失去
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better
对于组件的用法主要分为三步:(1)实现组件类
(2)在Manifest或者代码中注册组件(3)在活动中启动或者触发组件
如何使用Activity(见demo)
(1)创建UI—second.xml(2)创建SecondActivity(3)启动一个activity
前面我讲到要从主界面而跳转到第二个界面,也就是从第一个活动跳转到第二个活动,这个时候需要intent来衔接各个组件,完成组件之间的交互。
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 首先我们来看下官方sdk上对intent的定义,intent是指向其他app发出动作请求,四大组件中的活动,服务和广播都是由intent来启动(此处没有讲清楚呀!)也因此intent有广泛的应用,比如
– 从微博feed流跳转到消息箱 – 启动本地通知服务,闹钟备忘录服务 – 发微博晒照片跳转照相机程序
– 密码变更的时候,发送强制下线的广播…
Intent的类型
Intent包含两种类型,显式intent和隐式intent,显式intent是指通过组件类名来启动组件。然后隐式的intent是通过声明组件要执行的动作,android系统根据要执行的动作找到相应的组件启动之。
什么也不多说,我们看看代码。从代码中也可以看出显示intent和隐式intent的区别。一个是从主界面跳转到第二个页面,一个是先在Manifest声明跳转的动作,系统找到符合条件的活动进行启动。隐式intent活动启动的原理
我们通过一个图来看看隐式intent启动活动的原理,如图所示:
[1] Activity A 通过一个Action的描述创建Intent,并将其传给startActivity.[2] 安卓系统搜索所有activity的intent filters,看是否这个intent中的action [3] 如果ActivityB 符合,则将启动Activity B
运行一个intent 先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 如果要build一个intent,要么采用显式的intent通过组件类名进行启动。要么描述组件要执行的动作或者种类信息,系统找到满足条件的组件进行相关的启动,可能执行某些动作的时候还需要携带一些数据。
Intent的用法
Intent可以用来启动一个活动,也可以用于启动一个服务,或者将其余服务进行相关的绑定,或者发送广播,或者在这个过程中传递或者返回数据。具体会在后续进行相关的讲述。
Pendingintent的定义和应用
PendingIntent是指在intent对象外包了一层。Pendingintent最初的目的是用于授权外部程序可以使用内部的intent,就好像这个intent是内部调用,然后在内部进程内执行的。
其主要应用场景有:
一个是用于声明本地通知服务时所需的intent代码 另一个是用于声明定时任务触发的intent 最后是声明与控件交互的intent
Broadcast的定义和应用
广播接收器是指可以用来接收系统范围内的广播通知的组件。广播的应用有:
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 一些是来自系统的广播,比如说提示app电量过低,提示网络中断,不能再正常刷微信微博,开机时通知某些app自动启动。
有一些是应用程序广播或者本地广播,所谓本地广播是指程序内部的广播。比如当通知所有的活动强制下线等。
Broadcast的运行流程
Broadcast的运行流程包括发送广播,注册广播接收器和接收广播。发送广播主要是通过intent来进行广播的发送,注册广播接收器有两种方法,一种是在manifest中静态注册的方法,在manifest中声明接收器的类名以及相关动作。一种是在代码中动态注册的方法,在代码中创建intent-filter,并创建广播接收器对象,用这两个参数注册广播接收器;最后接收广播,就需要实现广播接收器的类,其中最重要是重载onReceive函数,里面是处理当接收到广播的时候如何处理。
ContentProvider的定义和应用
ContentProvider主要是提供访问外部数据的标准接口。
ContentProvider主要适应于当需要将一些复杂的数据或文件提供外部程序使用时,出于安全的考虑,提供contentprovider作为外部程序访问内部数据的接口。当只是在内部完成一些数据的读写,此时是不需要provider的。
ContentProvider的运行过程:
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better
1.App0 给其他app提供了一些数据。
2.App1和App2都想访问App0内部的数据,但App1因为没权限而无权访问,App2在manifest中声明了其访问权限。
3.为了App0内部数据安全,App0给外部程序提供了访问内部数据的标准接口即ContentProvider。
4.App2通过getContentResolver转化content URI中的provider authority和path,并与已知的providers匹配,从而找到所需要的provider,从而成功访问App0的内部数据。ContentProvider的用法:
首先设计相关的数据结构——文件或者结构化数据。
之后就是设计内容的URI,实现provider的类,之后就是定义provider的属性,并且在manifest文件中注册相关的provider。
最后使用getContentResolver来找到正确的provider,我们可以通过一个通讯录的例子来进行相关的了解。
Service的定义和应用
服务主要指在后台长期运行的程序。
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 服务的应用有本地通知服务,定时任务服务和后台应用程序等。
Service的生命周期以及服务的相关用法
服务的生命周期分为完整生命周期和活跃生命周期,完整生命周期是指从服务创建到服务销毁。如果某个服务在某个活动启动,即使是活动被销毁了,这个服务也依然存在,比如push服务,即使没有停留在app前端,push服务也是在后台运行的。
而活跃生命周期是指从服务绑定到服务解绑的整个过程。
Service的相关用法:
实现服务类,在manifest中注册服务组件,并且在活动中启动或者绑定某项服务。
你会发现所有的组件的使用,基本都是实现具体组件类,然后再manifest中注册或者在代码中注册,之后在活动中通过intent启动相关的组件。
资源Resources Res用于构建我们看到的用户界面视图,我们将从以下三个方面来讲述:资源类型,设备兼容性,以及如何在代码中使用Resource,我们对照右图,可以看出资源有布局,有字符串,有调色板等,除了资源的种类,资源还会考虑设备的兼容性,比如说根据屏幕分辨率——分为hdpi的调色版,ldpi的调色板等,根据系统语言,字符串的分为英语,中文,日语的等,而由于不同设备上安装的是不同版本的android操作系统,自然资源要适配各种不同版本的api,比如先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better values-v11,values-v14等
为了更好的用户交互,有时候我们要获取资源,比如实现点击登录按钮跳转到微博主页,我们必须获取登录按钮,针对这个按钮先点击事件。那如何获取到登录按钮呢?也就是如何获取到按钮资源呢?在Android开发中会生成一份R文件,为每一个资源都分配了一个id,我们可以根据这个id进行访问。那如何获取到这个id呢,主要是根据我们在资源xml文件中定义的id,比如R.id.btn_login,类似于html中我们用到的id,也可以是类型+资源名来获取到这个id,比如R.string.hello_world。
布局的树形结构
一个用户界面整体是一个树形结构,有一个根的layout,之后layout可以相互嵌套。在android中资源分为两类:viewGroup和view,而viewGroup继承与view,viewGroup主要指布局,而view主要指控件,如按钮,文本,列表框等 Layout 讲到布局,必须提到布局的几种类型,最常用的是线性布局,其次是相对布局,之后是绝对布局和帧布局,线性布局分为垂直和水平,默认是水平的方式。相对布局主要是相对屏幕或者某个控件,某个内嵌布局的相对位置。Manifest的相关作用
Manifest主要是用来声明App的运行环境,比如运行设备的硬软件特征,对屏幕分辨率,内存空间大小的要求,对Android操作系统版本的要求,App包含哪些组件,需要哪些用户权限等。这些都需要在Manifest中进行相关的声明
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better
小小测试---初步理解认识UI和交互
最后是做些小小测试,检验下大家今天的收获成果,比如在Android开发最重要的就是UI和交互,通过之前的几个小实验,现在大家思考下,这些稍微复杂一点的界面UI如何实现呢?如何构造布局,选择何种控件?
可以看到左边的这个,有一个标题栏,下面是聊天界面,最下面是输入框和发送按钮,可以做一个垂直线性的布局。上面的标题栏可以做一个横向线性的布局,中间的是一个listview的列表框,下面也可以做一个横向的线性布局(手绘一下基本的一个构造)
中间是一个通讯录的页面,这个通讯录的好友页面较之我们之前要复杂的多 也可以做一个垂直的线性布局,上面是一个标题栏,下面是一个listview,标题栏做一个横向的线性布局。而listview对其每一个list又定义一个横向的线性布局,一个ImageView图像控件和一个文本控件 右边的就相对要简单。标题栏加一个图像对象
看完UI之后,我们来分析下交互,左边的是输入文本框的内容,在点击按钮的时候获取文本框的内容添加到消息对象中,listview的消息列表中添加这条发送的消息。
中间就是我们刚刚获取了通讯录的用户名和电话号码的基础上之后,我们还需要获取联系人的头像。将这些元素在自定义列表布局中进行显示。
右边是添加一个感知器对象,感知手机晃动加速度,当加速度达到一定程度,随机弹出一个餐厅的名字。
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better 这三个界面可以做三个活动,在活动中显示UI,并且在活动中完成按钮以及列表框的触发事件。最后通过intent在各个界面之间进行跳转。
最后我们分析下微博的构造来理解四大组件。
微博有哪些主要的功能模块,这些功能模块之间如何交互。
从最下面的导航栏可以看出主要有微博主页,消息箱,微博发布器,发现和我的profile五大功能模块。他们之间可以通过点击按钮实现跳转到相应的活动页面,如果再进入更加深入一级别,就通过点击返回键,返回到上一界面。
首先所有的活动都会接收系统状态参数的一些广播,比如电量,比如网络状态,而且所有的活动都会接收push SDK的push通知服务等,所有活动也会接收当密码变更强制下线的广播。比如通讯录访问手机联系人的时候会用到通讯录数据。我们主要分析下微博feed流和消息箱,这些一般都是分为几个模块,feed流和消息箱都是相应的listview,并且对list定制布局。
后记
本次分享旨在让大家对android开发有一个初步的认识,了解android开发的重要组成部分和基本开发流程,当接到android开发的需求的时候,有一个开发的方向感和清晰的开发思路。希望大家能动一动手,一起见证奇迹app诞生时刻。
先做加法讲清楚,之后做减法,言简意赅,严格控制时间
讲清楚,do better
有一名话叫做:不经过风雨,怎么见彩虹?我想改一下:不真正进入社会,怎能了解社会呢?
在这次实习中,给我收获最大的是我觉得很多工作需要我去摸索和探讨,要不怕吃苦,勇于激流勇进,有的工作虽然单挑又重复,但这是磨练意志最有效的方法,我告诫自己要认真完成,对每项工作都要他看成是公司对自己的一次考核,做到每一件事的过程中遇到困难,一定要争取不抛弃,不放弃,坚持“战斗”,只要希望还在,胜利一定属于我们。
在此次专业实习的过程中,我进入了广州外语通科技有限公司当任Android开发实习生,并参加了两次大项目的研发,从实际到理论,加深了我们对软件技术专业的理解,和对于与社会接轨的深刻感受。
作为学生,我们更多的是课本的知识的理解,理论的优势是我们的特色,但是怎样将理论结合实际却是摆在我们面前的难题。而参观广州外语通科技有限公司正视给了我们直观的解读。广州外语通科技有限公司建立了一整套符合国际标准的质量、成本和交付体系,软件开发质量控制和过程改善能力已达到了国际先进水平,秉承“用开拓的意识、创造新的价值”的企业理念,不断跟踪国际先进技术与管理思想,研发和提供优质软件产品和技术服务,为客户不断创造和提升价值。正是因为秉持这样的理念其完整的价值链和细致的软件服务,给了我们以软件技术专业的具体实际的体验。与此同时,广州外语通科技有限公司企业的参观使我们对中国物流企业的现状有了大概的了解,参观过程中不同仓库的设施和地面的设置的挑选更是让我们多了超出理论的认识。通过指导人员的讲解我们对中国物流企业的信息化有了大致的了解:中国物流企业信息化整体水平不高是其信息化建设的核心问题。这包括:标准不统一,资源浪费严重;大型应用软件系统应用不普遍,应用层次低;现有各软件系统之间相互孤立,形成“信息孤岛”;信息化建设发展不平衡,造成“信息鸿沟”;硬件设备的利用率不高,资源浪费严重;综合信息系统是物流业信息化建设的必然趋势。
如果说前两次的参观实习是给的我们直观的视觉冲突和心理震撼,那么后来的信息化讲座就揭开了信息化和软件技术专业的神秘面纱。通过经验丰富的演讲者的ppt演示我们了解了多个行业的信息化实施过程和具体的商务转变成软件技术专业活动的流程。现实中简单的商务活动一旦设计成成功的xx专业流程将涉及多个业务流程,整体的实施过程是复杂而艰难的。鉴于中国Android专业已经很成熟,各方面的支持还不够很完备,这使得中国Android专业的发展有很大的扩展性。
作为应届毕业生,在毕业前的这次专业实习,无疑是给了我们对Android专业的清晰认识,这也是最为软件技术专业专业的学生的最大感悟。当然实习中还有着更多的感触,包括学习,生活,工作各个方面。
就学习而言,专业实习它更偏重于应用,更加细致,要求也更加严格。作为应届毕业生的我们要想适合自己的工作,在实际中实现自己的理想,必需不断的增加自己的能力,做事情更加专注。
就生活而言,专业学习展示给我们看各个不同的行业的人们的生活,不同行业的人们将自己的行业融入自己的生活,这样大的人群的生活展示给我们未来的生活远景,选择什么样的生活也是我们现在的最重要的抉择。一旦下定决心,也就要开始为自己的生活做准备,胜利是属于有准备的人的。现在的我就要为自己的生活做准备,不断的充实自己。
就工作而言,无疑的本次的xx专业专业实习,展示给我们了多种职业,而作为应届毕业生,择业的选择是大多数人所面对的问题。就我们xx专业而言,面试时常遇见的问题就是“Android专业是干什么的?”或许大多数的学生跟我一样对android专业并没有清晰的概念,所以也并不能很好的回答这样的问题。不管怎样,勤劳的人是让人钦敬的,但所接触的朋友说“多年的工作让我清楚这个社会的运转不是控制在辛勤劳动的人手上,而是那一班根深帝固的政治家、资本家手中...工作中的认真负责不是为了讨好表现,而是为了要冶练自己的品性,是在为自己,不是为老板”。
上面的认识都是正面的,也是自己受益的主要部分,但就个人而言,本次的xx专业实习更多的是让自己认识到自己的不足。作为一个即将毕业的应届生,通过此次的实习,更多的是对大学四年的回顾和反省。进入了社会,和学校的感觉是完全不一样的。只有在刚进入公司的一个月里,大家还把你当作新人,时间久了公司的领导就把你与其它同事相比较;当你开始跑客户时,客户把你与做了很多年的销售相比较,没人把再把你当新人看待,而你把你当作一个正式的有能力的人使用。
看着那些员工忙忙碌碌的来来去去,坚定的态度是那么一点一滴在铸就起来,一个被人认可的人首先一定是一个认真负责的人,一个认真负责的人无论到哪里都可以站得正。相对于经验和技术而言,这些都是可以积累的,可以日久能熟的,但是否能有正确的态度却是因人而异的,有的人永远让人感觉畏锁。我从来没有把现在的工作当作实习,我就是认定我是在工作,而不是来学习东西的。我是为工作而学习,学习是为了把工作做得更好。
总的来说,我们这一次实习是比较成功的,大家都能学习到了很多在校园、在课堂上、课本上学不到的东西,也了解很多和懂得了做人的道理,特别是体会到生活中的艰辛和找工作的不容易。
感谢这次实习,感谢这次实习的教师,感谢为我们争取了这实习机会的领导。这次实习,一定会令我的人生走向新一页!
XXX
智能手机近几年正在飞速普及, 人们对智能时代的生活也有了越来越高的需求, 各种智能可穿戴设备应运而生、智能手表、智能手环、智能眼镜等新兴事物蓬勃发展, 带给人们更好更便捷的智能生活。蓝牙无线技术是一种支持设备短距离传输的通信技术, 能够在不同的外设间进行无线数据交换, 取代了近距离的有线连接, 能够有效地简化移动通信终端设备之间的通信。低功耗蓝牙是蓝牙4.0规范的核心内容, 也叫蓝牙4.0BLE。该技术的最大特点就是超低的待机功耗和运行功耗, 这非常符合当前可穿戴设备和物联网的发展需求、低功耗蓝牙技术可以使一颗纽扣电池连续使用数年之久, 这样的特性会激发更多的开发者去开发低成本、低功耗的无线领域方案, 如医疗保健、体育健身、家庭娱乐、传感器物联网等方方面面。低成本、向下兼容、跨厂商互操作性强等特点会推进低功耗蓝牙的市场进步。
1 蓝牙协议概述
蓝牙协议最初由爱立信公司于1994年创建, 是一种无线个人局域网互连标准。截至目前, 蓝牙协议主要分为6个版本, 即V1.1、V1.2、V2.0、V2.1、V3.0、V4.0, 这些版本的最主要特点如下:
(1) V1.1的传输速率约为748kbps。
(2) V1.2改进了自适应跳频功能, 增强通信链路抗干扰能力。
(3) V2.0+EDR将传输速率提高到2.1Mbps, 可同时ACL数据链路和SCO语音链路。
(4) V2.1+EDR增强了配对的安全性, 传统的配对采用个人识别码, 是永久密码存储在本机上, 容易被盗取, V2.1支持随机数字配对, 每次连接都会采用新的随机数对链路加密。
(5) V3.0+HS规格吸收了802.11媒介访问控制层和物理层的优点, 其传输速率可以达到24Mbps, 其原理是HS补充协议中提出一种MAC/PHY交替射频技术, 可使两个3.0+HS设备暂时离开原有的蓝牙连接状态, 变为802.11网络连接, 相当于进行Wi-Fi传输。
(6) 蓝牙4.0是由SIG组织于2010年加入蓝牙核心规范, 它将传统蓝牙 (又称BR/EDR, 即基本/增强速率) 、高速蓝牙、低耗能技术三者合为一体, 并向下兼容, 其最大的特点就是低功耗。BLE相比BR/EDR的低功耗优势最主要体现在以下几个方面:
(1) 传统蓝牙设备采用79个信道, 会对16~32个信道发出广播, BLE仅采用3个广播信道, 而且广播模式启动时间由22.5ms减少到1.2ms。
(2) BLE还将BR/EDR的链路空闲等待状态改进为深度睡眠状态, 即便在链路连接的情况下, 蓝牙控制器也可在睡眠与唤醒状态之间切换, 虽然增大了数据通信间隔时间, 但极大降低了连接空闲时的待机功耗, 且将传统蓝牙的潜伏期 (从非连接状态到发送数据) 从100ms缩减为只需3ms。
(3) BLE还扩展了一种不需要连接即可传递数据的方式, 因为BLE的每个广播信令可以携带32字节数据, 这样很多应用可以不用建立连接, 只需定期循环广播数据即可, 不仅大大降低了平均电流, 同时这也是一种一对多的通信方式。
(4) 在数据包长度方面, BLE还支持超短数据包, 仅8~27字节, 并加入循环冗余CRC校验, 在BLE协议栈的Notification功能中就用到了33种超短数据包的简单传输方式。
目前, Apple、Google、Samsung、Microsoft等各大公司已经开始在其移动终端上支持BLE协议, 相关产品主要有i Phone 4s以上、Android4.3以上、Galaxy S II、Windows Surface, 而主流的i OS、Android、Windows 8操作系统已经集成了对BLE协议栈的支持。
2 低功耗蓝牙协议栈结构分析
低功耗蓝牙BLE是蓝牙4.0的重要组成部分, BLE协议栈主要包括两部分, 即主机和控制器, 协议栈的结构如图一所示。
协议栈的实现采用分层思想, 控制器部分包括物理层、链路层、主机控制结构层;主机包括逻辑链路控制与适配协议、安全管理、属性协议、通过访问配置文件、通用属性配置文件。上层可以调用下层提供的函数来实现需要的功能。
(1) 物理层 (Physical Layer) 是基带速率为1Mbps自适应的GFSK射频, 工作于免许可的2.4GHZ ISM频段。
(2) 链路层 (Link Layer) 用于控制设备协议栈的射频状态, 设备将会处于等待、广告、扫描、初始化、连接等五个状态中的某一个。广播设备可以在处于非连接的状态下直接发送广播数据;而扫描数据可以监听广播设备发出的广播数据, 发现BLE蓝牙设备;初始化状态设备通过发送连接请求来回应广播状态设备, 如果广播设备接受连接的请求, 那么初始化状态设备和广播设备都会进入连接状态。发起连接的一方称为主机, 接受连接的一方称为从机。
(3) 主机控制器接口 (Host Controller Interface) 为主机和控制器之间提供标准的控制器接口。可以是软件API调用, 或者是UART、SPI、USB等硬件设备接口分离。
(4) 逻辑链路控制与适配协议层 (Logic Link Control&Adaptation Protocol) 对上层数据进行封装, 允许逻辑信道上点对点的数据通信[26]。
(5) 安全管理层 (Security Manager) 定义了配对和密钥的分配方式, 并为协议栈其他层与另一个设备之间的安全连接和数据交换提供服务。
(6) 属性协议层 (Attribute Protocol) 允许设备向另一个设备展示特定的数据, 以属性的形式。链路层状态中的主机和从机和设备在ATT中的角色是相互独立的。在链路层作为主机角色的设备, 在ATT层既可以是客户端, 也可以作服务器, 甚至可以同时作为ATT的服务器和客户端, 但是在链路层只能做一种角色。
(7) 通用访问应用框架 (Generic Access Profile) 保证不同的Bluetooth产品可以互相发现对方并建立连接。通用访问配置文件定义了蓝牙设备如何发现和建立与其他设备的安全或不安全连接。它处理一些一般模式的业务, 如询问、命名、搜索, 和一些安全性问题如担保, 同时还处理一些有关连接的业务如链路建立、信道和连接建立。通用访问配置文件规定的是一些一般性的运行任务。因此, 它具有强制性, 并作为所有其他蓝牙应用规范的基础。
(8) 通用属性应用框架 (Generic Attribute profile) 定义了如何使用ATT层的服务框架。GATT层将ATT层的通信基本框架具体化, 规定了配置文件profile的结构, 相当于ATT层提供给用户开发的接口。在BLE中, 所有被profile或服务用到的数据块都称为特性值Characteristic。此外, 任何两个建立连接的蓝牙GATT设备之前的数据通信过程都是通过GATT的子程序处理的。因此, 应用程序和所有的profiles都是直接使用GATT层。
3 低功耗蓝牙在Android上的实现
低功耗蓝牙是在Android4.3版本之后增加的功能, 本节将分析Android系统上蓝牙4.0的通信过程的设计与实现。表一是Android4.3系统低功耗蓝牙的常用类。
GATT (Generic Attribute profile) 是蓝牙4.0最上层的应用框架, 提供蓝牙设备交互的具体功能接口, 所有BLE的profile都是基于GATT实现的, 包括血糖、血压等传感器profile。基于BLE的连接过程, GATT可以分为两种角色, 一种是中心设备 (Central) , 主要做的动作是搜索BLE设备的广播, 并发起连接;另一种是外围设备 (peripheral) , 主要功能是发出BLE广播消息, 让中心设备去搜索。一般来说, 手机端都是作为中心设备存在, 主动去搜索和连接外围的BLE设备。GATT的结构如图二所示。
一个GATT的profile可以由多个services组成, 而一个service可能包含多个关联的service。Service可以看作是Characteristic的集合, 每个Characteristic特征值其实就是一个数据类型, 而Characteristic可以分为三部分:property代表这个Characteristic具有哪些属性, 包括数据单位、参数偏移量等等, 一般为一个字节;value是具体的数据值, 根据不同的profile, 数据格式完全不同;descriptor标示对Characteristic的描述, 每个Characteristic可以有多个descriptor存在, 描述了所在Characteristic的读写、通知、交互等属性, descriptor的这些属性central端可以通过写指定特征值的方式来改变。
GATT实现通信的工作流程如图三所示。
GATT在搜索start Le Scan的时候就要将Le S-can Callback注册进去, 通过回调上报搜索到LE设备。因为GATT的外围设备会一直广播, 搜索的时候会不停的搜到设备, 所以要注意的一点是, 一旦搜索到目标设备, 就要立即停止搜索, 或者对搜索动作设定搜索时间, 超过时间理解停止, 否则会大量占用系统资源, 产生较大功耗。此外还可以指定UUID来搜索目标设备, 这样会省去其他的外设干扰。
对于GATT来说, 连接仅仅是一个开始, 连接成功并不代表可以通信, 这与传统的蓝牙通信有很大不同。在使用Bluetooth Gatt的connect方法进行连接的时候, 同样要注册Bluetooth Gatt Callback参数, 通过回调通知蓝牙LE的状态变化。常用的回调有:
(1) on Connection State Change;
(2) on Services Discovered;
(3) on Characteristic Read;
(4) on Characteristic Changed。
on Connection State Change主要是LE连接状态变化的回调, 通知用户连接状态改变。当连接建立成功后, 要做的就是去搜索远端设备提供的GATT服务, 调用discover Services方法去查找远端服务, 找到服务的结果会通过on Services Discovered返回。此时, 更新查找所提供服务里面的特征值Characteristic, 判断其UUID是否为所要进行通信的UUID, 若匹配, 则要对目标特征值Characteristic写入属性描述, 要实现主动读取数据, 还是使用通知的方式目标提供数据。如果是主动读取数据, 那么读取数据时, on Characteristic Read会被执行, 提供读取的数据。而使用通知的方式提供数据, 则一旦远端设备数据有变化, on Characteristic Changed会被执行, 提供最新更新的数据。写入数据的方法也是通过Bluetooth Gatt Characteristic类去写入, 先将数据字节数组用set Value方法写入Characteristic, 然后调用write Characteristic将数据写入传输给远端设备。
要注意的是, GATT是低功耗蓝牙传输, 相对来说牺牲了一定的传输速度, 对传输数据的大小也有一定限制。目前Android4.3系统传输每个包的大小是20个字节, 如果发送数据多于20个字节, 超出的部分将不会被对方收到, 因此发送的时候要对数据进行处理, 按照MTU大小为20发送数据。
4 结束语
低功耗蓝牙功能在Android平台上目前仅支持Android4.3以上的操作系统, 因此在设计软件功能上有很大的局限性。随着Android系统的不断完善, BLE功能也会逐步强大起来, 在应用方面不断进步。BLE低功耗蓝牙是未来蓝牙发展的趋势, 对于可穿戴设备来说是一种重要的无线通信手段, 应用产品也会越来越多。
摘要:低功耗蓝牙是最新的蓝牙技术, 其特点是超低的待机功耗和运行功耗, 这非常符合当前可穿戴设备和物联网的发展需求。本文基于Android平台, 从低功耗蓝牙结构的特点到实现低功耗蓝牙通信过程做深入浅出的分析。
关键词:低功耗蓝牙,Android系统,无线通讯
参考文献
[1]孙益祥.可穿戴设备发展趋势及信息安全风险分析[J].无线互联科技, 2013, (11) :92, 126.
[2]Bluetooth SIG.Bluetooth Specification version4.0[S].2010.
[3]欧阳骏, 陈子龙, 黄宁淋.蓝牙4.0BLE开发完全手册:物联网开发技术实战[M].北京:化学工业出版社, 2013.
[4]范晨灿.基于蓝牙4.0传输的Android手机心电监护系统[D].杭州:浙江大学, 2013.
[5]Android Open Source Project.About the Android Open Source Project[EB/OL].http://source.android.com/about/index.html.2014-10-24.
1. SQLite支持事务吗?添加删除如何提高性能?
2. 对Intent、Activity、广播、Service等的理解
3. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。
4. Activity和Task的启动模式有哪些?每种含义是什么?
5、handler机制的原理
6、sim卡的EF 文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,EF就是作存储并和手机通讯用的
7、嵌入式操作系统内存管理有哪几种,各有何特性?
页式,段式,段页,用到了MMU,虚拟空间等技术
8、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、
航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。
9、一条最长的短信息约占多少byte?
中文70(包括标点),英文160个字节
10、 android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
相关阅读推荐:
总结android项目的基本开发步骤
做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流。一 应用规划:
-确定功能。
-必须的界面及界面跳转的流程。
-需要的数据及数据的来源及格式。
-是否需要服务端支持。
-是否需要本地数据库支持。
-是否需要特殊权限。
-是否需要后台服务。二 架构设计:
-分层。
-网络连接。
-数据处理-xml、domain。
-封装Activity。三 界面设计:
-主界面确定。
-模块界面、列表、查看、编辑界面。
-菜单、按钮、对话框、提示信息。
-界面总体颜色。四 数据操作和存储:
-数据来源。
-数据类型。
-存储方式。五 业务实现:
-客户端业务解析。六 页面跳转:
-每个页面间的跳转。
-菜单、按钮、事件等。
#开发之前还需要做一些准备工作
1.技术储备
a.Java
重要程度:❤❤❤❤❤-框架,编程思想,编码规范,设计模式等 b.Xml
重要程度:❤❤❤❤-布局,选择器,配置文件等
c.数据库
重要程度:❤❤❤-关系型数据库,SQLite
http:/// 2.开发工具
a.Eclipse或者AndroidStudio
b.Android SDK
c.其他:svn / git,JDK,资源,数据库,模拟器,真机等
#开发过程中还有以下的一些流程 1.多种开源框架和优秀源码的引用
-xUtils,Volley,Vitamio,SlidingMenu等 2.数据访问-访问框架-传递方式
3.多种API的接入-短信服务-即时通信
-消息推送-第三方登录等 4.后台开发
-后台的开发,为app提供接口-后台的云服务器
5.内存优化
-垃圾回收-
一、二级缓存-适配器的优化
-图片框架及资源的优化
6.多线程异步
-Handler-Asynctask
7.屏幕适配
#开发基本结束之后还有很多需要流程 1.多型号真机实测 2.云服务器优化 3.APK加密 4.数字签名 5.用户协议 6.应用平台 7.项目上线
8.应用推广和广告插入 9.版本更新和维护
关键词:蓝牙通信,远程控制,Android
1 概述
随着计算机技术和通信技术的飞速发展,人类的生活水平有了日新月异的变化,以人为本,舒适,便利,智能化已经成为家居系统办公系统的重要理念。这些力求创造安全舒适的生活办公环境的理念,成为当今开发商关注的重要卖点之一。远程控制软件产品被广泛应用于日常生活和工作中,不管是个人用于远程协助,还是企业用于远程管理,远程控制技术都能给我们带来了极大的方便,因此远程控制软件的市场前景也相当乐观[1]。而基于Android蓝牙的远程控制系统就是这种全新的控制和计算模式的一种实现。
2 系统的相关技术分析
2.1 蓝牙技术
蓝牙是一个开放性的、短距离无线通信技术标准。它可以用来在较短距离内取代目前多种线缆连接方案,穿透墙壁等障碍,通过统一的短距离无线链路,在各种数字设备之间实现灵活、安全、低成本、小功耗的话音和数据通信。
蓝牙作为一种新兴的短距离无线通信技术已经在各个领域得到广泛应用,它提供低成本、低功耗、近距离的无线通信,构成固定与移动设备通信环境中的个人网络,使得近距离内各种信息设备能够实现无缝资源共享[2]。
2.2 Java无线蓝牙技术
任何蓝牙应用都有以下这些组件:堆栈初始化组件,设备管理组件,设备发现组件,服务发现组件和通讯组件。Java蓝牙API依赖Java通用连接框架,一直一来这成为Java蓝牙API应用的一个局限。但是,人们建议将GCF加入到J2SE中。Java蓝牙API使得访问更多的系统成为可能[3]。
Java蓝牙API定义了两个包:一个是Java蓝牙API的核心javax.bluetooth,另一个是用于对象交换协议的javax.obex(OBEX)。
根据JSR 82规范,所有潜在蓝牙系统都必须支持蓝牙控制中心(BCC),该控制中心是一个控制面板,它的作用类似于可以让用户或OEM给堆栈中的某些配置参数定义具体值得应用程序,特别是,它将应用于堆栈初始化中[4]。
3 系统的功能需求和设计
3.1 系统的功能需求
基于Android蓝牙远程控制电脑系统,电脑端主要是先接受蓝牙数据,然后根据接受的数据只想相应的电脑操作。而实现这些操作的基础就是蓝牙通信。要完成蓝牙通行需要进行蓝牙的搜索、配对、连接和数据通信。
3.1.1 Android客户端功能需求
蓝牙连接:用户可能匹配了多个台电脑。每台电脑的蓝牙MAC地址各不相同。因此本系统提供了选择连接功能。
蓝牙连接保持:由于在蓝牙的连接过程中可能会出现连接丢失的现象,因此仅仅连接一次是远远不够的。本模块负责保持蓝牙的连接稳定性。
数据发送:负责将操作捕获的动作信号发送至PC端(服务器端)。
操作捕获:用于捕捉用户对触摸板的常用操作,并转化为数据信号。
3.1.2 PC控制端功能需求
蓝牙接收保持:作为服务器端,应一直监听客户端发来的信息,并确保无数据丢失现象。
数据接受分析:负责接受客户端发送来的动作信息,并将动作信息解析。
鼠标控制:将客户端发送来的动作信号解析后,在电脑上还原成客户端的动作操作。
3.2 系统的设计
系统整体分析与设计,系统总设计如图1所示:
4 系统的实现
4.1 PC控制端的实现
控制器软件首先要实现搜索周围蓝牙设备的功能。通过搜索,过滤掉周围其他的蓝牙设备,找到需要控制的电脑。根据蓝牙协议,蓝牙通信模型此采用C/S模型。电脑作为服务器端,提供链接服务,等待Android端(客户端)的连接[5]。一般服务发现是紧接着设备发现后进行的,服务发现的目的是搜索某个已发现的蓝牙设备当前提供哪些服务。总之设备发现和服务发现的结果,是最终软件能显示出控制器所在范围内可控制电脑的设备列表,提供给用户做下一步的连接操作[6]。
设备连接通信编写一个独立的类实现,以下是该类主要的代码:
4.2 Android客户端的实现
1)View划动的数据获取
设置i计数器,i=0时,为第一次进行触摸操作,获取当前触摸屏坐标x=(int)event.get X();y=(int)event.get Y();i++;i!=0时,新获取的坐标减去上次坐标为移动坐标x=(int)event.get X();y=(int)event.get Y();m=x-x0;n=y-y0;x0=(int)event.get X();y0=(int)event.get Y();判断移动坐标m,n是否都为0,若都为0代表无位移,即划动停止,设置计数器i=0。
2)按压事件的实现
当左button长按,代表按压开始,button变为橙色,再次长按代表按压施放,button恢复白色。该功能如图2所示:
实现按压事件的关键代码如下:
5 结束语
该系统设计实现了用Android移动设备取代传统鼠标的功能。当用户运行位于Android操作系统上的应用的时候,可以搜索附近的蓝牙设备,然后用户可以选择一台进行连接,当连接完成后,电脑和Android移动设备之间建立了蓝牙通信的连接通道,之后用户可以通过控制器程序实现控制鼠标的操作。
参考文献
[1]郭克华.Java ME移动开发实例精讲[M].北京:人民邮电出版社,2000:50-5.
[2]斯托林斯.无线通信与网络[M].北京:人民邮电出版社,2001:15-19.
[3]黄丹丹.Java与蓝牙技术在DLP投影系统中的应用[J].计算机技术与发展,2010:48-50.
[4]谷晓,邱少明.Java面向对象程序设计[M].北京:清华大学出版社,2009:35-38.
[5]张渊.eclipse软件体系结构研究[J].软件工程,2002,8(2):40-43.
[6]喻宗泉.蓝牙技术的发展与研究[J].通信学,2006,8(2):48-50.
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用程序组成,是首个真正为移动终端打造的开放并且完整的移动平台。2008年9月
22日,美国运营商T-MobileUSA在纽约正式发布第一款Google手机,即T-MobileG1,厦门博看文思知道从那个时候起,Android的时代就真正的来临了。
从Android1.0至今经历了多次的版本更新,其中重要的变更是1.5、2.0和2.2。而其他的版本更新相对而言并不是那么重要。另外,由于每次更新都会多少改动包括Dalvik在内的底层模块,同时牵扯到SDK,导致了一些程序需要跟着Android版本进行变动。对于相对较为保守的开发人员而言,快速的版本更新将给他们带来越来越大的限制。在这种情况下,Android开源的意义就显得不是那么大了。
无论如何,由于Android与Google服务的紧密捆绑,这款操作系统拥有了得天独厚的优势。通过Google强有力的支持,很多事情在Android上都会变得很简单。另外需要特别提出的是,Android是一款基于互联网的操作系统,在可以连接上互联网的情况下,一款Android手机可以发挥出比其他手机更多的能力。而在没有网络的情况下,Android手机并不比其他的手机出色,尤其是娱乐性相对于iPhone可以说是逊色不少。作为厦门博看文思开发人员,应当在学习并深入了解Android之后,在自己的软件中,将Android的优势发挥出来,同时通过一些手段去弥补Android本身的缺陷或不足。下面来看一下厦门博看文思Android拥有的特点吧:
•与硬件交互非常方便,包括摄像头、GPS等,都可以简单的操作。
•拥有自己的运行时和虚拟机,优秀的内存管理能力。
•提供丰富的界面控件供开发者使用,允许可视化开发,并保证Android平台下的应用程序界面一致。
•提供轻量级的进程间通信机制。
•支持无界面的后台服务类应用程序。
•支持高效、快速的数据存取方式。
在这些特性的支持下,试图在Android下开发一个应用不会太过困难。事实上,一个稍有Java经验的开发人员,都可以快速的上手进行Android的开发。而开发的核心,一直以来也是围绕着Android手机几个大的特点来进行的,其中就包括了触摸屏、摄像头、GPS模块、互联网功能、语音输入、Google账户等。需要说的是,如果一位J2ME工程师想转行做Android,那么他将付出的代价比J2SE或J2EE工程师要大得多。
毕竟Android所支持的是基本完整的J2SE的子集,反过来再看J2ME就会觉得它的功能太弱了。
除了Java外,还有许多语言支持Android的开发,比较为人所熟知的有Scala,而作为Android本身的底层语言,C/C++的作用也完全不可忽视。而目前的开源社区内,已经有一些牛人在尝试让更多的语言可以开发Android应用。比较有代表性的可能是KoushikDutta,他已经解决了在Mono平台下,让Dalvik调用Mono代码的问题。或许在不久的将来,.NET下的所有语言,都有可能借助Mono跑在Android上,这是一件值得让人期待的事情。
语言已不是问题,那还有什么会成为问题?也许很多人会说经验。诚然,经验决定了一位开发人员能否快速地、流畅地完成开发工作,也决定了软件的鲁棒性,Bug的数量、等级和修正问题的返工次数。不过我认为,这些都不重要,哪怕是一个
关于CAN的介绍,官方给出了一份文档,点击下载。经过了好几遍的通读之后,对他的基本步骤及意图有了一些了解,但是有一点让我感到疑惑——所有的步骤都是在PC上完成的,但是最后的使用是在ARM上,我并没有看到哪一步对ARM板进行了操作,那么最后如何实现呢?要了解这个问题,首先简单看看文档的操作步骤。
首先我们需要将ARM板上的CAN模块启动,调节SW8,将profile设置为1。SW8在显示屏接线的下方,如下图所示:
ARM开发板运行linux系统并且不修改canutil工具源码
如果你的ARM是运行的linux系统,那么恭喜你,TI的linux源码中已经集成了CANUTIL工具,可以直接使用。但是默认CAN驱动好像是未打开的,例如:在ARM终端
root@am335x-evm:~# canconfig can0 bitrate 50000 Cannot find device can0 failed to set bitrate of can0 to 50000
提示找不到can0设备,说明内核中未加入CAN驱动,那么我们需要配置驱动,方法如下:
在内核根目录输入
gedit Makefile
找到如下片段:
export KBUILD_BUILDHOST :=(SUBARCH)ARCH?=(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:”%”=%)
修改为:
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-eabi-
此步骤目的是使当前内核编译模式为ARM平台。
接下来输入:
make menuconfig
按照图示步骤依次选择:
1. [*] Networking support —>
2. <*> CAN bus subsystem support —>
3. CAN Device Drivers —>
4. <*> Bosch D_CAN devices —>
注意把这里的D_CAN打上星号。
5. Generic Platform. Bus based D_CAN driver
同样将这一项打上星号。
好了,驱动配置完毕,下面执行Make指令,随后将生成好的内核镜像制作到SD卡中,重新启动开发板,那么CAN0设备就可以使用了。
可以尝试通过以下指令进行配置和收发:
1. 配置can0波特率为50000 ,开启三采样模式vcD4NCjxwcmUgY2xhc3M9”brush:java;“>canconfig can0 bitrate 50000 ctrlmode triple-sampling on打开can0设备
canconfig can0 start
发送数据
cansend can0 -i 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
接收数据
candump can0
ARM开发板运行android系统或者要重新编译canutil工具
如果你是用的android或者你想对CAN工具进行修改重新编译,那么还需要继续下面的步骤。
首先同样需要在内核中配置CAN驱动,并将Profile Selection设置成1,方法同上。
然后下载源码,官方说明中是需要下载三种源码(点击可下载):
- iproute2
- libsocket
- canutil
但是这里我只需要用到最后一个canutil即可,
下载完成之后,首先配置环境变量,如下:
export GNUEABI=arm-arago-linux-gnueabiexport CC=$GNUEABI-gccexport LD=$GNUEABI-ldexport NM=$GNUEABI-nmexport AR=$GNUEABI-arexport RANLIB=$GNUEABI-ranlibexport CXX=$GNUEABI-c++export PREFIX=$FILESYS_PATH/usrexport CROSS_COMPILE_PREFIX=$PREFIXexport PATH=$TOOL_CHAIN_PATH/bin:$PATHexport LIBSOCKETCAN_INSTALL_DIR=$LIBSOCKETCAN_PATH/installexport PKG_CONFIG_PATH=$LIBSOCKETCAN_PATH/configexport LD_LIBRARY_PATH=${LIBDIR}:${LD_LIBRARY_PATH}export LD_RAN_PATH=${LIBDIR}:${LD_RAN_PATH}export LDFLAGS=-Wl,--rpath -Wl,$LIBSOCKETCAN_INSTALL_DIR/libexport INCLUDES=-I$LIBSOCKETCAN_INSTALL_DIR/include
其中PREFIX 是目标目录,可以自行设置。
然后进入canutils-4.0.6文件夹,输入以下指令:
./configure --host=arm-arago-linux --prefix=$PREFIX --enable-debug
之后会根据目标平台生成相应的Makefile。接着依次执行:
make
make install
完毕之后,会在PREFIX/usr/bin下找到如下四个文件:
cansend , candump , cansequence , canecho
PREFIX/usr/sbin下找到如下一个文件:
canconfig
将这几个文件复制到android系统的/system/bin目录下(需要root权限)。这样我们就可以执行这5个命令了。
但这时候如果直接执行,可能会出现如下错误:
root@android:/ # cansend/system/bin/sh: cansend: No such file or directory
这说明cansend这个应用程序是动态编译的,本地缺少需要的库文件。可以在PC上通过命令readelf查看需要的库文件。
root@MC:~/android/can/usr/bin# readelf -l cansendElf file type is EXEC (Executable file)Entry point 0x8679There are 8 program headers, starting at offset 52Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x001074 0x00009074 0x00009074 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4 INTERP 0x000134 0x00008134 0x00008134 0x00019 0x00019 R 0x1[Requesting program interpreter: /lib/ld-linux-armhf.so.3] LOAD 0x000000 0x00008000 0x00008000 0x01080 0x01080 R E 0x8000 LOAD 0x001080 0x00011080 0x00011080 0x00158 0x00170 RW 0x8000 DYNAMIC 0x00108c 0x0001108c 0x0001108c 0x000e8 0x000e8 RW 0x4 NOTE 0x000150 0x00008150 0x00008150 0x00044 0x00044 R 0x4 GNU_STACK0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
看到最中间显示的一句话:
[Requesting program interpreter: /lib/ld-linux-armhf.so.3]
这里需要ld-linux-armhf.so.3库文件才能使用cansend命令。这里也是android和linux在文件系统上的一个差异,android系统无法直接运行由交叉编译器动态编译出来的应用程序。这里可以参考我的另一篇博客——
Android系统如何运行动态编译的程序 。将ARM-linux系统中的库文件复制到android系统的/lib目录下即可。
这时候,我们可以利用canconfig来配置can设备,也可以通过cansend、cansequence来发送数据,通过candump来接收数据,具体指令集可以参考官方文档。
【android蓝牙开发简介】推荐阅读:
android开发案例教程11-24
android开发学习教程02-14
android手机游戏开发03-31
蓝牙技术阅读训练及答案12-14
android开发工程师工作岗位职责说明07-09
android实习日记07-15
android商品管理07-19
Android 个人总结07-19
android实习总结11-07
android面试宝典02-08