Merge branch '测试2' of http://192.168.1.22:3000/zhangwen/front_linux into 测试2

This commit is contained in:
lnk
2026-03-13 16:07:38 +08:00
6 changed files with 557 additions and 12 deletions

View File

@@ -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);//登录后测试实时
@@ -2321,8 +2338,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;
@@ -2438,6 +2457,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;