Merge branch 'develop_liyi' into 'canary_release'
Develop liyi See merge request StarlockTeam/app-starlock!4
This commit is contained in:
commit
1a235bcb62
@ -68,6 +68,7 @@ class LoginData {
|
||||
void updateStarchart(
|
||||
StarChartRegisterNodeEntity starChartRegisterNodeEntity) {
|
||||
starchart = Starchart(
|
||||
scdUrl: this.starchart?.scdUrl,
|
||||
starchartId: starChartRegisterNodeEntity.peer?.id,
|
||||
starchartPeerPublicKey: starChartRegisterNodeEntity.peer?.publicKey,
|
||||
starchartPeerPrivateKey: starChartRegisterNodeEntity.peer?.privateKey,
|
||||
|
||||
@ -80,7 +80,7 @@ class StarLockLoginLogic extends BaseGetXController {
|
||||
Storage.saveStarChartRegisterNodeInfo(starChartRegisterNodeEntity);
|
||||
entity.data!.updateStarchart(starChartRegisterNodeEntity);
|
||||
}
|
||||
Storage.saveLoginData(entity.data);
|
||||
await Storage.saveLoginData(entity.data);
|
||||
Storage.setBool(saveIsVip, entity.data!.isVip == 1);
|
||||
eventBus.fire(MineInfoChangeRefreshUI());
|
||||
if (Get.isRegistered<LockMainLogic>()) {
|
||||
|
||||
@ -212,7 +212,15 @@ class ConfiguringWifiLogic extends BaseGetXController {
|
||||
// 显示加载指示器
|
||||
showEasyLoading();
|
||||
state.isLoading.value = true;
|
||||
// 模拟异步请求
|
||||
// 添加15秒超时检查
|
||||
Future.delayed(const Duration(seconds: 15), () {
|
||||
if (state.isLoading.isTrue) {
|
||||
EasyLoading.dismiss();
|
||||
state.isLoading.value = false;
|
||||
state.sureBtnState.value = 0;
|
||||
showToast('配网失败'.tr);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 获取设备状态
|
||||
|
||||
@ -158,7 +158,8 @@ class Starchart {
|
||||
String? starchartPeerPrivateKey;
|
||||
|
||||
Starchart(
|
||||
{this.scdUrl,this.starchartId,
|
||||
{this.scdUrl,
|
||||
this.starchartId,
|
||||
this.starchartPeerPublicKey,
|
||||
this.starchartPeerPrivateKey});
|
||||
|
||||
|
||||
@ -6,10 +6,11 @@ import 'package:star_lock/network/api_provider_base.dart';
|
||||
import 'package:star_lock/talk/starChart/entity/relay_info_entity.dart';
|
||||
import 'package:star_lock/talk/starChart/entity/report_information_data.dart';
|
||||
import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart';
|
||||
import 'package:star_lock/tools/storage.dart';
|
||||
|
||||
class StartChartApi extends BaseProvider {
|
||||
// 星图url
|
||||
String _startChartHost = 'http://sls1-scd.star-lock.cn:8080';
|
||||
String _startChartHost = '';
|
||||
|
||||
static StartChartApi get to => Get.put(StartChartApi());
|
||||
|
||||
@ -28,6 +29,17 @@ class StartChartApi extends BaseProvider {
|
||||
required String name,
|
||||
required String unique,
|
||||
}) async {
|
||||
final loginData = await Storage.getLoginData();
|
||||
|
||||
// 获取星图url
|
||||
if (loginData != null &&
|
||||
loginData?.starchart != null &&
|
||||
loginData?.starchart?.scdUrl != null &&
|
||||
loginData?.starchart?.scdUrl != '') {
|
||||
StartChartApi.to.startChartHost =
|
||||
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
|
||||
}
|
||||
|
||||
final response = await post(
|
||||
_startChartHost + starChartRegisterNodeURL.toUrl,
|
||||
jsonEncode(<String, dynamic>{
|
||||
@ -44,6 +56,17 @@ class StartChartApi extends BaseProvider {
|
||||
|
||||
// 星图--中继查询
|
||||
Future<RelayInfoEntity> relayQueryInfo() async {
|
||||
final loginData = await Storage.getLoginData();
|
||||
|
||||
// 获取星图url
|
||||
if (loginData != null &&
|
||||
loginData?.starchart != null &&
|
||||
loginData?.starchart?.scdUrl != null &&
|
||||
loginData?.starchart?.scdUrl != '') {
|
||||
StartChartApi.to.startChartHost =
|
||||
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
|
||||
}
|
||||
|
||||
final response = await get(
|
||||
_startChartHost + relayQueryInfoURL.toUrl,
|
||||
isUnShowLoading: true,
|
||||
@ -56,6 +79,17 @@ class StartChartApi extends BaseProvider {
|
||||
Future<Response> reportInformation({
|
||||
required ReportInformationData reportInformationData,
|
||||
}) async {
|
||||
final loginData = await Storage.getLoginData();
|
||||
|
||||
// 获取星图url
|
||||
if (loginData != null &&
|
||||
loginData?.starchart != null &&
|
||||
loginData?.starchart?.scdUrl != null &&
|
||||
loginData?.starchart?.scdUrl != '') {
|
||||
StartChartApi.to.startChartHost =
|
||||
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
|
||||
}
|
||||
|
||||
final response = await post(
|
||||
_startChartHost + reportInformationDataURL.toUrl,
|
||||
jsonEncode(reportInformationData.toJson()),
|
||||
@ -69,6 +103,17 @@ class StartChartApi extends BaseProvider {
|
||||
Future<Response> analyzeInformationOtherEnd({
|
||||
required String peerId,
|
||||
}) async {
|
||||
final loginData = await Storage.getLoginData();
|
||||
|
||||
// 获取星图url
|
||||
if (loginData != null &&
|
||||
loginData?.starchart != null &&
|
||||
loginData?.starchart?.scdUrl != null &&
|
||||
loginData?.starchart?.scdUrl != '') {
|
||||
StartChartApi.to.startChartHost =
|
||||
loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost;
|
||||
}
|
||||
|
||||
final response = await get(
|
||||
_startChartHost + analyzeInformationOtherEndURL.toUrl + '?id=$peerId',
|
||||
isUnShowLoading: true,
|
||||
|
||||
@ -2,7 +2,7 @@ import 'dart:async';
|
||||
|
||||
import 'dart:typed_data';
|
||||
import 'package:convert/convert.dart';
|
||||
import 'package:fast_rsa/fast_rsa.dart' as fastRsa;
|
||||
// import 'package:fast_rsa/fast_rsa.dart' as fastRsa;
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:pointycastle/export.dart' as pc;
|
||||
import 'dart:convert';
|
||||
@ -11,6 +11,31 @@ import 'package:star_lock/talk/starChart/exception/start_chart_message_exception
|
||||
|
||||
class DoSign {
|
||||
// 生成签名sing
|
||||
// Future<String> generateSign({
|
||||
// required int currentTimestamp,
|
||||
// required String privateKeyHex,
|
||||
// }) async {
|
||||
// String resultSign = '';
|
||||
// try {
|
||||
// // 1. 将 32 位时间戳以小端字节序编码为二进制数据
|
||||
// Uint8List signData = encodeTimestampToLittleEndianBytes(currentTimestamp);
|
||||
//
|
||||
// // 2.将十六进制字符串转换为字节数组
|
||||
// List<int> privateKeyBytes = hexToBytes(privateKeyHex);
|
||||
//
|
||||
// // 3.将私钥转换为 PEM 格式
|
||||
// final pemPrivateKey =
|
||||
// convertToPemPrivateKey(privateKeyBytes, isPKCS8: true);
|
||||
// // 4.签名
|
||||
// var result = await fastRsa.RSA
|
||||
// .signPKCS1v15Bytes(signData, fastRsa.Hash.SHA256, pemPrivateKey);
|
||||
// resultSign = hex.encode(result);
|
||||
// } catch (e) {
|
||||
// throw StartChartMessageException('❌--->上报信息生成签名时出现错误: $e');
|
||||
// }
|
||||
// return resultSign ?? '';
|
||||
// }
|
||||
|
||||
Future<String> generateSign({
|
||||
required int currentTimestamp,
|
||||
required String privateKeyHex,
|
||||
@ -20,20 +45,20 @@ class DoSign {
|
||||
// 1. 将 32 位时间戳以小端字节序编码为二进制数据
|
||||
Uint8List signData = encodeTimestampToLittleEndianBytes(currentTimestamp);
|
||||
|
||||
// 2.将十六进制字符串转换为字节数组
|
||||
List<int> privateKeyBytes = hexToBytes(privateKeyHex);
|
||||
// 2. 加载私钥
|
||||
final privateKey = loadPrivateKey(privateKeyHex);
|
||||
|
||||
// 3.将私钥转换为 PEM 格式
|
||||
final pemPrivateKey =
|
||||
convertToPemPrivateKey(privateKeyBytes, isPKCS8: true);
|
||||
// 4.签名
|
||||
var result = await fastRsa.RSA
|
||||
.signPKCS1v15Bytes(signData, fastRsa.Hash.SHA256, pemPrivateKey);
|
||||
resultSign = hex.encode(result);
|
||||
// 3. 创建 RSA 签名器
|
||||
final signer = pc.RSASigner(pc.SHA256Digest(), '0609608648016503040201');
|
||||
signer.init(true, pc.PrivateKeyParameter<pc.RSAPrivateKey>(privateKey));
|
||||
|
||||
// 4. 生成签名
|
||||
final signature = signer.generateSignature(signData);
|
||||
resultSign = hex.encode(signature.bytes);
|
||||
} catch (e) {
|
||||
throw StartChartMessageException('❌--->上报信息生成签名时出现错误: $e');
|
||||
}
|
||||
return resultSign ?? '';
|
||||
return resultSign;
|
||||
}
|
||||
|
||||
// 将 32 位时间戳以小端字节序编码为二进制数据
|
||||
|
||||
@ -186,7 +186,7 @@ class StartChartManage {
|
||||
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
|
||||
final data = relayInfoEntity.relay_list?[i];
|
||||
if (data?.peerID != FromPeerId) {
|
||||
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
|
||||
final parseUdpUrl = await _parseUdpUrl(data?.listenAddr ?? '');
|
||||
remoteHost = parseUdpUrl['host'] ?? '';
|
||||
remotePort = parseUdpUrl['port'] ?? '';
|
||||
relayPeerId = data?.peerID ?? '';
|
||||
@ -893,18 +893,30 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
/// 解析 UDP URL 并提取 IP 地址和端口号
|
||||
Map<String, dynamic> _parseUdpUrl(String url) {
|
||||
// 使用正则表达式匹配 IP 地址和端口号
|
||||
final regex = RegExp(r'udp://(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d+)')
|
||||
.firstMatch(url);
|
||||
/// 解析 UDP URL 并提取 IP 地址和端口号,同时处理域名解析
|
||||
Future<Map<String, dynamic>> _parseUdpUrl(String url) async {
|
||||
final regex = RegExp(r'udp://([a-zA-Z0-9.-]+):(\d+)').firstMatch(url);
|
||||
|
||||
if (regex != null) {
|
||||
final ip = regex.group(1);
|
||||
final host = regex.group(1);
|
||||
final portStr = regex.group(2);
|
||||
final port = int.tryParse(portStr ?? '');
|
||||
|
||||
if (ip != null && port != null) {
|
||||
return {'host': ip, 'port': port};
|
||||
if (host != null && port != null) {
|
||||
try {
|
||||
// 尝试进行 DNS 解析
|
||||
final List<InternetAddress> addresses =
|
||||
await InternetAddress.lookup(host);
|
||||
if (addresses.isEmpty) {
|
||||
throw FormatException('DNS resolution failed for $host');
|
||||
}
|
||||
|
||||
// 使用解析后的第一个 IP 地址
|
||||
final String resolvedIp = addresses.first.address;
|
||||
return {'host': resolvedIp, 'port': port};
|
||||
} catch (e) {
|
||||
throw FormatException('DNS resolution error for $host: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
throw FormatException('无法解析 URL 格式: $url');
|
||||
@ -1063,6 +1075,13 @@ class StartChartManage {
|
||||
reStartTalkExpectMessageTimer();
|
||||
}
|
||||
|
||||
void reSetDefaultTalkExpect() {
|
||||
_defaultTalkExpect = TalkExpectReq(
|
||||
videoType: [VideoTypeE.IMAGE],
|
||||
audioType: [AudioTypeE.G711],
|
||||
);
|
||||
}
|
||||
|
||||
/// 修改预期接收到的数据
|
||||
void sendOnlyImageVideoTalkExpectData() {
|
||||
final talkExpectReq = TalkExpectReq(
|
||||
@ -1141,10 +1160,7 @@ class StartChartManage {
|
||||
|
||||
/// 重置数据
|
||||
void _resetData() {
|
||||
_defaultTalkExpect = TalkExpectReq(
|
||||
videoType: [VideoTypeE.IMAGE],
|
||||
audioType: [AudioTypeE.G711],
|
||||
);
|
||||
reSetDefaultTalkExpect();
|
||||
isOnlineStarChartServer = false;
|
||||
talkStatus.setUninitialized();
|
||||
}
|
||||
|
||||
@ -426,6 +426,8 @@ class TalkViewLogic extends BaseGetXController {
|
||||
@override
|
||||
void dispose() {
|
||||
stopProcessingAudio();
|
||||
// 重置期望数据
|
||||
StartChartManage().reSetDefaultTalkExpect();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
12
pubspec.yaml
12
pubspec.yaml
@ -185,9 +185,9 @@ dependencies:
|
||||
common_utils: ^2.0.0
|
||||
lpinyin: ^2.0.3
|
||||
#加密解密
|
||||
encrypt: ^5.0.1
|
||||
crypto: ^3.0.3
|
||||
pointycastle: ^3.4.0
|
||||
# encrypt: ^5.0.1
|
||||
# crypto: ^3.0.3
|
||||
pointycastle: ^3.7.3 # 使用最新版本
|
||||
date_format: ^2.0.7
|
||||
|
||||
# 下拉刷新
|
||||
@ -257,9 +257,9 @@ dependencies:
|
||||
firebase_analytics: 11.3.0
|
||||
#</com>
|
||||
|
||||
cryptography: ^2.7.0
|
||||
asn1lib: ^1.0.0
|
||||
fast_rsa: ^3.6.6
|
||||
# cryptography: ^2.7.0
|
||||
# asn1lib: ^1.0.0
|
||||
# fast_rsa: ^3.6.6
|
||||
protobuf: ^3.1.0
|
||||
#录屏
|
||||
flutter_screen_recording: 2.0.16
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user