最近有个场景:
2个独立的产品 与 对应 2款独立的app,简称 应用A、应用B
实验场景:
###1.应用A、应用B
###2.手机:华为P30 Android 10
###3.蓝牙模块:TI CC2540 和 Nordic(nrf52832)
重现步骤:
###步骤1:使用应用A 连接TI的 CC2540,连接、断开、连接 没有异常;
###步骤2:使用应用B 连接Nordic的模块,连接、断开、连接 没有异常;
###步骤3:此时手动断开应用B 与Nordic的连接(同时后台杀死应用B);
###步骤4:手动断开应用A与CC2540的连接,再尝试连接CC2540
结果:手机再也连接不上CC2540(可以通过重启蓝牙恢复)、但是 应用B可以操作 继续连接Nordic
进一步验证:下载第三方软件“nRF Connect”或者其它开源应用,都连接不上CC2540
###步骤5:使用应用B连接Nordic模块(保持连接状态),再操作应用A连接2540,此时可以连接。
###步骤6:再断开Nordic后,应用A重复 断开-连接 动作(再也连不上了)
备注:
跟踪应用层代码:
应用层操作为(2540 模块 加入了防劫持策略):
###1.连接;
###2.发现服务
###3.开启密码通知(出现问题的地方);
###4.写入密码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback,BluetoothDevice.TRANSPORT_LE);
}else {
mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback);
}
```
连接回调如下:
```
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if(status == BluetoothGatt.GATT_SUCCESS){
if(newState == BluetoothProfile.STATE_CONNECTED){
mConnectionState = STATE_CONNECTED;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
mBluetoothGatt.discoverServices();// 发现服务true
}else if(newState == BluetoothProfile.STATE_DISCONNECTED){
boolean statue = refreshDeviceCache(mBluetoothGatt);
shutdownConnection();
mConnectionState = STATE_DISCONNECTED;
mProgramming = false;
for (int i = 0; i < mBTListenerBuff.size(); i++) {
mBTListenerBuff.get(i).EC_BTSTATE_CHANGE(mConnectinState);
}
}
}else {
boolean statue = refreshDeviceCache(mBluetoothGatt);
shutdownConnection();
mConnectionState = STATE_DISCONNECTED;
mProgramming = false;
for (int i = 0; i < mBTListenerBuff.size(); i++) {
mBTListenerBuff.get(i).EC_BTSTATE_CHANGE(mConnectionState);
}
}
}
...
```
开启通知:
![图片说明](https://img-ask.csdn.net/upload/202007/02/1593690413_68932.png)
![图片说明](https://img-ask.csdn.net/upload/202007/02/1593690422_771654.png)
问题:
打开通知操作,无响应!!!
最后附上:
使用nrf Connect打印的log
1.Nordic 模块
![图片说明](https://img-ask.csdn.net/upload/202007/02/1593690577_445072.jpg)
2.TI 2540模块
![图片说明](https://img-ask.csdn.net/upload/202007/02/1593690626_872353.jpg)
App应用层尝试清除缓存:
public static boolean refreshDeviceCache(BluetoothGatt mBluetoothGatt) {
if (mBluetoothGatt !=null) {
try {
BluetoothGatt localBluetoothGatt = mBluetoothGatt;
Method localMethod = localBluetoothGatt.getClass().getMethod("refresh",new Class[0]);
if (localMethod !=null) {
boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt,new Object[0])).booleanValue();
return bool;
}
}catch (Exception localException) {
localException.printStackTrace();
Log.d("zwm","An exception occured while refreshing device");
}
}
return false;
}
疑问:
1.此为蓝牙缓存导致的吗?
2.为什么Nordic 模块不受影响?
有点啰嗦,将就看看,不知道有没有 朋友 遇到此问题?