OTA升级
更新时间:2026-06-16 17:21:46
// 导入头文件
import 'package:airtc_engine/src/device_center/rtcx_ota_firmware.dart';
APP端触发设备固件升级
class RTCXFluOtaFirmwareApi {
/// 获取设备当前可用的固件信息
@async
RTCXFluFirmwareUpdateCheckRsp otaCheckFirmwareUpdate(RTCXFluFirmwareUpdateCheckReq req);
/// 确定设备允许进行升级,可批量升级,(不会返回设备是否正常执行了升级结果)
@async
RTCXFluFirmwareUpdateResult otaFirmwareUpdate(RTCXFluFirmwareUpdateReq req);
/// 更新设备分组信息
@async
RTCXFluFirmwareUpdateProgressRsp otaFirmwareUpdateProgress(RTCXFluFirmwareUpdateProgressReq req);
/// 该接口会触发单台设备升级指令,同步返回设备是否正常执行了升级指令结果,33216: 无可升级的版本;6221: 设备不在线
@async
RTCXFluFirmwareUpdateResult otaFirmwareSingleUpdate(RTCXFluFirmwareSingleUpdateReq req);
}
使用 RTCXFluOtaFirmwareApi调用示例如下:
获取设备升级信息
// api实例
final RTCXFluOtaFirmwareApi otaFirmwareApi = RTCXFluOtaFirmwareApi();
void otaCheckFirmwareUpdate() {
RTCXFluFirmwareUpdateCheckReq req = RTCXFluFirmwareUpdateCheckReq(
iotId: 'iotId',
);
otaFirmwareApi
.otaCheckFirmwareUpdate(req)
.then((data) {
RTCXFluFirmwareUpdateCheckRsp rsp = data;
if (rsp.firmwareVersion != null && rsp.firmwareVersion!.isNotEmpty) {
print("检测到新固件");
// 是否需要升级,需要升级调用otaFirmwareUpdate
}
})
.catchError((error) {
print("otaCheckFirmwareUpdate error:${error.toString()}");
});
}
触发设备升级
该接口只是触发设备升级,返回结果只代表接口调用成功与否,并不是设备升级状态,需要通过调用获取设备升级状态接口获取升级状态
void otaFirmwareUpdate() {
RTCXFluFirmwareUpdateReq req = RTCXFluFirmwareUpdateReq(
devices: [
{"iotId": "iotId_1"},
{"iotId": "iotId_2"},
],
);
otaFirmwareApi
.otaFirmwareUpdate(req)
.then((data) {
RTCXFluFirmwareUpdateResult result = data;
if(result.success) {
print("接口调用成功");
} else {
print("接口调用失败");
}
})
.catchError((error) {
print("otaFirmwareUpdate error:${error.toString()}");
});
}
获取设备升级状态
由于设备升级需要一定的时间,所以App层需要通过轮询的方式调用该接口查询设备升级状态(需注意控制超时)
Timer? _timer;
bool _isTimerRunning = false;
double otaUpdateTimeout = 10*60.0;
double otaUpdateCounter = 0;
// 不需要timer时候释放资源, 防止内存泄漏
@override
void dispose() {
// TODO: implement dispose
_pauseTimer();
super.dispose();
}
// 不需要timer时候,别忘记释放掉
void _startTimer() {
// 定时器轮询升级状态
if (_isTimerRunning) return;
_isTimerRunning = true;
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
// 实时更新固件升级进度
if(otaUpdateCounter >= otaUpdateTimeout) {
otaUpdateCounter = 0;
print("升级超时");
_pauseTimer();
return;
}
if(otaUpdateCounter % 2 == 0) {
otaFirmwareUpdateProgress();
}
otaUpdateCounter++;
});
}
void _pauseTimer() {
_timer?.cancel();
_isTimerRunning = false;
}
void otaFirmwareUpdateProgress() {
RTCXFluFirmwareUpdateProgressReq req = RTCXFluFirmwareUpdateProgressReq(
iotId: 'iotId',
);
otaFirmwareApi
.otaFirmwareUpdateProgress(req)
.then((data) {
RTCXFluFirmwareUpdateProgressRsp rsp = data;
if ('SUCCEEDED' == rsp.status) {
_pauseTimer();
otaUpdateCounter = 0;
print("固件升级成功");
} else if ('FAILED' == rsp.status) {
_pauseTimer();
otaUpdateCounter = 0;
print("固件升级失败");
}
})
.catchError((error) {
_pauseTimer();
otaUpdateCounter = 0;
print("获取升级进度失败");
});
}
触发单台设备升级
该接口会触发单台设备升级指令,同步返回设备是否正常执行了升级指令结果,33216: 无可升级的版本;6221: 设备不在线
void singleUpdate(){
RTCXFluFirmwareSingleUpdateReq req = RTCXFluFirmwareSingleUpdateReq(iotId: 'iotId');
otaFirmwareApi
.otaFirmwareSingleUpdate(req)
.then((data) {
RTCXFluFirmwareUpdateResult result = data;
if (result.success) {
print("接口调用成功");
} else {
print("接口调用失败");
}
})
.catchError((error) {
print("otaFirmwareSingleUpdate error:${error.toString()}");
});
}