扒一扒蓝牙自动重连机制的实现原理
在日常使用蓝牙的过程中想必大家都发现了这样一个现象:连接蓝牙设备的手机在关闭再重新打开蓝牙后,会自动连接上先前连接著的那个设备同样的场景对于安卓车机系统效果也是一致的。那这是怎么实现的呢本篇文章我们就来聊一聊安卓系统中蓝牙的自动重連机制。
由于蓝牙分为Server和Client两端也就是手机和蓝牙设备(车机系统)这两类具体载体,所以蓝牙重连机制也会有所差异但是整体上的流程基本相同:
监听蓝牙的状态变化 -> 获取关闭蓝牙前连接的设备信息 -> 自动连接。
1、手机蓝牙自动重连机制的主要在进程com.android.bluetooth中实现的路径:
2、車机蓝牙自动重连机制的主要在进程com.android.car中实现的,路径:
由于流程相差无几所以本篇就从车机蓝牙系统的角度来分析下自动重连机制的实現原理,手机端的蓝牙自动重连机制有机会再给大家扒(先挖个坑待以后慢慢填…)。
车机蓝牙的自动重连主要是在com.android.car这个服务进程中实現的先来整体认识下这个进程吧。从该进程的清单文件中可以知道其始于CarService.java:
从系统的全局变量Settings中读取已连接的设备信息后面等监听到藍牙状态打开后,再去重连这些设备对应的各个协议
注册监听的蓝牙广播有如下几种类型:
最后对协议重连是按照如下的协议顺序来依佽连接:
从整个流程分析下来最为关键的部分就是从Setting中读取数据,并且会在蓝牙关闭或进程退出时将已连接设备的信息保存到Setting中
实际上偅连机制不单单适用于上述这种打开蓝牙后的场景,有时蓝牙设备间由于各种原因而导致链路断开过了一段时间需要自动重连上蓝牙设備,这种场景在上面的重连机制中就不适用了那该如何实现呢?
方法那也是有的还记得我有写过一篇《蓝牙链路断开的原因》中详细講解了蓝牙ACL链路断开的几种原因,然而不是每种断开都需要自动重连的比如用户手动断开蓝牙这种情况下还发起自动重连,那就太让人無语了
所以我们只需要对由于链路超时导致的ACL断开的场景,自动发起重连这样等两个蓝牙设备再次靠近时,就能自动连接成功
具体實现方案可以参考《蓝牙链路断开的原因》中将ACL链路断开的原因获取到,然后判断原因是链路超时则发起重连。
由于两个蓝牙设备超时斷开后再次靠近的时间是不确定的,如果只发起一次自动重连可能无法成功连接上设备因此这里的自动重连机制中需要加个循环以保證某一次成功连接。
蓝牙重连机制就简单分析到这儿感兴趣的小伙伴欢迎私信留言一起讨论。
更多互联互通技术欢迎关注微信公众号:Connectivity