簡體   English   中英

Android BLE重新連接非常慢

[英]Android BLE reconnection very slow

背景:

我有一個BLE外設有兩種模式:“應用程序”和“引導程序”。 在這兩種模式下,設備都使用相同的MAC地址進行通告。

要從一種模式切換到另一種模式,BLE外設必須自行重啟。 在這樣做時,它必須斷開任何活動的BLE連接。

BLE外設僅在Bootloader模式下保持約5秒鍾。 如果沒有人在該窗口內連接它,它將切換到應用程序模式。

問題:

Android需要很長時間才能重新連接到BLE設備,足夠長,以至於我錯過了5秒窗口。 原始代碼有幾層到BluetoothGATT和BluetoothAdapter層,但調用順序歸結為:

BluetoothGattCharacteristic c = mCharacteristics.get(POWER_STATE_UUID);
c.setValue(SHUTDOWN_VALUE);
mBluetoothGatt.writeCharacteristic(c);
// Signalled by BluetoothGattCallback.onCharacteristicWrite
bleWriteCondition.await();

mBluetoothGatt.disconnect();
// Wait for the underlying layer to confirm we're disconnected
while( mConnectionState != BluetoothProfile.STATE_DISCONNECTED ) {
    // Signalled by BluetoothGattCallback.onConnectionStateChange
    bleStateCondition.await(); 
}
mBluetoothGatt.connect();
while (mConnectionState != BluetoothProfile.STATE_CONNECTED) {
    // Signalled by BluetoothGattCallback.onConnectionStateChange
    bleStateCondition.await();
    if (bleStateCondition.stat != 0) {
        break;
    }
}

我完全是錯誤的做法嗎? 我試過在BluetoothGatt實例上調用close(),然后使用BluetoothDevice.connectGatt生成一個新的實例,但是我得到了同樣非常慢的行為。

我正在測試三星Galaxy S4,API級別21。

這里的問題是gatt connect調用發出后台連接請求。 此調用可能需要相當長的時間才能生成連接。 這里有兩種類型的連接請求的描述: 直接與背景連接

獲得連接的絕對最快方式是進行掃描,並在找到設備時向其發出直接連接請求。 當掃描剛剛找到它時,您知道它就在那里,連接將很快完成。 這比您的示例代碼更復雜,但是在您的小窗口的情況下最有效。 掃描是查找設備最積極的方式。 但是,如果您已有設備對象,則只需在設備上調用直接連接請求即可。

掃描是使用以下代碼發出的:

scanner = bluetoothAdapter.getBluetoothLeScanner();
settings = new ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .build();
filters = new ArrayList<ScanFilter>();
ScanFilter uuidFilter = new ScanFilter.Builder()
            .setServiceUuid(YOUR_SERVICE_UUID).build();
filters.add(uuidFilter);
scanner.startScan(filters, settings, myScanCallback);

找到您的設備(使用掃描回調)后,通過此方法調用發出直接連接請求:

myGatt = myDevice.connectGatt(this, false, myGattCallback);

關鍵部分是false的參數。 如果找不到設備,連接請求將在30秒左右超時。

暫無
暫無

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

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