Android BLE:onCharacteristicRead仅在第一次使用

时间:2018-10-31 14:13:18

标签: android bluetooth bluetooth-lowenergy gatt android-6.0.1-marshmallow

Gatt通信仅在第一次使用时起作用。
我已经阅读了很多与此相关的问题,但是没有解决方案。
整个过程:
1.重新启动手机
2.运行应用程序
3.应用程序连接到BLE设备并获取可访问的Wifi网络列表(SdkGattAttributes.WIFI_CHAR_WIFI_LIST)
到现在为止一切都很好
4.重新启动应用程序
5.应用程序连接到设备并尝试获取wifi列表,但从未收到onCharacteristicRead。没有writeCharacteristic被发送给此人
6.手机重启后,应用程序能够获取wifi列表,但只能获取一次
有什么不对的地方。释放一些资源还是什么?如果需要,我可以发布一些代码。
预先感谢。

2 个答案:

答案 0 :(得分:1)

我最终找到了解决方案,所以我将其发布在这里。

问题在于,成功建立连接后,mBluetoothGatt.requestMtu(512)设置了MTU,并且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();
    }
}

答案 1 :(得分:0)

onCharacteristicWriteRequest中,请不要忘记发送响应:

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

另一种可能是,如果一次没有收到发送的数据(preparedWrite是正确的,带有特定偏移量),则在完全接收到数据并发送响应后,需要在onExecuteWrite上对其进行处理。

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