Files
tuiche/lib/common/util/FirmwareVersionService.dart

140 lines
3.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:convert';
import 'dart:io';
class FirmwareVersionInfo {
final String version;
final String fileName;
final String downloadUrl;
FirmwareVersionInfo({
required this.version,
required this.fileName,
required this.downloadUrl,
});
@override
String toString() {
return 'FirmwareVersionInfo{version: $version, fileName: $fileName, downloadUrl: $downloadUrl}';
}
}
class FirmwareVersionService {
/// 从远程URL获取最新的固件版本信息
/// [baseUrl] 基础URL如 "https://share.file.he-info.cn"
/// [firmwarePath] 固件路径,如 "/ota/aithv2/"
static Future<FirmwareVersionInfo?> getLatestFirmwareVersion({
required String baseUrl,
required String firmwarePath,
}) async {
try {
// 构建完整的API URL
final apiUrl = '$baseUrl/~/api/get_file_list?uri=$firmwarePath';
// 发送HTTP请求 - 使用基础的http客户端不依赖项目特定实现
final response = await _makeHttpRequest(apiUrl);
if (response == null) {
return null;
}
// 解析响应数据
return _parseFirmwareData(response, baseUrl, firmwarePath);
} catch (e) {
print('获取固件版本信息失败: $e');
return null;
}
}
/// 发送HTTP请求
static Future<dynamic> _makeHttpRequest(String url) async {
try {
// 使用基础的http客户端
final httpClient = HttpClient();
final request = await httpClient.getUrl(Uri.parse(url));
final response = await request.close();
if (response.statusCode != 200) {
return null;
}
final responseBody = await response.transform(utf8.decoder).join();
return jsonDecode(responseBody);
} catch (e) {
print('HTTP请求失败: $e');
return null;
}
}
/// 解析固件数据
static FirmwareVersionInfo? _parseFirmwareData(
dynamic data,
String baseUrl,
String firmwarePath
) {
if (data == null || data['list'] == null) {
return null;
}
final versionList = data['list'] as List;
int? maxVersionNum;
String? latestFileName;
for (var item in versionList) {
if (item is Map && item.containsKey('n')) {
final fileName = item['n'] as String;
try {
// 解析版本号 - 假设文件名格式为 "something-version.extension"
final versionMatch = _extractVersionFromFileName(fileName);
if (versionMatch != null) {
final versionNum = int.parse(versionMatch);
if (maxVersionNum == null || versionNum > maxVersionNum) {
maxVersionNum = versionNum;
latestFileName = fileName;
}
}
} catch (e) {
// 解析失败跳过
continue;
}
}
}
if (latestFileName != null && maxVersionNum != null) {
// 构建下载URL
final downloadUrl = '$baseUrl/${firmwarePath.replaceFirst('/', '')}$latestFileName';
return FirmwareVersionInfo(
version: maxVersionNum.toString(),
fileName: latestFileName,
downloadUrl: downloadUrl,
);
}
return null;
}
/// 从文件名中提取版本号
static String? _extractVersionFromFileName(String fileName) {
// 多种可能的文件名格式处理
final patterns = [
// 格式: something-123.bin
RegExp(r'-(\d+)\.'),
// 格式: v123.bin
RegExp(r'v(\d+)\.'),
// 格式: firmware_123.bin
RegExp(r'_(\d+)\.'),
];
for (final pattern in patterns) {
final match = pattern.firstMatch(fileName);
if (match != null && match.groupCount >= 1) {
return match.group(1);
}
}
return null;
}
}