需求分析:
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、一些耗时的操作,一些互不影响的需要并行的操作,都需要用线程来实现,这一块并没有很多相同的任务需要执行,线程池暂时不需要;

蓝牙遥控器服务端实现相关推荐

  1. Linux下基于Bluez开发USB蓝牙SPP服务端

    由于是在linux上运行的,所以参考的bluez的代码,用C语言实现了蓝牙的Server端. 原理也很简单,在服务器端,通过命令添加SPP服务 前提是先安装好bluez,一般是安装好的,没安装的话可以 ...

  2. Android 手机蓝牙遥控器解决方案

    驱动力(需求): 女朋友觉得躺床上用ipad看电视剧不爽,对睡姿要求太高,还容易砸到自己,所以提出需求,没辙,搞起来: 现有设备: Rk3288 开发版一个,dell 显示器一个,小音箱一对: 思路: ...

  3. 蓝牙上层协议,服务端的启动,获取以及蓝牙设备的连接

    1,蓝牙协议/服务端的启动 上一篇文章中,分析了Bluetooth.apk启动过程,启动Bluetooth.apk时,一般启动了AdapterService这一对应的服务.查看package/app/ ...

  4. 三角定位法java代码_GitHub - megagao/IndoorPos: 这是一个采用蓝牙4.0--iBeacon技术的室内定位服务端程序。...

    IndoorPos 这是一个采用iBeacon技术的室内定位服务端程序,里面包含了三种定位算法,三边定位算法.加权三边定位算法和三角形加权质心定位算法.程序采用Spring框架,简化了JDBC和RMI ...

  5. Qt windows端的蓝牙串口服务

    Qt windows端的蓝牙串口服务 环境 系统 Qt 蓝牙模块 使用步骤 蓝牙模块参数获取 配对 扫描.连接.数据收发 扫描 连接 数据收发 环境 系统 只测试过自己电脑,系统版本如下: 查看方式按 ...

  6. 【BLE】nrf connect配置为服务端进行蓝牙主从通信实验

    需求背景 在进行BLE模块调试时,我们通常配置nrf connect APP作为蓝牙客户端,扫描蓝牙开发板的广播,进行连接. 然而当进行蓝牙主从通信实验时,为了调试主机端程序,如果手上只有一块开发板, ...

  7. 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端

    低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端 Android对外模模式(peripheral)的支持 从Android5.0开始才支持 关键术语和概念 以下是关键BLE术语和 ...

  8. Android BLE蓝牙——服务端实现(十四)

    一.BLE服务端开发 1.设置广播及初始化 //广播设置(必须) AdvertiseSettings settings = new AdvertiseSettings.Builder().setAdv ...

  9. Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

    参考: https://developer.android.com/guide/topics/connectivity/bluetooth-le http://a1anwang.com/post-47 ...

最新文章

  1. 标杆徐linux云计算视频,标杆徐2018 Linux自动化运维系列④: Shell脚本自动化编程实战...
  2. 单例模式反射、序列化漏洞及解决方案!
  3. 针对以下需求提供一个解决方案:在卡牛-信用卡管家APP里面,我们的用户需要一个寻找 附近银行网点/ATM 的功能
  4. 女生心中的理想男生!这些条件你符合几条?
  5. Java-ArrayList和Vector的区别
  6. 搭建本地Ubuntu14.04源
  7. DataGrid控件(可以实现不刷新增加删除等操作)
  8. individual program总结2.0
  9. error “Device supports x86, but APK only supports armeabi-v7a”
  10. 今天,我们能否见证小米的伟大时刻——以专利为视角的创新能力分析
  11. Outlook和Foxmail里设置Gmail(Google)谷歌企业邮箱
  12. 计算机主机是啥意思,服务器宕机是什么意思?电脑宕机的读法与含义
  13. apache、iis6、ii7独立ip主机屏蔽拦截蜘蛛抓取(适用vps云主机服务器)
  14. 整理总结:零基础英语语法
  15. springboot 应用:异常管理,应用启动过程,应用监控 Prometheus 和 Grafana
  16. bat实现 自动循环打开谷歌浏览器自动访问网站关闭浏览器功能
  17. 惊喜or惊吓?开发者眼中的苹果新品发布会
  18. 今天专科明天海归之美国留学
  19. 电脑有网登录不了qq,可能原因是这个
  20. windows10 快速启动开启与关闭

热门文章

  1. 【2019暑假集训】07.08比赛总结
  2. Noip2019暑期训练2 反思
  3. 华为云是如何暗中为你的网站保驾护航
  4. 为什么我劝你要有适度攻击性?
  5. python3 scrapy 爬虫实战之爬取站长之家
  6. PTA-L2-021 点赞狂魔 (25 分)(C++写法)
  7. Unity LineRenderer
  8. MTK平台LCM驱动移植
  9. 「Photoshop2021入门教程」对齐与分布制作波点图案
  10. verilog图像旋转200*200的256色图片