fix:增加组包时的最大组包超时时间
This commit is contained in:
parent
a20206dfaf
commit
4ab5d77473
@ -1,3 +1,4 @@
|
|||||||
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:audioplayers/audioplayers.dart';
|
import 'package:audioplayers/audioplayers.dart';
|
||||||
@ -22,6 +23,8 @@ class ScpMessageBaseHandle {
|
|||||||
/// 分包缓冲区
|
/// 分包缓冲区
|
||||||
// 存储每个 messageId 对应的分包数据
|
// 存储每个 messageId 对应的分包数据
|
||||||
static Map<int, List<List<int>>> _packetBuffer = {};
|
static Map<int, List<List<int>>> _packetBuffer = {};
|
||||||
|
final Map<int, Timer> _packetTimers = {};
|
||||||
|
final Duration _timeoutDuration = Duration(seconds: 10); // 分包组包最大超时时间
|
||||||
|
|
||||||
// 通话数据流的单例流数据处理类
|
// 通话数据流的单例流数据处理类
|
||||||
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
|
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
|
||||||
@ -74,7 +77,7 @@ class ScpMessageBaseHandle {
|
|||||||
|
|
||||||
/// 处理分包逻辑
|
/// 处理分包逻辑
|
||||||
/// 如果没有收到所有包则返回null
|
/// 如果没有收到所有包则返回null
|
||||||
dynamic handleFragmentedPayload({
|
dynamic handleFragmentedPayload({
|
||||||
required int messageId,
|
required int messageId,
|
||||||
required int spTotal,
|
required int spTotal,
|
||||||
required int spIndex,
|
required int spIndex,
|
||||||
@ -84,6 +87,7 @@ class ScpMessageBaseHandle {
|
|||||||
// 初始化分包列表
|
// 初始化分包列表
|
||||||
if (!_packetBuffer.containsKey(messageId)) {
|
if (!_packetBuffer.containsKey(messageId)) {
|
||||||
_packetBuffer[messageId] = List.filled(spTotal, []);
|
_packetBuffer[messageId] = List.filled(spTotal, []);
|
||||||
|
_startTimer(messageId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查分包索引是否在合法范围内
|
// 检查分包索引是否在合法范围内
|
||||||
@ -102,7 +106,7 @@ class ScpMessageBaseHandle {
|
|||||||
_packetBuffer[messageId]!.expand((packet) => packet).toList();
|
_packetBuffer[messageId]!.expand((packet) => packet).toList();
|
||||||
|
|
||||||
// 清除已重组的分包数据
|
// 清除已重组的分包数据
|
||||||
_packetBuffer.remove(messageId);
|
_clearPacketData(messageId);
|
||||||
|
|
||||||
// 解析完整的 payload
|
// 解析完整的 payload
|
||||||
if (payloadType == PayloadTypeConstant.talkData) {
|
if (payloadType == PayloadTypeConstant.talkData) {
|
||||||
@ -120,4 +124,18 @@ class ScpMessageBaseHandle {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 启动定时器
|
||||||
|
void _startTimer(int messageId) {
|
||||||
|
_packetTimers[messageId]?.cancel();
|
||||||
|
_packetTimers[messageId] = Timer(_timeoutDuration, () {
|
||||||
|
_clearPacketData(messageId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清除分包数据和定时器
|
||||||
|
void _clearPacketData(int messageId) {
|
||||||
|
_packetBuffer.remove(messageId);
|
||||||
|
_packetTimers.remove(messageId)?.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user