From 0dad04d51cdca9a7638b7d9b37b766412693ae34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CDaisyWu=E2=80=9D?= <“18682150237@163.com”> Date: Tue, 21 Jan 2025 15:12:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AF=B9=E8=AE=B2?= =?UTF-8?q?=E6=94=B6=E5=8F=91=E5=8C=85=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 7 +- .../handle/impl/debug_Info_model.dart | 22 ++++++ .../handle/impl/udp_talk_data_handler.dart | 67 ++++++++++++++++--- lib/talk/startChart/start_chart_manage.dart | 40 ++++++++++- .../views/talkView/talk_view_page.dart | 36 ++++++++++ 5 files changed, 159 insertions(+), 13 deletions(-) create mode 100644 lib/talk/startChart/handle/impl/debug_Info_model.dart diff --git a/lib/main.dart b/lib/main.dart index 3a84ac58..031a9a67 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,11 +7,13 @@ import 'package:flutter/services.dart'; import 'package:flutter_bugly/flutter_bugly.dart'; import 'package:get/get.dart'; import 'package:path/path.dart' as path; +import 'package:provider/provider.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/about/debug/debug_tool.dart'; import 'package:star_lock/network/api_provider.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/start_chart_api.dart'; +import 'package:star_lock/talk/startChart/handle/impl/debug_Info_model.dart'; import 'package:star_lock/talk/startChart/status/appLifecycle_observer.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/device_info_service.dart'; @@ -51,7 +53,10 @@ FutureOr main() async { DeBug.showFloatWidget(); } }); - runApp(MyApp(isLogin: isLogin)); + runApp(MultiProvider(providers: [ + ChangeNotifierProvider(create: (_) => DebugInfoModel()), + ], child: MyApp(isLogin: isLogin))); + // runApp(MyApp(isLogin: isLogin)); }); if (AppPlatform.isAndroid) { diff --git a/lib/talk/startChart/handle/impl/debug_Info_model.dart b/lib/talk/startChart/handle/impl/debug_Info_model.dart new file mode 100644 index 00000000..6d5758ba --- /dev/null +++ b/lib/talk/startChart/handle/impl/debug_Info_model.dart @@ -0,0 +1,22 @@ +import 'package:flutter/foundation.dart'; + +class DebugInfoModel with ChangeNotifier { + int _recvDataRate = 0; + int _recvPacketCount = 0; + int _sendDataRate = 0; + int _sendPacketCount = 0; + + int get recvDataRate => _recvDataRate; + int get recvPacketCount => _recvPacketCount; + int get sendDataRate => _sendDataRate; + int get sendPacketCount => _sendPacketCount; + + void updateDebugInfo(int recvDataRate, int recvPacketCount, int sendDataRate, + int sendPacketCount) { + _recvDataRate = recvDataRate; + _recvPacketCount = recvPacketCount; + _sendDataRate = sendDataRate; + _sendPacketCount = sendPacketCount; + notifyListeners(); + } +} diff --git a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart index a70bc4f7..8b8fcbf3 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart @@ -1,25 +1,71 @@ -import 'dart:convert'; -import 'dart:io'; import 'dart:typed_data'; - -import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:get/get.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:star_lock/app_settings/app_settings.dart'; -import 'package:star_lock/talk/call/g711.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; -import 'package:star_lock/talk/startChart/constant/talk_status.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; -import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart'; -import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pbserver.dart'; import 'package:star_lock/talk/startChart/proto/talk_data_h264_frame.pb.dart'; +// class UdpTalkDataHandler extends ScpMessageBaseHandle +// implements ScpMessageHandler { class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler { + factory UdpTalkDataHandler() { + return _instance; + } + UdpTalkDataHandler._internal(); + static final UdpTalkDataHandler _instance = UdpTalkDataHandler._internal(); + + int _recentRecvDataRate = 0; + int _recentRecvPacketCount = 0; + int _recentSendDataRate = 0; + int _recentSendPacketCount = 0; + + int _lastRecvDataRate = 0; + int _lastRecvPacketCount = 0; + int _lastSendDataRate = 0; + int _lastSendPacketCount = 0; + + void updateRecvDataRate(int dataSize) { + _recentRecvDataRate += dataSize; + _recentRecvPacketCount++; + } + + void updateSendDataRate(int dataSize) { + _recentSendDataRate += dataSize; + _recentSendPacketCount++; + } + + void resetDataRates() { + _lastRecvDataRate = _recentRecvDataRate; + _lastRecvPacketCount = _recentRecvPacketCount; + _lastSendDataRate = _recentSendDataRate; + _lastSendPacketCount = _recentSendPacketCount; + + _recentRecvDataRate = 0; + _recentRecvPacketCount = 0; + _recentSendDataRate = 0; + _recentSendPacketCount = 0; + } + + int getLastRecvDataRate() { + return _lastRecvDataRate; + } + + int getLastRecvPacketCount() { + return _lastRecvPacketCount; + } + + int getLastSendDataRate() { + return _lastSendDataRate; + } + + int getLastSendPacketCount() { + return _lastSendPacketCount; + } + @override void handleReq(ScpMessage scpMessage) {} @@ -33,6 +79,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle void handleRealTimeData(ScpMessage scpMessage) { // 收到数据后调用更新,防止定时器超时 talkDataOverTimeTimerManager.renew(); + if (scpMessage.Payload != null) { final TalkData talkData = scpMessage.Payload; // 处理音视频数据 diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index df512c64..f2ebe79b 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -4,7 +4,9 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:fixnum/fixnum.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:provider/provider.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/flavors.dart'; @@ -24,6 +26,8 @@ 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/star_chart_register_node_entity.dart'; import 'package:star_lock/talk/startChart/exception/start_chart_message_exception.dart'; +import 'package:star_lock/talk/startChart/handle/impl/debug_Info_model.dart'; +import 'package:star_lock/talk/startChart/handle/impl/udp_talk_data_handler.dart'; import 'package:star_lock/talk/startChart/handle/other/do_sign.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'; @@ -211,7 +215,20 @@ class StartChartManage { _udpSocket!.broadcastEnabled = true; /// 设置数据接收回调 - _onReceiveData(_udpSocket!); + _onReceiveData(_udpSocket!, Get.context!); + + // 每秒重置数据速率 + Timer.periodic(Duration(seconds: 1), (Timer t) { + UdpTalkDataHandler().resetDataRates(); + // 更新调试信息 + Provider.of(Get.context!, listen: false) + .updateDebugInfo( + UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB + UdpTalkDataHandler().getLastRecvPacketCount(), + UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB + UdpTalkDataHandler().getLastSendPacketCount(), + ); + }); }).catchError((error) { _log(text: 'Failed to bind UDP socket: $error'); }); @@ -686,6 +703,15 @@ class StartChartManage { '❌Udp send data error----> $result ${message.length}'); // _udpSocket = null; } + UdpTalkDataHandler().updateSendDataRate(message.length); + + // 更新调试信息 + Provider.of(Get.context!, listen: false).updateDebugInfo( + UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB + UdpTalkDataHandler().getLastRecvPacketCount(), + UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB + UdpTalkDataHandler().getLastSendPacketCount(), + ); } // 发送消息 @@ -878,13 +904,23 @@ class StartChartManage { } // 接收返回的数据 - void _onReceiveData(RawDatagramSocket socket) { + void _onReceiveData(RawDatagramSocket socket, BuildContext context) { socket.listen((RawSocketEvent event) { if (event == RawSocketEvent.read) { Datagram? dg = socket.receive(); try { if (dg?.data != null) { final deserialize = ScpMessage.deserialize(dg!.data); + UdpTalkDataHandler().updateRecvDataRate(dg.data.length); + + // 更新调试信息 + Provider.of(context, listen: false).updateDebugInfo( + UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB + UdpTalkDataHandler().getLastRecvPacketCount(), + UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB + UdpTalkDataHandler().getLastSendPacketCount(), + ); + if (deserialize != null) { // 处理返回数据 _handleUdpResultData(deserialize); diff --git a/lib/talk/startChart/views/talkView/talk_view_page.dart b/lib/talk/startChart/views/talkView/talk_view_page.dart index 6d5da3a1..d396ddcb 100644 --- a/lib/talk/startChart/views/talkView/talk_view_page.dart +++ b/lib/talk/startChart/views/talkView/talk_view_page.dart @@ -11,9 +11,12 @@ import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:provider/provider.dart'; import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/startChart/constant/talk_status.dart'; +import 'package:star_lock/talk/startChart/handle/impl/debug_Info_model.dart'; +import 'package:star_lock/talk/startChart/handle/impl/udp_talk_data_handler.dart'; import 'package:star_lock/talk/startChart/views/talkView/talk_view_logic.dart'; import 'package:star_lock/talk/startChart/views/talkView/talk_view_state.dart'; @@ -204,6 +207,38 @@ class _TalkViewPageState extends State ), ) : Container()), + Visibility( + visible: true, + child: Positioned( + top: 20, // 设置在顶部 + left: 20, + right: 20, // 确保调试信息在屏幕宽度内居中 + child: Container( + height: 100, // 设置高度为 100 + color: Colors.black.withOpacity(0.5), // 可选:设置背景颜色和透明度 + padding: const EdgeInsets.all(10), // 可选:设置内边距 + child: Consumer( + builder: (BuildContext context, DebugInfoModel debugInfo, + Widget? child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'recv ${debugInfo.recvDataRate}KB/s [${debugInfo.recvPacketCount}]', + style: const TextStyle( + color: Colors.white), // 设置文本颜色为白色 + ), + Text( + 'send ${debugInfo.sendDataRate}KB/s [${debugInfo.sendPacketCount}]', + style: const TextStyle( + color: Colors.white), // 设置文本颜色为白色 + ), + ], + ); + }, + ), + ), + )), ], ), ), @@ -489,6 +524,7 @@ class _TalkViewPageState extends State state.videoBuffer.clear(); state.listData.value = Uint8List(0); CallTalk().finishAVData(); + UdpTalkDataHandler().resetDataRates(); super.dispose(); } }