fix:调整对讲接听逻辑
This commit is contained in:
parent
4e0fdd6f29
commit
661ba90f08
@ -10,40 +10,28 @@ import '../../start_chart_manage.dart';
|
||||
|
||||
class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
|
||||
|
||||
@override
|
||||
void handleReq(ScpMessage scpMessage) {
|
||||
// TODO: 收到同意接听请求
|
||||
print('收到同意接听请求');
|
||||
// 回复同意接听消息
|
||||
startChartManage.sendGenericRespSuccessMessage(
|
||||
ToPeerId: scpMessage.FromPeerId!,
|
||||
FromPeerId: scpMessage.ToPeerId!,
|
||||
PayloadType: scpMessage.PayloadType!,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
// TODO: 收到同意接听回复
|
||||
// 收到同意接听回复
|
||||
final GenericResp genericResp = scpMessage.Payload;
|
||||
if (checkGenericRespSuccess(genericResp)) {
|
||||
// 同意接听
|
||||
// 回复成功消息
|
||||
startChartManage.sendGenericRespSuccessMessage(
|
||||
ToPeerId: scpMessage.FromPeerId!,
|
||||
FromPeerId: scpMessage.ToPeerId!,
|
||||
PayloadType: scpMessage.PayloadType!,
|
||||
);
|
||||
// 启动通话保持
|
||||
startChartManage.startTalkPingMessageTimer();
|
||||
// 启动通话保持监听定时器
|
||||
talkePingOverTimeTimerManager.startTimer();
|
||||
// 设置通话保持超时后的事件
|
||||
talkePingOverTimeTimerManager.setOnTimeout(() {
|
||||
EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds);
|
||||
});
|
||||
|
||||
// 启动对讲数据监听定时器
|
||||
talkDataOverTimeTimerManager.startTimer();
|
||||
// 设置对讲数据超时后的事件
|
||||
talkDataOverTimeTimerManager.setOnTimeout(() {
|
||||
EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds);
|
||||
});
|
||||
// 启动通话保持定时器
|
||||
_handleStartTalkPing();
|
||||
// 启动通话数据检查的定时器
|
||||
_handleCheckTalkDataTimer();
|
||||
// 启动发送预期数据请求
|
||||
_handleStartSendTalkExpectDataRequest();
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,8 +41,42 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
||||
}
|
||||
|
||||
@override
|
||||
void handleRealTimeData(ScpMessage scpMessage
|
||||
) {
|
||||
void handleRealTimeData(ScpMessage scpMessage) {
|
||||
// TODO: implement handleRealTimeData
|
||||
}
|
||||
|
||||
// 启动通话保持
|
||||
void _handleStartTalkPing() {
|
||||
// 启动通话保持
|
||||
startChartManage.startTalkPingMessageTimer();
|
||||
// 启动通话保持监听定时器(用来判断如果x秒内没有收到通话保持则执行的操作)
|
||||
talkePingOverTimeTimerManager.startTimer();
|
||||
// 设置通话保持超时后的事件
|
||||
talkePingOverTimeTimerManager.setOnTimeout(() {
|
||||
EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds);
|
||||
// 停止发送通话保持的命令
|
||||
startChartManage.stopTalkPingMessageTimer();
|
||||
startChartManage.stopTalkExpectMessageTimer();
|
||||
startChartManage.changeCallingStatus(false);
|
||||
});
|
||||
}
|
||||
|
||||
/// 启动通话数据的检查,判断x秒内是否收到通话数据
|
||||
void _handleCheckTalkDataTimer() {
|
||||
// 启动对讲数据监听定时器
|
||||
talkDataOverTimeTimerManager.startTimer();
|
||||
// 设置对讲数据超时后的事件
|
||||
talkDataOverTimeTimerManager.setOnTimeout(() {
|
||||
EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds);
|
||||
startChartManage.stopTalkPingMessageTimer();
|
||||
startChartManage.stopTalkExpectMessageTimer();
|
||||
startChartManage.changeCallingStatus(false);
|
||||
});
|
||||
}
|
||||
|
||||
/// 启动发送预期数据请求
|
||||
void _handleStartSendTalkExpectDataRequest() {
|
||||
// 启动发送预期数据定时器
|
||||
startChartManage.startTalkExpectTimer();
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,8 +10,6 @@ import '../../start_chart_manage.dart';
|
||||
|
||||
class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
|
||||
|
||||
@override
|
||||
void handleReq(ScpMessage scpMessage) {
|
||||
// TODO: 收到音视频数据请求
|
||||
@ -21,6 +19,8 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
// TODO: 收到音视频数据回复
|
||||
print('收到音视频数据');
|
||||
// 收到数据后调用更新,防止定时器超时
|
||||
talkDataOverTimeTimerManager.receiveMessage();
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -10,8 +10,6 @@ import '../../start_chart_manage.dart';
|
||||
|
||||
class UdpTalkExpectHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
|
||||
|
||||
@override
|
||||
void handleReq(ScpMessage scpMessage) {
|
||||
// TODO: 收到预期音视频数据请求
|
||||
@ -19,7 +17,11 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
|
||||
|
||||
@override
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
// TODO: 收到预期音视频数据回复
|
||||
// 收到预期音视频数据回复
|
||||
final GenericResp genericResp = scpMessage.Payload;
|
||||
if (checkGenericRespSuccess(genericResp)) {
|
||||
print('收到预期数据成功');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -14,14 +14,13 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
|
||||
|
||||
@override
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
// TODO: 收到通话保持回复
|
||||
// 收到通话保持回复
|
||||
final GenericResp genericResp = scpMessage.Payload;
|
||||
if (checkGenericRespSuccess(genericResp)) {
|
||||
// 收到消息
|
||||
// 收到消息,重新触发定时器
|
||||
talkePingOverTimeTimerManager.receiveMessage();
|
||||
// 修改状态
|
||||
startChartManage.changeCallingStatus(true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -10,11 +10,6 @@ import '../../start_chart_manage.dart';
|
||||
|
||||
class UdpTalkRejectHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
@override
|
||||
void handle(ScpMessage scpMessage) {
|
||||
print('收到接听拒绝');
|
||||
}
|
||||
|
||||
@override
|
||||
void handleReq(ScpMessage scpMessage) {
|
||||
// TODO: 收到接听拒绝请求
|
||||
@ -22,7 +17,8 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
|
||||
|
||||
@override
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
// TODO: 收到接听拒绝回复
|
||||
// 收到接听拒绝回复
|
||||
EasyLoading.showToast('对方已经拒绝接听', duration: 2000.milliseconds);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -15,52 +15,24 @@ import '../../start_chart_manage.dart';
|
||||
|
||||
class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
implements ScpMessageHandler {
|
||||
|
||||
|
||||
// 来电事件的处理
|
||||
void _talkRequestEvent() {
|
||||
playRingtone();
|
||||
_showTalkRequestNotification();
|
||||
// 收到呼叫请求,跳转到接听页面
|
||||
Get.toNamed(
|
||||
Routers.lockMonitoringPage,
|
||||
arguments: <String, String>{'lockId': '111'},
|
||||
);
|
||||
}
|
||||
|
||||
// 收到来电请求时进行本地通知
|
||||
Future<void> _showTalkRequestNotification() async {
|
||||
const AndroidNotificationDetails androidPlatformChannelSpecifics =
|
||||
AndroidNotificationDetails('1', 'flutter_channel',
|
||||
importance: Importance.max,
|
||||
priority: Priority.high,
|
||||
playSound: true,
|
||||
ticker: 'ticker');
|
||||
const NotificationDetails platformChannelSpecifics =
|
||||
NotificationDetails(android: androidPlatformChannelSpecifics);
|
||||
// 获取锁名
|
||||
String? getLockName = await Storage.getString(saveLockAlias);
|
||||
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
||||
FlutterLocalNotificationsPlugin();
|
||||
// 执行本地通知
|
||||
await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr,
|
||||
'${'收到来自'.tr}($getLockName)${'锁的呼叫'.tr}。', platformChannelSpecifics,
|
||||
payload: 'item x');
|
||||
}
|
||||
|
||||
@override
|
||||
void handleReq(ScpMessage scpMessage) {
|
||||
// 收到对讲请求
|
||||
print('收到对讲请求:${scpMessage}');
|
||||
final TalkReq talkReq = scpMessage.Payload;
|
||||
// 回复成功消息
|
||||
// 回复收到对讲成功的消息
|
||||
startChartManage.sendGenericRespSuccessMessage(
|
||||
ToPeerId: scpMessage.FromPeerId!,
|
||||
FromPeerId: scpMessage.ToPeerId!,
|
||||
PayloadType: scpMessage.PayloadType!,
|
||||
);
|
||||
startChartManage.FromPeerId = scpMessage.ToPeerId!;
|
||||
startChartManage.ToPeerId = scpMessage.FromPeerId!;
|
||||
// 处理收到接听请求后的事件
|
||||
_talkRequestEvent();
|
||||
// _talkRequestEvent(talkObjectName: talkReq.callerName);
|
||||
|
||||
Future.delayed(Duration(seconds: 1), () {
|
||||
startChartManage.sendTalkAcceptMessage();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@ -81,4 +53,36 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
void handleRealTimeData(ScpMessage scpMessage) {
|
||||
// TODO: implement handleRealTimeData
|
||||
}
|
||||
|
||||
// 来电事件的处理
|
||||
void _talkRequestEvent({required String talkObjectName}) {
|
||||
playRingtone();
|
||||
_showTalkRequestNotification(talkObjectName: talkObjectName);
|
||||
// 收到呼叫请求,跳转到接听页面
|
||||
Get.toNamed(
|
||||
Routers.lockMonitoringPage,
|
||||
arguments: <String, String>{'lockId': '111'},
|
||||
);
|
||||
}
|
||||
|
||||
// 收到来电请求时进行本地通知
|
||||
Future<void> _showTalkRequestNotification(
|
||||
{required String talkObjectName}) async {
|
||||
const AndroidNotificationDetails androidPlatformChannelSpecifics =
|
||||
AndroidNotificationDetails('1', 'flutter_channel',
|
||||
importance: Importance.max,
|
||||
priority: Priority.high,
|
||||
playSound: true,
|
||||
ticker: 'ticker');
|
||||
const NotificationDetails platformChannelSpecifics =
|
||||
NotificationDetails(android: androidPlatformChannelSpecifics);
|
||||
// 获取锁名
|
||||
// String? getLockName = await Storage.getString(saveLockAlias);
|
||||
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
||||
FlutterLocalNotificationsPlugin();
|
||||
// 执行本地通知
|
||||
await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr,
|
||||
'${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}。', platformChannelSpecifics,
|
||||
payload: 'item x');
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,9 +64,16 @@ class StartChartManage {
|
||||
Timer? reStartOnlineStartChartServerTimer; // 重新上线定时器
|
||||
int talkPingIntervalTime = 1; // 发送通话保持消息间隔(s)
|
||||
Timer? talkPingTimer; // 发送通话保持消息定时器
|
||||
int talkExpectIntervalTime = 1; // 发送通话预期数据的消息间隔(s)
|
||||
Timer? talkExpectTimer; // 发送通话预期消息定时器
|
||||
|
||||
// 默认通话的期望数据格式
|
||||
TalkExpect defaultTalkExpect = TalkExpect(
|
||||
videoType: [TalkExpect_VideoTypeE.H264],
|
||||
audioType: [TalkExpect_AudioTypeE.G711],
|
||||
);
|
||||
|
||||
String relayPeerId = ''; // 中继peerId
|
||||
|
||||
bool _calling = false; // 是否处于通话中
|
||||
|
||||
// 星图服务初始化
|
||||
@ -255,14 +262,11 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送期望接受消息
|
||||
void sendTalkExpectMessage() async {
|
||||
void sendTalkExpectMessage({required TalkExpect talkExpect}) async {
|
||||
final message = MessageCommand.talkExpectMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
talkExpect: TalkExpect(
|
||||
videoType: [TalkExpect_VideoTypeE.H264],
|
||||
audioType: [TalkExpect_AudioTypeE.G711],
|
||||
),
|
||||
talkExpect: talkExpect,
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -707,4 +711,30 @@ class StartChartManage {
|
||||
talkPingTimer?.cancel();
|
||||
talkPingTimer = null; // 清除定时器引用
|
||||
}
|
||||
|
||||
/// 通话期望数据定时器
|
||||
void startTalkExpectTimer() {
|
||||
talkExpectTimer ??= Timer.periodic(
|
||||
Duration(
|
||||
seconds: talkExpectIntervalTime,
|
||||
),
|
||||
(Timer timer) {
|
||||
// 发送期望接受消息
|
||||
sendTalkExpectMessage(
|
||||
talkExpect: defaultTalkExpect,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// 停止发送通话期望数据
|
||||
void stopTalkExpectMessageTimer() {
|
||||
talkExpectTimer?.cancel();
|
||||
talkExpectTimer = null; // 清除定时器引用
|
||||
}
|
||||
|
||||
/// 修改预期接收到的数据
|
||||
void changeTalkExpectDataType({required TalkExpect talkExpect}) {
|
||||
defaultTalkExpect = talkExpect;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user