序言:最近在MTK方案上移植蓝牙驱动(RTL8723DU驱动)后,出现一个问题,蓝牙音箱断开后可以回连,但是蓝牙语音遥控只有第一次配对可以连上,断开后没法自己回连。

蓝牙音箱和蓝牙语音遥控区别

蓝牙有两种类型:经典蓝牙和低功耗蓝牙,而这里我们的蓝牙音箱属于经典蓝牙,蓝牙语音遥控属于低功耗蓝牙(BLE设备)
 经典蓝牙:蓝牙最初的设计意图,是打电话放音乐。3.0版本以下的蓝牙,都称为“经典蓝牙”。功耗高、传输数据量大、传输距离只有10米。
 低功耗蓝牙:就是BLE,通常说的蓝牙4.0(及以上版本)。低功耗,数据量小,距离50米左右。
传声音的,用经典蓝牙:
如蓝牙耳机、蓝牙音箱。蓝牙设计的时候就是为了传声音的,所以是近距离的音频传输的不二选择。
电池供电、连手机APP的,用BLE:
如共享单车锁、蓝牙智能锁、蓝牙防丢器、蓝牙室内定位,是目前手机和智能硬件通信的性价比最高的手段。直线距离约50米,一节5号电池能用一年,传输模组成本10块钱,远比WIFI、4G等大数据量的通信协议更实用。

问题定位

android.bluetooth.device.action.ACL_DISCONNECTED
android.bluetooth.device.action.ACL_CONNECTED

(1)蓝牙正常断开,板卡会接收到ACL_DISCONNECTED这个广播,蓝牙会连上,板卡会接收到ACL_CONNECTED这个广播;但是蓝牙语音遥控只有第一次配对成功的时候回收到ACL_CONNECTED这个广播,第一次断开会收到ACL_DISCONNECTED这个广播,后面重新连不会都不会收到广播。
(2)尝试收到发送广播,蓝牙语音遥控也不会再连上

adb shell am broacast -a android.bluetooth.device.action.ACL_CONNECTED

(3)蓝牙语音场分析
我们板卡在和蓝牙语音连接时,第二次连接时蓝牙我们的MAC地址和第一次连接蓝牙是蓝牙的MAC地址不一样,其他方案正常连接蓝牙语音遥控时,通信时的MAC地址是不变的。

问题修改

BLE设备地址和以太网一样,BLE协议也有自己的MAC地址,BLE协议将这个MAC地址称之为Device Address(设备地址)。
设备地址包括长度为48比特,分为公共设备地址(Public Device Address)和随机设备地址(Random Device Address)两种类型,

目前我们的板卡对BLE设备的MAC地址应该为随机设备地址,导致BLE设备回连连不上,需要将BLE设备地址修改为公共地址

修改位置:
system/bt/internal_include/bt_target.h

//将BLE_LOCAL_PRIVACY_ENABLED 设为FALSE
#ifndef BLE_LOCAL_PRIVACY_ENABLED
#define BLE_LOCAL_PRIVACY_ENABLED FALSE
#endif

注意:根据自己的项目修改合适的位置,MTK方案里bt_target.h有三个位置,最好还是一步一步定位的是哪个文件