【问题标题】:Waiting for stream to stop before returning List在返回列表之前等待流停止
【发布时间】: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] 表示将要接收的数据包数量。但是在他们的原生库中,他们没有这样的实现,他们只是等待所有消息到达并使用数据长度来验证是否接收到所有消息。

标签: flutter dart


【解决方案1】:

我正在尝试做的事情:只有在收集了所有数据并且设备停止响应后才返回 _response,即。流停止流式传输。

根据听众的需要,这可以通过使用 Future 来简化。这是广播流吗?

【讨论】:

  • 这不是广播。它监听设备通知。我希望它监听设备响应的所有数据,然后将其存储在 _response 中,然后返回它。我知道它可能是 Future,但我希望接收和存储最终数据,因为需要对其执行许多操作。
  • 另外,您能否解释一下在这种情况下如何做到这一点?
  • 我看到了你的问题。您想消费流,您知道该怎么做,但您想缓存流数据并将其转发给其他消费者?
  • 这就像试图在不使用async 函数的情况下从Future&lt;int&gt; 获取int。数据必须以Stream 的形式使用,没有时间或生命周期可以让您同步读取List&lt;List&lt;int&gt;&gt;Have a look at this answer 您可以尝试使用该语法来消费您的流。
  • 对!但是我只想在流停止时将结果返回给消费者。消费者通过调用函数 (_rxSubscription.resume()) 来启动流,并且还将停止它。调用函数 2-3 秒后数据开始流式传输。
猜你喜欢
  • 2021-12-02
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2014-11-26
相关资源
最近更新 更多