Ble pairing failed

2019-06-04 04:57发布

I was involved an Android APP which does BLE connection and pairing with our company Bt chip. The APP is as BLE central role, while the Bt chip is as BLE peripheral role.

When the APP runs on Android 4.4 or 5.0 smart phone, the BLE connection and pairing works well. When the APP runs on Android 5.1 or the latest version 6.0, BLE pairing is terminated by error code (error code: 13), while BLE connection is succeed. Here is the air log:

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

My Bt host program (based on Bt chip) received CONNECTION_PARAMETER_UPDATE_COMP_IND event, and then received LE_DEVICE_DISCONNECT_COMP_IND event. I guess the operation of disconnect BLE is done by Android Bt stack.

In Android 4.4 or 5.0, There is no CONNECTION_PARAMETER_UPDATE_COMP_IND event received, So what's the matter about it, how could I make BLE pairing success on Android 5.1 or 6.0. Any help will be appreciated.

2条回答
欢心
2楼-- · 2019-06-04 05:23

Thanks for your reply. I tried using startScan method instead of startLeScan, but the issue is still exist. Here is part of code:

    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) {

    }
};

There is other way to fix the issue, or I miss something? Thank you

查看更多
闹够了就滚
3楼-- · 2019-06-04 05:29

For Bluetooth low energy devices finding and pairing there is two ways is being supported

  1. For kitkat version and below

    startLeScan() 
    

This method takes a BluetoothAdapter.LeScanCallback as a parameter

  1. For Lollipop version and above

    mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
    
    mBluetoothLeScanner.startScan(filters, settings, mScanCallback);
    

    and you need to define your callback as flow to get response

    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) {
    
    }
    };
    
查看更多
登录 后发表回答