fix:调整udp返回数据为工厂模式处理

This commit is contained in:
liyi 2024-12-04 10:52:05 +08:00
parent 5054f2a68a
commit 857f9fad2a
14 changed files with 324 additions and 225 deletions

View File

@ -36,6 +36,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
AppFirstEnterHandle().getAppFirstEnter(isAgreePrivacy); AppFirstEnterHandle().getAppFirstEnter(isAgreePrivacy);
}); });
StartChartManage().init();
} }
@override @override
@ -233,12 +234,6 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
} }
} }
: null)), : null)),
SubmitBtn(
btnName: '初始化星图服务',
onClick: () async {
await StartChartManage().init();
},
),
SubmitBtn( SubmitBtn(
btnName: '发送回声测试消息', btnName: '发送回声测试消息',
onClick: () { onClick: () {
@ -251,7 +246,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
onClick: () { onClick: () {
StartChartManage().sendGatewayResetMessage( StartChartManage().sendGatewayResetMessage(
ToPeerId: '3phX8Ng2cZHz5NtP8xAf6nYy2z1BYytoejgjoHrWMGhH', ToPeerId: '3phX8Ng2cZHz5NtP8xAf6nYy2z1BYytoejgjoHrWMGhH',
gatewayId: 1, gatewayId: 1000000000,
); );
}, },
), ),

View File

@ -79,11 +79,13 @@ class MessageCommand {
required String ToPeerId, required String ToPeerId,
required int time, required int time,
}) { }) {
//
final gatewayResetReq = GatewayResetReq( final gatewayResetReq = GatewayResetReq(
iD: gatewayId, iD: gatewayId,
time: time, time: time,
); );
final payloadLength = gatewayResetReq.writeToBuffer().length; //
final payload = gatewayResetReq.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
@ -92,9 +94,9 @@ class MessageCommand {
SpIndex: 0, SpIndex: 0,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: gatewayResetReq, Payload: payload,
PayloadCRC: 55230, PayloadCRC: 55230,
PayloadLength: payloadLength, PayloadLength: payload.length,
PayloadType: PayloadTypeConstant.gatewayReset, PayloadType: PayloadTypeConstant.gatewayReset,
); );
String serializedBytesString = message.serialize(); String serializedBytesString = message.serialize();

View File

@ -0,0 +1,5 @@
class UdpConstant{
// generic成功响应
static const int genericRespSuccessCode = 0;
static const String genericRespSuccessMsg = 'ok';
}

View File

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:crc32_checksum/crc32_checksum.dart'; import 'package:crc32_checksum/crc32_checksum.dart';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart'; import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
@ -140,6 +141,9 @@ class ScpMessage {
// Payload () // Payload ()
if (Payload != null && Payload is String) { if (Payload != null && Payload is String) {
bytes.addAll(utf8.encode(Payload!)); bytes.addAll(utf8.encode(Payload!));
} else {
//
bytes.addAll(Payload);
} }
// 16 // 16
@ -277,65 +281,76 @@ class ScpMessage {
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
}) { }) {
switch (payloadType) { try {
case PayloadTypeConstant.goOnline: switch (payloadType) {
// 线 case PayloadTypeConstant.goOnline:
LoginResponse loginResp = LoginResponse.fromBytes(byte); // 线
return loginResp; LoginResponse loginResp = LoginResponse.fromBytes(byte);
case PayloadTypeConstant.heartbeat: return loginResp;
// case PayloadTypeConstant.heartbeat:
HeartbeatResponse heartbeatResponse = HeartbeatResponse.fromBytes(byte); //
return heartbeatResponse; HeartbeatResponse heartbeatResponse =
case PayloadTypeConstant.echoTest: HeartbeatResponse.fromBytes(byte);
// return heartbeatResponse;
String payload = utf8.decode(byte); case PayloadTypeConstant.echoTest:
return payload; //
case PayloadTypeConstant.gatewayReset: String payload = utf8.decode(byte);
// return payload;
final GatewayResetResp gatewayResetResp = case PayloadTypeConstant.gatewayReset:
GatewayResetResp.fromBuffer(byte); //
return gatewayResetResp; final GatewayResetResp gatewayResetResp =
case PayloadTypeConstant.callRequest: GatewayResetResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return gatewayResetResp;
return genericResp; case PayloadTypeConstant.callRequest:
case PayloadTypeConstant.talkAccept: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkAccept:
case PayloadTypeConstant.gatewayTransfer: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.gatewayTransfer:
case PayloadTypeConstant.blePassthrough: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final BleResp bleResp = BleResp.fromBuffer(byte); return genericResp;
return bleResp; case PayloadTypeConstant.blePassthrough:
case PayloadTypeConstant.remoteUnlock: final BleResp bleResp = BleResp.fromBuffer(byte);
final RemoteUnlockResp remoteUnlockResp = return bleResp;
RemoteUnlockResp.fromBuffer(byte); case PayloadTypeConstant.remoteUnlock:
return remoteUnlockResp; final RemoteUnlockResp remoteUnlockResp =
case PayloadTypeConstant.talkReceiverTransfer: RemoteUnlockResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return remoteUnlockResp;
return genericResp; case PayloadTypeConstant.talkReceiverTransfer:
case PayloadTypeConstant.talkPush: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkPush:
case PayloadTypeConstant.talkReject: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkReject:
case PayloadTypeConstant.talkPing: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkPing:
case PayloadTypeConstant.talkExpect: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkExpect:
case PayloadTypeConstant.talkData: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkData:
case PayloadTypeConstant.talkHangup: final GenericResp genericResp = GenericResp.fromBuffer(byte);
final GenericResp genericResp = GenericResp.fromBuffer(byte); return genericResp;
return genericResp; case PayloadTypeConstant.talkHangup:
default: final GenericResp genericResp = GenericResp.fromBuffer(byte);
print('❌未知的payloadType类型,按照字符串解析'); return genericResp;
String payload = utf8.decode(byte); default:
return payload; print('❌未知的payloadType类型,按照字符串解析');
String payload = utf8.decode(byte);
return payload;
}
} catch (e) {
_log(text: '❌反序列化udp数据时遇到错误----》$e');
String payload = utf8.decode(byte);
return payload;
} }
} }
static void _log({required String text}) {
AppLog.log('=====${text}');
}
} }

View File

@ -0,0 +1,24 @@
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.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 '../../start_chart_manage.dart';
class UdpCallRequestHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
@override
void handle(ScpMessage scpMessage) {
final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) {
// TODO
Get.toNamed(
Routers.lockMonitoringPage,
arguments: <String, String>{'lockId': '111'},
);
}
}
}

View File

@ -0,0 +1,14 @@
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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 '../../start_chart_manage.dart';
class UdpEchoTestHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
@override
void handle(ScpMessage scpMessage) {
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
}
}

View File

@ -0,0 +1,19 @@
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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 '../../start_chart_manage.dart';
class UdpGateWayResetHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
@override
void handle(ScpMessage scpMessage) {
final GatewayResetResp gatewayResetResp = scpMessage.Payload;
final status = gatewayResetResp.status;
if (status != null && status == GatewayResetResp_StatusE.OK) {
// TODO
}
}
}

View File

@ -0,0 +1,27 @@
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/login_response.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 '../../start_chart_manage.dart';
class UdpGoOnlineHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handle(ScpMessage scpMessage) {
final startChartManage = StartChartManage();
final LoginResponse loginResponse = scpMessage.Payload;
final responseType = loginResponse.responseType;
if (responseType != null &&
responseType == PayloadTypeConstant.loginSuccessResponse) {
startChartManage.isOnlineStartChartServer = true;
// 线
startChartManage.stopReStartOnlineStartChartServer();
log(text: '星图登录成功');
} else {
// 线
startChartManage.reStartOnlineStartChartServer();
}
}
}

View File

@ -0,0 +1,26 @@
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
import 'package:star_lock/talk/startChart/entity/login_response.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 '../../start_chart_manage.dart';
class UdpHeartBeatHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
@override
void handle(ScpMessage scpMessage) {
final startChartManage = StartChartManage();
final HeartbeatResponse heartbeatResponse = scpMessage.Payload;
final statusCode = heartbeatResponse.statusCode;
if (statusCode != null &&
statusCode != PayloadTypeConstant.heartHeatSuccessResponse) {
// 线
startChartManage.reStartOnlineStartChartServer();
}
startChartManage.heartbeatIntervalTime =
heartbeatResponse.nextPingTime ?? 1;
//
startChartManage.reStartHeartBeat();
}
}

View File

@ -0,0 +1,11 @@
import 'package:star_lock/app_settings/app_settings.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';
class UnKnowPayloadTypeHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
@override
void handle(ScpMessage scpMessage) {
AppLog.log('❌未知的payloadType类型');
}
}

View File

@ -0,0 +1,17 @@
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/constant/udp_constant.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
class ScpMessageBaseHandle {
bool checkGenericRespSuccess(GenericResp genericResp) {
if (genericResp == null) return false;
final code = genericResp.code;
final message = genericResp.message;
return code == UdpConstant.genericRespSuccessCode &&
message == UdpConstant.genericRespSuccessMsg;
}
void log({required String text}) {
AppLog.log('==========${text}');
}
}

View File

@ -0,0 +1,5 @@
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
abstract class ScpMessageHandler {
void handle(ScpMessage scpMessage);
}

View File

@ -0,0 +1,27 @@
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/handle/impl/udp_call_request_handler.dart';
import 'package:star_lock/talk/startChart/handle/impl/udp_echo_test_handler.dart';
import 'package:star_lock/talk/startChart/handle/impl/udp_gateway_reset_handler.dart';
import 'package:star_lock/talk/startChart/handle/impl/udp_go_online_handler.dart';
import 'package:star_lock/talk/startChart/handle/impl/udp_heart_beat_handler.dart';
import 'package:star_lock/talk/startChart/handle/impl/unknow_payload_type_handler.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
class ScpMessageHandlerFactory {
static ScpMessageHandler createHandler(int payloadType) {
switch (payloadType) {
case PayloadTypeConstant.goOnline:
return UdpGoOnlineHandler();
case PayloadTypeConstant.heartbeat:
return UdpHeartBeatHandler();
case PayloadTypeConstant.echoTest:
return UdpEchoTestHandler();
case PayloadTypeConstant.gatewayReset:
return UdpGateWayResetHandler();
case PayloadTypeConstant.callRequest:
return UdpCallRequestHandler();
default:
return UnKnowPayloadTypeHandler();
}
}
}

View File

@ -7,6 +7,7 @@ import 'package:fast_rsa/fast_rsa.dart' as fastRsa;
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pointycastle/export.dart' as pc; import 'package:pointycastle/export.dart' as pc;
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';
import 'package:star_lock/network/start_chart_api.dart'; import 'package:star_lock/network/start_chart_api.dart';
@ -14,12 +15,17 @@ import 'package:star_lock/talk/startChart/command/message_command.dart';
import 'package:star_lock/talk/startChart/constant/ip_constant.dart'; import 'package:star_lock/talk/startChart/constant/ip_constant.dart';
import 'package:star_lock/talk/startChart/constant/listen_addr_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/listen_addr_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/udp_constant.dart';
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart'; import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
import 'package:star_lock/talk/startChart/entity/login_response.dart'; import 'package:star_lock/talk/startChart/entity/login_response.dart';
import 'package:star_lock/talk/startChart/entity/relay_info_entity.dart'; import 'package:star_lock/talk/startChart/entity/relay_info_entity.dart';
import 'package:star_lock/talk/startChart/entity/report_information_data.dart'; 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/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.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/tools/deviceInfo_utils.dart'; import 'package:star_lock/tools/deviceInfo_utils.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -48,7 +54,7 @@ class StartChartManage {
final int localPort = 62289; // final int localPort = 62289; //
String localPublicHost = ''; // ip地址 String localPublicHost = ''; // ip地址
int _heartbeatIntervalTime = 1; // s int heartbeatIntervalTime = 1; // s
Timer? _heartBeatTimer; // Timer? _heartBeatTimer; //
bool _heartBeatTimerRunning = false; // bool _heartBeatTimerRunning = false; //
@ -58,16 +64,15 @@ class StartChartManage {
// echo测试peer对端 // echo测试peer对端
final String echoPeerId = '3phX8Ng2cZHz5NtP8xAf6nYy2z1BYytoejgjoHrWMGhH'; final String echoPeerId = '3phX8Ng2cZHz5NtP8xAf6nYy2z1BYytoejgjoHrWMGhH';
bool _isOnlineStartChartServer = false; // 线 bool isOnlineStartChartServer = false; // 线
int _reStartOnlineStartChartServerIntervalTime = 1; // 线(s) int reStartOnlineStartChartServerIntervalTime = 1; // 线(s)
Timer? _reStartOnlineStartChartServerTimer; // 线 Timer? reStartOnlineStartChartServerTimer; // 线
bool _reStartOnlineStartChartServerTimerRunning = false; // 线
String relayPeerId = ''; // peerId String relayPeerId = ''; // peerId
// //
Future<void> init() async { Future<void> init() async {
if (_isOnlineStartChartServer && _udpSocket != null) { if (isOnlineStartChartServer && _udpSocket != null) {
// 线 // 线
return; return;
} }
@ -134,28 +139,6 @@ class StartChartManage {
}); });
} }
//
void _onReceiveData(RawDatagramSocket socket) {
socket.listen((RawSocketEvent event) {
if (event == RawSocketEvent.read) {
Datagram? dg = socket.receive();
try {
if (dg?.data != null) {
final deserialize = ScpMessage.deserialize(dg!.data);
if (deserialize != null) {
_handleUdpResultData(deserialize);
}
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
_log(text: 'Udp收到结构体数据---》$deserialize');
}
}
} catch (e) {
_log(text: '❌ Udp result data error ----> $e');
}
}
});
}
// //
Future<void> reportInformation() async { Future<void> reportInformation() async {
_log(text: '上报信息至发现服务'); _log(text: '上报信息至发现服务');
@ -168,13 +151,13 @@ class StartChartManage {
// //
_sendHeartbeatMessage(); _sendHeartbeatMessage();
// 线 // 线
await _reStartOnlineStartChartServer(); await reStartOnlineStartChartServer();
} }
} }
// 线 // 线
Future<void> _sendOnlineMessage() async { Future<void> _sendOnlineMessage() async {
if (_isOnlineStartChartServer) { if (isOnlineStartChartServer) {
_log(text: '星图已上线,请勿重复发送上线消息'); _log(text: '星图已上线,请勿重复发送上线消息');
return; return;
} }
@ -194,7 +177,7 @@ class StartChartManage {
} }
_heartBeatTimer ??= Timer.periodic( _heartBeatTimer ??= Timer.periodic(
Duration( Duration(
seconds: _heartbeatIntervalTime, seconds: heartbeatIntervalTime,
), ),
(Timer timer) async { (Timer timer) async {
final List<int> message = MessageCommand.heartbeatMessage( final List<int> message = MessageCommand.heartbeatMessage(
@ -223,27 +206,36 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
gatewayId: gatewayId, gatewayId: gatewayId,
time: DateTime.now().microsecond ~/ 1000, time: DateTime.now().millisecondsSinceEpoch ~/ 1000,
); );
await _sendMessage(message: message); await _sendMessage(message: message);
Get.toNamed(
Routers.lockMonitoringPage,
arguments: <String, String>{'lockId': '111'},
);
} }
// 线 // 线
Future<void> _reStartOnlineStartChartServer() async { Future<void> reStartOnlineStartChartServer() async {
if (_isOnlineStartChartServer) { if (isOnlineStartChartServer) {
_log(text: '星图已上线,请勿重复发送上线消息'); _log(text: '星图已上线,请勿重复发送上线消息');
return; return;
} }
_reStartOnlineStartChartServerTimer ??= Timer.periodic( reStartOnlineStartChartServerTimer ??= Timer.periodic(
Duration( Duration(
seconds: _reStartOnlineStartChartServerIntervalTime, seconds: reStartOnlineStartChartServerIntervalTime,
), ),
(Timer timer) async { (Timer timer) async {
// 线 // 线
await _sendOnlineMessage(); await _sendOnlineMessage();
}, },
); );
_reStartOnlineStartChartServerTimerRunning = true; }
//
void reStartHeartBeat() {
stopHeartbeat();
_sendHeartbeatMessage();
} }
// //
@ -255,9 +247,8 @@ class StartChartManage {
// 线 // 线
void stopReStartOnlineStartChartServer() { void stopReStartOnlineStartChartServer() {
_reStartOnlineStartChartServerTimer?.cancel(); reStartOnlineStartChartServerTimer?.cancel();
_reStartOnlineStartChartServerTimer = null; // reStartOnlineStartChartServerTimer = null; //
_reStartOnlineStartChartServerTimerRunning = false;
} }
// //
@ -341,6 +332,11 @@ class StartChartManage {
return data; return data;
} }
//
Future<void> analyzeInformationOtherEnd() async {
await StartChartApi.to.analyzeInformationOtherEnd(peerId: ToPeerId);
}
// ip地址和中继返回的外网地址 // ip地址和中继返回的外网地址
Future<List<ListenAddrData>> _makeListenAddrDataList() async { Future<List<ListenAddrData>> _makeListenAddrDataList() async {
final List<ListenAddrData> listenAddrDataList = []; final List<ListenAddrData> listenAddrDataList = [];
@ -459,7 +455,7 @@ class StartChartManage {
return resultSign ?? ''; return resultSign ?? '';
} }
// 32 // 32
Uint8List encodeTimestampToLittleEndianBytes(int timestamp) { Uint8List encodeTimestampToLittleEndianBytes(int timestamp) {
// 4 ByteData // 4 ByteData
ByteData byteData = ByteData(4); ByteData byteData = ByteData(4);
@ -473,6 +469,7 @@ class StartChartManage {
return bytes; return bytes;
} }
///
String convertToPemPrivateKey(List<int> privateKeyBytes, String convertToPemPrivateKey(List<int> privateKeyBytes,
{bool isPKCS8 = true}) { {bool isPKCS8 = true}) {
// Base64编码的字符串 // Base64编码的字符串
@ -531,11 +528,6 @@ class StartChartManage {
} }
} }
//
Future<void> analyzeInformationOtherEnd() async {
await StartChartApi.to.analyzeInformationOtherEnd(peerId: ToPeerId);
}
// //
List<int> hexToBytes(String hex) { List<int> hexToBytes(String hex) {
return List<int>.generate(hex.length ~/ 2, return List<int>.generate(hex.length ~/ 2,
@ -549,6 +541,7 @@ class StartChartManage {
); );
} }
///
Future<String> getPublicKey() async { Future<String> getPublicKey() async {
// //
final StarChartRegisterNodeEntity? starChartRegisterNodeInfo = final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
@ -556,6 +549,7 @@ class StartChartManage {
return starChartRegisterNodeInfo?.peer?.publicKey ?? ''; return starChartRegisterNodeInfo?.peer?.publicKey ?? '';
} }
///
Future<String> getPrivateKey() async { Future<String> getPrivateKey() async {
// //
final StarChartRegisterNodeEntity? starChartRegisterNodeInfo = final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
@ -563,119 +557,37 @@ class StartChartManage {
return starChartRegisterNodeInfo?.peer?.privateKey ?? ''; return starChartRegisterNodeInfo?.peer?.privateKey ?? '';
} }
//
void _onReceiveData(RawDatagramSocket socket) {
socket.listen((RawSocketEvent event) {
if (event == RawSocketEvent.read) {
Datagram? dg = socket.receive();
try {
if (dg?.data != null) {
final deserialize = ScpMessage.deserialize(dg!.data);
if (deserialize != null) {
_handleUdpResultData(deserialize);
}
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
_log(text: 'Udp收到结构体数据---》$deserialize');
}
}
} catch (e) {
_log(text: '❌ Udp result data error ----> $e');
}
}
});
}
// udp返回的数据 // udp返回的数据
void _handleUdpResultData(ScpMessage scpMessage) { void _handleUdpResultData(ScpMessage scpMessage) {
final int payloadType = scpMessage.PayloadType ?? 0; final int payloadType = scpMessage.PayloadType ?? 0;
switch (payloadType) { try {
case PayloadTypeConstant.goOnline: final ScpMessageHandler handler =
_handleUdpGoOnlineResultData(scpMessage); ScpMessageHandlerFactory.createHandler(payloadType);
break; handler.handle(scpMessage);
case PayloadTypeConstant.heartbeat: } catch (e) {
_handleUdpHeartBeatResultData(scpMessage); _log(text: '❌ _handleUdpResultData 处理udp返回数据时遇到错误---> $e');
break;
case PayloadTypeConstant.echoTest:
_handleUdpEchoTestResultData(scpMessage);
break;
case PayloadTypeConstant.gatewayReset:
// TODO:
print('Handling Gateway Reset message.');
break;
case PayloadTypeConstant.callRequest:
// TODO:
print('Handling Call Request message.');
break;
case PayloadTypeConstant.talkAccept:
// TODO:
print('Handling Talk Accept message.');
break;
case PayloadTypeConstant.gatewayTransfer:
// TODO:
print('Handling Gateway Transfer message.');
break;
case PayloadTypeConstant.blePassthrough:
// TODO:
print('Handling BLE Passthrough message.');
break;
case PayloadTypeConstant.remoteUnlock:
// TODO:
print('Handling Remote Unlock message.');
break;
case PayloadTypeConstant.talkReceiverTransfer:
// TODO:
print('Handling Talk Receiver Transfer message.');
break;
case PayloadTypeConstant.talkPush:
// TODO:
print('Handling Talk Push message.');
break;
case PayloadTypeConstant.talkReject:
// TODO:
print('Handling Talk Reject message.');
break;
case PayloadTypeConstant.talkPing:
// TODO:
print('Handling Talk Ping message.');
break;
case PayloadTypeConstant.talkExpect:
// TODO:
print('Handling Talk Expect message.');
break;
case PayloadTypeConstant.talkData:
// TODO:
print('Handling Talk Data message.');
break;
case PayloadTypeConstant.talkHangup:
// TODO:
print('Handling Talk Hangup message.');
break;
default:
_log(text: '❌未知的payloadType类型');
break;
} }
} }
/// 线udp返回的数据
void _handleUdpGoOnlineResultData(ScpMessage scpMessage) {
final LoginResponse loginResponse = scpMessage.Payload;
final responseType = loginResponse.responseType;
if (responseType != null &&
responseType == PayloadTypeConstant.loginSuccessResponse) {
_log(text: '星图登录成功');
_isOnlineStartChartServer = true;
// 线
stopReStartOnlineStartChartServer();
} else {
// 线
_reStartOnlineStartChartServer();
}
}
/// udp返回的数据
void _handleUdpHeartBeatResultData(ScpMessage scpMessage) {
final HeartbeatResponse heartbeatResponse = scpMessage.Payload;
final statusCode = heartbeatResponse.statusCode;
if (statusCode != null &&
statusCode != PayloadTypeConstant.heartHeatSuccessResponse) {
// 线
_reStartOnlineStartChartServer();
}
_heartbeatIntervalTime = heartbeatResponse.nextPingTime ?? 1;
}
///
void _handleUdpEchoTestResultData(ScpMessage scpMessage) {
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
}
} }