Android BLE - проблемы после соединения с периферией - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время я могу сканировать устройства Bluetooth, найти подходящее периферийное устройство, подключиться к нему и записать характеристику / прочитать ее ответ.Проблемы начинают происходить после того, как я подключился к периферийным устройствам.Что еще хуже, это то, что такое поведение не соответствует тому, когда это происходит.Со временем он столкнется с этой проблемой, но иногда это происходит после первого подключения к периферийному устройству, а иногда после нескольких взаимодействий.Каждый раз, когда я останавливаю и перезапускаю приложение, нажимаю кнопку сканирования, я снова могу найти устройство, подключиться и т. Д.

Одна мысль, которая у меня возникает, - возможно, приложение не полностью отключается, когда происходит повторное сканирование.,Что может быть понятно, почему приложение не может найти периферийные устройства.Однако я не уверен, что еще делать при отключении от периферийных устройств.Я думаю, что проблема со сканированием является признаком другой проблемы, которая возникает.

Вот моя логика отключения :

public void stopService() {
    if (bluetoothGatt != null) {
        Log.d(BLE.TAG, "Closing bluetooth gatt connection...");
        bluetoothGatt.close();
    }

    bluetoothGatt = null;
    Log.d(BLE.TAG, "Updating service status...");
    updateState(BluetoothStatus.NONE);
}

Состояние обновления - это метод, которыйВызывает событие, когда состояние меняется .

Я переопределяю метод onConnectionStateChange :

@RequiresPermission(Manifest.permission.BLUETOOTH)
    @Override
    public void onConnectionStateChange(final BluetoothGatt gatt, int status, final int newState) {
        super.onConnectionStateChange(gatt, status, newState);
        Log.v(BLE.TAG, "onConnectionStateChange: status: " + status + " newState: " + newState);
        if (status != BluetoothGatt.GATT_SUCCESS || newState == BluetoothProfile.STATE_DISCONNECTED) {
            gatt.close();
            stopService();
            updateState(BluetoothStatus.NONE);
        } else {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                gatt.discoverServices();
            } else if (newState == BluetoothProfile.STATE_CONNECTING) {
                updateState(BluetoothStatus.CONNECTING);
            }
        }
    }

Логика сканирования :

final BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

    @RequiresPermission(Manifest.permission.BLUETOOTH)
    @Override
    public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
        List<UUID> uuids = parseUUIDs(scanRecord);
        if(uuids.contains(mConfig.uuid)) {
            if(!foundDeviceAddressList.contains(device.getAddress())) {
                Log.v(TAG, "onLeScan " + device.getName() + " mac address: " + device.getAddress() + " uuids: " + uuids);
                foundDeviceAddressList.add(device.getAddress());
                if (onScanCallback != null && (mConfig.uuid == null || uuids.contains(mConfig.uuid))) {
                    threadManager.runOnMainThread(new Runnable() {
                        @Override
                        public void run() {
                            onScanCallback.onDeviceDiscovered(device, rssi);
                        }
                    });
                }
            }
        }
    }
};

ОБНОВЛЕНИЕ: Таким образом, я смог убедиться, что состояние соединения остается подключенным даже после вызова stopService ().Есть ли способ подтвердить, что состояние соединения было переработано?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...