修改了装置重启方式,去除了外部调用的校验流程,现在直接在内部自动完成。
新增了装置升级的正式流程。
This commit is contained in:
@@ -132,6 +132,21 @@ std::vector<uint8_t> GeneratePreUpgradeFileFromLengthBytes(uint32_t fileLen)
|
||||
return fileData;
|
||||
}
|
||||
|
||||
// 读取文件为二进制字节数组
|
||||
std::vector<unsigned char> read_file_as_bytes(const std::string& file_path)
|
||||
{
|
||||
std::ifstream file(file_path, std::ios::binary);
|
||||
if (!file.is_open()) {
|
||||
std::cerr << "打开文件失败: " << file_path << std::endl;
|
||||
return {};
|
||||
}
|
||||
|
||||
return std::vector<unsigned char>(
|
||||
std::istreambuf_iterator<char>(file),
|
||||
std::istreambuf_iterator<char>()
|
||||
);
|
||||
}
|
||||
|
||||
//消息处理逻辑
|
||||
void process_received_message(string mac, string id,const char* data, size_t length) {
|
||||
// 实际的消息处理逻辑
|
||||
@@ -160,9 +175,11 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
ClientManager::instance().set_cloud_status(id, 1); //设置了云前置登录状态为已登录
|
||||
ClientManager::instance().read_devversion_action_to_device(id);//主动触发,读取装置版本配置信息,仅在装置登录后执行一次,当前获取版本信息确认对时报文结构。
|
||||
|
||||
ClientManager::instance().set_preupgrade_action_to_device(id, "");//装置升级预校验流程 校验文件自动生成 当前填空
|
||||
//ClientManager::instance().set_ctrl_action_to_device(id,0x01,0x00);//尝试装置重启指令!第一步校验
|
||||
//ClientManager::instance().set_ctrl_action_to_device(id, 0x01, 0x01);//尝试装置重启指令!校验完毕后尝试执行重启指令
|
||||
//std::vector<unsigned char> file_data = read_file_as_bytes("pqs_arm2.bin");
|
||||
//ClientManager::instance().send_upgrade_action_to_device(id, file_data,10240);//默认单帧最大10240
|
||||
|
||||
//ClientManager::instance().set_preupgrade_action_to_device(id, "");//装置升级预校验流程 校验文件自动生成 当前填空
|
||||
//ClientManager::instance().set_ctrl_action_to_device(id,0x01,0x00);//尝试装置重启指令!
|
||||
|
||||
//ClientManager::instance().get_dev_status(id);//设备在线情况判断 ture在线 false离线
|
||||
//ClientManager::instance().set_real_state_count("D002", 1,1);//登录后测试实时
|
||||
@@ -2310,8 +2327,10 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
if (udata[9] == 0x01) {
|
||||
//当前仅检查0x01复位指令!其余控制指令全部依照不合法处理!
|
||||
std::cout << "***ctrl do next" << mac << std::endl;
|
||||
//控制命令校验合法,调整为空闲,处理后续工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
|
||||
//校验完毕后直接准备重启
|
||||
auto packet = generate_control_message(0x01, 0x01);
|
||||
ClientManager::instance().change_device_state(id, DeviceState::SET_CTRL, packet);
|
||||
}
|
||||
else {
|
||||
std::cout << "***ctrl fail" << mac << std::endl;
|
||||
@@ -2427,6 +2446,95 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::SET_UPGRADE:
|
||||
//装置升级
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Upgrade)) {
|
||||
//接收到最终的升级验证报文
|
||||
if (udata[9] == 0x01) {
|
||||
//接收文件成功,下发开始升级指令
|
||||
//事件不插入队列,直接修改装置最新状态,防止外部其他指令打断更新流程
|
||||
std::cout << "*** upgrade 0x01 do next ***!" << mac << std::endl;
|
||||
auto sendbuff = generate_upgrade_end_message();
|
||||
ClientManager::instance().change_device_state(id, DeviceState::SET_UPGRADE, sendbuff);
|
||||
}
|
||||
else if (udata[9] == 0x02) {
|
||||
//接收文件错误!
|
||||
std::cout << "*** upgrade 0x02 fail ***!" << mac << std::endl;
|
||||
// 升级流程失败,调整为空闲状态,处理下一项工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else if (udata[9] == 0x55) {
|
||||
//升级流程成功,等候装置重启
|
||||
std::cout << "*** upgrade 0x55 success ***!" << mac << std::endl;
|
||||
// 升级流程失败,调整为空闲状态,处理下一项工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else if (udata[9] == 0xAA) {
|
||||
// 升级流程失败!
|
||||
std::cout << "*** upgrade 0xAA fail ***!" << mac << std::endl;
|
||||
// 升级流程失败,调整为空闲状态,处理下一项工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else {
|
||||
std::cout << "*** upgrade ?? error ***!" << mac << std::endl;
|
||||
// 升级流程失败,调整为空闲状态,处理下一项工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
}
|
||||
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewACK)) {
|
||||
uint32_t current_frame_index = 0;//当前帧
|
||||
uint32_t total_frames = 0;//总帧数
|
||||
bool all_sent = false;
|
||||
std::vector<unsigned char> packet;//报文流
|
||||
|
||||
bool ok = ClientManager::instance().try_get_next_upgrade_packet_to_device(
|
||||
id,
|
||||
current_frame_index,
|
||||
total_frames,
|
||||
all_sent,
|
||||
packet
|
||||
);
|
||||
|
||||
if (!ok) {
|
||||
//组装后续升级报文时出现异常,无法发送后续帧文件
|
||||
std::cout << "获取下一帧失败\n";
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else if (!packet.empty()) {
|
||||
// 只要拿到了报文,就先发送
|
||||
std::cout << "已生成并发送下一帧,当前进度: "
|
||||
<< current_frame_index << "/" << total_frames << std::endl;
|
||||
|
||||
ClientManager::instance().change_device_state(id, DeviceState::SET_UPGRADE, packet);
|
||||
|
||||
if (all_sent) {
|
||||
std::cout << "最后一帧已发出,后续等待装置消息\n";
|
||||
}
|
||||
}
|
||||
else if (all_sent) {
|
||||
// 没有新报文可发,说明之前已经全部发完
|
||||
std::cout << "所有帧都已发送完毕,等待装置消息\n";
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// 理论上不该走到这里,防御处理
|
||||
std::cout << "未获取到有效升级报文\n";
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
}
|
||||
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewNACK)) {
|
||||
std::cout << "*** upgrade 0x41 fail ***!" << mac << std::endl;
|
||||
// 升级流程失败,调整为空闲状态,处理下一项工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else {
|
||||
// 装置答非所问异常
|
||||
std::cout << "*** upgrade ?? fail ***!" << mac << std::endl;
|
||||
// 升级流程失败,调整为空闲状态,处理下一项工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::CUSTOM_ACTION:
|
||||
// 自定义动作状态
|
||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||
|
||||
Reference in New Issue
Block a user