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