蓝牙自动重连机制

扒一扒蓝牙自动重连机制的实现原理

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

由于蓝牙分为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

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

  • 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链路断开的原因获取到,然后判断原因是链路超时,则发起重连。
在这里插入图片描述

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

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

更多互联互通技术,欢迎关注微信公众号:Connectivity
在这里插入图片描述

实现微信小程序中的蓝牙自动机制,关键步骤包括系统差异处理、异常情况处理、连接流程控制以及蓝牙服务ID的定义。《微信小程序蓝牙连接2.0实战:兼容Android与iOS》详细介绍了这些关键步骤,并提供了实际的解决方案。 参考资源链接:[微信小程序蓝牙连接2.0实战:兼容Android与iOS](https://wenku.csdn.net/doc/7kk18tw2fh) 首先,开发者需要处理Android和iOS平台的系统差异。例如,在Android设备上,如果开启蓝牙适配器的扫描操作失败,系统会每3秒尝试新开启扫描。而在iOS设备上,如果获取已连接蓝牙设备为空,则每3秒会新尝试获取设备。 其次,要合理设计异常情况的处理机制。例如,当蓝牙未开启时,系统应监听蓝牙状态变化,并在蓝牙开启后自动尝试新连接。初始化蓝牙适配器失败时,应自动试初始化过程。连接失败时,无论是Android还是iOS平台,都应新开始扫描或获取设备,并在连接成功后处理蓝牙适配器置的情况。 连接流程控制是通过在`App.js`中的`onLaunch`事件触发`init()`方法实现的,该方法定义了蓝牙服务的ID列表,这些ID是连接过程中识别关键信息的标识。 最后,蓝牙服务ID的定义也是实现自动机制的关键。预设的服务ID如`6E400001-B5A3-F393-E0A9-E50E24DCCA9E`等,用于定位特定的蓝牙服务和特性。 以上步骤结合《微信小程序蓝牙连接2.0实战:兼容Android与iOS》中的实例代码和方案,可以有效提高微信小程序中蓝牙连接的稳定性和成功率,确保用户在使用过程中即使遇到连接失败或设备置等意外情况也能自动新连接,从而提升用户体验。 参考资源链接:[微信小程序蓝牙连接2.0实战:兼容Android与iOS](https://wenku.csdn.net/doc/7kk18tw2fh)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值