Android BLE:onCharacteristicRead 仅在第一次有效

Android BLE: onCharacteristicRead works only first time

Gatt 通信仅在第一次使用时有效。
我已经阅读了很多与此相关的问题,但没有解决方案。
整个过程:
1.重启phone
2. 运行 应用
3. 应用程序连接到 BLE 设备并获取可访问的 Wifi 网络列表 (SdkGattAttributes.WIFI_CHAR_WIFI_LIST)
到目前为止一切正常
4. 重启应用程序
5. 应用程序连接到设备并尝试获取 wifi 列表,但从未收到 onCharacteristicRead。没有 writeCharacteristic 优先于此
发送 6. phone 重启后应用程序能够获取 wifi 列表,但同样只能获取一次
有什么问题。释放一些资源还是什么?如果需要,我可以 post 一些代码。
提前致谢。

onCharacteristicWriteRequest 如果需要请不要忘记发送回复:

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

还有一种可能,如果你发送的数据没有立即收到(preparedWrite为true,有特定的offset),你需要在onExecuteWrite数据完全收到后处理,然后发送response。

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

我最终找到了解决方案,所以我post在这里为其他人提供。

问题是在成功连接后设置了 MTU mBluetoothGatt.requestMtu(512) 并且一个接一个地请求服务 mBluetoothGatt.discoverServices() 这可能混淆了 gatt。

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