添加了文件管理:文件目录读取,文件下载功能

This commit is contained in:
zw
2025-07-30 13:52:52 +08:00
parent fff1312c6e
commit cc9d651b5a
5 changed files with 265 additions and 9 deletions

View File

@@ -68,7 +68,9 @@ void process_received_message(string mac, string id,const char* data, size_t len
std::cout << "cloud login: " << mac << " state: success!" << std::endl;
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ
//ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ
//ClientManager::instance().add_file_menu_action_to_device("D002","/etc");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ
//ClientManager::instance().add_file_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
}
if (udata[19] == 0x00) {
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
@@ -356,8 +358,21 @@ void process_received_message(string mac, string id,const char* data, size_t len
-1, //<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
);
//std::cout << js << std::endl;
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
//std::ofstream outFile("json.txt"); // <20>ȼ<EFBFBD><C8BC><EFBFBD> std::ofstream outFile(filePath, std::ios::out);
//if (outFile.is_open()) { // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
// outFile << js; // д<><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// outFile.close(); // <20>ر<EFBFBD><D8B1>ļ<EFBFBD>
// // <20>ɹ<EFBFBD><C9B9><EFBFBD>ʾ<EFBFBD><CABE>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>н<EFBFBD><D0BD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
//}
//else {
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
//}
queue_data_t data;
data.monitor_no = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data.strTopic = TOPIC_STAT;//ͳ<><CDB3>topic
@@ -605,7 +620,14 @@ void process_received_message(string mac, string id,const char* data, size_t len
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::string mac_dir = mac; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
std::string wavefile = "wave"; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (mkdir(wavefile.c_str(), 0777) != 0 && errno != EEXIST) {
std::cerr << "Failed to create directory: " << wavefile << std::endl;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::string mac_dir = wavefile + "/" + mac; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (mkdir(mac_dir.c_str(), 0777) != 0 && errno != EEXIST) {
std::cerr << "Failed to create directory: " << mac_dir << std::endl;
@@ -632,7 +654,142 @@ void process_received_message(string mac, string id,const char* data, size_t len
else {
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
std::cout << "udata[8]: " << static_cast<int>(udata[8]) << std::endl;
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
break;
case DeviceState::READING_FILEMENU:
//<2F><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼
std::cout << "READING_FILEMENU state: Processing stats time from " << mac << std::endl;
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_FileDir)) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD>С
const size_t struct_size = sizeof(tag_dir_info);
const uint8_t* data_ptr = parser.RecvData.data();
size_t data_size = parser.RecvData.size();
std::vector<tag_dir_info> FileList;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (size_t i = 0; i < data_size; i += struct_size) {
if (i + struct_size > data_size) break;
tag_dir_info dir_info;
memcpy(&dir_info, data_ptr + i, struct_size);
// <20>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA> (<28><><EFBFBD><EFBFBD> -> С<><D0A1>)
dir_info.flag = ntohl(dir_info.flag);
dir_info.size = ntohl(dir_info.size);
std::string gbk_name(dir_info.name, strnlen(dir_info.name, sizeof(dir_info.name)));
// <20><>ӡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
std::cout << "file name:" << gbk_name << std::endl;
// <20><><EFBFBD>ӵ<EFBFBD><D3B5>ļ<EFBFBD><C4BC>б<EFBFBD>
FileList.push_back(dir_info);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1><EFBFBD><EFBFBD>߼<EFBFBD>
// <20><><EFBFBD><EFBFBD>: send_file_list(FileList);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
else {
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ݴ<EFBFBD><DDB4>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
break;
case DeviceState::READING_FILEDATA:
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>̬<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::cout << "READING_FILEDATA state: Processing stats time from " << mac << std::endl;
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_File_Download))
{
// <20><>ȡ<EFBFBD><C8A1>ǰ֡<C7B0><D6A1><EFBFBD>ţ<EFBFBD>12-15<31>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int current_frame = (static_cast<int>(udata[12]) << 24) |
(static_cast<int>(udata[13]) << 16) |
(static_cast<int>(udata[14]) << 8) |
static_cast<int>(udata[15]);
// <20><>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>16-19<31>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int total_frames = (static_cast<int>(udata[16]) << 24) |
(static_cast<int>(udata[17]) << 16) |
(static_cast<int>(udata[18]) << 8) |
static_cast<int>(udata[19]);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
const uint8_t* data_ptr = parser.RecvData.data() + 14;
size_t data_size = parser.RecvData.size() - 14;
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD>¼<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
if (current_frame == 1) {
ClientManager::DownloadInfo info;
if (ClientManager::instance().parse_download_packet(id, info)) {
ClientManager::instance().update_current_filename(id, info.filename);
}
}
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
std::string filename = ClientManager::instance().get_current_filename(id);
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
ClientManager::instance().add_file_packet_to_device(id, current_frame, data_ptr, data_size);
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ<EFBFBD><C8AB>δ<EFBFBD><CEB4>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ģ<EFBFBD><C4A3><EFBFBD>ȫ<EFBFBD><C8AB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (current_frame < total_frames) {
// δ<><CEB4>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD>״̬,<2C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸ĵ<DEB8><C4B5>±<EFBFBD><C2B1><EFBFBD>
int nextframe = current_frame + 1;
auto downloadMsg = generate_downloadfile_message(nextframe, filename);
ClientManager::instance().change_device_state(id, DeviceState::READING_FILEDATA, downloadMsg);
}
else {
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::cout << "mac: " << mac << " fileinfo: " << filename << std::endl;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>з<EFBFBD>Ƭ
auto packets = ClientManager::instance().get_and_clear_file_packets(id);
// <20>ϲ<EFBFBD><CFB2>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
std::vector<unsigned char> file_data;
for (const auto& packet : packets) {
file_data.insert(file_data.end(), packet.begin(), packet.end());
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::string wavefile = "download"; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (mkdir(wavefile.c_str(), 0777) != 0 && errno != EEXIST) {
std::cerr << "Failed to create directory: " << wavefile << std::endl;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
std::string mac_dir = wavefile + "/" + mac; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (mkdir(mac_dir.c_str(), 0777) != 0 && errno != EEXIST) {
std::cerr << "Failed to create directory: " << mac_dir << std::endl;
}
std::string path = extract_filename(filename);
std::string file_path = mac_dir + "/" + path;
std::ofstream out_file(file_path, std::ios::binary);
if (out_file) {
out_file.write(reinterpret_cast<const char*>(file_data.data()),
file_data.size());
std::cout << "File saved: " << file_path << std::endl;
}
else {
std::cerr << "Failed to save file: " << file_path
<< ", Error: " << strerror(errno) << std::endl;
}
//<2F><>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>أ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>еȺ<D0B5><C8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>״̬<D7B4><CCAC>ֱ<EFBFBD>ӾͻῪʼ<E1BFAA><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
}
else {
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
break;