android 蓝牙开锁功能系统的蓝牙远程控制功能什么时候实现

工具类服务
编辑部专用服务
作者专用服务
基于Android系统远程控制客户端/服务器的设计与实现
随着通讯技术的迅猛发展,手机、平板电脑等移动数字终端与人们的日常生活联系越来越密切,成为了人们获取外界信息的一个主要途径。Android系统是一个以Linux为基础的开源操作系统,主要应用于手机系统的开发。Android机顶盒和智能手机一样,具有全开放式平台,搭载了Android操作系统,可以由用户自行安装和卸载软件,通过程序来不断对电视的功能进行扩展,并可以通过网线、无线网络来与外接进行数据交互。本课题基于成都三零凯天通信实业公司智能终端项目,结合计算机技术、通信技术和移动平台技术,在对Android移动平台进行分析的基础上,开发出一套利用Android移动设备,通过WIFI无线网络连接遥控Android机顶盒的远程控制系统。在传统机顶盒遥控器的功能上,增加了鼠标功能模块和远程桌面图片显示功能模块,方便用户的控制和操作,提供更丰富的功能需求和更智能的用户体验。  
本文首先分析了基于Android远程控制系统的研究背景,结合当前国内外的基本研究现状,分析了本课题的研究目的和意义,然后对Android系统框架、组件、SDK编程技术、Android应用开发环境的配置以及事件处理机制进行了分析。  
论文详细的对远程控制系统的可行性进行了分析,根据项目对系统的功能性和非功能性需求,在对系统软件结构进行分析的基础上,给出了系统的总体设计架构。论文主要研究基于Android远程控制系统的客户端服务器,采用C/S的设计模式,对服务器和客户端的设计分别进行了分析,最终给出了客户端和服务器功能模块的设计方案,并主要对客户端进行了详细的设计和实现。客户端主要负责界面设计、数据库操作、鼠标模块以及远程桌面图片显示模块设计,采用MVC软件设计模式,使得设计思路清晰,系统耦合度低,易于软件的兼容和扩展。服务器负责Android控制指令的解析、系统回调事件的处理以及系统截屏等。  
再次,本文给出了服务器和客户端各个功能模块的具体实现方法。服务器采用读取显示缓冲区的帧缓存实现系统截屏,利用系统回调的方法响应用户指令,采用Socket TCP协议实现与客户端的数据交互以及图片传输。客户端采用SQLite实现数据库操作,利用基于监听的Android事件处理方式获取控制指令,创建模拟测试区域获取手指的运动轨迹实现鼠标滑动功能等。  
最后,对系统的各个功能模块进行测试并且给出了测试结果。对论文所作的工作进行了总结,并展望了一部分功能模块的完善和改进工作。
学科专业:
授予学位:
学位授予单位:
导师姓名:
学位年度:
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社毕业的学长学姐:基于Android的蓝牙远程控制PC系统的设计与实现【郑州轻工业学院吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:203,418贴子:
毕业的学长学姐:基于Android的蓝牙远程控制PC系统的设计与实现收藏
有没有可以帮助我的,,,,连个屁毛都不会。。
不爆照是不行了。。。
爆照也不行,我刚工作,在做安卓,啥都不会
Android会,windows不会
把pc作为服务端,手机作为客服端,通过蓝牙获得pc的mac实现通信,pc把屏幕图像逐祯发送手机,手机回调ontouch事件获得手指在屏幕上动作信息和位移坐标,把数据发送给pc解析为鼠标事件并反馈图像
蓝牙apijavax.bluetooth,具体不知道,大概思路是这个,貌似蓝牙还要了解蓝牙控制台设备选择一丢丢的东西,最近单位项目刚好有用到蓝牙
大神来帮忙
蓝牙和远程挨得着吗?一般蓝牙也就10米左右,就算高性能的理论上能有100多米,那也不能称得上远程吧
可以帮你,但程序员劳务可不低哦
登录百度帐号推荐应用3153人阅读
Android(15)
java(17)
整合后台服务和驱动代码注入
Home键的驱动代码:
/dev/input/event1: 000001
/dev/input/event1: 000000
/dev/input/event1: 000000
/dev/input/event1: 000000
对应输入的驱动代码:
sendevent/dev/input/event1 0 0 0
sendevent/dev/input/event1 1 102 1
sendevent/dev/input/event1 0 0 0
sendevent/dev/input/event1 1 102 0
sendevent/dev/input/event1 0 0 0
sendevent /dev/input/event1 0 0 0
从主页点击QQ图标启动QQ的驱动代码:
/dev/input/event4: 000001
/dev/input/event4: 000001
/dev/input/event4: 000053
/dev/input/event4: 000394
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000052
/dev/input/event4: 000394
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000052
/dev/input/event4: 000394
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
对应输入的驱动代码:
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 1 330 1
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 83
sendevent/dev/input/event4 3 54 916
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 82
sendevent/dev/input/event4 3 54 916
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 82
sendevent/dev/input/event4 3 54 916
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 1 330 0
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 0 0 0
输入的驱动代码优化:
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 53 83
sendevent /dev/input/event4 3 54 916
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 0 0 0
在弹出的输入法上点击字母n
/dev/input/event4: 000001
/dev/input/event4: 000001
/dev/input/event4: 000205
/dev/input/event4: 000463
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000205
/dev/input/event4: 000463
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000205
/dev/input/event4: 000463
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
对应输入的驱动代码:
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 1 330 1
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 517
sendevent/dev/input/event4 3 54 1123
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 517
sendevent/dev/input/event4 3 54 1123
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 517
sendevent/dev/input/event4 3 54 1123
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 1 330 0
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 0 0 0
优化后的驱动输入代码:
sendevent /dev/input/event4 00 0
sendevent /dev/input/event4 1330 1
sendevent /dev/input/event4 353 517
sendevent /dev/input/event4 354 1123
sendevent /dev/input/event4 00 0
sendevent /dev/input/event4 1330 0
sendevent /dev/input/event4 00 0
sendevent /dev/input/event4 00 0
点击发送按钮
/dev/input/event4: 000001
/dev/input/event4: 000001
/dev/input/event4: 000292
/dev/input/event4: 00027f
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000291
/dev/input/event4: 00027f
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000292
/dev/input/event4: 00027f
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000001
/dev/input/event4: 000292
/dev/input/event4: 00027f
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
对应输入的驱动代码:
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 1 330 1
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 658
sendevent/dev/input/event4 3 54 639
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 657
sendevent/dev/input/event4 3 54 639
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 658
sendevent/dev/input/event4 3 54 639
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 3 48 1
sendevent/dev/input/event4 3 53 658
sendevent/dev/input/event4 3 54 639
sendevent/dev/input/event4 0 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 1 330 0
sendevent /dev/input/event40 2 0
sendevent/dev/input/event4 0 0 0
sendevent/dev/input/event4 0 0 0
优化后的驱动输入代码:
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 53 658
sendevent /dev/input/event4 3 54 639
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 0 0 0
所以整套动作如下:
1、按下Home键,让手机界面回到系统主页
Home键对应输入的驱动代码:
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 1 102 1
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 1 102 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 0 0
2、从主页点击QQ图标启动QQ
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 53 83
sendevent /dev/input/event4 3 54 916
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 0 0 0
3、在弹出的输入法上点击字母n
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 53 517
sendevent /dev/input/event4 3 54 1123
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 0 0 0
4、点击发送按钮
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 53 658
sendevent /dev/input/event4 3 54 639
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 0 0 0
5、按下Home键,让手机界面回到系统主页
Home键对应输入的驱动代码:
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 1 102 1
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 1 102 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 0 0
实现的效果如下:就是从我的手机qq给通过我的设备发送一个字母n
这是发送界面
这是接受界面
上面的步骤是怎么获取指令的动作,下面描述的这个例子是我从手机主页打开QQ,然后从搜索列表中找出我的某个好友,然后给他发送消息“你好”,然后返回主页面。
当然,整套系统不能连续做,中间要有停顿,否则有的时候系统还没有把响应动作做完,下一个动作又开始了,导致动作出错。可以在代码里用sleep函数控制等待的时间。整套动作在PC上用终端演示完全没有问题,下一步就可以在手机上实现了。
具体的在代码里的实现:
第一步:在我前两篇博客里的有个关于android服务的例子,名字叫Servic.zip,在这个例子里加入了一个动作列表的类,用来保存动作指令,就是上面的指令序列。
第二步:将我上一篇博客里用按钮来注入代码的响应函数doXue()重新封装一下,放服务的类里面,我把参数换成了String数组,每次传一个动作的指令数组过去,然后用sleep控制等待时间。比如,启动QQ时间会比较长,我就设置成等待5秒再继续执行下一个动作。
好了,核心代码如下:
指令类:从这个类的定义里面可以清楚的看到每个步骤了 ,我就不多解释每个数组里面的指令的功能了,都写在注释里了。
public class OrderList {
//1---Home键对应输入的驱动代码
static String[] orderHome1 = {
&sendevent /dev/input/event1 0 0 0&,
&sendevent /dev/input/event1 1 102 1&,
&sendevent /dev/input/event1 0 0 0&,
&sendevent /dev/input/event1 1 102 0&,
&sendevent /dev/input/event1 0 0 0&,
&sendevent /dev/input/event1 0 0 0&
//2---从主页点击QQ图标启动QQ的驱动代码
static String[] orderQQ2
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 83&,
&sendevent /dev/input/event4 3 54 916&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 0 0 0&
//3---在弹出的QQ界面上点击搜索
static String[] orderSearch3
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 363&,
&sendevent /dev/input/event4 3 54 194&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 0 0 0&
//4---输入hyl 选择何一柳 前提是输入法是中文输入模式
static String[] orderInput4
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 219&,
&sendevent /dev/input/event4 3 54 1014&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 530&,
&sendevent /dev/input/event4 3 54 1127&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 367&,
&sendevent /dev/input/event4 3 54 1003&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 130&,
&sendevent /dev/input/event4 3 54 768&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 0 0 0&
//5---从搜索结果中选择何一柳
static String[] orderSelect5
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 438&,
&sendevent /dev/input/event4 3 54 223&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&
//6---点击输入框 弹出输入法
static String[] orderGetInput6
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 412&,
&sendevent /dev/input/event4 3 54 1233&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 0 0 0&
//7---从输入法打字 输入 你好 四个字
static String[] orderInputText7
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 524&,
&sendevent /dev/input/event4 3 54 1020&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 222&,
&sendevent /dev/input/event4 3 54 1006&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 3 53 221&,
&sendevent /dev/input/event4 3 54 1006&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 209&,
&sendevent /dev/input/event4 3 54 1009&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 350&,
&sendevent /dev/input/event4 3 54 903&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 521&,
&sendevent /dev/input/event4 3 54 992&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 115&,
&sendevent /dev/input/event4 3 54 762&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 0 0 0&
//8---点击发送按钮代码
static String[] orderInputSend8
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 1&,
&sendevent /dev/input/event4 3 53 658&,
&sendevent /dev/input/event4 3 54 639&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 1 330 0&,
&sendevent /dev/input/event4 0 0 0&,
&sendevent /dev/input/event4 0 0 0&
实际执行这些指令的函数doXue(String[] orders)
//指令执行函数
void doXue(String[] orders){
Log.i(TAG, &doXue-----------------&);
Runtime runtime = Runtime.getRuntime();
DataOutputStream dataO
Process process = runtime.exec(&su &);
InputStream in = process.getInputStream();
BufferedReader bufferReader = new BufferedReader(
new InputStreamReader(in));
BufferedReader err=new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line =
dataOut = new DataOutputStream(process.getOutputStream());
//点击发送按钮
for(String order : orders){
dataOut.writeBytes(order + &;&);
dataOut.flush();
dataOut.close();
process.waitFor();
while ((line = err.readLine()) != null) {
Log.i(TAG,line);
while ((line = bufferReader.readLine()) != null) {
Log.i(TAG,line);
} catch (Exception e) {
e.printStackTrace();
Log.i(TAG,e.getMessage());
最后是调用这个注入驱动代码的服务的代码:
public void onCreate() {
// TODO Auto-generated method stub
Log.i(TAG, &Service-----------------created&);
super.onCreate();
Thread thread = new Thread() {
public void run() {
Log.i(TAG, &Service-----------------&);
Log.i(TAG, &Service-----------------orderHome1&);
doXue(OrderList.orderHome1);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderHome1&);
doXue(OrderList.orderHome1);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderQQ2&);
doXue(OrderList.orderQQ2);
Thread.sleep(1000 * 5); //启动QQ时间设置稍微长一点
Log.i(TAG, &Service-----------------orderSearch3&);
doXue(OrderList.orderSearch3);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderInput4&);
doXue(OrderList.orderInput4);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderSelect5&);
doXue(OrderList.orderSelect5);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderGetInput6&);
doXue(OrderList.orderGetInput6);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderInputText7&);
doXue(OrderList.orderInputText7);
Thread.sleep(1000 * 2);
Log.i(TAG, &Service-----------------orderInputSend8&);
doXue(OrderList.orderInputSend8);
Thread.sleep(1000 * 2);
doXue(OrderList.orderHome1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
thread.start();
最后就是启动服务了,这个代码就不贴了,网上很多,之前的例子里面也有。这个demo的最终效果就是,打开这个app以后,点击启动服务,然后程序会自动请求root权限,如果你的手机root过,或者有root权限管理工具的话,就选择授权,然后,手机会自动回到主页,然后打开QQ,然后搜索联系人,然后发消息,最后再次回到主页。
Demo的下载地址:不要积分。
演示效果的gif
当然了,再次说明下,这种驱动代码不同类型不同款的手机是不同的,同款手机如果Rom不同可能也不同,上面的指令仅仅针对我自己的手机,所以如果你用上面的代码来测试你自己的手机的话,应该不会又效果,随便举个例子,我的QQ图标放在主页的那个位置,你的QQ不一定也在那个位置,再加上屏幕大小还不一样。
&因此,后面我会继续改进,开始时候让用户自己在自己的手机上录制动作,程序获取手机的相关驱动代码,然后编制成一套动作就行了。
后面还需要优化的地方:
1、我在前一篇博客里自己写的驱动代码16进制转10进制转换工具还不够完善,没有去处重复的指令,比如系统模拟了同一个点的多次点击,这个完全可以过滤掉,还有一些没用的驱动代码也可以过滤掉。让输出的结果更加简洁,后面有时间我会继续优化上传。
2、目前demo的动作还不够连贯,需要自己编写代码,后面需要改成让程序自动录制用户的操作,这就涉及到另一个问题,怎么用服务从android后台拿到写入驱动里的程序,而不是从PC端去获取,让整个录制动作,到系统再次响应同一个动作连续在一起。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:32903次
排名:千里之外
原创:30篇
评论:18条
(1)(1)(2)(1)(1)(1)(1)(1)(7)(2)(3)(4)(4)(1)(5)(1)(1)关于Android蓝牙开发的一些经验之谈
关于Android蓝牙开发的一些经验之谈
编辑:www.fx114.net
本篇文章主要介绍了"关于Android蓝牙开发的一些经验之谈",主要涉及到关于Android蓝牙开发的一些经验之谈方面的内容,对于关于Android蓝牙开发的一些经验之谈感兴趣的同学可以参考一下。
& & & & & & 最近在开发一款基于蓝牙的手机远程控制软件,程序没有分开服务端和客户端进行开发,而是把它们都集合在一起,在安装该软件的两台手机后可以通过搜索发现后进行匹配连接,然后通过主控端通过发送命令控制子机进行一些操作,其中功能包括控制打电话,发短信,打开网页,照相后返回照片,获取联系人,基本的远程文件管理和下载,打开关闭闪光灯(如果有),文字聊天和语音聊天。从功能所用的数据类型来看,需要传输的数据类型有字符串,二进制数据,语音数据等等。从现有的Android蓝牙支持来看,Google对于蓝牙的支持相对比较少,虽然它支持像socket之类的数据传输(bluetoothSocket),但不像一般一socket一样可以支持并发监听和发送接收操作。此文主要介绍如何在只有一个数据连接的基础上对不同数据的发送和接收并处理,结合本人开发的小软件谈谈本人的一些看法。
& & & & & &&在蓝牙连接建立起来后(具体可以参考其他蓝牙的相关开发资料,不再赘述),我通过新开一个线程去监听蓝牙端口是否有数据写入,为方便控制数据读入写出的方便,我没有直接采用BluetoothSocket的默认的InputStream和&OutputStream,而是以此为基础上加装成为对象输入输出流:(ObjectInputStream/OutputStream),具体代码如下:
socket=mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);//mAdapter为BluetoothAdapter类型
socket = mmServerSocket.accept();//等待连接,成功返回一个bluetoothsocket,mmServerSocket为BluetoothSocket类型
InputStream tmpIn = socket.getInputStream();
OutputStream tmpOut = socket.getOutputStream();//获取输入输出流
新建一个新线程监听端口:
public void run() {
while (true) {
ObjectInputStream input = new ObjectInputStream(mmInStream);// 等待数据传入
Object temp = input.readObject();//从流中读入一个对象数据
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
定义写出函数:
public void write(Object buffer) {
ObjectOutputStream input = new ObjectOutputStream(mmOutStream);
input.writeObject(buffer);
} catch (IOException e) {
& & & & & &&这样做的好处是我们可以发送和接收更多类型的数据而不仅仅是单一的数据了,我们要做的就是根据我们的需要把传送过来的数据对象进行正确的转换。于是,对于远程操作这一类的软件来说就可以有一个比较通用的模式来应用了:
1.& 两台手机在连接匹配后同时进入到同一个接收和发送模式(可以理解为发收的数据类型),我们默认为字符串类型;
2.& 服务机发送一个文本命令,并根据命令的类型进行本地判断,改变本地收发的模式(如果需要),以便接收子机返回的数据;
3.& 子机接收命令后进行命令解释,根据命令的类型选择不同的操作,如果需要的话也可更改收发的模式,如要返回数据,就将该数据打包成一个对象类型(Object)然后通过write(Object buffer)将数据送出;
4.& 服务机接收到返回的数据,线程完整地接收到一个对象之后将数据返回给主线程,主线程根据当前的模式类型选择恰当的操作对数据进行处理,如要继续进行此类的通信,继续发送对象
5.& 重复3,4,直到一方退出该模式,双方改变模式为字符串模式,子机再次等待接收另一命令。
& & & & & &&&这是一个大概的思路了,下面我以远程文件查看和传输为例子讲一下具体的操作。
& & & & & &&由于发收类型已经设置为对象了,字符串模式实际上收发的也是对象类型的。
//服务机通过发送一个命令”file”:
String command=”file”;
Write((Object)command);//调用write方法将命令送出
setState(1);//自定方法,将当前的模式转换为”file”的模式,这个方法体和参数都可以自定,总知只要可以在本类中全局调用可用来标识当前类的状态就可以了
& & & & & & &子机检测到有数据传入,以一个对象为单位接收好数据(查看以上线程的定义),然后可通过Handler等将收到的数据Object temp返回给主线程
mHandler.obtainMessage(MESSAGE_READ, -1, -1, temp).sendToTarget();
重载Handler的p handleMessage(Message msg)方法,如:
private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {// receive a message from
// sendMessage(Message)
switch (msg.what) {
String command=(String)msg.
//其中msg.what就是用obtainMessage返回的时候的第一个参数,int类型(如我用的MESSAGE_READ),最后一个参数就是要返回的对象(关于obtainMessage可以参考SDK文档).msg.obj就是返回的temp对象,通过强制类型转换把它还原成字符串类型,然后对进行命令进行解释选择相关操作就可以了,这里我们以获取SD卡目录为例子
if(command.equals(“file”))//判断方法也是多样的,视你发送的内容而定,我是采用双方统一的命令格式以减少数据传输的,此处判断仅为方便
setState(BTService.MESSAGE_TYPE_OBJECT_FILE_CLIENT);//改变模式,形式自定
getFile getfile = new getFile();
ArrayList&File& listfile = new ArrayList&File&();
listfile = getfile.fileGet();//获取SD根目录列表
listOfFiles listoffiles = new listOfFiles();
listoffiles.setList(listfile);//将数据以listOfFiles对象类型封装
write((Object) listoffiles);//发送封装好的对象
& & & & & & &其中getFile和listOfFiles如下:
//getFilepackage com.home.functions.
import java.io.F
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.os.E
import android.util.L
import android.widget.T
//use to package file
public class getFile {
private List&File& fileList =
private String SdState =
private File SDFile =
private File sdPath =
private String currentPath =
public List&File& fileGet() {
fileList = new ArrayList&File&();
SdState = Environment.getExternalStorageState();
if (SdState.equals(Environment.MEDIA_MOUNTED)) {
SDFile = Environment.getExternalStorageDirectory();
sdPath = new File(SDFile.getAbsolutePath());// get SD card root
getName();
} catch (Exception e) {
Log.e(&file&, &error&);
currentPath = SDFile.getAbsolutePath();
return fileL
public List&File& fileList(String path) {
Log.d(&path&, currentPath);
sdPath = new File(currentPath + &/& + path);
if (sdPath.isFile()) {
Log.v(&isfile&, &isfile&);
fileList.clear();
currentPath = currentPath + &/& +
getName();
return fileL
public List&File& previous()
if(!currentPath.equals(&/mnt&))
currentPath=currentPath.substring(0, currentPath.lastIndexOf(&/&));
Log.i(&currentpath&,currentPath);
sdPath=new File(currentPath);
fileList.clear();
getName();
return fileL
private void getName() {
if (sdPath.listFiles().length & 0) { // if has any file
for (File file : sdPath.listFiles()) {
fileList.add(file);
public String getPath()
return currentP
public File getCurrentFile(String filename)
filename=filename.substring(1,filename.length());
File file=new File(currentPath+&/&+filename);
Log.e(&filepath&,file.getAbsolutePath());
//listOfFilepackage com.home.functions.
import java.io.F
import java.io.S
import java.util.L
public class listOfFiles implements Serializable{
List&File& filelist=
public void setList(List&File& list)
public List&File& getList()
& & & & & & &服务机因已经在发送命令的同时改变 变了自身的接收模式,在服务机接收到数据后(接收和解释过程同子机)通过判断现在模式的类型,发现是文件管理的对象模式,于是在接收到数据并返回到主线程后对数据进行还原:
listOfFiles listoffiles = (listOfFiles) msg.
ArrayList&File& listfile = listoffiles.getList();
& & & & & & &就得到了一个装着子机SD卡目录的ArrayList了,此时就可以对其进行后续操作。
& & & & & & &再深入的话,文件传输也可以进行同样的操作,子机接收到命令后进入文件发送模式,通过在本地读取一个文字的一定长度(如20KB)为一个单位,将其封装成一个对象,然后发送,服务机因已经在发送请求时已进入文件接收模式,在接收到对象后对其进行解释操作,然后写入到一个文件当中,子机重复读取文件打包发送,服务器重复读取流数据然后追加写入文件直到文件到尾,文件就“下载”下来了:
int r = 0;
byte[] bytes = new byte[21504];// 本地缓存大小,一次读取的文件字节数,根据机质的不同调大可以改善传输性能
BufferedInputS
input = new BufferedInputStream(new FileInputStream(file));//文件输入流
while ((r = input.read(bytes)) != -1) {
filecache fileCache = new filecache();
fileCache.setFile(bytes);//封装数据
fileCache.setFileSize(r);//设置读取的字节数据
mService.write((Object) fileCache);//发出对象
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
String endCommand = &file_end&;
mService.write((Object) endCommand);//发送结束标志
//接收(在Handler的handlerMessage方法中处理)
String judgeCommand = (String) msg.obj.toString();
if (judgeCommand.equals(&file_end&)) {
setState(MESSAGE_TYPE_OBJECT_FILE_SERVER);//设置模式为文件管理模式,自定,作标识作用
else {//非文件结尾,写入
filecache fileCache = (filecache) msg.//还原数据
byte[] bytes = fileCache.getFile();
BufferedOutputS
output = new BufferedOutputStream(
new FileOutputStream(newfile, true));//追加写入,newfile为要写入的文件,File类型,自定
output.write(bytes, 0, fileCache.getFileSize());//写到磁盘中
output.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
其中filecache的定义如下:
package com.home.functions.
import java.io.S
public class filecache implements Serializable{
private static final long serialVersionUID = 1L;
byte[] bytes = new byte[21504];//21KB
// byte[] bytes=new byte[80240];//here?
public void setFile(byte[] source)
public byte[] getFile()
public void setFileSize(int Filesize)
public int getFileSize()
& & & & & & &这样重复这两个过程,当文件读取发送完毕,文件也就从子机传送到服务机当中的,当然以上可以在独立的线程中进行,只要通过Handler传递数据就可以了。
& & & & & & &对于不同类型的数据,就可以考虑如上的一种设计,即设计一个对象然后将真正需要发送的数据包含在那个对象当中(考虑到发送数据的多样性,如果数据类型只是一种很单纯的基本类型就不用这种方法了,直接转换成Object然后发就可以了)然后发送接收该对象就可以了,那个对象要序列化,即实现
Serializable接口。只要注意好模式的转换的时间,无论通过蓝牙什么时候发送什么都是可以的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:}

我要回帖

更多关于 android远程控制软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信