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