Android BLE: onCharacteristicRead работает только в первый раз - PullRequest
0 голосов
/ 31 октября 2018

Связь Гатта работает только при первом использовании.
Я прочитал много вопросов, связанных с этим, но решение не помогло.
Весь процесс:
1. Перезагрузите телефон
2. Запустите приложение
3. Приложение подключается к устройству BLE и получает список доступных сетей Wifi (SdkGattAttributes.WIFI_CHAR_WIFI_LIST)
до сих пор все ок
4. перезапустите приложение
5. Приложение подключается к устройству и пытается получить список Wi-Fi, но onCharacteristicRead никогда не принимается. Нет writeCharacteristic было отправлено до этого
6. После перезагрузки телефона приложение может получить список Wi-Fi, но снова только один раз
Что может быть не так. Некоторые ресурсы освобождаются или как? Я могу опубликовать код, если это необходимо.
Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

В конце концов я нашел решение, поэтому выкладываю его здесь для других.

Проблема заключалась в том, что после успешного подключения MTU был установлен mBluetoothGatt.requestMtu(512), а службы запрашивались mBluetoothGatt.discoverServices() одна за другой, что, вероятно, приводило к путанице.

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        mBluetoothGatt.discoverServices();
        mBluetoothGatt.requestMtu(512);
    }
}

Решение: первый запрос mtu и когда финшн откроет услуги

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (newState == BluetoothProfile.STATE_CONNECTED) {
        mBluetoothGatt.requestMtu(512);
    }
}
public void onMtuChanged (BluetoothGatt gatt, int mtu, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        mBluetoothGatt.discoverServices();
    }
}
0 голосов
/ 01 ноября 2018

В onCharacteristicWriteRequest не забудьте при необходимости отправить ответ:

if (responseNeeded) {
            bluetoothGattServer?.sendResponse(device,
                    requestId,
                    BluetoothGatt.GATT_SUCCESS,
                    offset,
                    value)
        }

Еще одна возможность, если отправленные вами данные не получены сразу (подготовлено с истинным значением с определенным смещением), вам нужно обработать их на onExecuteWrite, когда данные получены полностью и отправить ответ.

bluetoothGattServer?.sendResponse(device,
                requestId,
                BluetoothGatt.GATT_SUCCESS,
                0,
                ByteArray(0))
...