【发布时间】:2021-03-17 13:57:40
【问题描述】:
所以我有一个 StreamSubscription 可以正确读取从我的设备接收到的数据。
StreamSubscription<List<int>> _rxSubscription;
List<List<int>> _response = new List<List<int>>();
_rxSubscription = _ble.subscribeToCharacteristic(_rx).listen((event) {
_response.add(event);
});
writeToDevice(List<int> command) async {
_rxSubscription.resume();
await _ble.writeCharacteristicWithoutResponse(_tx, value: command);
return _response;
}
以下是设备的响应方式:
I/flutter ( 5506): [[0, 65, 0, 0], [0, 0, 104, 220, 69, 91, 240, 63, 0, 0, 240, 100, 112, 209, 240, 63, 0, 0, 176, 19], [133, 233, 240, 63, 0, 0, 104, 126, 172, 204, 240, 63, 0, 0, 96, 250, 189, 193, 240, 63]]
当执行任何写入操作时,此数据会连续流式传输,并且长度可能会根据“命令”而变化,这意味着可以有 n 个数据包被发回。现在运行该函数后,它返回一个空列表,因为在设备开始响应之前返回了_response。
我正在尝试做的事情:只有在收集了所有数据并且设备停止响应后才返回 _response,即。流停止流式传输。我将如何在飞镖中做到这一点?我不想使用计时器,因为数据可能需要更长或更短的时间。 (目前数据包中没有实现可能指示消息结束的行结束)
【问题讨论】:
-
如果没有任何信息表明消息结束,并且您不想使用超时,那么您如何知道流何时结束?
-
@jamesdlin 我知道,它一直在吞噬我的思想。但有可能,我在 Kotlin 中设备连接库的本机实现中看到了它。我在想是否有办法检查最后一个响应何时到达 + 1 秒,然后将其发送给消费者。这就是他们本地的做法。
-
我已经更新了供应商说明。第一个数据包 [0,65,0,0] 表示将要接收的数据包数量。但是在他们的原生库中,他们没有这样的实现,他们只是等待所有消息到达并使用数据长度来验证是否接收到所有消息。