蓝牙自动重连机制的原理分析

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

由于蓝牙分为Server和Client两端,也就是手机和蓝牙设备(车机系统)这两类具体载体,所以蓝牙重连机制也会有所差异,但是整体上的流程基本相同:

监听蓝牙的状态变化->获取关闭蓝牙前连接的设备信息->自动连接

1、手机蓝牙自动重连机制的主要在进程com.android.bluetooth中实现的,路径:

packagesappsBluetoothsrccomandroidbluetoothbtservicePhonePolicy.java

For循环中通过判断设备某一个协议的优先级决定是否发起该协议的连接,只有Priority = BluetoothProfile.PRIORITY_AUTO_CONNECT(1000)的设备才会自动连接。

2、车机蓝牙自动重连机制的主要在进程com.android.car中实现的,路径:

packagesservicesCarservicesrccomandroidcarBluetoothDeviceConnectionPolicy.java

由于流程相差无几,所以本篇就从车机蓝牙系统的角度来分析下自动重连机制的实现原理,手机端的蓝牙自动重连机制有机会再给大家扒(先挖个坑,待以后慢慢填…)。

车机蓝牙的自动重连主要是在com.android.car这个服务进程中实现的,先来整体认识下这个进程吧。从该进程的清单文件中可以知道其始于CarService.java:

从系统的全局变量Settings中读取已连接的设备信息,后面等监听到蓝牙状态打开后,再去重连这些设备对应的各个协议。

该全局变量存储路径:/data/system/users/0/settings_secure.xml

注册监听的蓝牙广播有如下几种类型:

  • BluetoothDevice.ACTION_BOND_STATE_CHANGED—设备配对状态
  • BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED—媒体音频协议连接状态
  • BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED—手机音频协议连接状态
  • BluetoothPan.ACTION_CONNECTION_STATE_CHANGED—共享网络协议连接状态
  • BluetoothPbapClient.ACTION_CONNECTION_STATE_CHANGED—电话簿协议连接状态
  • BluetoothMapClient.ACTION_CONNECTION_STATE_CHANGED—短信协议连接状态
  • 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断开的场景,自动发起重连。这样等两个蓝牙设备再次靠近时,就能自动连接成功。

具体实现方案可以参考《蓝牙链路断开的原因》中将ACL链路断开的原因获取到,然后判断原因是链路超时,则发起重连。

由于两个蓝牙设备超时断开后,再次靠近的时间是不确定的,如果只发起一次自动重连可能无法成功连接上设备,因此这里的自动重连机制中需要加个循环以保证某一次成功连接。

蓝牙重连机制就简单分析到这儿,感兴趣的小伙伴欢迎私信留言一起讨论。

macbook蓝牙pan未连接_蓝牙自动重连机制相关推荐

  1. macbook蓝牙pan未连接_机械键盘也能这么萌?洛斐DOT小黄鸭键鼠,蓝牙一键切换!...

    如今是一个颜值即"正义"的时代,一款产品功能做得好,不一定为人所知,但一款拥有可爱萌趣外形.精细美观做工的产品,自然能够让很多用户喜欢,洛斐小黄鸭键鼠套装就是这样的产品. 在洛斐刚 ...

  2. macbook蓝牙pan未连接_关于 MacBook 的电池问题,你了解多少

    很多小伙伴购买 MacBook 之后,在使用过程中都很关注 Mac 的电池健康问题,也想知道在使用过程中需要注意些什么能够优化电池的续航能力. 本期Mac毒就根据苹果官方的说明解释和相关经验来为大家介 ...

  3. macbook蓝牙pan未连接_LOFREE洛斐Dot圆点蓝牙机械键盘 洛斐MAUS薯片蓝牙鼠标使用评测...

    洛斐蓝牙键盘众筹时就关注了,颜值比常见的机械键盘高多许.一起先来欣赏官方配图: 颜值即正义 复古即潮流DOT蓝牙机械键盘 洛斐MAUS薯片蓝牙鼠标也一直有所期待,这款鼠标给我的感觉是极简&小清 ...

  4. macbook蓝牙pan未连接_macOS Catalina 10.15.1 连接iPad 13.2.2 分屏失败的解决办法

    想用iPad做为拓展屏幕,首先第一点,您的ipad是支持Apple Pencil款. 下面说说我升级后连接设备出现的一些问题及心得: 第一步: 升级iPad为最新系统13.2.2,升级后感觉icon都 ...

  5. 开发手机蓝牙硬件APP如何实现蓝牙自动重连机制

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

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

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

  7. 蓝牙协议分析(3)_蓝牙低功耗(BLE)协议栈介绍

    原文链接:蓝牙协议分析(3)_蓝牙低功耗(BLE)协议栈介绍 系列索引:蓝牙协议分析(1)_基本概念 蓝牙协议分析(2)_协议架构 目录 1. 前言 2. Why 3. How和What 4. Phy ...

  8. [Qt] TCP客户端与服务器断开连接自动重联机制

    TCP服务器断开连接自动重联机制 客户端加入定时器实现断线重联(客户端服务端代码见上一篇博客) 编译环境:Qt 5.9.5 ui界面如图: 代码如下 tcpclient.h #ifndef TCPCL ...

  9. 达梦数据库JDBC连接池断开自动重连设置

    一.场景 在网络状况不是非常良好,经常会出现暂时性的拥塞或者断开的情况,而且当我们重启数据库时也会发生类似的情况.所以需要配置中间件的连接池来实现连接测试以及自动重连,通过重新配置连接池,成功解决了这 ...

最新文章

  1. python中文昵称-官方出品 Python 中文文档!拜托,别再说看不懂了
  2. 如何使用ABAP异步RFC调用提升应用性能
  3. BootstrapTable入门Demo
  4. vue 跨域:使用vue-cli 配置 proxyTable 实现跨域问题
  5. LINQ to SQL 用O/R设计器手工建表对象
  6. 【iOS开发-35】有了ARC内存管理机制,是否还须要操心内存溢出等问题?——面试必备...
  7. 【博弈 —— NIM模型】
  8. linux如何添加虚拟打印机,Linux下虚拟打印机CUPS-PDF教程
  9. NXP iMX8基于eIQ框架测试Machine Learning
  10. 国家级非遗传承人高清旺《四大美人》皮影数字藏品惊艳亮相!
  11. shell 亚瑟王环
  12. 将openwrt软路由装进U盘中并运行
  13. 微信小程序——卡片列表显示listview(带阴影)
  14. Windows下使用GPU加速FFmpeg处理图片合成视频
  15. vue大文件上传控件选哪个好?
  16. java.util. 什么意思_java.util中,util是什么意义
  17. 什么是编码?什么是解码?为什么要编码.解码?
  18. Java IDE - Selenium 包下载
  19. 夫兵形象水,水之行避高趋下,兵之形避实击虚;水因地制流,兵因故制胜。故兵无常势水无常形。能因敌变化取胜者谓之神。
  20. 109 个实用 Shell 脚本实例,代码清晰拿来就能用!(附pdf)

热门文章

  1. 使用Telerik的登陆模板实现DoubanFm的登陆(WP7)
  2. MySQL自学笔记(二)
  3. 原创整理《考研英语词汇的逻辑》精选词汇-思维导图
  4. 你不可不知的《哈利波特》秘密(二)
  5. java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...
  6. 自定义拍照时 拍照界面_拍照时图片比例怎么选?比构图还要提前一步的摄影攻略要做好...
  7. 汇编移位指令SHR,SAR,SAL/SHL,ROR,ROL,RCR,RCL
  8. Python 使用乐动体育的 backoff 更优雅的实现轮询
  9. TP6 WhereIn排序问题
  10. 区块链入门二:概念篇