簡體   English   中英

配對失敗

[英]Ble pairing failed

我參與了一個Android應用,該應用執行BLE連接並與我們公司的Bt芯片配對。 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配對成功。 任何幫助將不勝感激。

對於藍牙低功耗設備,查找和配對支持兩種方式

  1. 對於kitkat版本及以下

     startLeScan() 

此方法將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) { } }; 

感謝您的回復。 我嘗試使用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) {

    }
};

還有其他方法可以解決此問題,或者我錯過了什么? 謝謝

如果您已經有一個搜索設備的arrayList( ArrayList<Bluetoothdevice> scannedDevice ),則可以選擇其中之一並創建一個綁定。

scannedDevice.get(position).createBond();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM