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? 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: {'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 _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 isCallMe(List? 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? 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 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; } } }