我对这个问题迷失了方向。
事实是,一个发布字符串值的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()); return; }
使用偏移值。尚无法正常工作,但确实如此。
我不知道该告诉应用程序响应多长时间。
最佳答案
好的,我明白了,所以我会留下我的答复来帮助别人解决我的问题。
正确的解决方案是
@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字节的数组。
如果不是这样,那么我将从回调请求的偏移量开始准备原始数组的一部分,直到获得一些信息为止。因此,如果数组包含大量信息,则不重要,在第二,第三次回调中,我知道从哪里开始返回数据。
抱歉,如果不清楚,但是启用日志记录,您将了解我的意思。
祝大家好运