140 lines
3.7 KiB
Dart
140 lines
3.7 KiB
Dart
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;
|
||
}
|
||
} |