添加了文件管理:文件目录读取,文件下载功能
This commit is contained in:
@@ -391,3 +391,18 @@ std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const s
|
|||||||
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
return GetMsg(dataBuf, static_cast<unsigned char>(MsgRequestType::Request_File_Download));
|
return GetMsg(dataBuf, static_cast<unsigned char>(MsgRequestType::Request_File_Download));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//<2F>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
|
||||||
|
std::vector<unsigned char> generate_getfilemenu_message(const std::string& filedir) {
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>131<33>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD> (3 + 128)<29><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
|
||||||
|
std::vector<unsigned char> dataBuf(131, 0x00);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>3<EFBFBD><33>ʼ<EFBFBD><CABC>
|
||||||
|
size_t copyLen = std::min(filedir.size(), static_cast<size_t>(128));
|
||||||
|
if (copyLen > 0) {
|
||||||
|
memcpy(dataBuf.data() + 3, filedir.c_str(), copyLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
return GetMsg(dataBuf, static_cast<unsigned char>(MsgRequestType::Request_FileDir));
|
||||||
|
}
|
||||||
@@ -25,7 +25,9 @@ enum class MsgRequestType : unsigned char {
|
|||||||
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||||
Request_New_3S = 0x04,
|
Request_New_3S = 0x04,
|
||||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
|
||||||
Request_File_Download = 0x07
|
Request_File_Download = 0x07,
|
||||||
|
//ѯ<><D1AF><EFBFBD>ļ<EFBFBD>Ŀ¼
|
||||||
|
Request_FileDir = 0x02
|
||||||
};
|
};
|
||||||
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||||
enum class MsgResponseType : unsigned char {
|
enum class MsgResponseType : unsigned char {
|
||||||
@@ -40,7 +42,9 @@ enum class MsgResponseType : unsigned char {
|
|||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD>¼<EFBFBD>
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD>¼<EFBFBD>
|
||||||
Response_ActiveSOEInfo = 0x17,
|
Response_ActiveSOEInfo = 0x17,
|
||||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
|
||||||
Response_File_Download = 0x87
|
Response_File_Download = 0x87,
|
||||||
|
//ѯ<><D1AF><EFBFBD>ļ<EFBFBD>Ŀ¼
|
||||||
|
Response_FileDir = 0x82
|
||||||
};
|
};
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
||||||
class MessageParser {
|
class MessageParser {
|
||||||
@@ -2048,6 +2052,15 @@ struct QVVRRecord {
|
|||||||
QVVRRecord DynamicLog_GetQVVRRecordFromLogBuffer(const std::string& strScale, uint32_t nPTType, float fPT, const NewTaglogbuffer& log);
|
QVVRRecord DynamicLog_GetQVVRRecordFromLogBuffer(const std::string& strScale, uint32_t nPTType, float fPT, const NewTaglogbuffer& log);
|
||||||
//<2F><>̬<EFBFBD><CCAC><EFBFBD>ؽṹ-------------------------------
|
//<2F><>̬<EFBFBD><CCAC><EFBFBD>ؽṹ-------------------------------
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9> (1<>ֽڶ<D6BD><DAB6><EFBFBD>)
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
struct tag_dir_info {
|
||||||
|
int32_t flag; // 0-Ŀ¼<C4BF><C2BC>1-<2D>ļ<EFBFBD>
|
||||||
|
char name[64]; // <20>ļ<EFBFBD><C4BC><EFBFBD>/Ŀ¼<C4BF><C2BC>
|
||||||
|
uint32_t size; // <20>ļ<EFBFBD><C4BC><EFBFBD>С
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
||||||
std::vector<unsigned char> generate_binary_message(
|
std::vector<unsigned char> generate_binary_message(
|
||||||
uint16_t msg_type,
|
uint16_t msg_type,
|
||||||
@@ -2063,3 +2076,5 @@ std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_
|
|||||||
std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo, unsigned char StaTtype, unsigned char flag);
|
std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo, unsigned char StaTtype, unsigned char flag);
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const std::string& fileName);
|
std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const std::string& fileName);
|
||||||
|
//<2F>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
|
||||||
|
std::vector<unsigned char> generate_getfilemenu_message(const std::string& filedir);
|
||||||
@@ -992,6 +992,7 @@ bool ClientManager::clear_float_cache(const std::string& identifier) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//实时数据调用
|
||||||
bool ClientManager::set_real_state_count(const std::string& identifier, int count, ushort point_id) {
|
bool ClientManager::set_real_state_count(const std::string& identifier, int count, ushort point_id) {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
@@ -1020,6 +1021,66 @@ bool ClientManager::set_real_state_count(const std::string& identifier, int coun
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//读取文件目录调用
|
||||||
|
bool ClientManager::add_file_menu_action_to_device(
|
||||||
|
const std::string& identifier,
|
||||||
|
const std::string& file_path)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
// 查找匹配的设备
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier)
|
||||||
|
{
|
||||||
|
// 生成文件目录读取报文
|
||||||
|
auto packet = generate_getfilemenu_message(file_path);
|
||||||
|
|
||||||
|
// 添加动作到队列 (状态: 读取文件目录)
|
||||||
|
ctx->add_action(DeviceState::READING_FILEMENU, packet);
|
||||||
|
|
||||||
|
// 如果当前空闲则立即执行
|
||||||
|
if (ctx->current_state_ == DeviceState::IDLE) {
|
||||||
|
ctx->process_next_action();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true; // 成功添加
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false; // 设备未找到
|
||||||
|
}
|
||||||
|
|
||||||
|
//文件下载调用
|
||||||
|
bool ClientManager::add_file_download_action_to_device(
|
||||||
|
const std::string& identifier,
|
||||||
|
const std::string& file_path)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
|
||||||
|
// 查找匹配的设备
|
||||||
|
for (auto& pair : clients_) {
|
||||||
|
auto& ctx = pair.second;
|
||||||
|
if (ctx->device_info.device_id == identifier ||
|
||||||
|
ctx->device_info.mac == identifier)
|
||||||
|
{
|
||||||
|
// 生成下载请求报文 (帧序号固定为1,代表开始新文件的下载)
|
||||||
|
auto downloadMsg = generate_downloadfile_message(1, file_path);
|
||||||
|
|
||||||
|
// 添加动作到队列 (状态: 读取文件目录)
|
||||||
|
ctx->add_action(DeviceState::READING_FILEDATA, downloadMsg);
|
||||||
|
|
||||||
|
// 如果当前空闲则立即执行
|
||||||
|
if (ctx->current_state_ == DeviceState::IDLE) {
|
||||||
|
ctx->process_next_action();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true; // 成功添加
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false; // 设备未找到
|
||||||
|
}
|
||||||
|
|
||||||
bool ClientManager::get_point_scale_and_pttype(const std::string& identifier,
|
bool ClientManager::get_point_scale_and_pttype(const std::string& identifier,
|
||||||
ushort nCpuNo,
|
ushort nCpuNo,
|
||||||
std::string& out_scale,
|
std::string& out_scale,
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ enum class DeviceState {
|
|||||||
READING_STATS_TIME, // <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>
|
READING_STATS_TIME, // <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>
|
||||||
READING_REALSTAT, // <20><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
READING_REALSTAT, // <20><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||||
READING_EVENTFILE, // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
READING_EVENTFILE, // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
READING_FILEMENU, // <20><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼
|
||||||
|
READING_FILEDATA, // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
||||||
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
||||||
};
|
};
|
||||||
@@ -302,9 +304,6 @@ public:
|
|||||||
// <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8>㻺<EFBFBD><E3BBBA>
|
// <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8>㻺<EFBFBD><E3BBBA>
|
||||||
bool clear_float_cache(const std::string& identifier);
|
bool clear_float_cache(const std::string& identifier);
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
bool set_real_state_count(const std::string& identifier, int count, ushort point_id);
|
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
||||||
bool add_realtime_packet_to_device(const std::string& identifier,
|
bool add_realtime_packet_to_device(const std::string& identifier,
|
||||||
unsigned char packet_type,
|
unsigned char packet_type,
|
||||||
@@ -362,6 +361,15 @@ public:
|
|||||||
bool update_current_filename(const std::string& identifier, const std::string& filename);
|
bool update_current_filename(const std::string& identifier, const std::string& filename);
|
||||||
|
|
||||||
std::string get_current_filename(const std::string& identifier);
|
std::string get_current_filename(const std::string& identifier);
|
||||||
|
|
||||||
|
//<2F><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20>ļ<EFBFBD>·<EFBFBD><C2B7>
|
||||||
|
bool add_file_menu_action_to_device(const std::string& identifier, const std::string& file_path);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> ʵʱ<CAB5><CAB1><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
bool set_real_state_count(const std::string& identifier, int count, ushort point_id);
|
||||||
|
|
||||||
|
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20>ļ<EFBFBD>λ<EFBFBD><CEBB>
|
||||||
|
bool add_file_download_action_to_device(const std::string& identifier, const std::string& file_path);
|
||||||
private:
|
private:
|
||||||
ClientManager() : loop_(nullptr) {}
|
ClientManager() : loop_(nullptr) {}
|
||||||
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
||||||
|
|||||||
@@ -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;
|
std::cout << "cloud login: " << mac << " state: success!" << std::endl;
|
||||||
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
|
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
|
||||||
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<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) {
|
if (udata[19] == 0x00) {
|
||||||
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
|
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
|
-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>
|
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
);
|
);
|
||||||
|
|
||||||
//std::cout << js << std::endl;
|
//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;
|
queue_data_t data;
|
||||||
data.monitor_no = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
data.monitor_no = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
data.strTopic = TOPIC_STAT;//ͳ<><CDB3>topic
|
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>
|
// <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>
|
// <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) {
|
if (mkdir(mac_dir.c_str(), 0777) != 0 && errno != EEXIST) {
|
||||||
std::cerr << "Failed to create directory: " << mac_dir << std::endl;
|
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 {
|
else {
|
||||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
// װ<>ô<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>
|
// <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);
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user