zhangwm1219_ 2020-07-02 19:55 采纳率: 0%
浏览 504

Android BLE 连接 TI和 Nordic 模块,兼容性 错误码 0x13(19)

最近有个场景:
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 模块不受影响?

有点啰嗦,将就看看,不知道有没有 朋友 遇到此问题?
  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 手机连接电脑热点显示无ip分配
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大