- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
被 Android 弄糊涂了 BluetoothGattServerCallback#onCharacteristicWriteRequest方法。
对于参数preparedWrite
,我原以为写操作应该由我来负责,回调如何知道我应该在什么时候对消息进行排队?
文档说应用程序必须调用 BluetoothGattServer.sendResponse(BluetoothDevice, int, int, int, byte[]) 来完成请求。
,如果 responseNeeded
是假的?
调用 BluetoothGattServer#sendResponse(BluetoothDevice, int, int, int, byte[])
似乎总是返回请求中的值,无论我将什么设置为 value
。是预期的吗?
最佳答案
preparedWrite
用于支持长写(大于 MTU)。
BluetoothGattServerCallback#onCharacteristicWriteRequest
与 BluetoothGattServerCallback#onExecuteWrite
结合使用以重组对等设备发送的 fragment 数据。回答您的问题:
参数preparedWrite
在接收到传入数据的 fragment 时为真,即数据需要排队直到更多数据到达。 BluetoothGattServerCallback#onExecuteWrite
将在接收到最终 fragment 并且可以完全组装发送的特征值后调用。
如果 responseNeeded
为 false,则不要调用 BluetoothGattServer.sendResponse(BluetoothDevice, int, int, int, byte[])
。
只需发送一个空的值
。
下面是一个onCharacteristicWriteRequest
的例子:
@Override
public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
Log.d("SVC", "BluetoothGattServerCallback.onCharacteristicWriteRequest with " + value.length + " bytes");
if(preparedWrite) {
handleInputFragment(device, characteristic.getUuid(), value);
} else {
handleInputMessage(device, characteristic.getUuid(), value);
}
if(responseNeeded) {
Log.d("SVC", "sending response to write request for characteristic: " + characteristic.getUuid());
if(!gattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, new byte[0])) {
Log.e("SVC", "response to characteristic write request failed");
}
}
}
和onExecuteWrite
@Override
public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
Log.d("SVC", "BluetoothGattServerCallback.onExecuteWrite " + (execute ? "execute" : "cancelled"));
super.onExecuteWrite(device, requestId, execute);
Iterator<InputBuffer> itr = inputBuffers.iterator();
while(itr.hasNext()) {
InputBuffer buf = itr.next();
if(buf.device.equals(device)) {
itr.remove();
if(execute) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
for (byte[] b : buf.bytes) {
os.write(b, 0, b.length);
}
handleInputMessage(device, buf.characteristicUuid, os.toByteArray());
}
}
}
}
InputBuffer机制的实现是这样的
private class InputBuffer {
final BluetoothDevice device;
final UUID characteristicUuid;
final List<byte[]> bytes;
InputBuffer(BluetoothDevice device, UUID characteristicUuid, byte[] value) {
this.device = device;
this.characteristicUuid = characteristicUuid;
this.bytes = new ArrayList<>();
this.bytes.add(value);
}
}
private List<InputBuffer> inputBuffers = new LinkedList<>();
private void handleInputFragment(BluetoothDevice device, UUID characteristicUuid, byte[] value) {
Log.d("SVC", "handling input Fragment");
for(InputBuffer buf : inputBuffers) {
if(buf.device.equals(device)) {
buf.bytes.add(value);
return;
}
}
inputBuffers.add(new InputBuffer(device, characteristicUuid, value));
}
handleInputMessage
的实现是特定于应用程序的。
关于android - 被 BluetoothGattServerCallback#onCharacteristicWriteRequest 搞糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730896/
被 Android 弄糊涂了 BluetoothGattServerCallback#onCharacteristicWriteRequest方法。 对于参数preparedWrite,我原以为写操作
我有一部 Android 手机充当中央设备,另一部 Android 手机充当外围设备。 我正在从 Central 请求读取外围设备的特性,使用 mBluetoothGatt.readCharacter
所以我有一个简单的外设应用程序,我在我的三星 S8 手机上运行的 Android Studio 中编写代码。我可以很好地设置我所有的 BLE 广告和特性,但是当我添加我的服务时。从另一个中央设备(即具
我是一名优秀的程序员,十分优秀!