diff --git a/LFtid1056.rar b/LFtid1056.rar new file mode 100644 index 0000000..1c18161 Binary files /dev/null and b/LFtid1056.rar differ diff --git a/LFtid1056/PQSMsg.cpp b/LFtid1056/PQSMsg.cpp index 68a8d9d..8372e90 100644 --- a/LFtid1056/PQSMsg.cpp +++ b/LFtid1056/PQSMsg.cpp @@ -367,6 +367,15 @@ std::vector generate_frontlogin_message(const std::string& strMac // 结束符 packet[packetSize - 1] = 0x16; + //lnk20250808 + // ======= 调试输出报文 ======= + std::cout << "[generate_frontlogin_message] Packet (" << packet.size() << " bytes):\n"; + for (size_t i = 0; i < packet.size(); ++i) { + printf("%02X ", packet[i]); + if ((i + 1) % 16 == 0) printf("\n"); + } + if (packet.size() % 16 != 0) printf("\n"); + return packet; } diff --git a/LFtid1056/cloudfront/code/cfg_parser.cpp b/LFtid1056/cloudfront/code/cfg_parser.cpp index 3ef7ae6..11ba5fa 100644 --- a/LFtid1056/cloudfront/code/cfg_parser.cpp +++ b/LFtid1056/cloudfront/code/cfg_parser.cpp @@ -173,6 +173,10 @@ std::string G_MQCONSUMER_TOPIC_LOG = "";//consumer topie std::string G_MQCONSUMER_TAG_LOG = "";//consumer tag std::string G_MQCONSUMER_KEY_LOG = "";//consumer key +std::string G_MQCONSUMER_TOPIC_CLOUD = "";//consumer topie +std::string G_MQCONSUMER_TAG_CLOUD = "";//consumer tag +std::string G_MQCONSUMER_KEY_CLOUD = "";//consumer key + //娴嬭瘯鐢ㄧ殑涓婚 std::string G_ROCKETMQ_TOPIC_TEST = "";//topie std::string G_ROCKETMQ_TAG_TEST = "";//tag @@ -315,6 +319,10 @@ void loadConfig(const std::string& filename) { strMap["RocketMq.ConsumerTagLOG"] = &G_MQCONSUMER_TAG_LOG; strMap["RocketMq.ConsumerKeyLOG"] = &G_MQCONSUMER_KEY_LOG; + strMap["RocketMq.ConsumerTopicCLOUD"] = &G_MQCONSUMER_TOPIC_CLOUD; + strMap["RocketMq.ConsumerTagCLOUD"] = &G_MQCONSUMER_TAG_CLOUD; + strMap["RocketMq.ConsumerKeyCLOUD"] = &G_MQCONSUMER_KEY_CLOUD; + strMap["RocketMq.Topic_Test"] = &G_ROCKETMQ_TOPIC_TEST; strMap["RocketMq.Tag_Test"] = &G_ROCKETMQ_TAG_TEST; strMap["RocketMq.Key_Test"] = &G_ROCKETMQ_KEY_TEST; @@ -2724,6 +2732,7 @@ bool compare_qvvr_and_file(const std::string& cfg_path, const std::vector lock(ledgermtx); + for (auto &dev : terminal_devlist) { + if (dev.terminal_id == devid) { + return normalize_mac(dev.addr_str); // 瑙勮寖鍖栧悗杩斿洖 + } + } + return {}; // 娌℃壘鍒拌繑鍥炵┖涓 +} +////////////////////////////////////////////////////////////////////////////////////////鐩綍淇℃伅鍙戦佹帴鍙e嚱鏁 + +bool send_file_list(const std::string &dev_id, const std::vector &FileList) { + // 鎵惧埌瀵瑰簲 terminal_dev + std::lock_guard lock(ledgermtx); + + auto it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(), + [&](const terminal_dev &dev) { return dev.terminal_id == dev_id; }); + if (it == terminal_devlist.end()) { + std::cerr << "[send_file_list] device not found: " << dev_id << std::endl; + return false; + } + + terminal_dev &dev = *it; + + // 鍒ゆ柇 isbusy==1 涓 busytype==READING_FILEMENU + if (dev.isbusy != 1 || dev.busytype != static_cast(DeviceState::READING_FILEMENU)) { + std::cerr << "[send_file_list] device not in READING_FILEMENU state." << std::endl; + return false; + } + + // 鏋勯 JSON 鎶ユ枃 + nlohmann::json j; + j["guid"] = dev.guid; + j["FrontIP"] = FRONT_IP; // 杩欓噷濉綘鐨勫墠缃満 IP + j["Node"] = g_front_seg_index; // 鑺傜偣鍙 + j["Dev_mac"] = normalize_mac(dev.addr_str); // addr_str 瀛樼殑鏄 MAC + + // 鏋勯 DirInfo 鏁扮粍 + nlohmann::json dirArray = nlohmann::json::array(); + for (const auto &f : FileList) { + nlohmann::json item; + item["Name"] = f.name; + item["Type"] = (f.flag == 0) ? "dir" : "file"; + item["Size"] = f.size; + dirArray.push_back(item); + } + + // 鏋勯 Detail 閮ㄥ垎 + nlohmann::json detail; + detail["Type"] = 0x2131; // 璇诲彇鐩綍 + detail["Msg"] = { {"DirInfo", dirArray} }; + detail["Code"] = 200; // 璇锋眰鎴愬姛 + + // 鏀惧埌椤跺眰 + j["Detail"] = detail; + + // 鎵撳嵃璋冭瘯 + std::cout << j.dump(4) << std::endl; + + // ---- 鍏ラ槦鍙戦 ---- + queue_data_t connect_info; + connect_info.strTopic = Topic_Reply_Topic; + connect_info.strText = j.dump(); // 搴忓垪鍖栦负瀛楃涓 + { + std::lock_guard lock(queue_data_list_mutex); + queue_data_list.push_back(std::move(connect_info)); + } + // 璋冭瘯鎵撳嵃 + std::cout << "[send_reply_to_cloud] queued: " << j.dump() << std::endl; + + //鍙戦佸悗娓呴櫎guid鍜屾爣蹇 + if (dev.isbusy > 0) { + dev.isbusy--; + } + if(dev.isbusy == 0){ + dev.guid.clear(); + dev.busytype = 0; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////妫鏌ヤ簯鍓嶇疆缁堢鐨刴q涓氬姟瓒呮椂 +int get_type_by_state(int state) { + switch (static_cast(state)) { + case DeviceState::READING_STATS: + case DeviceState::READING_STATS_TIME: + case DeviceState::READING_REALSTAT: + case DeviceState::READING_FIXEDVALUE: + case DeviceState::READING_FIXEDVALUEDES: + case DeviceState::SET_FIXEDVALUE: + case DeviceState::READING_INTERFIXEDVALUE: + case DeviceState::READING_INTERFIXEDVALUEDES: + case DeviceState::READING_CONTROLWORD: + case DeviceState::SET_INTERFIXEDVALUE: + return 0x2106; + + case DeviceState::READING_FILEMENU: + return 0x2131; + + case DeviceState::READING_EVENTFILE: + case DeviceState::READING_FILEDATA: + return 0x2132; + + default: + return 0; // 娌℃湁瀵瑰簲鐨則ype + } +} + +// 瀹氭椂妫鏌ヤ笟鍔¤秴鏃 +void check_device_busy_timeout() +{ + std::lock_guard lock(ledgermtx); + for (auto &dev : terminal_devlist) + { + if (dev.isbusy != 0) // 鏈変笟鍔″湪杩涜 + { + dev.busytimecount++; + + if (dev.busytype == static_cast(DeviceState::READING_FILEDATA)) //涓嬭浇鏂囦欢涓氬姟 + { + if (dev.busytimecount > 30) + { + std::cout << "[Timeout] Device " << dev.terminal_id + << " busytype=READING_FILEMENU 瓒呮椂(" + << dev.busytimecount << "s)" << std::endl; + + //鍙戦佽秴鏃跺搷搴 + send_reply_to_cloud(static_cast(ResponseCode::BAD_REQUEST),dev.terminal_id,get_type_by_state(dev.busytype)); + + // 瓒呮椂娓呯┖鐘舵 + dev.guid.clear(); // 娓呯┖杩涜涓殑 guid + dev.busytype = 0; // 澶嶄綅涓氬姟绫诲瀷 + dev.isbusy = 0; // 鏍囪绌洪棽 + dev.busytimecount = 0; // 璁℃椂娓呴浂 + } + } + else //鍏朵粬涓氬姟 + { + if (dev.busytimecount > 10) + { + std::cout << "[Timeout] Device " << dev.terminal_id + << " busytype=" << dev.busytype + << " 瓒呮椂(" << dev.busytimecount << "s)" << std::endl; + // 瓒呮椂娓呯┖鐘舵 + dev.guid.clear(); + dev.busytype = 0; + dev.isbusy = 0; + dev.busytimecount = 0; + } + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////////// 涓鍒嗛挓璋冪敤涓娆★細妫鏌 qvvr_file 瓒呮椂骞跺浠 +static bool ensure_dir_exists(const std::string &path) +{ + struct stat st; + if (stat(path.c_str(), &st) == 0) { + if (S_ISDIR(st.st_mode)) { + return true; // 宸插瓨鍦 + } + return false; // 瀛樺湪浣嗕笉鏄洰褰 + } + // 涓嶅瓨鍦ㄥ垯鍒涘缓 + if (mkdir(path.c_str(), 0755) == 0) { + return true; + } + return false; +} + +void check_and_backup_qvvr_files() { + std::lock_guard lock(ledgermtx); + + const std::string data_dir = FRONT_PATH + "/data"; + const std::string backup_dir = data_dir + "/comtrade_bak"; + + if (!ensure_dir_exists(data_dir) && !ensure_dir_exists(data_dir)) { + std::cerr << "[check_and_backup_qvvr_files] 鍒涘缓 data 鐩綍澶辫触\n"; + return; + } + if (!ensure_dir_exists(backup_dir) && !ensure_dir_exists(backup_dir)) { + std::cerr << "[check_and_backup_qvvr_files] 鍒涘缓 comtrade_bak 鐩綍澶辫触\n"; + return; + } + + for (auto &dev : terminal_devlist) { + for (auto &line : dev.line) { + + // 鐢ㄨ凯浠e櫒閬嶅巻锛屽厑璁稿湪寰幆涓 erase 褰撳墠鍏冪礌 + for (std::vector::iterator qit = line.qvvrevent.qvvrfile.begin(); + qit != line.qvvrevent.qvvrfile.end(); /* no ++ here */) { + + qvvr_file &qfile = *qit; + + if (!qfile.used_status) { + ++qit; + continue; + } + + ++qfile.file_time_count; // 姣忓垎閽+1 + + // 瓒呮椂闃堝硷細>10 鍒嗛挓 + if (qfile.file_time_count > 10) { + std::cout << "[Qvvr Timeout] dev=" << dev.terminal_id + << " -> move files to: " << backup_dir << std::endl; + + // 绉诲姩璇ヨ褰曞唴鐨勬墍鏈夋枃浠 + for (std::list::const_iterator it = qfile.file_download.begin(); + it != qfile.file_download.end(); ++it) { + const std::string &src = *it; + const size_t pos = src.find_last_of("/\\"); + const std::string base = (pos == std::string::npos) ? src : src.substr(pos + 1); + const std::string dst = backup_dir + "/" + base; + + if (rename(src.c_str(), dst.c_str()) != 0) { + std::cerr << " [ERROR] 绉诲姩澶辫触: " << src + << " -> " << dst << " , " << strerror(errno) << std::endl; + } else { + std::cout << " moved: " << src << " -> " << dst << std::endl; + } + } + + // 鉁 鐩存帴浠 qvvrfile 鍚戦噺涓垹闄よ繖鏉¤褰 + qit = line.qvvrevent.qvvrfile.erase(qit); + // 娉ㄦ剰锛氫笉鍐嶅 qfile 璇诲啓锛屽洜涓哄畠宸茶鍒犻櫎 + continue; // 涓嶈嚜澧烇紝鐢 erase 杩斿洖鐨勬柊杩唬鍣ㄧ户缁 + } + + ++qit; // 姝e父鍓嶈繘 + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////瀹氬间俊鎭彂閫佹帴鍙e嚱鏁 +bool save_set_value(const std::string &dev_id, unsigned char mp_index, const std::vector &fabsf) { + std::lock_guard lock(ledgermtx); + + // 1. 鎵惧埌瀵瑰簲 terminal_dev + auto it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(), + [&](const terminal_dev &dev) { return dev.terminal_id == dev_id; }); + if (it == terminal_devlist.end()) { + std::cerr << "[send_set_reply] device not found: " << dev_id << std::endl; + return false; + } + + terminal_dev &dev = *it; + + // 2. 妫鏌ョ姸鎬 + if (dev.isbusy != 2 || dev.busytype != static_cast(DeviceState::READING_FIXEDVALUE)) { + std::cerr << "[send_set_reply] device not in READING_FIXEDVALUE state." << std::endl; + return false; + } + + // 3. 閬嶅巻鐩戞祴鐐癸紝鎵惧埌 logical_device_seq == mp_index 鐨勭洃娴嬬偣 + bool found = false; + for (auto &mon : dev.line) { + if (std::atoi(mon.logical_device_seq.c_str()) == static_cast(mp_index)) { + // 鈽 娓呯悊鍘熸湁鐨 set_values + mon.set_values.clear(); + // 鈽 灏 fabsf 渚濇瀛樺叆璇ョ洃娴嬬偣鐨 set_values + for (const auto &val : fabsf) { + mon.set_values.push_back(val); + } + found = true; + break; + } + } + + if (!found) { + std::cerr << "[send_set_reply] monitor with seq=" << (int)mp_index + << " not found in terminal " << dev_id << std::endl; + return false; + } + + // 4. 鐘舵侀掑噺 + dev.isbusy--; + + return true; +} + +bool save_internal_value(const std::string &dev_id, const std::vector &fabsf) { + // 鎵惧埌瀵瑰簲 terminal_dev + std::lock_guard lock(ledgermtx); + + auto it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(), + [&](const terminal_dev &dev) { return dev.terminal_id == dev_id; }); + if (it == terminal_devlist.end()) { + std::cerr << "[send_set_reply] device not found: " << dev_id << std::endl; + return false; + } + + terminal_dev &dev = *it; + + // 鍒ゆ柇 isbusy==3 涓 busytype==READING_INTERFIXEDVALUE + if (dev.isbusy != 3 || dev.busytype != static_cast(DeviceState::READING_INTERFIXEDVALUE)) { + std::cerr << "[send_set_reply] device not in READING_INTERFIXEDVALUE state." << std::endl; + return false; + } + + // 鈽 鏂板锛氭竻鐞嗗師鏈夌殑鍐呴儴瀹氬煎垪琛 + dev.internal_values.clear(); + //灏嗗间弗鏍兼寜椤哄簭瀛樺叆list涓 + for (const auto &val : fabsf) { + dev.internal_values.push_back(val); + } + + dev.isbusy--; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////鍥炲瀹氬艰鍙栧搷搴 +bool send_set_value_reply(const std::string &dev_id, unsigned char mp_index, const std::vector &dz_info) { + std::lock_guard lock(ledgermtx); + + // 1) 鎵剧粓绔 + auto it = std::find_if(terminal_devlist.begin(), terminal_devlist.end(), + [&](const terminal_dev &d) { return d.terminal_id == dev_id; }); + if (it == terminal_devlist.end()) { + std::cerr << "[send_set_value_reply] device not found: " << dev_id << std::endl; + return false; + } + terminal_dev &dev = *it; + + // 2) 鏍¢獙鐘舵侊細鍙戦佲滃畾鍊艰鍙栫粨鏋溾濆洖澶嶏紝搴斿浜 READING_FIXEDVALUE锛沬sbusy == 1 + if (dev.isbusy != 1 || dev.busytype != static_cast(DeviceState::READING_FIXEDVALUE)) { //瀹氬艰鍙 + std::cerr << "[send_set_value_reply] device not in READING_FIXEDVALUE state." << std::endl; + return false; + } + + // 3) 瀹氫綅鐩戞祴鐐癸紙mp_index 鈭 [1,6]锛夛紝涓 logical_device_seq 姣斿 + ledger_monitor *pMon = nullptr; + for (auto &mon : dev.line) { + if (std::atoi(mon.logical_device_seq.c_str()) == static_cast(mp_index)) { + pMon = &mon; + break; + } + } + if (!pMon) { + std::cerr << "[send_set_value_reply] monitor with seq=" << (int)mp_index + << " not found in terminal " << dev_id << std::endl; + return false; + } + + // 4) 鍙栬鐩戞祴鐐圭殑 set_values锛屼弗鏍兼寜椤哄簭鐢ㄤ簬 DZ_Value + std::vector ordered_vals; + ordered_vals.reserve(pMon->set_values.size()); + for (float v : pMon->set_values) ordered_vals.push_back(v); + + if (ordered_vals.empty()) { + std::cerr << "[send_set_value_reply] monitor seq=" << (int)mp_index + << " has empty set_values." << std::endl; + return false; + } + + // 5) 鐢熸垚 JSON锛堢粨鏋勪弗鏍艰创鍚堜綘缁欑殑鏍蜂緥锛 + nlohmann::json j; + + // 椤跺眰 + j["guid"] = dev.guid; + j["FrontIP"] = FRONT_IP; // 浣犵殑鍓嶇疆鏈 IP锛堥」鐩凡鏈夊父閲/鍙橀噺锛 + j["Node"] = g_front_seg_index; // 鑺傜偣鍙凤紙椤圭洰宸叉湁鍙橀噺锛 + j["Dev_mac"] = normalize_mac(dev.addr_str); + + // Detail + nlohmann::json detail; + detail["Type"] = 0x2106; // 璁惧鏁版嵁 + + // Msg + nlohmann::json msg; + msg["Cldid"] = mp_index; //娴嬬偣搴忓彿 + msg["DataType"] = 0x0C; //瀹氬 + + // DataArray锛堝璞℃暟缁勶級锛氶愪釜濉厖锛孌Z_Value 涓ユ牸鎸 set_values 椤哄簭 + nlohmann::json dataArray = nlohmann::json::array(); + + const size_t n_meta = dz_info.size(); + const size_t n_vals = ordered_vals.size(); + const size_t n = std::min(n_meta, n_vals); // 浠ヤ袱鑰呰緝鐭暱搴︿负鍑 + + if (n_meta != n_vals) { + std::cerr << "[send_set_value_reply] warn: dz_info size(" << n_meta + << ") != set_values size(" << n_vals << "), will emit " << n << " items.\n"; + return false; // 鎴栬呯户缁彂閫侊紝瑙嗛渶姹傝屽畾 + } + + for (size_t i = 0; i < n; ++i) { + const DZ_TAB_STRUCT &dz = dz_info[i]; + nlohmann::json item; + item["LN_Num"] = dz.LN_Num; + item["DZ_Num"] = dz.DZ_Num; + item["DZ_Name"] = dz.DZ_Name; + item["DZ_Value"] = ordered_vals[i]; // 鈽 涓ユ牸鎸夐『搴 + item["DZ_Type"] = dz.DZ_Type; + item["DZ_Min"] = dz.DZ_Min; + item["DZ_Max"] = dz.DZ_Max; + item["DZ_Default"]= dz.DZ_Default; + item["DZ_UNIT"] = dz.DZ_UNIT; + dataArray.push_back(std::move(item)); + } + + msg["DataArray"] = std::move(dataArray); + detail["Msg"] = std::move(msg); + detail["Code"] = 200; + + j["Detail"] = std::move(detail); + + // 6) 鍏ラ槦鍙戦 + queue_data_t connect_info; + connect_info.strTopic = Topic_Reply_Topic; + connect_info.strText = j.dump(); // 搴忓垪鍖栦负瀛楃涓 + + { + std::lock_guard lk(queue_data_list_mutex); + queue_data_list.push_back(std::move(connect_info)); + } + + // 璋冭瘯鎵撳嵃 + std::cout << "[send_set_value_reply] queued JSON:\n" << j.dump(4) << std::endl; + + // 7) 鍙戦佸悗鏇存柊缁堢鐘舵侊紙鎸変綘鐜版湁瑙勫垯锛 + if (dev.isbusy > 0) { + dev.isbusy--; + } + if (dev.isbusy == 0) { + dev.guid.clear(); + dev.busytype = 0; + if (pMon) { + pMon->set_values.clear();//娓呯悊鏈瀹氬艰褰 + } + } + + return true; +} diff --git a/LFtid1056/cloudfront/code/interface.cpp b/LFtid1056/cloudfront/code/interface.cpp index f0a8117..7605517 100644 --- a/LFtid1056/cloudfront/code/interface.cpp +++ b/LFtid1056/cloudfront/code/interface.cpp @@ -48,9 +48,9 @@ std::vector terminal_devlist; std::mutex ledgermtx; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// -extern int g_front_seg_index; + extern int g_front_seg_num; -extern std::string FRONT_IP; + extern uint32_t g_node_id; //绛涢夌殑缁堢鐘舵:鏁扮粍銆0,1銆戠瓫閫夎繍琛屽拰鍦ㄨ繍 diff --git a/LFtid1056/cloudfront/code/interface.h b/LFtid1056/cloudfront/code/interface.h index 3f4008a..1a11cb0 100644 --- a/LFtid1056/cloudfront/code/interface.h +++ b/LFtid1056/cloudfront/code/interface.h @@ -98,13 +98,22 @@ public: double CT2; // 鐢垫祦鍙樻瘮2 qvvr_event qvvrevent; //鏆傛佷簨浠 + + //瀹氬糽ist + std::list set_values; }; //缁堢鍙拌处 class terminal_dev { public: - std::string guid; //鍙拌处鏇存柊鍥炲鐢 + std::string guid; //姝e湪杩涜鐨刧uid + int busytype; //涓氬姟绫诲瀷锛屼娇鐢ㄧ姸鎬佹満 + int isbusy; //涓氬姟杩涜鏍囧織 + int busytimecount; //涓氬姟杩涜璁℃椂 + + //鍐呴儴瀹氬糽ist + std::list internal_values; std::string terminal_id; std::string terminal_name; @@ -442,6 +451,19 @@ void to_json(nlohmann::json& j, const DataArrayItem& d); void to_json(nlohmann::json& j, const MsgObj& m); void to_json(nlohmann::json& j, const FullObj& f); +/////////////////////////////////////////////////////////////////////浜戝钩鍙颁笅鍙戞寚浠ょ殑瑙f瀽 +struct MsgParsed { + int type; // 鎸囦护缂栧彿 + std::string name; // 鏂囦欢鍚/鐩綍鍚 + int cldid; // 娴嬬偣鍙 + int datatype; // 鎸囦护缁嗗垎 + int operate; // 鎿嶄綔璇诲啓 + std::vector dataArray_f; // 瀹氬煎啓鍏ワ紝涓ユ牸鎸夌収椤哄簭 + std::vector dataArray_us; // 鍐呴儴瀹氬煎啓鍏ワ紝涓ユ牸鎸夌収椤哄簭 + + bool ok; +}; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////鎻愪緵缁欓氳閮ㄥ垎璋冪敤鐨勫嚱鏁 std::vector GenerateDeviceInfoFromLedger(const std::vector& terminal_devlist);//鎺ュ彛璇诲彇鍙拌处鍚庯紝鍐嶈皟鐢ㄨ繖涓皢鍙拌处鎷疯礉杩囨潵 @@ -472,10 +494,47 @@ bool assign_qvvr_file_list(const std::string& id, ushort nCpuNo, const std::vect //褰曟尝鏂囦欢涓嬭浇瀹屾垚閫氱煡鎺ュ彛 bool update_qvvr_file_download(const std::string& filename_with_mac, const std::string& terminal_id); +//涓婇佹枃浠跺垪琛ㄦ帴鍙 +bool send_file_list(const std::string &dev_id, const std::vector &FileList); + //鎻愬彇mac std::string normalize_mac(const std::string& mac); +std::string get_mac_by_devid(const std::string &devid); +//鏆傛佹枃浠惰秴鏃舵娴 +void check_and_backup_qvvr_files(); + +//涓氬姟瓒呮椂妫鏌 +void check_device_busy_timeout(); + +//涓氬姟鍝嶅簲 +void send_reply_to_cloud(int reply_code, const std::string& dev_id, int type); + +//鏌uid +std::string find_guid_index_from_dev_id(const std::string& dev_id); + +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +extern int g_front_seg_index; +extern std::string FRONT_IP; +extern std::string FRONT_PATH; + +extern std::string WEB_FILEUPLOAD; +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// 鍝嶅簲鐮佹灇涓 +enum class ResponseCode : int { + OK = 200, // 璇锋眰鎴愬姛 + ACCEPTED = 201, // 璇锋眰琚帴鍙楋紝寮濮嬪鐞 + PROCESSING = 202, // 璇锋眰琚帴鍙楋紝浣嗘槸鏈鐞嗗畬 + BAD_REQUEST = 400, // 璇锋眰澶辫触 + UNAUTHORIZED = 401, // 璇锋眰鏈璇/璁よ瘉閿欒锛堜笉鏀寔鐨勮姹傦級 + REJECTED_BUSY = 402, // 璇锋眰琚嫆缁濓紝鍦ㄥ鐞嗗悓绫诲懡浠 + FORBIDDEN = 403, // 璇锋眰琚嫆缁濓紙鏈煡鍘熷洜锛 + NOT_FOUND = 404, // 璇锋眰鐨勮祫婧愪笉瀛樺湪 + BUSY = 405, // 褰撳墠蹇欙紝鏃犳硶鍝嶅簲 + TIMEOUT = 406, // 璇锋眰瓒呭嚭浜嗙瓑寰呮椂闂 + INTERNAL_ERROR = 500 // 鍏朵粬閿欒 +}; #endif diff --git a/LFtid1056/cloudfront/code/main.cpp b/LFtid1056/cloudfront/code/main.cpp index c5f9599..f5d7004 100644 --- a/LFtid1056/cloudfront/code/main.cpp +++ b/LFtid1056/cloudfront/code/main.cpp @@ -344,18 +344,32 @@ void Front::OnTimerThread() std::this_thread::sleep_for(std::chrono::milliseconds(1000)); std::cout << "OnTimerThread::run() is called ...... \n"; - int counter = 0; + int hbCounter = 0; // 蹇冭烦璁℃暟 + int backupCounter = 0; // 澶囦唤璁℃暟锛堝垎閽熺敤锛 + send_heartbeat_to_queue("1"); while (!m_IsTimerCancel) { update_log_entries_countdown(); - if (counter >= 30) { + //涓氬姟瓒呮椂妫鏌 + check_device_busy_timeout(); + + // 姣 30 绉掑彂涓娆″績璺 + if (hbCounter >= 30) { send_heartbeat_to_queue("1"); - counter = 0; + hbCounter = 0; } - counter++; + + // 姣 60 绉掕皟鐢ㄤ竴娆″綍娉㈡枃浠舵鏌 + if (backupCounter >= 60) { + check_and_backup_qvvr_files(); + backupCounter = 0; + } + + hbCounter++; + backupCounter++; g_ontime_blocked_times = 0; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); @@ -366,7 +380,6 @@ void Front::OnTimerThread() std::cerr << "[OnTimerThread] Caught unknown exception" << std::endl; } - // 璁剧疆閲嶅惎鏍囧織 { std::lock_guard lock(m_threadCheckMutex); m_needRestartTimerThread = true; diff --git a/LFtid1056/cloudfront/code/rocketmq.cpp b/LFtid1056/cloudfront/code/rocketmq.cpp index 1147ae9..caaf4e9 100644 --- a/LFtid1056/cloudfront/code/rocketmq.cpp +++ b/LFtid1056/cloudfront/code/rocketmq.cpp @@ -62,7 +62,6 @@ static rocketmq::RocketMQProducer* g_producer = nullptr; //鐢熶骇鑰 //鍓嶇疆杩涚▼ extern unsigned int g_node_id; -extern int g_front_seg_index; extern std::string subdir; extern std::string FRONT_INST; @@ -341,6 +340,7 @@ void my_rocketmq_send(queue_data_t& data,rocketmq::RocketMQProducer* producer) /////////////////////////////////////////////////////////////////////////////////////////////////鏌ユ壘鍙拌处涓嬫爣 // 鏍规嵁缁堢 ID 鏌ユ壘 terminal_devlist 涓殑绱㈠紩锛屾壘涓嶅埌杩斿洖 -1 int find_dev_index_from_dev_id(const std::string& dev_id) { + std::lock_guard lock(ledgermtx); for (size_t i = 0; i < terminal_devlist.size(); ++i) { if (terminal_devlist[i].terminal_id == dev_id) { return static_cast(i); @@ -350,6 +350,7 @@ int find_dev_index_from_dev_id(const std::string& dev_id) { } int find_mp_index_from_mp_id(const std::string& mp_id) { + std::lock_guard lock(ledgermtx); for (const auto& dev : terminal_devlist) { for (size_t j = 0; j < dev.line.size(); ++j) { if (dev.line[j].monitor_id == mp_id) { @@ -360,6 +361,16 @@ int find_mp_index_from_mp_id(const std::string& mp_id) { return -1; // 鏈壘鍒 } +std::string find_guid_index_from_dev_id(const std::string& dev_id) { + std::lock_guard lock(ledgermtx); + for (size_t i = 0; i < terminal_devlist.size(); ++i) { + if (terminal_devlist[i].terminal_id == dev_id) { + return terminal_devlist[i].guid; + } + } + return ""; // 鏈壘鍒 +} + /////////////////////////////////////////////////////////////////////////////////////////////////鍥炶皟鍑芥暟鐨刯son澶勭悊 std::string parseJsonMessageRC(const std::string& inputJson) { @@ -1617,3 +1628,431 @@ void rocketmq_test_rc(Front* front)//鐢ㄦ潵娴嬭瘯琛ユ嫑 queue_data_list.push_back(data); } +////////////////////////////////////////////////////////////////////////////////////////////////////////////浜戝墠缃柊澧炲姛鑳 + +bool parseJsonMessageCLOUD(const std::string &body, + std::string &devid, + std::string &guid, + nlohmann::json &detailObj, // 杩欓噷杩斿洖鏁翠釜 Detail + std::string &front_ip, // 鏂板锛氳繑鍥 FrontIP + int &node) // 鏂板锛氳繑鍥 Node +{ + try { + auto j = nlohmann::json::parse(body); + + // guid + if (j.contains("guid") && j["guid"].is_string()) { + guid = j["guid"].get(); + } else { + guid.clear(); + } + + // FrontIP + if (j.contains("FrontIP") && j["FrontIP"].is_string()) { + front_ip = j["FrontIP"].get(); + } else { + front_ip.clear(); + } + + // Node + if (j.contains("Node") && j["Node"].is_number_integer()) { + node = j["Node"].get(); + } else { + node = 0; + } + + // Dev_id锛堝吋瀹瑰瓧绗︿覆鎴栨暟瀛楋級 + if (j.contains("Dev_id")) { + if (j["Dev_id"].is_string()) { + devid = j["Dev_id"].get(); + } else if (j["Dev_id"].is_number_integer()) { + devid = std::to_string(j["Dev_id"].get()); + } else if (j["Dev_id"].is_number_unsigned()) { + devid = std::to_string(j["Dev_id"].get()); + } else if (j["Dev_id"].is_number_float()) { + devid = std::to_string(j["Dev_id"].get()); + } else { + devid.clear(); + } + } else { + devid.clear(); + } + + // Detail锛堝畬鏁存斁鍏 detailObj + if (j.contains("Detail") && j["Detail"].is_object()) { + detailObj = j["Detail"]; // 鐩存帴淇濆瓨鏁翠釜 Detail + } else { + detailObj = nlohmann::json::object(); + } + + return true; + } + catch (const std::exception &e) { + std::cerr << "[parseJsonMessageCLOUD] JSON parse error: " << e.what() << "\n"; + guid.clear(); + devid.clear(); + front_ip.clear(); + node = 0; + detailObj = nlohmann::json::object(); + return false; + } +} + +int recordguid(const std::string &devid, + const std::string &guid, + int busytype,int busycount) +{ + std::lock_guard lock(ledgermtx); + for (auto &dev : terminal_devlist) { + if (dev.terminal_id == devid) { + if (dev.isbusy == 1) { + std::cout << "Dev is busy锛宐usytype is" << dev.busytype << std::endl; + //鍝嶅簲guid:姝e繖 + + return dev.busytype; // 姝e湪蹇欙紝涓嶈兘璁板綍 + } + dev.guid = guid; + dev.busytype = busytype; + dev.isbusy = busycount; + dev.busytimecount = 0; + return 0; + } + } + std::cout << "Dev not found" << std::endl; + //鍝嶅簲guid:澶辫触 + + return -1; // 鏈壘鍒板搴旂殑瑁呯疆 +} + + +// 鎸 type 瑙f瀽 Msg +bool parsemsg(const std::string& devid, const std::string& guid, const nlohmann::json& detailObj) { + MsgParsed parsed; + nlohmann::json msgObj; + + // 鐩存帴瑙f瀽 detailObj 鐨 Type + if (detailObj.contains("Type")) { + if (detailObj["Type"].is_string()) { + try { + parsed.type = std::stoi(detailObj["Type"].get(), nullptr, 0); // 鏀寔 "0x2106" 鏍煎紡 + } catch (...) { + return false; + } + } else if (detailObj["Type"].is_number_integer()) { + parsed.type = detailObj["Type"].get(); + } else if (detailObj["Type"].is_number_unsigned()) { + parsed.type = static_cast(detailObj["Type"].get()); + } else { + return false; + } + } else { + return false; + } + + // 鐩存帴瑙f瀽 detailObj 鐨 Msg + if (detailObj.contains("Msg") && detailObj["Msg"].is_object()) { + msgObj = detailObj["Msg"]; + } else { + msgObj = nlohmann::json::object(); + } + + try { + switch (parsed.type) { + case 0x2131: { // 璇诲彇鐩綍 + + if(!recordguid(devid,guid,static_cast(DeviceState::READING_FILEMENU),1)){ + return true; + } + + if (!msgObj.contains("Name") || !msgObj["Name"].is_string()) return false; + parsed.name = msgObj["Name"].get(); + parsed.ok = true; + + std::cout << "[dir parsemsg] Name: " << parsed.name << std::endl; + + // 娣诲姞鎸囦护鍒伴槦鍒楀綋涓 + ClientManager::instance().add_file_menu_action_to_device(devid, parsed.name); + return true; + } + + case 0x2132: { // 涓嬭浇鏂囦欢 + + if(!recordguid(devid,guid,static_cast(DeviceState::READING_FILEDATA),1)){ + return true; + } + + if (!msgObj.contains("Name") || !msgObj["Name"].is_string()) return false; + parsed.name = msgObj["Name"].get(); + parsed.ok = true; + + std::cout << "[file parsemsg] Name: " << parsed.name << std::endl; + + // 涓嬪彂鎸囦护 + ClientManager::instance().add_file_download_action_to_device(devid, parsed.name); + return true; + } + + case 0x2106: { // 瀹氬/鍐呴儴瀹氬 + if (!msgObj.contains("Cldid") || !msgObj["Cldid"].is_number_integer()) return false; + if (!msgObj.contains("DataType") || !msgObj["DataType"].is_number_integer()) return false; + if (!msgObj.contains("Operate") || !msgObj["Operate"].is_number_integer()) return false; + if (!msgObj.contains("DataArray")|| !msgObj["DataArray"].is_array()) return false; + + parsed.cldid = msgObj["Cldid"].get(); + parsed.datatype = msgObj["DataType"].get(); + parsed.operate = msgObj["Operate"].get(); + + // 璋冭瘯鎵撳嵃 + std::cout << "[parsemsg] Cldid=" << parsed.cldid + << ", DataType=0x" << std::hex << parsed.datatype << std::dec + << ", Operate=" << parsed.operate + << std::endl; + + // 鍏堟竻绌烘暟缁勶紝閬垮厤澶嶇敤瀵硅薄鏃舵畫鐣 + parsed.dataArray_f.clear(); + parsed.dataArray_us.clear(); + + switch (parsed.datatype) { + case 0x0C: { // 瀹氬硷紙float 闃靛垪锛 + + for (const auto& v : msgObj["DataArray"]) { + if (!v.is_number()) return false; + // 缁熶竴鎸 double 鍙栵紝鍐嶅己杞垚 float 鏇寸ǔ濡 + parsed.dataArray_f.push_back(static_cast(v.get())); + } + + // 鎵撳嵃 DataArray + std::cout << "[0x0C] DataArray=["; + for (size_t i = 0; i < parsed.dataArray_f.size(); ++i) { + std::cout << parsed.dataArray_f[i] << (i + 1 < parsed.dataArray_f.size() ? ", " : ""); + } + std::cout << "]" << std::endl; + + parsed.ok = true; + + // 鏍规嵁 Operate 鍒嗘祦锛1=璇伙紝2=鍐欙級 + switch (parsed.operate) { + case 1: { // 璇 + + if(!recordguid(devid,guid,static_cast(DeviceState::READING_FIXEDVALUE),2)){ + return true; + } + + ClientManager::instance().get_fixedvalue_action_to_device( + devid, static_cast(parsed.cldid)); // 鑾峰彇瑁呯疆娴嬬偣瀹氬兼暟鎹 + ClientManager::instance().get_fixedvaluedes_action_to_device(devid); // 鑾峰彇瑁呯疆瀹氬兼弿杩 + break; + } + case 2: { // 鍐 + + if(!recordguid(devid,guid,static_cast(DeviceState::SET_FIXEDVALUE),1)){ + return true; + } + + ClientManager::instance().set_fixedvalue_action_to_device( + devid, static_cast(parsed.cldid), parsed.dataArray_f); // 瑁呯疆淇敼瀹氬 + break; + } + default: + return false; + } + break; + } + + case 0x0D: { // 鍐呴儴瀹氬硷紙uint16_t 闃靛垪锛 + for (const auto& v : msgObj["DataArray"]) { + if (!v.is_number_integer() && !v.is_number_unsigned()) return false; + // 鑼冨洿鏍¢獙 [0, 65535] + long long val = v.get(); + if (val < 0 || val > 65535) return false; + parsed.dataArray_us.push_back(static_cast(val)); + } + + // 鎵撳嵃 DataArray + std::cout << "[0x0D] DataArray=["; + for (size_t i = 0; i < parsed.dataArray_us.size(); ++i) { + std::cout << parsed.dataArray_us[i] << (i + 1 < parsed.dataArray_us.size() ? ", " : ""); + } + std::cout << "]" << std::endl; + + parsed.ok = true; + + // 鏍规嵁 Operate 鍒嗘祦锛1=璇伙紝2=鍐欙級 + switch (parsed.operate) { + case 1: { // 璇 + + if(!recordguid(devid,guid,static_cast(DeviceState::READING_INTERFIXEDVALUE),3)){ + return true; + } + + ClientManager::instance().get_interfixedvalue_action_to_device(devid); // 鑾峰彇鍐呴儴瀹氬 + ClientManager::instance().get_fixedvalucontrolword_action_to_device(devid, 1); // 1-鍐呴儴瀹氬兼弿杩 + ClientManager::instance().get_fixedvalucontrolword_action_to_device(devid, 2); // 2-鎺у埗瀛楁弿杩 + break; + } + case 2: { // 鍐 + + if(!recordguid(devid,guid,static_cast(DeviceState::SET_INTERFIXEDVALUE),1)){ + return true; + } + + ClientManager::instance().set_interfixedvalue_action_to_device(devid, parsed.dataArray_us); + break; + } + default: + return false; + } + break; + } + + default: + return false; + } + + return true; + } + + default: + return false; + } + } catch (const std::exception& e) { + std::cerr << "[parsemsg] exception: " << e.what() << std::endl; + return false; + } catch (...) { + std::cerr << "[parsemsg] unknown exception" << std::endl; + return false; + } +} + +//蹇冭烦鍜屽叾浠栧搷搴 +void send_reply_to_cloud(int reply_code, const std::string& dev_id, int type) { + try { + std::string guid = find_guid_index_from_dev_id(dev_id); + if(guid == "") + { + std::cerr << "dev: " << dev_id << " guid not found" << std::endl; + return; + } + + // ---- 鏋勯犳牴 JSON ---- + nlohmann::json obj; + obj["guid"] = guid; + obj["FrontIP"] = FRONT_IP; + obj["Node"] = g_front_seg_index; + + // Dev_mac锛氫粠鍙拌处鍙 addr_str 骞惰鑼冨寲 + std::string mac = get_mac_by_devid(dev_id); + obj["Dev_mac"] = mac; + + // ---- 鏋勯 Detail ---- + nlohmann::json detail; + detail["Type"] = type; + + // Msg + nlohmann::json msg; + msg["Time"] = static_cast(std::time(nullptr)); + detail["Msg"] = std::move(msg); + + // Code + detail["Code"] = reply_code; + + obj["Detail"] = std::move(detail); + + // ---- 鍏ラ槦鍙戦 ---- + queue_data_t connect_info; + connect_info.strTopic = Topic_Reply_Topic; + connect_info.strText = obj.dump(); // 搴忓垪鍖栦负瀛楃涓 + + { + std::lock_guard lock(queue_data_list_mutex); + queue_data_list.push_back(std::move(connect_info)); + } + + // 璋冭瘯鎵撳嵃 + std::cout << "[send_reply_to_cloud] queued: " << obj.dump() << std::endl; + } + catch (const std::exception& e) { + std::cerr << "send_reply_to_cloud exception: " << e.what() << std::endl; + } +} + +//浜戝墠缃姛鑳 +rocketmq::ConsumeStatus cloudMessageCallback(const rocketmq::MQMessageExt& msg) { + //鏈垵濮嬪寲涓嶅鐞嗘秷璐 + if (INITFLAG != 1) { + return rocketmq::RECONSUME_LATER; + } + + std::string body = msg.getBody(); + std::string key = msg.getKeys(); + + if (body.empty()) { + std::cerr << "Message body is NULL or empty." << std::endl; + return rocketmq::RECONSUME_LATER; + } + + // 鏃ュ織璁板綍 + DIY_INFOLOG("process", "銆怤ORMAL銆戝墠缃秷璐箃opic:%s_%s鐨勪簯鍓嶇疆鎺у埗娑堟伅",FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_CLOUD.c_str()); + + std::cout << "cloud Callback received message: " << body << std::endl; + if (!key.empty()) { + std::cout << "Message Key: " << key << std::endl; + } else { + std::cout << "Message Key: N/A" << std::endl; + } + + // 娑堟伅瑙f瀽 + std::string guid; + std::string devid; + std::string FrontIP; + int Node; + nlohmann::json DetailObj; + + if (!parseJsonMessageCLOUD(body, devid, guid, DetailObj,FrontIP,Node)) { + std::cerr << "Failed to parse the JSON message." << std::endl; + DIY_ERRORLOG("process", "銆怑RROR銆戝墠缃秷璐箃opic:%s_%s鐨勪簯鍓嶇疆鎺у埗娑堟伅澶辫触,娑堟伅鐨刯son鏍煎紡涓嶆纭", FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str()); + return rocketmq::RECONSUME_LATER; + } + + // ====== 璋冭瘯鎵撳嵃 ====== + std::cout << "[CLOUD Msg Parsed] " + << "guid=" << guid + << ", devid=" << devid + << ", FrontIP=" << FrontIP + << ", Node=" << Node + << std::endl; + + if(FrontIP != FRONT_IP || Node != g_front_seg_index){ + std::cout << "褰撳墠杩涚▼涓嶆秷璐硅繖涓秷鎭" << std::endl; + return rocketmq::CONSUME_SUCCESS; + } + + if(!parsemsg(devid,guid,DetailObj)){ + std::cerr << "clouddata is error." << std::endl; + DIY_ERRORLOG("process","銆怑RROR銆戝墠缃殑%d鍙疯繘绋嬪鐞唗opic:%s_%s鐨勪簯鍓嶇疆鎺у埗娑堟伅澶辫触,娑堟伅鏃犳硶瑙f瀽", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str()); + } + + return rocketmq::CONSUME_SUCCESS; +} + +void rocketmq_test_getdir(Front* front)//鐢ㄦ潵娴嬭瘯鐩綍鑾峰彇 +{ + if (!front || !front->m_producer) { + std::cerr << "front 鎴 producer 鏃犳晥\n"; + return; + } + + rocketmq::RocketMQProducer* producer = front->m_producer; + + queue_data_t data; + data.monitor_no = 123; + data.strTopic = G_MQCONSUMER_TOPIC_CLOUD; + std::ifstream file("getdir.txt"); // 鏂囦欢涓瓨鍌ㄩ暱瀛楃涓 + std::stringstream buffer; + buffer << file.rdbuf(); // 璇诲彇鏁翠釜鏂囦欢鍐呭 + + data.strText = std::string(buffer.str()); + data.mp_id = "123123"; + std::lock_guard lock(queue_data_list_mutex); + queue_data_list.push_back(data); +} diff --git a/LFtid1056/cloudfront/code/rocketmq.h b/LFtid1056/cloudfront/code/rocketmq.h index 987780f..4b4e493 100644 --- a/LFtid1056/cloudfront/code/rocketmq.h +++ b/LFtid1056/cloudfront/code/rocketmq.h @@ -86,6 +86,10 @@ extern std::string G_MQCONSUMER_TOPIC_LOG; extern std::string G_MQCONSUMER_TAG_LOG; extern std::string G_MQCONSUMER_KEY_LOG; +extern std::string G_MQCONSUMER_TOPIC_CLOUD; +extern std::string G_MQCONSUMER_TAG_CLOUD; +extern std::string G_MQCONSUMER_KEY_CLOUD; + extern std::string G_LOG_TOPIC; extern std::string G_LOG_TAG; extern std::string G_LOG_KEY; @@ -336,7 +340,7 @@ void rocketmq_test_rc(Front* front); void rocketmq_test_set(Front* front); void rocketmq_test_ud(Front* front); void rocketmq_test_rt(Front* front); - +void rocketmq_test_getdir(Front* front); void InitializeProducer(rocketmq::RocketMQProducer*& producer); #endif // _ROCKETMQ_CLIENT_WRAPPER_H_ diff --git a/LFtid1056/cloudfront/code/worker.cpp b/LFtid1056/cloudfront/code/worker.cpp index 709147b..5a055f2 100644 --- a/LFtid1056/cloudfront/code/worker.cpp +++ b/LFtid1056/cloudfront/code/worker.cpp @@ -294,6 +294,7 @@ extern bool normalOutputEnabled; "G_TEST_NUM= - Set the G_TEST_NUM\r\n" "G_TEST_TYPE= - Set the G_TEST_TYPE 0:use ledger,1:use number\r\n" "LOG= - Set the LOG\r\n" + "dir - Execute rocketmq_test_getdir\r\n" "rc - Execute rocketmq_test_rc\r\n" "rt - Execute rocketmq_test_rt\r\n" "ud - Execute rocketmq_test_ud\r\n" @@ -325,6 +326,9 @@ extern bool normalOutputEnabled; } else if (cmd == "rc") { rocketmq_test_rc(m_front); sendStr(clientFD, "\r\x1B[KExecuted rocketmq_test_rc\r\n"); + } else if (cmd == "getdir") { + rocketmq_test_getdir(m_front); + sendStr(clientFD, "\r\x1B[KExecuted rocketmq_test_getdir\r\n"); } else if (cmd == "rt") { rocketmq_test_rt(m_front); sendStr(clientFD, "\r\x1B[KExecuted rocketmq_test_rt\r\n"); diff --git a/LFtid1056/dealMsg.cpp b/LFtid1056/dealMsg.cpp index f0f5613..c859240 100644 --- a/LFtid1056/dealMsg.cpp +++ b/LFtid1056/dealMsg.cpp @@ -707,7 +707,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } // 这里可以添加发送文件列表的逻辑 - // 例如: send_file_list(FileList); + send_file_list(id,FileList);//lnk20250813 // 处理完成后重置状态 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -792,6 +792,12 @@ void process_received_message(string mac, string id,const char* data, size_t len out_file.write(reinterpret_cast(file_data.data()), file_data.size()); std::cout << "File saved: " << file_path << std::endl; + + //使用接口上送文件lnk20250826 + std::string filename; + SendFileWeb(WEB_FILEUPLOAD, file_path, file_path, filename); + std::cout << "File upload: " << filename << std::endl; + } else { std::cerr << "Failed to save file: " << file_path @@ -866,6 +872,9 @@ void process_received_message(string mac, string id,const char* data, size_t len std::cout << " Value[" << j << "]: " << fList[j] << std::endl; } + //存储定值lnk20250827 + save_internal_value(id, monitor_index, fList); + //测试定值修改功能 //ClientManager::instance().set_fixedvalue_action_to_device(id, monitor_index, fList); @@ -947,6 +956,11 @@ void process_received_message(string mac, string id,const char* data, size_t len << ", Unit=" << dz_unit << std::endl; } + //lnk20250828 + // 提取测点序号 (第一个字节) + uint8_t monitor_index = parser.RecvData[0]; + std::cout << "Monitor Index: " << static_cast(monitor_index) << std::endl; + send_set_value_reply(id, monitor_index, dz_list); //定值描述读取完毕,调整为空闲,处理后续工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -962,6 +976,10 @@ void process_received_message(string mac, string id,const char* data, size_t len //设置装置定值 if (udata[8] == static_cast(MsgResponseType::Response_NewACK)) { std::cout << "set success" << mac << std::endl; + + //响应lnk20250828 + send_reply_to_cloud(static_cast(ResponseCode::OK),id,static_cast(DeviceState::SET_FIXEDVALUE)); + //定值设置成功,调整为空闲,处理后续工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -1012,6 +1030,9 @@ void process_received_message(string mac, string id,const char* data, size_t len std::cout << " Value[" << j << "]: " << fList[j] << std::endl; } + //存储定值lnk20250827 + save_internal_value(id, fList); + //内部定值修改测试 //ClientManager::instance().set_interfixedvalue_action_to_device(id, fList);