gpt4 book ai didi

Android BLE - 外设 | onCharacteristicRead 返回错误值或其中的一部分(但重复)

转载 作者:行者123 更新时间:2023-11-29 15:12:25 28 4
gpt4 key购买 nike

我对这个问题失去了理智。

事实是,一个 android 设备正在通告一个字符串值:“78d89537-4309-4728-87f6-3ab2bbe231d8”(36 字节)。我使用的特征定义为

 anonIdCharacteristic = new BluetoothGattCharacteristic(TippeeBluetoothManager.UUID_READ_CHARACTERISTIC,
BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_BROADCAST,
BluetoothGattCharacteristic.PERMISSION_READ );
anonIdCharacteristic.setValue(idToAdvertise);

如您所见,我是在“阅读”模式下做广告,而不是通知。

当另一个 android 设备连接并尝试读取特征时,调用 onCharacteristicRead 方法但是传递的值是错误的。更具体的是:

“78d89537-4309-4728-87f678d89537-4309-4728-87f678d89537-4309-4728-87f6...”(600 字节)

这是预期值的一部分,但重复了。

如果我将自己置于调试“服务器端”,则可以看到发送的字节数是正确的。在调试“客户端”字节是 600

我做错了什么?

提前致谢

---- 编辑 ---

我找到了更多信息。

onCharacteristicReadRequest 被重复调用,新月偏移导致“脏”缓冲区,现在我以这种方式响应:

if (BluetoothManager.UUID_READ_CHARACTERISTIC.equals(characteristic.getUuid())) { mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, getStoredValue());返回;

使用偏移值。还没有工作,但它的东西。

我想知道是什么告诉应用程序响应需要多长时间..

最佳答案

好的,我明白了,所以我会留下我的回复以帮助其他人遇到我的情况。

正确的解决方法是

@Override
public void onCharacteristicReadRequest(BluetoothDevice device,
int requestId,
int offset,
BluetoothGattCharacteristic characteristic) {
super.onCharacteristicReadRequest(device, requestId, offset, characteristic);
Log.i(TAG, "onCharacteristicReadRequest " + characteristic.getUuid().toString());

byte[] fullValue = getStoredValue();

//check
if (offset > fullValue.length) {
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, new byte[]{0} );
return;

}


int size = fullValue.length - offset;
byte[] response = new byte[size];

for (int i = offset; i < fullValue.length; i++) {
response[i - offset] = fullValue[i];
}



if (MYBluetoothManager.UUID_READ_CHARACTERISTIC.equals(characteristic.getUuid())) {
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, response);
return;
}



mGattServer.sendResponse(device,
requestId,
BluetoothGatt.GATT_FAILURE,
0,
null);
}

};

回调被重复调用并带有偏移量,这一点很清楚。不清楚的是我应该用一个包含从该偏移量开始的所有数据的数组来响应。

所以我开始准备一个包含所有数据的数组。如果请求的偏移量超过了数据的长度,我只返回一个 0 字节的数组。

如果不是这样,我会从回调请求的偏移量开始准备原始数组的一部分,直到我有一些信息。因此,如果数组包含太多信息并不重要,在第二个、第三个回调中我知道从哪里开始返回数据。

抱歉,如果不清楚,但启用日志记录,您就会明白我的意思。

祝大家好运

关于Android BLE - 外设 | onCharacteristicRead 返回错误值或其中的一部分(但重复),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512305/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com