更新睡眠报告提示样式,更新ios蓝牙开关判定
This commit is contained in:
140
lib/common/util/FirmwareVersionService.dart
Normal file
140
lib/common/util/FirmwareVersionService.dart
Normal file
@@ -0,0 +1,140 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user