在日常使用蓝牙的过程中,想必大家都发现了这样一个现象:连接蓝牙设备的手机在关闭再重新打开蓝牙后,会自动连接上先前连接着的那个设备,同样的场景对于安卓手机系统效果也是一致的。那这是怎么实现的呢,本篇文章我们就来聊一聊安卓系统中蓝牙的自动重连机制。

由于蓝牙分为Server和Client两端,也就是手机和蓝牙设备(车机系统)这两类具体载体,所以蓝牙重连机制也会有所差异,但是整体上的流程基本相同:
监听蓝牙的状态变化->获取关闭蓝牙前连接的设备信息->自动连接。
1、手机蓝牙自动重连机制的主要在进程 com.android.bluetooth 中实现的,路径:
packages\apps\Bluetooth\src\com\android\bluetooth\btservice\PhonePolicy.java

For循环中通过判断设备某一个协议的优先级决定是否发起该协议的连接,只有Priority = BluetoothProfile.PRIORITY_AUTO_CONNECT(1000)的设备才会自动连接。
2、车机蓝牙自动重连机制的主要在进程 com.android.car 中实现的,路径:
packages\services\Car\service\src\com\android\car\BluetoothDeviceConnectionPolicy.java

由于流程相差无几,所以本篇就从车机蓝牙系统的角度来分析下自动重连机制的实现原理,手机端的蓝牙自动重连机制有机会再给大家分析。
车机蓝牙的自动重连主要是在 com.android.car 这个服务进程中实现的,先来整体认识下这个进程吧。从该进程的清单文件中可以知道其始于CarService.java:
从系统的全局变量Settings中读取已连接的设备信息,后面等监听到蓝牙状态打开后,再去重连这些设备对应的各个协议。
该全局变量存储路径:/data/system/users/0/settings_secure.xml
注册监听的蓝牙广播有如下几种类型:
1、BluetoothDevice.ACTION_BOND_STATE_CHANGED—设备配对状态;
2、BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED—媒体音频协议连接状态;
3、BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED—手机音频协议连接状态;
4、BluetoothPan.ACTION_CONNECTION_STATE_CHANGED—共享网络协议连接状态;
5、BluetoothPbapClient.ACTION_CONNECTION_STATE_CHANGED—电话簿协议连接状态;
6、BluetoothMapClient.ACTION_CONNECTION_STATE_CHANGED—短信协议连接状态;
7、BluetoothAdapter.ACTION_STATE_CHANGED—蓝牙开关状态;
BluetoothDevice.ACTION_UUID—设备UUID;

CarBluetoothUserService是通过bind服务PerUserCarService后getBluetoothUserService()间接使能起来的。

最后对协议重连是按照如下的协议顺序来依次连接:
1、BluetoothProfile.HEADSET_CLIENT
2、BluetoothProfile.A2DP_SINK
3、BluetoothProfile.PBAP_CLIENT
4、BluetoothProfile.MAP_CLIENT
5、BluetoothProfile.PAN
从整个流程分析下来最为关键的部分就是从Setting中读取数据,并且会在蓝牙关闭或进程退出时将已连接设备的信息保存到Setting中。

实际上重连机制不单单适用于上述这种打开蓝牙后的场景,有时蓝牙设备间由于各种原因而导致链路断开,过了一段时间需要自动重连上蓝牙设备,这种场景在上面的重连机制中就不适用了,那该如何实现呢?

方法那也是有的,还记得我有写过一篇详细讲解了蓝牙ACL链路断开的几种原因,然而不是每种断开都需要自动重连的。比如用户手动断开蓝牙这种情况下还发起自动重连,那就太让人无语了。

所以我们只需要对由于链路超时导致的ACL断开的场景,自动发起重连。这样等两个蓝牙设备再次靠近时,就能自动连接成功。
由于两个蓝牙设备超时断开后,再次靠近的时间是不确定的,如果只发起一次自动重连可能无法成功连接上设备,因此这里的自动重连机制中需要加个循环以保证某一次成功连接。
蓝牙重连机制就简单分析到这儿,了解更多相关蓝牙连接APP自动重连机制可以咨询常州开发APP公司http://www.66dianzan.com点个赞科技。

开发手机蓝牙硬件APP如何实现蓝牙自动重连机制相关推荐

  1. Android 蓝牙开发——自动重连机制(十八)

    在日常使用蓝牙的过程中,想必大家都发现了这样一个现象:连接蓝牙设备的手机在关闭再重新打开蓝牙后,会自动连接上先前连接着的那个设备,同样的场景对于安卓车机系统效果也是一致的.本篇文章我们就来聊一聊安卓系 ...

  2. macbook蓝牙pan未连接_蓝牙自动重连机制

    蓝牙自动重连机制的原理分析 在日常使用蓝牙的过程中,想必大家都发现了这样一个现象:连接蓝牙设备的手机在关闭再重新打开蓝牙后,会自动连接上先前连接着的那个设备,同样的场景对于安卓车机系统效果也是一致的. ...

  3. QT Android wifi自动重连开发

    QT Android wifi自动重连开发 配置安卓wifi操作权限 通过监听QNetworkConfigurationManager信号判断WiFi是否失去连接 Java代码 QT代码 小米平板连接 ...

  4. ESP32-C3 学习测试 蓝牙 篇(二、蓝牙调试APP、开发板手机连接初体验)

    等了好久终于等到今天,盼了好久终于把蓝牙测试 = =! ESP32-C3 专栏好久没更新了,这次抽点时间把蓝牙的准备工作做完. 目录 前言 1.蓝牙手机调试工具 2.ESP-IDF中示例的选择 3.E ...

  5. 低功耗蓝牙工具APP开发实战

    <低功耗蓝牙工具APP开发实战> 什么是 LightBLE? ​ 一个功能比较全面的蓝牙调试工具.支持所有使用蓝牙4.0低功耗的设备接入调试,提供蓝牙设备搜索.读取服务.浏览特征等操作. ...

  6. 最新的单片机_关于单片机通过蓝牙将数据传输给手机并在app上面显示出来怎么实现...

    我之前做过相关的开发,所以顺便说一下,希望能帮助到你 首先是蓝牙通信,我想指出,如果你用的是蓝牙模块的话,那么它的单片机程序与串口的单片机程序差不多一样,只要你会串口操作,蓝牙也就解决了,如果不是用的 ...

  7. 手机APP开发之MIT Appinventor详细实战教程(六),蓝牙与单片机进行多数据交互,通信蓝牙控制APP的研发与设计。 以及相关问题的思考。

    目录 一.App的简单介绍 二.蓝牙逻辑连接的实现 三.数据比较逻辑结构的实现 四.数据显示遇到的问题和思考 五.解决方法和尝试 六.问题分析与寻求帮助 七.总结 一.App的简单介绍 首先APP的功 ...

  8. 手机app和单片机蓝牙通讯c语言,单片机怎么和手机通信,你知道吗?

    原标题:单片机怎么和手机通信,你知道吗? 在用单片机做产品的时候,难免会用到单片机和手机通信,能和手机通信的方案有很多这种,像常用的蓝牙,Wifi等等,当然还有更高层次的通过互联网,一般我们使用比较多 ...

  9. 51单片机蓝牙APP食物卡路里热量称重HX711电子秤蓝牙手机APP

    实践制作DIY- GC0059-食物卡路里热量称重 一.功能说明: 基于51单片机设计-食物卡路里热量称重 二.功能介绍: STC89C52单片机(AT89C51/52)+lcd1602+HX711+ ...

最新文章

  1. VS 2010测试解读2-给测试用例做标签
  2. 论文笔记: Modeling Extreme Events in Time Series Prediction
  3. sql必知必会(第四版) 学习笔记一
  4. linux重置root密码
  5. anaconda安装keras_关于yolo模型的试安装及关于现阶段安排的一点想法
  6. 晨哥真有料丨聊天就在一起了,真有这么简单吗?
  7. c语言中最常用的四种数据类型,计算机中有哪几种常见数据类型
  8. MFC编程记录--图片控件类
  9. Java对象序列化原理以及Serializable接口
  10. Linux中vim编辑器常用命令、文件查找、磁盘挂载、用户管理
  11. 结构仿真实验,Midas多跨超静定连续梁手算电算分析
  12. 参考 Docker 官方文档 Centos安装 Docker
  13. Linux Cannot assign requested address
  14. 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解
  15. amd的cpu跑python_Windows下用cpu模式跑通目标检测py-faster-rcnn 的demo.py
  16. map、set(底层结构)——C++
  17. 用threading+turtle画哆啦A梦,同时播放背景音乐
  18. 华为硬件工程师手册_一名电子工程师该如何打开正确的摆摊姿势?
  19. AT8400 串口控制语音芯片 UART设置MP3芯片 无损dsp硬解码
  20. 手机平板界面需要全屏展示,怎么设置?

热门文章

  1. Python 生成 GIF 文件
  2. 记录Robotium黑盒测试一个APK文件学习之从签名到简单测试
  3. 【C#】基础函数、运算符和表达式
  4. 看《流金岁月》杨珂带领销售团队成功之处
  5. 数据处理 过采样与欠采样 SMOTE与随机采样 达到样本均衡化
  6. 2018年-读书笔记
  7. 计算机审计体会论文,审计论文格式_计算机审计实验报告_审计论文范文3000字
  8. 【C语言】重要函数qsort函数的用法
  9. 信息学奥赛一本通:1147:最高分数的学生姓名
  10. NYOJ 20 吝啬的国度 续