app-starlock/lib/talk/udp/udp_talkClass.dart

227 lines
6.7 KiB
Dart
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'package:audioplayers/audioplayers.dart';
import 'package:fast_gbk/fast_gbk.dart';
import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
import 'package:star_lock/login/login/entity/LoginData.dart';
import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart';
import 'package:star_lock/talk/call/callTalk.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import '../../appRouters.dart';
import '../../app_settings/app_settings.dart';
import '../../tools/storage.dart';
import 'udp_manage.dart';
class UDPTalkClass {
factory UDPTalkClass() => _share();
UDPTalkClass._init();
static UDPTalkClass? _manager;
static UDPTalkClass _share() {
_manager ??= UDPTalkClass._init();
return _manager!;
}
UDPTalkClass get manager => _share();
// var status = 0; //0初始状态 1等待监视 2 3监视中 4呼叫成功 5主角通话中 6被叫通话 8被叫通话中
int status = 0;
var remoteEquid; // 手机号
late Timer talkTimer;
// 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态
bool isBeCall = false;
bool isEndCall = false; //是否已经调用结束对讲
final AudioPlayer audioPlayer = AudioPlayer();
int playLocalAudioSecond = 0;
late Timer playLocalAudioTimer;
beCallW({List<int>? data, String? ip, int? port}) async {
AppLog.log('beCall status:$status');
// if (await isCallMe(data)) {
// return;
// }
if (status == 0) {
// 空闲
// 响铃
// [[Pub getApp] ring];
remoteEquid = getEquidFrombb(data, 9);
status = 6;
// 呼叫应答,呼叫成功
data![7] = 1;
data[8] = 4;
UDPManage().sendData(data);
// 门锁发送视频
data[7] = 1;
data[8] = 5;
UDPManage().sendData(data);
// Get.to(MaterialPageRoute(
// builder: (context) {
// return const LockMonitoringPage();
// },
// fullscreenDialog: true
// ));
if (isBeCall == false) {
isBeCall = true;
// 保持连接
talkTimer = Timer.periodic(1.seconds, (Timer timer) {
data[7] = 1;
data[8] = 9;
UDPManage().sendData(data);
});
Get.toNamed(Routers.lockMonitoringPage, arguments: <String, String>{'lockId': '111'});
}
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
_showNotification(flutterLocalNotificationsPlugin);
playLocalAudio();
if (isEndCall == true) {
AppLog.log('已经结束对讲1');
return;
}
playLocalAudioTimer = Timer.periodic(const Duration(seconds: 1), (Timer timer) {
playLocalAudioSecond++;
// AppLog.log('还在工作么这个定时器$playLocalAudioSecond');
// 检查条件如果达到60秒且未得到应答则认为失败
if (playLocalAudioSecond >= 60) {
timer.cancel(); // 取消定时器
playLocalAudioSecond = 0;
// LockMonitoringLogic().initiateUdpHangUpAction(5);
callNoAnswer(4);
}
});
} else {
// 忙
}
}
//发送本地通知
Future<void> _showNotification(
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) 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);
await flutterLocalNotificationsPlugin.show(
0, '呼叫提醒'.tr, '${'收到来自'.tr}($getLockName)${'锁的呼叫'.tr}', platformChannelSpecifics,
payload: 'item x');
}
// 判断是否是call的本人
Future<bool> isCallMe(List<int>? data) async {
final LoginData? loginData = await Storage.getLoginData();
AppLog.log('getEquidFrombb(data, 1000):${getEquidFrombb(data, 12)}');
if (loginData!.mobile == getEquidFrombb(data, 12)) {
return true;
}
return false;
}
String getEquidFrombb(List<int>? bb, int pos) {
String equid = '';
int equlen = 8;
if (bb![pos] == 77) {
//M
equlen = 8;
} else if (bb[pos] == 87) {
//W
equlen = 5;
} else if (bb[pos] == 72) {
//H
equlen = 12;
} else if (bb[pos] == 83) {
//S
equlen = 12;
} else if (bb[pos] == 0x50) {
//P
equlen = 12;
} else if (bb[pos] == 0x54) {
//T
equlen = 16;
} else {
equlen = 12;
}
List<int> tempbb = bb.sublist(pos, pos + equlen);
equid = gbk.decode(tempbb);
return equid;
}
//播放本地音频
void playLocalAudio() async {
audioPlayer.setReleaseMode(ReleaseMode.loop);
await audioPlayer.play(AssetSource('ring1.mp3'));
}
// 停止播放本地音频
void stopLocalAudio() async {
audioPlayer.setReleaseMode(ReleaseMode.loop);
await audioPlayer.stop();
if (playLocalAudioTimer != null) {
playLocalAudioTimer.cancel();
playLocalAudioSecond = 0;
}
}
//呼叫有响铃无应答处理
void callNoAnswer(int clickIndex) {
if (isEndCall == true) {
// AppLog.log('已经结束对讲2');
return;
}
// AppLog.log('$clickIndex****无应答处理');
stopLocalAudio();
status = 0;
isBeCall = false;
// isEndCall = true;
// LockMonitoringState().isClickHangUp.value = false;
CallTalk().finishAVData();
eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status));
Get.back();
if (talkTimer != null) {
talkTimer.cancel();
}
if (playLocalAudioTimer != null) {
playLocalAudioTimer.cancel();
playLocalAudioSecond = 0;
}
if (LockMonitoringState().oneMinuteTimeTimer != null) {
LockMonitoringState().oneMinuteTimeTimer.cancel();
LockMonitoringState().oneMinuteTime.value = 0;
}
LockMonitoringState().listPhotoData.value = Uint8List(0);
if (LockMonitoringState().answerTimer != null) {
LockMonitoringState().answerTimer.cancel();
LockMonitoringState().answerSeconds.value = 0;
}
if (LockMonitoringState().hangUpTimer != null) {
LockMonitoringState().hangUpTimer.cancel();
LockMonitoringState().hangUpSeconds.value = 0;
}
if (LockMonitoringState().openDoorTimer != null) {
LockMonitoringState().openDoorTimer.cancel();
LockMonitoringState().openDoorSeconds.value = 0;
}
}
}