首页 文章

Ble配对失败

提问于
浏览
1

我参与了一个Android APP,它与我们公司的Bt芯片进行BLE连接和配对 . APP作为BLE核心角色,而Bt芯片则作为BLE外设角色 .

当APP在Android 4.4或5.0智能手机上运行时,BLE连接和配对效果很好 . 当APP在Android 5.1或最新版本6.0上运行时,BLE配对由错误代码(错误代码:13)终止,而BLE连接成功 . 这是空中日志:

4,148   0x50654c1d  0x0000  1   LL_VERSION_IND      24      2015/12/3 14:13:39.600368   
4,160   0x50654c1d  0x0001  2   LL_VERSION_IND      24   00:00:00.048473    2015/12/3 14:13:39.648841   
4,163   0x50654c1d  0x0002  1   LL_FEATURE_REQ      27   00:00:00.048522    2015/12/3 14:13:39.697363   
4,169   0x50654c1d  0x0003  2   LL_FEATURE_RSP      27   00:00:00.049066    2015/12/3 14:13:39.746429   
4,179   0x50654c1d  0x0004  1   LL_CONNECTION_UPDATE_REQ    0x000a  30   00:00:00.048436    2015/12/3 14:13:39.794865   
4,234   0x50654c1d  0x000b  1   LL_ENC_REQ      41   00:00:00.303755    2015/12/3 14:13:40.098620   
4,237   0x50654c1d  0x000c  2   LL_ENC_RSP      31   00:00:00.007727    2015/12/3 14:13:40.106347   
4,244   0x50654c1d  0x000d  2   LL_START_ENC_REQ        19   00:00:00.007500    2015/12/3 14:13:40.113847   
4,245   0x50654c1d  0x000e  M   LL_START_ENC_RSP        23   00:00:00.007273    2015/12/3 14:13:40.121120   
4,248   0x50654c1d  0x000f  S   LL_START_ENC_RSP        23   00:00:00.007726    2015/12/3 14:13:40.128846   
4,392   0x50654c1d  0x004a  M   LL_CONNECTION_UPDATE_REQ    0x0050  34   00:00:00.442275    2015/12/3 14:13:40.571121   
4,794   0x50654c1d  0x008c  M   LL_CHANNEL_MAP_REQ  0x0093  30   00:00:03.002545    2015/12/3 14:13:43.573666   
7,168   0x50654c1d  0x0131  M   LL_CHANNEL_MAP_REQ  0x0138  30   00:00:08.043797    2015/12/3 14:13:51.617463   
10,065  0x50654c1d  0x0261  M   LL_CHANNEL_MAP_REQ  0x0268  30   00:00:14.820121    2015/12/3 14:14:06.437584   
10,449  0x50654c1d  0x029d  M   LL_TERMINATE_IND        24   00:00:02.925044    2015/12/3 14:14:09.362628

我的Bt主机程序(基于Bt芯片)收到 CONNECTION_PARAMETER_UPDATE_COMP_IND 事件,然后收到 LE_DEVICE_DISCONNECT_COMP_IND 事件 . 我想断开 BLE 的操作是由Android Bt堆栈完成的 .

在Android 4.4或5.0中,没有收到 CONNECTION_PARAMETER_UPDATE_COMP_IND 事件,那么问题是什么,我怎样才能在Android 5.1或6.0上成功配置BLE . 任何帮助将不胜感激 .

2 回答

  • 2

    对于蓝牙低功耗设备的查找和配对,有两种方式得到支持

    • 对于 kitkat version 及以下
    startLeScan()
    

    此方法将 BluetoothAdapter.LeScanCallback 作为参数

    • 适用于 Lollipop version 及以上
    mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
    
    mBluetoothLeScanner.startScan(filters, settings, mScanCallback);
    

    并且您需要将回调定义为获取响应的流程

    private ScanCallback mScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
    
    }
    
    @Override
    public void onBatchScanResults(List<ScanResult> results) {
    
    }
    
    @Override
    public void onScanFailed(int errorCode) {
    
    }
    };
    
  • 0

    感谢您的回复 . 我尝试使用startScan方法而不是startLeScan,但问题仍然存在 . 这是代码的一部分:

    mBluetoothScanner = mBluetoothAdapter.getBluetoothLeScanner();
        mBluetoothScanner.startScan(mScanCallback);
        private ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            final byte[] scanRecord = result.getScanRecord().getBytes();
            final int rssi = result.getRssi();
            final BluetoothDevice device = result.getDevice();
    
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    //Application analyzes data in received packet.
                    AdvertisingData adData = new AdvertisingData(scanRecord);
                    byte[] adManufacturerData = adData.getAdManufacturerData();
                    if (adManufacturerData.length < 2) {return;}
    
                    byte[] carBrand = Arrays.copyOf(adManufacturerData, adManufacturerData.length - 2);
                    byte[] carModel = Arrays.copyOfRange(adManufacturerData, adManufacturerData.length - 2, adManufacturerData.length);
                    if (!Arrays.equals(carBrand, mManufacturerData)) {return;}
    
                    mScanningFrame.setRssiInfo(rssi);
    
                    if (rssi >= mRssi) {
                        mConnectingFrame.setCarImage(carModel);
                        mConnectedFrame.setCarImage(carModel);
                        mDisconnectedFrame.setCarImage(carModel);
                        try {
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        showFrame(mConnectingFrame);
                        mBleDevice = device;
                        mBluetoothGatt = mBleDevice.connectGatt(getApplicationContext(), false, mGattCallback);
                        mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    }
                }
            });
        }
    
        @Override
        public void onBatchScanResults(List<ScanResult> results) {
    
        }
    
        @Override
        public void onScanFailed(int errorCode) {
    
        }
    };
    

    还有其他方法可以解决这个问题,或者我错过了什么?谢谢

相关问题