更新睡眠报告提示样式,更新ios蓝牙开关判定

This commit is contained in:
wyf
2025-09-04 11:20:44 +08:00
parent aad3a00ac3
commit 9f73a8111a
12 changed files with 1845 additions and 277 deletions

View 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;
}
}