最近我们公司的语音遥控器的项目就快要进入尾声了,还需要优化一下蓝牙回连这块的技术。先来看看需求:
iOS 端:
1、当设备开机时,尝试回连最后一次连接过的设备 A2DP(多个设备的情况下优先连接最后连接的设备);
2、连接上 A2DP 后,扫描设备 BLE 连接设备 BLE(在当前打开应用或者应用在后台打开情况下);
Android
第一种情况:
1、当设备开机时,尝试回连最后一次连接过的设备 A2DP(多个设备的情况下优先连接最后连接的设备);
2、连接上 A2DP 后,App 拿到蓝牙对象,去连接 SPP (在当前打开应用或者应用在后台打开情况下);
第二种情况:
1、手机“设置”自动回连上一次最新的 A2DP 连接;
2、连接上 A2DP 后,App 拿到蓝牙对象,去连接 SPP (在当前打开应用或者应用在后台打开情况下);
第三种情况:
进入 App 之后,如果原来本地保存的连接数据显示有最后的一次连接的设备,就尝试自动连接这个设备(A2DP + SPP一起连接 )。
回连逻辑 (BLE遥控器)
iOS/Android
第一种情况
iOS/Android
被动断开情况下,会一直去自动扫描,扫到为止。
第二种情况
打开应用,会检测到上次保存的最新的一次 BLE 自动回连
特殊情况
当 App 最后一次连接 BLE 设备,退出之后,在系统设置页面连接音箱(某些手机可以连接一个或者多个),再次进入的时候,回连 BLE 然后会回连 2819 音箱,这个时候我们允许 2819 音箱和 BLE 共存。某些手机存在可以连接多个音箱(过滤是否是我们的产品)的情况,默认回连第一个。
为了用户的方便使用,现在的连接蓝牙的应用和设备大部分都做了回连的处理。比如你的蓝牙耳机,当它关机之后,就会和你的手机断开,重新开机时,又会自动和你的蓝牙进行连接。这里就做了回连的技术处理。今天我要写的就是这块的总结和逻辑处理。
蓝牙版本
- 蓝牙4.0:也叫BLE(Bluetooth low energy),特点是功耗低,传输速率也较低。但绝对可以满足市场上的大部分智能穿戴产品了,是目前iOS蓝牙开发的主流。从iPhone4s开始支持。使用
CoreBluetooth
进行开发 - 蓝牙3.0:硬件需要获得MFi认证才能配合iOS设备使用,使用
ExternalAccessory
框架进行开发。 因为硬件有要求,一般的蓝牙外设都不会选择3.0,除了涉及高质量音频传输的,比如耳机。
目前我们采用的是蓝牙 4.0 版本。当一个设备因为没电关机,或者自动关机的情况会与 BLE 断开,当再次开机的时候,他会与最后一次设备自动进行连接,不需要走配对的过程,叫做蓝牙回连。
在测试过程中,我们需要注意一下几个场景:
1 设备被强制关机或者是断电关机
2 设备和手机距离太远断开
3 只是断开 A2DP 的情况
4 应用被结束进程
设备要是被强制关机了或者是断电关机了,开机之后,应用如果没有关闭是需要自动回连的。系统的 A2DP 会自动回连,iOS 出现过音源输出选择的 bug,A2DP 已经连接,但是声音是默认从 iPhone 中出声,这个问题目前还没有解决。
设备和手机距离太远断开,这里有可能会回连失败,因为硬件如果设置扫描几次就不再发起回连,应用也就没办法回连成功了。
只是断开 A2DP 的情况下,BLE 还是在连接状态,可以正常调起应用,但是不能让声音从设备端出来。这一点目前也没有办法修改,这是苹果系统设定。
应用被结束了进程,手机系统的蓝牙是在连接状态的,但是应用内 BLE 却已经断开了。