Ble配对失败

时间:2016-01-22 07:40:46

标签: android bluetooth-lowenergy

我参与了一个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。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

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

  1. kitkat版及以下

    startLeScan() 
    
  2. 此方法将 BluetoothAdapter.LeScanCallback 作为参数

    1. 棒棒糖版及以上

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

答案 1 :(得分: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) {

    }
};

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

答案 2 :(得分:0)

如果您已经有了一个搜索设备的arrayList(ArrayList<Bluetoothdevice> scannedDevice),则可以选择其中之一并创建绑定。

scannedDevice.get(position).createBond();