跳到主要内容

OTA升级

更新时间:2024-12-09 10:03:03

APP端触发设备固件升级

package com.polaris.iot.appsdk.libuserdevicemgr;

object DeviceOTAMgr{
/**
* 获取可更新版本
* @param checkReq [OTACheckReq]
* @param iotCallback [IoTCallback]
*/
fun checkVersion(checkReq: OTACheckReq, iotCallback: IoTCallback)

/**
* 触发升级
* @param devices iotId列表
* @param iotCallback [IoTCallback]
*/
fun confirmUpgrade(devices: List<String>, iotCallback: IoTCallback)

/**
* 获取升级状态
* @param checkReq [OTAProgressReq]
* @param iotCallback [IoTCallback]
*/
fun checkProgress(checkReq: OTAProgressReq, iotCallback: IoTCallback)
}

获取可更新版本

DeviceOTAMgr.checkVersion(new OTACheckReq(mPlayDeviceInfo.getIotId(), null, null), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
hideLoading();
showToast("获取版本失败");
IoTLogger.e(TAG, "checkVersion failed:" + exception.getCode() + "," + exception.getMessage());

}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
hideLoading();
OTACheckRsp rsp = (OTACheckRsp) response.getData();
if (rsp == null || rsp.getCurrentVersion() == null) {
showToast("暂无可升级版本");
return;
}
String msg = "升级模块:" + rsp.getModuleName() + "\n当前版本:" + rsp.getCurrentVersion() + "\n新版本:" + rsp.getFirmwareVersion();
AlertDialog.Builder builder = new AlertDialog.Builder(LivePlayActivity.this).setTitle("升级").setMessage(msg).setPositiveButton("升级", (dialog, which) -> {
dialog.dismiss();
doOTAUpgrade();
});

builder.setCancelable(false);
//非强制升级可取消
if (!Objects.equals(rsp.getOtaType(), OTATypeEnum.COMPELLENT.name())) {
builder.setNegativeButton("取消", (dialog, which) -> dialog.dismiss());
}
builder.show();
}
});

触发升级

List<String> devices = new ArrayList<>();
devices.add(mPlayDeviceInfo.getIotId());
DeviceOTAMgr.confirmUpgrade(devices, new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
showToast("确认升级失败,请重试");
IoTLogger.e(TAG, "confirmUpgrade failed:" + exception.getCode() + "," + exception.getMessage());
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
//定时获取升级状态
}
});

获取升级状态

final boolean[] upgradeEnd = {false};
long startTime = System.currentTimeMillis();
long lastCheckProgressTime = startTime;
while (!upgradeEnd[0]) {
try {
Thread.sleep(1000);
long nowTime = System.currentTimeMillis();
if (nowTime - startTime > timeout * 60 * 1000) {
//10分钟超时处理
break;
}
//30秒后,至少间隔15秒请求一次
if (!upgradeEnd[0] && nowTime - startTime > 30 * 1000 && nowTime - lastCheckProgressTime >= 15 * 1000) {
lastCheckProgressTime = nowTime;
DeviceOTAMgr.checkProgress(new OTAProgressReq(mPlayDeviceInfo.getIotId(), null), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {

}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
OTAProgressRsp rsp = (OTAProgressRsp) response.getData();
runOnUiThread(() -> {
if (Objects.equals(OTAUpgradeStatusEnum.SUCCEEDED.name(), rsp.getStatus())) {
upgradeEnd[0] = true;
//升级成功
} else if (Objects.equals(OTAUpgradeStatusEnum.FAILED.name(), rsp.getStatus())) {
//升级失败
}
});
}
});
}

} catch (Exception ignored) {
}