feat:增加网关初始化发送指令和接收指令的处理

This commit is contained in:
liyi 2024-12-03 17:55:33 +08:00
parent 2429a107e1
commit 5054f2a68a
5 changed files with 203 additions and 10 deletions

View File

@ -246,6 +246,15 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
ToPeerId: '3phX8Ng2cZHz5NtP8xAf6nYy2z1BYytoejgjoHrWMGhH');
},
),
SubmitBtn(
btnName: '发送网关初始化消息',
onClick: () {
StartChartManage().sendGatewayResetMessage(
ToPeerId: '3phX8Ng2cZHz5NtP8xAf6nYy2z1BYytoejgjoHrWMGhH',
gatewayId: 1,
);
},
),
SizedBox(height: 50.w),
Row(
mainAxisAlignment: MainAxisAlignment.center,

View File

@ -3,6 +3,7 @@ import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/protocol_flag_constant.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
class MessageCommand {
/// 线
@ -71,6 +72,35 @@ class MessageCommand {
return _hexToBytes(serializedBytesString);
}
//
static List<int> gatewayReset({
required int gatewayId,
required String FromPeerId,
required String ToPeerId,
required int time,
}) {
final gatewayResetReq = GatewayResetReq(
iD: gatewayId,
time: time,
);
final payloadLength = gatewayResetReq.writeToBuffer().length;
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: gatewayResetReq,
PayloadCRC: 55230,
PayloadLength: payloadLength,
PayloadType: PayloadTypeConstant.gatewayReset,
);
String serializedBytesString = message.serialize();
return _hexToBytes(serializedBytesString);
}
// 16
static List<int> _hexToBytes(String hex) {
final bytes = <int>[];

View File

@ -13,6 +13,46 @@ class PayloadTypeConstant {
//
static const int loginSuccessResponse = 110;
//
static const int heartHeatSuccessResponse = 0;
//
static const int gatewayReset = 1521;
//
static const int gatewayTransfer = 1523;
//
static const int blePassthrough = 1531;
//
static const int remoteUnlock = 1533;
//
static const int talkReceiverTransfer = 1620;
//
static const int callRequest = 1650;
//
static const int talkPush = 1652;
//
static const int talkReject = 1654;
//
static const int talkAccept = 1660;
//
static const int talkPing = 1662;
//
static const int talkExpect = 1664;
//
static const int talkData = 1666;
//
static const int talkHangup = 1668;
}

View File

@ -5,6 +5,10 @@ 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/entity/heartbeat_response.dart';
import 'package:star_lock/talk/startChart/entity/login_response.dart';
import 'package:star_lock/talk/startChart/proto/ble_message.pb.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/remote_unlock.pb.dart';
class ScpMessage {
ScpMessage({
@ -134,7 +138,7 @@ class ScpMessage {
}
// Payload ()
if (Payload != null) {
if (Payload != null && Payload is String) {
bytes.addAll(utf8.encode(Payload!));
}
@ -286,6 +290,48 @@ class ScpMessage {
//
String payload = utf8.decode(byte);
return payload;
case PayloadTypeConstant.gatewayReset:
//
final GatewayResetResp gatewayResetResp =
GatewayResetResp.fromBuffer(byte);
return gatewayResetResp;
case PayloadTypeConstant.callRequest:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkAccept:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.gatewayTransfer:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.blePassthrough:
final BleResp bleResp = BleResp.fromBuffer(byte);
return bleResp;
case PayloadTypeConstant.remoteUnlock:
final RemoteUnlockResp remoteUnlockResp =
RemoteUnlockResp.fromBuffer(byte);
return remoteUnlockResp;
case PayloadTypeConstant.talkReceiverTransfer:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkPush:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkReject:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkPing:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkExpect:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkData:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
case PayloadTypeConstant.talkHangup:
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
default:
print('❌未知的payloadType类型,按照字符串解析');
String payload = utf8.decode(byte);

View File

@ -150,7 +150,7 @@ class StartChartManage {
}
}
} catch (e) {
_log(text: '❌ Udp ----> $e');
_log(text: '❌ Udp result data error ----> $e');
}
}
});
@ -216,6 +216,18 @@ class StartChartManage {
await _sendMessage(message: message);
}
//
void sendGatewayResetMessage(
{required String ToPeerId, required int gatewayId}) async {
final message = MessageCommand.gatewayReset(
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
gatewayId: gatewayId,
time: DateTime.now().microsecond ~/ 1000,
);
await _sendMessage(message: message);
}
// 线
Future<void> _reStartOnlineStartChartServer() async {
if (_isOnlineStartChartServer) {
@ -253,7 +265,7 @@ class StartChartManage {
var result = await _udpSocket?.send(
message, InternetAddress(remoteHost), remotePort);
if (result != message.length) {
AppLog.log('❌Udp ----> send data error $result ${message.length}');
AppLog.log('❌Udp send data error----> $result ${message.length}');
_udpSocket = null;
}
}
@ -537,13 +549,6 @@ class StartChartManage {
);
}
/// 使 RSA PKCS#1 v1.5
Uint8List rsaSign(pc.RSAPrivateKey privateKey, List<int> data) {
final signer = pc.RSASigner(pc.SHA256Digest(), '06052b24030203')
..init(true, pc.PrivateKeyParameter<pc.RSAPrivateKey>(privateKey));
return signer.generateSignature(Uint8List.fromList(data)).bytes;
}
Future<String> getPublicKey() async {
//
final StarChartRegisterNodeEntity? starChartRegisterNodeInfo =
@ -571,7 +576,70 @@ class StartChartManage {
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;