完善升级校验及错误提示。

This commit is contained in:
luocai 2024-08-22 15:32:58 +08:00
parent eeb1fc088c
commit 31aa3d86ac
4 changed files with 36 additions and 10 deletions

View File

@ -42,7 +42,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
// Icon with lowest ID value placed first to ensure application icon // Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems. // remains consistent on all systems.
IDI_ICON1 ICON "resources\\logo.ico" // IDI_ICON1 ICON "resources\\logo.ico"
#endif // 中文(简体,中国) resources #endif // 中文(简体,中国) resources
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@ -3,6 +3,7 @@
#include "Configuration.h" #include "Configuration.h"
#include "H264Palyer.h" #include "H264Palyer.h"
#include "VideoFrameProvider.h" #include "VideoFrameProvider.h"
#include <QFileInfo>
#include <QFont> #include <QFont>
#include <QGuiApplication> #include <QGuiApplication>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
@ -219,10 +220,20 @@ void Application::startSearchDevice() {
} }
void Application::upgradeDevice(const QString &file) { void Application::upgradeDevice(const QString &file) {
constexpr auto versionPrefix = "RD_T009";
constexpr auto version = "RD_T009_V21R003B013";
QFileInfo fileInfo(file);
QString baseName = fileInfo.baseName();
int position = baseName.indexOf(versionPrefix);
if (position < 0 || ((baseName.length() - position) < std::strlen(version))) {
emit newMessage(2, "OTA升级", "文件名格式不合法!");
return;
}
QString firmware = baseName.mid(position, std::strlen(version));
if (!m_device.expired()) { if (!m_device.expired()) {
auto device = m_device.lock(); auto device = m_device.lock();
if (device->isConnected()) { if (device->isConnected()) {
device->requestOta(file); device->requestOta(firmware, file);
} else { } else {
emit newMessage(2, "OTA升级", "设备已离线,请重新连接设备!"); emit newMessage(2, "OTA升级", "设备已离线,请重新连接设备!");
} }

View File

@ -300,7 +300,7 @@ QFuture<bool> DeviceConnection::updateNetworkInfomation(bool dhcp, const QString
return ret; return ret;
} }
void DeviceConnection::requestOta(const QString &file) { void DeviceConnection::requestOta(const QString &firmware, const QString &file) {
m_otaProgress = 0; m_otaProgress = 0;
emit otaProgressChanged(true, m_otaProgress, "正在向设备发起OTA请求......"); emit otaProgressChanged(true, m_otaProgress, "正在向设备发起OTA请求......");
if (m_timerId > 0) { if (m_timerId > 0) {
@ -309,7 +309,7 @@ void DeviceConnection::requestOta(const QString &file) {
} }
Task task; Task task;
task.command = "a22devicefirmware_setdata"; task.command = "a22devicefirmware_setdata";
task.task = [this, file]() { task.task = [this, file, firmware]() {
std::ifstream ifs(Amass::StringUtility::UTF8ToGBK(file.toStdString()), std::ifstream::binary); std::ifstream ifs(Amass::StringUtility::UTF8ToGBK(file.toStdString()), std::ifstream::binary);
m_uploadBuffer = std::vector<uint8_t>((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>()); m_uploadBuffer = std::vector<uint8_t>((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
m_sendedSize = 0; m_sendedSize = 0;
@ -326,18 +326,17 @@ void DeviceConnection::requestOta(const QString &file) {
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
oss << std::setw(2) << static_cast<int>(md5[i]); oss << std::setw(2) << static_cast<int>(md5[i]);
} }
boost::json::object request; boost::json::object request;
request["func"] = "a22devicefirmware_setdata"; request["func"] = "a22devicefirmware_setdata";
request["deviceid"] = "0"; request["deviceid"] = "0";
boost::json::object data; boost::json::object data;
data["target_linux04_firmware"] = "RD_T009_V21R003B002"; data["target_linux04_firmware"] = firmware.toStdString();
data["datasize"] = std::filesystem::file_size(file.toStdString()); data["datasize"] = std::filesystem::file_size(file.toStdString());
data["md5"] = oss.str(); data["md5"] = oss.str();
request["data"] = std::move(data); request["data"] = std::move(data);
auto text = boost::json::serialize(request); auto text = boost::json::serialize(request);
m_commandSocket->write(text.data(), text.size()); m_commandSocket->write(text.data(), text.size());
LOG(info) << "requestOta: " << text << ": " << text.size(); LOG(info) << "requestOta: " << text;
}; };
if (m_requests.empty()) { if (m_requests.empty()) {
task.task(); task.task();
@ -520,7 +519,7 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
m_h264Socket->close(); m_h264Socket->close();
}, },
Qt::SingleShotConnection); Qt::SingleShotConnection);
m_otaTimer->start(120 * 1000); m_otaTimer->start(60 * 1000);
}); });
QTimer::singleShot(25000, this, [this]() { QTimer::singleShot(25000, this, [this]() {
LOG(info) << "try connect after ota."; LOG(info) << "try connect after ota.";
@ -528,7 +527,23 @@ QString DeviceConnection::handleCommand(const std::string_view &replyText, const
m_h264Socket->connectToHost(m_infomation.ip, 8000); m_h264Socket->connectToHost(m_infomation.ip, 8000);
}); });
} else { } else {
emit otaProgressChanged(false, m_otaProgress, QString("升级失败,错误码: %1").arg(value.c_str())); const char *message = nullptr;
if (value == "3") {
message = "升级固件MD5校验错误(3)";
} else if (value == "4") {
message = "升级固件大小错误(4)";
} else if (value == "5") {
message = "升级固件太大(5)";
} else if (value == "6") {
message = "升级固件版本不匹配(6)";
}
QString tip;
if (message == nullptr) {
tip = QString("升级失败,错误码: %1").arg(value.c_str());
} else {
tip = QString("升级失败: %1").arg(message);
}
emit otaProgressChanged(false, m_otaProgress, tip);
} }
} else { } else {
LOG(warning) << "unknown reply: " << replyText; LOG(warning) << "unknown reply: " << replyText;

View File

@ -81,7 +81,7 @@ public:
* *
* @param file * @param file
*/ */
void requestOta(const QString &file); void requestOta(const QString &firmware, const QString &file);
signals: signals:
void connected(); void connected();