我想使用计时器进行多次写入。 我正在尝试执行以下操作:
当我写作时,我想收到响应(OnWriteSuccess),当我得到它时,我会再写一次。
前十 - 二十次写入是可以的,但在那之后,我每次写入的时间间隔为2到4秒。
boolean envia = true;
public void write() {
Timer myTimer = null;
if (myTimer == null) {
Handler handler = null;
if (handler == null) {
handler = new Handler();
}
myTimer = new Timer();
Handler finalHandler = handler;
myTimer.schedule(new TimerTask() {
@Override
public void run() {
finalHandler.post(new Runnable() {
@Override
public void run() {
if (envia) {
envia = false;
if (buc == 256) {
buc = 0;
}
byte bytesToWrite[] = new byte[20];
for (int x = 0; x < 20; x++) {
bytesToWrite[x] = (byte) buc;
buc++;
}
if (isConnected()) {
connectionObservable
.flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(UUID_1, bytesToWrite))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
bytes -> onWriteSuccess(),
CharacteristicOperationExampleActivity.this::onWriteFailure
);
}
}
}
});
}
}, 200, 300);
private void onWriteSuccess() {
//noinspection ConstantConditions
Snackbar.make(findViewById(R.id.main), "Write success", Snackbar.LENGTH_SHORT).show();
envia = true;
}
答案 0 :(得分:0)
BLE的速度由连接间隔*确定。
Android操作系统通常使用一些非常激进的设置来建立连接,以便花费尽可能少的时间来连接(和发现服务)。
我已经阅读和观察到的是,Android OS在建立连接几秒后协商更轻松的连接间隔以保存能量。这可能是您观察经济放缓的原因。
您可以尝试更改行为的方法是调用RxBleConnection.requestConnectionPriority()
,以触发Android协商不同的连接间隔。如果Android操作系统和外围设备会就新协商的参数达成一致,那么连接速度应该会改变。
不幸的是,BluetoothGattCallback
上没有回调确认协议何时成功(或者即使)成功
*连接间隔-BLE连接针对低能耗进行了优化,实际传输在时间窗口中进行。这些窗口周期性地发生,周期等于连接间隔,因此连接间隔越短,在特定时间范围内可用的传输窗口越多 - 可以进行更多传输。