fix:调整挂断后的逻辑、增加账号未登录时不初始化星图逻辑、增加修改预期接收数据方法
This commit is contained in:
parent
13e3839d67
commit
25bbd0cd19
@ -9,6 +9,7 @@ import 'package:get/get.dart';
|
|||||||
import 'package:pointycastle/export.dart' as pc;
|
import 'package:pointycastle/export.dart' as pc;
|
||||||
import 'package:star_lock/app_settings/app_settings.dart';
|
import 'package:star_lock/app_settings/app_settings.dart';
|
||||||
import 'package:star_lock/flavors.dart';
|
import 'package:star_lock/flavors.dart';
|
||||||
|
import 'package:star_lock/login/login/entity/LoginData.dart';
|
||||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||||
import 'package:star_lock/network/api_repository.dart';
|
import 'package:star_lock/network/api_repository.dart';
|
||||||
import 'package:star_lock/network/start_chart_api.dart';
|
import 'package:star_lock/network/start_chart_api.dart';
|
||||||
@ -24,6 +25,9 @@ import 'package:star_lock/talk/startChart/entity/report_information_data.dart';
|
|||||||
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
||||||
import 'package:star_lock/talk/startChart/entity/star_chart_register_node_entity.dart';
|
import 'package:star_lock/talk/startChart/entity/star_chart_register_node_entity.dart';
|
||||||
import 'package:star_lock/talk/startChart/exception/start_chart_message_exception.dart';
|
import 'package:star_lock/talk/startChart/exception/start_chart_message_exception.dart';
|
||||||
|
import 'package:star_lock/talk/startChart/handle/other/talke_data_over_time_timer_manager.dart';
|
||||||
|
import 'package:star_lock/talk/startChart/handle/other/talke_ping_over_time_timer_manager.dart';
|
||||||
|
import 'package:star_lock/talk/startChart/handle/other/talke_request_over_time_timer_manager.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
|
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart';
|
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
|
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
|
||||||
@ -44,6 +48,12 @@ class StartChartManage {
|
|||||||
|
|
||||||
// 单例对象
|
// 单例对象
|
||||||
static final StartChartManage _instance = StartChartManage._internal();
|
static final StartChartManage _instance = StartChartManage._internal();
|
||||||
|
final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager =
|
||||||
|
TalkeRequestOverTimeTimerManager();
|
||||||
|
final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager =
|
||||||
|
TalkePingOverTimeTimerManager();
|
||||||
|
final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager =
|
||||||
|
TalkDataOverTimeTimerManager();
|
||||||
|
|
||||||
// 工厂构造函数,返回单例对象
|
// 工厂构造函数,返回单例对象
|
||||||
factory StartChartManage() {
|
factory StartChartManage() {
|
||||||
@ -80,6 +90,7 @@ class StartChartManage {
|
|||||||
Timer? talkPingTimer; // 发送通话保持消息定时器
|
Timer? talkPingTimer; // 发送通话保持消息定时器
|
||||||
int talkExpectIntervalTime = 1; // 发送通话预期数据的消息间隔(s)
|
int talkExpectIntervalTime = 1; // 发送通话预期数据的消息间隔(s)
|
||||||
Timer? talkExpectTimer; // 发送通话预期消息定时器
|
Timer? talkExpectTimer; // 发送通话预期消息定时器
|
||||||
|
Timer? talkAcceptTimer; // 重发同意接听消息定时器
|
||||||
int talkDataIntervalTime = 10; // 通话数据的消息间隔(ms)
|
int talkDataIntervalTime = 10; // 通话数据的消息间隔(ms)
|
||||||
Timer? talkDataTimer; // 发送通话数据消息定时器
|
Timer? talkDataTimer; // 发送通话数据消息定时器
|
||||||
|
|
||||||
@ -101,12 +112,15 @@ class StartChartManage {
|
|||||||
|
|
||||||
// 星图服务初始化
|
// 星图服务初始化
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
if (isOnlineStartChartServer && _udpSocket != null) {
|
// 判断是否登录账户
|
||||||
|
final loginData = await Storage.getLoginData();
|
||||||
|
|
||||||
|
if ((isOnlineStartChartServer && _udpSocket != null) || loginData == null) {
|
||||||
// 如果已经上线就不进行初始化
|
// 如果已经上线就不进行初始化
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 节点注册
|
// 节点注册
|
||||||
await _clientRegister();
|
await _clientRegister(loginData);
|
||||||
// 中继查询
|
// 中继查询
|
||||||
await _relayQuery();
|
await _relayQuery();
|
||||||
// 初始化udp服务
|
// 初始化udp服务
|
||||||
@ -116,12 +130,10 @@ class StartChartManage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 客户端注册
|
/// 客户端注册
|
||||||
Future<void> _clientRegister() async {
|
Future<void> _clientRegister(LoginData? loginData) async {
|
||||||
final StarChartRegisterNodeEntity? registerNodeEntity =
|
if (loginData?.starchart?.starchartId != null) {
|
||||||
await Storage.getStarChartRegisterNodeInfo();
|
_log(text: '获取到星图注册节点信息:${loginData?.starchart}');
|
||||||
if (registerNodeEntity != null && registerNodeEntity.peer?.id != null) {
|
FromPeerId = loginData?.starchart?.starchartId ?? '';
|
||||||
_log(text: '获取到星图注册节点信息:$registerNodeEntity');
|
|
||||||
FromPeerId = registerNodeEntity.peer!.id ?? '';
|
|
||||||
} else {
|
} else {
|
||||||
_log(text: '开始注册客户端');
|
_log(text: '开始注册客户端');
|
||||||
final StarChartRegisterNodeEntity requestStarChartRegisterNode =
|
final StarChartRegisterNodeEntity requestStarChartRegisterNode =
|
||||||
@ -143,6 +155,8 @@ class StartChartManage {
|
|||||||
starchartPeerPublicKey: registerNodeEntity?.peer?.publicKey ?? '',
|
starchartPeerPublicKey: registerNodeEntity?.peer?.publicKey ?? '',
|
||||||
starchartPeerPrivateKey: registerNodeEntity?.peer?.privateKey ?? '',
|
starchartPeerPrivateKey: registerNodeEntity?.peer?.privateKey ?? '',
|
||||||
);
|
);
|
||||||
|
registerNodeEntity?.peer?.id = entity.data?.starchart?.starchartId;
|
||||||
|
await Storage.saveStarChartRegisterNodeInfo(registerNodeEntity!);
|
||||||
if (entity.errorCode!.codeIsSuccessful) {
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
AppLog.log('绑定成功');
|
AppLog.log('绑定成功');
|
||||||
} else {
|
} else {
|
||||||
@ -237,7 +251,7 @@ class StartChartManage {
|
|||||||
|
|
||||||
// 发送对讲请求消息
|
// 发送对讲请求消息
|
||||||
Future<void> sendCallRequestMessage({required String ToPeerId}) async {
|
Future<void> sendCallRequestMessage({required String ToPeerId}) async {
|
||||||
if (talkStatus.status == TalkStatus.duringCall) {
|
if (talkStatus.status == TalkStatus.answeredSuccessfully) {
|
||||||
_log(text: '已经在通话中,请勿重复发送对讲请求');
|
_log(text: '已经在通话中,请勿重复发送对讲请求');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -364,23 +378,13 @@ class StartChartManage {
|
|||||||
|
|
||||||
// 发送同意接听消息
|
// 发送同意接听消息
|
||||||
void sendTalkAcceptMessage() async {
|
void sendTalkAcceptMessage() async {
|
||||||
if (talkStatus.status == TalkStatus.duringCall) {
|
|
||||||
_log(text: '已经在通话中,请勿重复发送同意接听消息');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (talkStatus.status != TalkStatus.waitingAnswer) {
|
|
||||||
_log(text: '当前未处于等待接听状态, 无法发送同意接听消息');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final message = MessageCommand.talkAcceptMessage(
|
final message = MessageCommand.talkAcceptMessage(
|
||||||
ToPeerId: ToPeerId,
|
ToPeerId: ToPeerId,
|
||||||
FromPeerId: FromPeerId,
|
FromPeerId: FromPeerId,
|
||||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||||
);
|
);
|
||||||
await _sendMessage(message: message);
|
await _sendMessage(message: message);
|
||||||
// 设置状态为等待接听
|
stopTalkExpectMessageTimer();
|
||||||
talkStatus.setWaitingAnswer();
|
|
||||||
// _log(text: '发送同意接听消息');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送拒绝接听消息
|
// 发送拒绝接听消息
|
||||||
@ -400,6 +404,11 @@ class StartChartManage {
|
|||||||
StartChartTalkStatus.instance.setRejected();
|
StartChartTalkStatus.instance.setRejected();
|
||||||
// 停止播放铃声
|
// 停止播放铃声
|
||||||
AudioPlayerManager().stopRingtone();
|
AudioPlayerManager().stopRingtone();
|
||||||
|
// 停止发送通话保持消息、通话预期数据请求
|
||||||
|
stopTalkExpectMessageTimer();
|
||||||
|
stopTalkPingMessageTimer();
|
||||||
|
// 取消定时器
|
||||||
|
talkePingOverTimeTimerManager.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送期望接受消息
|
// 发送期望接受消息
|
||||||
@ -456,7 +465,7 @@ class StartChartManage {
|
|||||||
|
|
||||||
// 发送通话中挂断消息
|
// 发送通话中挂断消息
|
||||||
Future<void> sendTalkHangupMessage() async {
|
Future<void> sendTalkHangupMessage() async {
|
||||||
if (talkStatus.status != TalkStatus.duringCall) {
|
if (talkStatus.status != TalkStatus.answeredSuccessfully) {
|
||||||
_log(text: '当前未处于接听状态, 无法发送通话中挂断消息');
|
_log(text: '当前未处于接听状态, 无法发送通话中挂断消息');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -471,6 +480,11 @@ class StartChartManage {
|
|||||||
StartChartTalkStatus.instance.setHangingUpDuring();
|
StartChartTalkStatus.instance.setHangingUpDuring();
|
||||||
// 停止播放铃声
|
// 停止播放铃声
|
||||||
AudioPlayerManager().stopRingtone();
|
AudioPlayerManager().stopRingtone();
|
||||||
|
// 停止发送通话保持消息、通话预期数据请求
|
||||||
|
stopTalkExpectMessageTimer();
|
||||||
|
stopTalkPingMessageTimer();
|
||||||
|
// 取消定时器
|
||||||
|
talkePingOverTimeTimerManager.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重新上线
|
// 重新上线
|
||||||
@ -799,17 +813,21 @@ class StartChartManage {
|
|||||||
/// 获取公钥
|
/// 获取公钥
|
||||||
Future<String> getPublicKey() async {
|
Future<String> getPublicKey() async {
|
||||||
// 从缓存中获取星图注册节点信息
|
// 从缓存中获取星图注册节点信息
|
||||||
final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
|
// final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
|
||||||
await Storage.getStarChartRegisterNodeInfo();
|
// await Storage.getStarChartRegisterNodeInfo();
|
||||||
return starChartRegisterNodeInfo?.peer?.publicKey ?? '';
|
// return starChartRegisterNodeInfo?.peer?.publicKey ?? '';
|
||||||
|
final loginData = await Storage.getLoginData();
|
||||||
|
return loginData?.starchart?.starchartPeerPublicKey ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 获取私钥
|
/// 获取私钥
|
||||||
Future<String> getPrivateKey() async {
|
Future<String> getPrivateKey() async {
|
||||||
// 从缓存中获取星图注册节点信息
|
// 从缓存中获取星图注册节点信息
|
||||||
final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
|
// final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
|
||||||
await Storage.getStarChartRegisterNodeInfo();
|
// await Storage.getStarChartRegisterNodeInfo();
|
||||||
return starChartRegisterNodeInfo?.peer?.privateKey ?? '';
|
// return starChartRegisterNodeInfo?.peer?.privateKey ?? '';
|
||||||
|
final loginData = await Storage.getLoginData();
|
||||||
|
return loginData?.starchart?.starchartPeerPrivateKey ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 接收返回的数据
|
// 接收返回的数据
|
||||||
@ -895,6 +913,23 @@ class StartChartManage {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 通话期望数据定时器
|
||||||
|
void startTalkAcceptTimer() {
|
||||||
|
talkAcceptTimer ??= Timer.periodic(
|
||||||
|
Duration(
|
||||||
|
seconds: talkExpectIntervalTime,
|
||||||
|
),
|
||||||
|
(Timer timer) {
|
||||||
|
sendTalkAcceptMessage();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopTalkAcceptTimer() {
|
||||||
|
talkAcceptTimer?.cancel();
|
||||||
|
talkAcceptTimer = null; // 清除定时器引用
|
||||||
|
}
|
||||||
|
|
||||||
/// 通话数据定时器
|
/// 通话数据定时器
|
||||||
void startTalkDataTimer() async {
|
void startTalkDataTimer() async {
|
||||||
// 如果已经启动了就不运行
|
// 如果已经启动了就不运行
|
||||||
@ -1010,22 +1045,44 @@ class StartChartManage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 修改预期接收到的数据
|
/// 修改预期接收到的数据
|
||||||
void changeTalkExpectDataType({required TalkExpectReq talkExpect}) {
|
void changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||||
|
{required TalkExpectReq talkExpect}) {
|
||||||
_defaultTalkExpect = talkExpect;
|
_defaultTalkExpect = talkExpect;
|
||||||
reStartTalkExpectMessageTimer();
|
reStartTalkExpectMessageTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 修改预期接收到的数据
|
||||||
|
void sendOnlyImageVideoTalkExpectData() {
|
||||||
|
final talkExpectReq = TalkExpectReq(
|
||||||
|
videoType: [VideoTypeE.IMAGE],
|
||||||
|
audioType: [],
|
||||||
|
);
|
||||||
|
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||||
|
talkExpect: talkExpectReq);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// 修改预期接收到的数据
|
||||||
|
void sendImageVideoAndG711AudioTalkExpectData() {
|
||||||
|
final talkExpectReq = TalkExpectReq(
|
||||||
|
videoType: [VideoTypeE.IMAGE],
|
||||||
|
audioType: [AudioTypeE.G711],
|
||||||
|
);
|
||||||
|
changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer(
|
||||||
|
talkExpect: talkExpectReq);
|
||||||
|
}
|
||||||
|
|
||||||
/// 销毁资源
|
/// 销毁资源
|
||||||
void destruction() async {
|
void destruction() async {
|
||||||
isOnlineStartChartServer = false;
|
isOnlineStartChartServer = false;
|
||||||
|
stopHeartbeat();
|
||||||
stopTalkExpectMessageTimer();
|
stopTalkExpectMessageTimer();
|
||||||
stopTalkPingMessageTimer();
|
stopTalkPingMessageTimer();
|
||||||
stopHeartbeat();
|
|
||||||
stopReStartOnlineStartChartServer();
|
stopReStartOnlineStartChartServer();
|
||||||
stopTalkDataTimer();
|
stopTalkDataTimer();
|
||||||
_resetData();
|
_resetData();
|
||||||
// await Storage.removerRelayInfo();
|
await Storage.removerRelayInfo();
|
||||||
// await Storage.removerStarChartRegisterNodeInfo();
|
await Storage.removerStarChartRegisterNodeInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _resetData() {
|
void _resetData() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user