feat:sdk 增加判断是否有新固件可用
This commit is contained in:
12
README.md
12
README.md
@@ -61,15 +61,21 @@ let sdk = DuooomiBleSDK(config: .init(
|
||||
| 方法 | 返回 | 说明 |
|
||||
|------|------|------|
|
||||
| `fetchLatestFirmware(identifier:status:)` | `FirmwareInfo?` | 查询最新固件,nil 表示无可用版本 |
|
||||
| `hasNewerFirmware(deviceVersion:serverVersion:)` | `Bool` | 对比版本号末尾10位时间戳,判断是否有新版本。参数无效返回 false |
|
||||
| `upgradeFirmware(fileUrl: String)` | `Void` | OTA 传输固件包到设备 |
|
||||
|
||||
```swift
|
||||
// 1. 查询最新固件
|
||||
let info = try await sdk.fetchLatestFirmware()
|
||||
// 2. OTA 升级
|
||||
if let info {
|
||||
|
||||
// 2. 检查是否有新版本
|
||||
let needUpdate = sdk.hasNewerFirmware(
|
||||
deviceVersion: sdk.version, // 当前设备版本
|
||||
serverVersion: info?.version // 服务端最新版本
|
||||
)
|
||||
|
||||
// 3. OTA 升级
|
||||
try await sdk.upgradeFirmware(fileUrl: info.fileUrl)
|
||||
}
|
||||
```
|
||||
|
||||
### 可观察状态
|
||||
|
||||
@@ -385,6 +385,21 @@ public final class DuooomiBleSDK: ObservableObject {
|
||||
return try await firmwareService.fetchLatest(identifier: identifier, status: status)
|
||||
}
|
||||
|
||||
/// 比较设备版本和服务端版本,判断是否有新固件可用。
|
||||
/// 对比规则:取版本号末尾 10 位时间戳比较大小。
|
||||
/// - Parameters:
|
||||
/// - deviceVersion: 当前设备版本号。
|
||||
/// - serverVersion: 服务端最新版本号。
|
||||
/// - Returns: 服务端版本更新返回 true,参数无效返回 false。
|
||||
public func hasNewerFirmware(deviceVersion: String?, serverVersion: String?) -> Bool {
|
||||
guard let device = deviceVersion, let server = serverVersion,
|
||||
device.count >= 10, server.count >= 10 else { return false }
|
||||
let deviceTs = device.suffix(10)
|
||||
let serverTs = server.suffix(10)
|
||||
guard let d = Int(deviceTs), let s = Int(serverTs) else { return false }
|
||||
return s > d
|
||||
}
|
||||
|
||||
/// 传输固件包到设备(OTA 升级)。
|
||||
/// - Parameter fileUrl: 固件文件的下载地址(从 `fetchLatestFirmware()` 获取)。
|
||||
/// - Throws: 未连接、下载失败、传输失败等。
|
||||
|
||||
@@ -200,6 +200,7 @@ struct WrapperTestView: View {
|
||||
if let info = firmwareInfo {
|
||||
VStack(alignment: .leading, spacing: 6) {
|
||||
LabeledContent("Latest", value: info.version)
|
||||
LabeledContent("Has Update", value: sdk.hasNewerFirmware(deviceVersion: sdk.version, serverVersion: info.version) ? "Yes" : "No")
|
||||
if let size = info.fileSize {
|
||||
let bytes = Int(size) ?? 0
|
||||
LabeledContent("Size", value: ByteCountFormatter.string(fromByteCount: Int64(bytes), countStyle: .file))
|
||||
@@ -429,7 +430,8 @@ struct WrapperTestView: View {
|
||||
let info = try await sdk.fetchLatestFirmware(identifier: brand, status: firmwareStatus)
|
||||
firmwareInfo = info
|
||||
if let info {
|
||||
log("firmware latest: \(info.version)", level: .success)
|
||||
let hasUpdate = sdk.hasNewerFirmware(deviceVersion: sdk.version, serverVersion: info.version)
|
||||
log("firmware latest: \(info.version), hasUpdate=\(hasUpdate)", level: .success)
|
||||
} else {
|
||||
log("no firmware available", level: .info)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user