蓝牙遥控器服务端实现
需求分析:
1、开机启动,等待客户端连接
2、检测到有客户端连入就开始监听数据
3、监听到数据之后,进行相应的处理
4、检测到客户端断开,就重新开始等待客户端连接
1、开机启动,等待客户端连接
监听开机广播,然后启动服务,等待客户端连接,暂时为了测试,使用 Activity 手动启动服务;
2、检测到有客户端连入就开始监听数据
因为都是耗时操作,所以这些工作我么都需要放到线程中进行操作
监听客户端连入
public void startBluetoothServerSocket() {new BluetoothServerThread().start();}class BluetoothServerThread extends Thread {BluetoothServerThread() {if (mBsServerSocket == null) {try {if (false) {mBsServerSocket = BluetoothAdapter.getDefaultAdapter().listenUsingRfcommWithServiceRecord(BluetoothAdapter.getDefaultAdapter().getName(), UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"));} else {mBsServerSocket = BluetoothAdapter.getDefaultAdapter().listenUsingInsecureRfcommWithServiceRecord(BluetoothAdapter.getDefaultAdapter().getName(), UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"));}} catch (IOException e) {Log.d("liuxiuting", "fail to get serversocket of bluetooth" + e.toString());e.printStackTrace();}}}@Overridepublic void run() {super.run();if (mBsServerSocket != null) {Log.d("liuxiuting", "mBsServerSocket!=null");try {btSocket = mBsServerSocket.accept();Log.d(TAG, "有客户端连接到我们");onConnectSucceed(btSocket);} catch (IOException e) {Log.d(TAG, "fail to mBsServerSocket.accept()" + e.toString());}}}
监听客户端消息
private class ConnectedThread extends Thread {private final BluetoothSocket mmSocket;private final InputStream mmInStream;private final OutputStream mmOutStream;public ConnectedThread(BluetoothSocket socket, String socketType) {Log.d(TAG, "create ConnectedThread: " + socketType);mmSocket = socket;InputStream tmpIn = null;OutputStream tmpOut = null;// Get the BluetoothSocket input and output streamstry {tmpIn = socket.getInputStream();tmpOut = socket.getOutputStream();} catch (IOException e) {Log.e(TAG, "temp sockets not created", e);}mmInStream = tmpIn;mmOutStream = tmpOut;}public void run() {Log.i(TAG, "BEGIN mConnectedThread");byte[] buffer;int bytes;String str;// Keep listening to the InputStream while connectedwhile (true) {try {// Read from the InputStream// 此处每次读取1024个字节,切记每次必须new一下buffer,// 或者在读之前将 buffer 清空,否则会出现脏数据buffer = new byte[1024];bytes = mmInStream.read(buffer);str = new String(buffer,"UTF-8");// 得到数据,我们开始做具体操作DataProcessManager.getInstance().dataProcess(str.trim());Log.e(TAG, str.trim());} catch (IOException e) {// 如果走到这儿,说明客户端断开了连接,我们需要把一些对象close,// 这些对象包括 输入输出流,获取到的socket,以及我们监听客户端// 连接时创建的 mBsServerSocket// 然后开始重新监听Log.e(TAG, "disconnected", e);// Start the service over to restart listening modecancel();closeBluetoothServerSocket();break;}}try {Thread.sleep(1000);startBluetoothServerSocket();} catch (InterruptedException e) {e.printStackTrace();}}
3、 对接收到的数据进行分析处理
传过来的数据大概分两种:
一种是键值,最多是三位数,另外一种就是字符串用于输入文本,所以我就用字符串长度来区分,为了防止文本少于四个字符,所以我在传输文本之前在文本开头添加了四个 0;
public void dataProcess(String code){if(code.length()>=4){code = code.substring(4);//去掉开头的四个 0new RemoteControlTextThread(code).start();}else{new RemoteControlNumThread(code).start();}// 不同的功能用不同的线程来实现,方便后续的扩展}
具体的功能实现:
@Overridepublic void run() {super.run();try {remoteCommand = "input keyevent "+remoteCode;Runtime.getRuntime().exec(remoteCommand);} catch (IOException e) {e.printStackTrace();}}
@Overridepublic void run() {super.run();try {remoteCommand = "input text "+remoteText;Runtime.getRuntime().exec(remoteCommand);} catch (IOException e) {e.printStackTrace();}}
还有需要注意的一点就是应用需要系统权限,否则命令无法执行成功;
总结
服务端这一块东西从技术上分析就是Socket,和 adb 命令执行,执行部分相对简单,容易出错的部分就只有Socket 部分了,我觉得需要注意的地方有三点;
1、判断客户端断开的时机,知道断开后重新监听之前,需要将所有的资源释放掉,否则会监听失败;
2、数据的获取,buffer 数据每次都需要清空,否则会出现脏数据;
3、一些耗时的操作,一些互不影响的需要并行的操作,都需要用线程来实现,这一块并没有很多相同的任务需要执行,线程池暂时不需要;
蓝牙遥控器服务端实现相关推荐
- Linux下基于Bluez开发USB蓝牙SPP服务端
由于是在linux上运行的,所以参考的bluez的代码,用C语言实现了蓝牙的Server端. 原理也很简单,在服务器端,通过命令添加SPP服务 前提是先安装好bluez,一般是安装好的,没安装的话可以 ...
- Android 手机蓝牙遥控器解决方案
驱动力(需求): 女朋友觉得躺床上用ipad看电视剧不爽,对睡姿要求太高,还容易砸到自己,所以提出需求,没辙,搞起来: 现有设备: Rk3288 开发版一个,dell 显示器一个,小音箱一对: 思路: ...
- 蓝牙上层协议,服务端的启动,获取以及蓝牙设备的连接
1,蓝牙协议/服务端的启动 上一篇文章中,分析了Bluetooth.apk启动过程,启动Bluetooth.apk时,一般启动了AdapterService这一对应的服务.查看package/app/ ...
- 三角定位法java代码_GitHub - megagao/IndoorPos: 这是一个采用蓝牙4.0--iBeacon技术的室内定位服务端程序。...
IndoorPos 这是一个采用iBeacon技术的室内定位服务端程序,里面包含了三种定位算法,三边定位算法.加权三边定位算法和三角形加权质心定位算法.程序采用Spring框架,简化了JDBC和RMI ...
- Qt windows端的蓝牙串口服务
Qt windows端的蓝牙串口服务 环境 系统 Qt 蓝牙模块 使用步骤 蓝牙模块参数获取 配对 扫描.连接.数据收发 扫描 连接 数据收发 环境 系统 只测试过自己电脑,系统版本如下: 查看方式按 ...
- 【BLE】nrf connect配置为服务端进行蓝牙主从通信实验
需求背景 在进行BLE模块调试时,我们通常配置nrf connect APP作为蓝牙客户端,扫描蓝牙开发板的广播,进行连接. 然而当进行蓝牙主从通信实验时,为了调试主机端程序,如果手上只有一块开发板, ...
- 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端
低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端 Android对外模模式(peripheral)的支持 从Android5.0开始才支持 关键术语和概念 以下是关键BLE术语和 ...
- Android BLE蓝牙——服务端实现(十四)
一.BLE服务端开发 1.设置广播及初始化 //广播设置(必须) AdvertiseSettings settings = new AdvertiseSettings.Builder().setAdv ...
- Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)
参考: https://developer.android.com/guide/topics/connectivity/bluetooth-le http://a1anwang.com/post-47 ...
最新文章
- 标杆徐linux云计算视频,标杆徐2018 Linux自动化运维系列④: Shell脚本自动化编程实战...
- 单例模式反射、序列化漏洞及解决方案!
- 针对以下需求提供一个解决方案:在卡牛-信用卡管家APP里面,我们的用户需要一个寻找 附近银行网点/ATM 的功能
- 女生心中的理想男生!这些条件你符合几条?
- Java-ArrayList和Vector的区别
- 搭建本地Ubuntu14.04源
- DataGrid控件(可以实现不刷新增加删除等操作)
- individual program总结2.0
- error “Device supports x86, but APK only supports armeabi-v7a”
- 今天,我们能否见证小米的伟大时刻——以专利为视角的创新能力分析
- Outlook和Foxmail里设置Gmail(Google)谷歌企业邮箱
- 计算机主机是啥意思,服务器宕机是什么意思?电脑宕机的读法与含义
- apache、iis6、ii7独立ip主机屏蔽拦截蜘蛛抓取(适用vps云主机服务器)
- 整理总结:零基础英语语法
- springboot 应用:异常管理,应用启动过程,应用监控 Prometheus 和 Grafana
- bat实现 自动循环打开谷歌浏览器自动访问网站关闭浏览器功能
- 惊喜or惊吓?开发者眼中的苹果新品发布会
- 今天专科明天海归之美国留学
- 电脑有网登录不了qq,可能原因是这个
- windows10 快速启动开启与关闭