feat: 新增对讲收发包调试信息
This commit is contained in:
parent
87f315f79d
commit
0dad04d51c
@ -7,11 +7,13 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_bugly/flutter_bugly.dart';
|
import 'package:flutter_bugly/flutter_bugly.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
import 'package:star_lock/flavors.dart';
|
import 'package:star_lock/flavors.dart';
|
||||||
import 'package:star_lock/mine/about/debug/debug_tool.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_provider.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';
|
||||||
|
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/talk/startChart/status/appLifecycle_observer.dart';
|
||||||
import 'package:star_lock/tools/bugly/bugly_tool.dart';
|
import 'package:star_lock/tools/bugly/bugly_tool.dart';
|
||||||
import 'package:star_lock/tools/device_info_service.dart';
|
import 'package:star_lock/tools/device_info_service.dart';
|
||||||
@ -51,7 +53,10 @@ FutureOr<void> main() async {
|
|||||||
DeBug.showFloatWidget();
|
DeBug.showFloatWidget();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
runApp(MyApp(isLogin: isLogin));
|
runApp(MultiProvider(providers: [
|
||||||
|
ChangeNotifierProvider(create: (_) => DebugInfoModel()),
|
||||||
|
], child: MyApp(isLogin: isLogin)));
|
||||||
|
// runApp(MyApp(isLogin: isLogin));
|
||||||
});
|
});
|
||||||
|
|
||||||
if (AppPlatform.isAndroid) {
|
if (AppPlatform.isAndroid) {
|
||||||
|
|||||||
22
lib/talk/startChart/handle/impl/debug_Info_model.dart
Normal file
22
lib/talk/startChart/handle/impl/debug_Info_model.dart
Normal file
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,25 +1,71 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:typed_data';
|
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/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/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/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_base_handle.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/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.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/talk_data.pbserver.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';
|
import 'package:star_lock/talk/startChart/proto/talk_data_h264_frame.pb.dart';
|
||||||
|
|
||||||
|
// class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||||
|
// implements ScpMessageHandler {
|
||||||
class UdpTalkDataHandler extends ScpMessageBaseHandle
|
class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||||
implements ScpMessageHandler {
|
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
|
@override
|
||||||
void handleReq(ScpMessage scpMessage) {}
|
void handleReq(ScpMessage scpMessage) {}
|
||||||
|
|
||||||
@ -33,6 +79,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
|||||||
void handleRealTimeData(ScpMessage scpMessage) {
|
void handleRealTimeData(ScpMessage scpMessage) {
|
||||||
// 收到数据后调用更新,防止定时器超时
|
// 收到数据后调用更新,防止定时器超时
|
||||||
talkDataOverTimeTimerManager.renew();
|
talkDataOverTimeTimerManager.renew();
|
||||||
|
|
||||||
if (scpMessage.Payload != null) {
|
if (scpMessage.Payload != null) {
|
||||||
final TalkData talkData = scpMessage.Payload;
|
final TalkData talkData = scpMessage.Payload;
|
||||||
// 处理音视频数据
|
// 处理音视频数据
|
||||||
|
|||||||
@ -4,7 +4,9 @@ import 'dart:math';
|
|||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:fixnum/fixnum.dart';
|
import 'package:fixnum/fixnum.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
import 'package:star_lock/appRouters.dart';
|
import 'package:star_lock/appRouters.dart';
|
||||||
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';
|
||||||
@ -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/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/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/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_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_ping_over_time_timer_manager.dart';
|
||||||
@ -211,7 +215,20 @@ class StartChartManage {
|
|||||||
_udpSocket!.broadcastEnabled = true;
|
_udpSocket!.broadcastEnabled = true;
|
||||||
|
|
||||||
/// 设置数据接收回调
|
/// 设置数据接收回调
|
||||||
_onReceiveData(_udpSocket!);
|
_onReceiveData(_udpSocket!, Get.context!);
|
||||||
|
|
||||||
|
// 每秒重置数据速率
|
||||||
|
Timer.periodic(Duration(seconds: 1), (Timer t) {
|
||||||
|
UdpTalkDataHandler().resetDataRates();
|
||||||
|
// 更新调试信息
|
||||||
|
Provider.of<DebugInfoModel>(Get.context!, listen: false)
|
||||||
|
.updateDebugInfo(
|
||||||
|
UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB
|
||||||
|
UdpTalkDataHandler().getLastRecvPacketCount(),
|
||||||
|
UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB
|
||||||
|
UdpTalkDataHandler().getLastSendPacketCount(),
|
||||||
|
);
|
||||||
|
});
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
_log(text: 'Failed to bind UDP socket: $error');
|
_log(text: 'Failed to bind UDP socket: $error');
|
||||||
});
|
});
|
||||||
@ -686,6 +703,15 @@ class StartChartManage {
|
|||||||
'❌Udp send data error----> $result ${message.length}');
|
'❌Udp send data error----> $result ${message.length}');
|
||||||
// _udpSocket = null;
|
// _udpSocket = null;
|
||||||
}
|
}
|
||||||
|
UdpTalkDataHandler().updateSendDataRate(message.length);
|
||||||
|
|
||||||
|
// 更新调试信息
|
||||||
|
Provider.of<DebugInfoModel>(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) {
|
socket.listen((RawSocketEvent event) {
|
||||||
if (event == RawSocketEvent.read) {
|
if (event == RawSocketEvent.read) {
|
||||||
Datagram? dg = socket.receive();
|
Datagram? dg = socket.receive();
|
||||||
try {
|
try {
|
||||||
if (dg?.data != null) {
|
if (dg?.data != null) {
|
||||||
final deserialize = ScpMessage.deserialize(dg!.data);
|
final deserialize = ScpMessage.deserialize(dg!.data);
|
||||||
|
UdpTalkDataHandler().updateRecvDataRate(dg.data.length);
|
||||||
|
|
||||||
|
// 更新调试信息
|
||||||
|
Provider.of<DebugInfoModel>(context, listen: false).updateDebugInfo(
|
||||||
|
UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB
|
||||||
|
UdpTalkDataHandler().getLastRecvPacketCount(),
|
||||||
|
UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB
|
||||||
|
UdpTalkDataHandler().getLastSendPacketCount(),
|
||||||
|
);
|
||||||
|
|
||||||
if (deserialize != null) {
|
if (deserialize != null) {
|
||||||
// 处理返回数据
|
// 处理返回数据
|
||||||
_handleUdpResultData(deserialize);
|
_handleUdpResultData(deserialize);
|
||||||
|
|||||||
@ -11,9 +11,12 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'package:star_lock/talk/call/callTalk.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/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_logic.dart';
|
||||||
import 'package:star_lock/talk/startChart/views/talkView/talk_view_state.dart';
|
import 'package:star_lock/talk/startChart/views/talkView/talk_view_state.dart';
|
||||||
@ -204,6 +207,38 @@ class _TalkViewPageState extends State<TalkViewPage>
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
: Container()),
|
: 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<DebugInfoModel>(
|
||||||
|
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<TalkViewPage>
|
|||||||
state.videoBuffer.clear();
|
state.videoBuffer.clear();
|
||||||
state.listData.value = Uint8List(0);
|
state.listData.value = Uint8List(0);
|
||||||
CallTalk().finishAVData();
|
CallTalk().finishAVData();
|
||||||
|
UdpTalkDataHandler().resetDataRates();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user