From 124df419118a46e721343e663ec1c687a3ee3331 Mon Sep 17 00:00:00 2001 From: lnk Date: Wed, 10 Sep 2025 16:59:50 +0800 Subject: [PATCH] add event fun --- LFtid1056/client2.h | 1 - LFtid1056/cloudfront/code/cfg_parser.cpp | 626 ++++++++++++++++++----- LFtid1056/cloudfront/code/interface.h | 55 +- LFtid1056/cloudfront/code/log4.h | 8 +- LFtid1056/cloudfront/code/main.cpp | 4 +- LFtid1056/cloudfront/code/rocketmq.cpp | 5 +- LFtid1056/dealMsg.cpp | 34 +- 7 files changed, 583 insertions(+), 150 deletions(-) diff --git a/LFtid1056/client2.h b/LFtid1056/client2.h index 688ad4f..d0cae85 100644 --- a/LFtid1056/client2.h +++ b/LFtid1056/client2.h @@ -62,7 +62,6 @@ enum class DeviceState { READING_DEVVERSION, // 读取装置版本配置信息 SET_RIGHTTIME, // 设置装置对时 READING_EVENTLOG, // 补招事件日志 - READING_EVENTFILE, // 补招暂态波形文件 READING_STATSFILE, // 补招稳态数据文件 // 可根据需要添加更多状态 CUSTOM_ACTION // 自定义动作 diff --git a/LFtid1056/cloudfront/code/cfg_parser.cpp b/LFtid1056/cloudfront/code/cfg_parser.cpp index bd23815..cabd5d3 100644 --- a/LFtid1056/cloudfront/code/cfg_parser.cpp +++ b/LFtid1056/cloudfront/code/cfg_parser.cpp @@ -26,7 +26,7 @@ #include "nlohmann/json.hpp" #include "curl/curl.h" -#include "log4cplus/log4.h" //鍏抽敭涓婇佹棩蹇 +#include "log4.h" //鍏抽敭涓婇佹棩蹇 #include "interface.h" //鍙拌处缁撴瀯 #include "tinyxml2.h" #include "rocketmq.h" @@ -560,6 +560,17 @@ double sGetMsTime() { return static_cast(ms); } +//绉掓椂闂磋浆涓烘爣鍑嗘椂闂村瓧绗︿覆 +// 鈽呮柊澧烇細灏 epoch 绉掔骇鏃堕棿杞垚 "YYYY-MM-DD HH:MM:SS" +static std::string epoch_to_datetime_str(long long epoch_sec) { + char buf[20]; + std::tm tm{}; + time_t t = static_cast(epoch_sec); + localtime_r(&t, &tm); + std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); + return std::string(buf); +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////瀹炴椂瑙﹀彂閮ㄥ垎 //鑾峰彇瀹炴椂瑙﹀彂鏂囦欢 @@ -781,7 +792,7 @@ void check_3s_config() { } } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////琛ユ嫑閮ㄥ垎 +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////琛ユ嫑鏂囦欢閮ㄥ垎 //灏嗘枃浠跺唴瀹硅鍙栧埌缁撴瀯涓 void parse_recall(recall_xml_t* recall_xml, const std::string& parentTag, const std::map& attributes, const std::string& id) { @@ -1030,7 +1041,7 @@ void create_recall_xml() CreateRecallXml(); //} } - +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////琛ユ嫑閮ㄥ垎 // 宸ュ叿鍑芥暟锛氬皢鏃堕棿瀛楃涓茶浆涓 time_t锛堢绾э級 static long long parse_time_to_epoch(const std::string& time_str) { std::tm tm = {}; @@ -1084,7 +1095,6 @@ int recall_json_handle(const std::string& jstr) { int stat = 0; int voltage = 0; try { - std::vector recallParams; // 1. 瑙f瀽 JSON 鏁扮粍 auto json_root = nlohmann::json::parse(jstr); @@ -1096,7 +1106,9 @@ int recall_json_handle(const std::string& jstr) { // 2. 閬嶅巻姣忎釜琛ユ嫑椤 for (auto& item : json_root) { // 鑾峰彇蹇呴渶瀛楁 - if (!item.contains("monitorId") || + // 鈽呬慨鏀癸細寮哄埗瑕佹眰 terminalId锛 + if (!item.contains("terminalId") || + !item.contains("monitor") || !item.contains("timeInterval") || !item.contains("dataType")) { @@ -1104,131 +1116,115 @@ int recall_json_handle(const std::string& jstr) { return 10000; } + // 鈽呮柊澧烇細璇诲彇 terminalId锛堝繀濉級 + std::string terminalId = item["terminalId"].get(); + if (terminalId.empty()) { + std::cout << "terminalId涓虹┖" << std::endl; + continue; + } + // 2.1 瑙f瀽 dataType std::string datatype = item["dataType"].get(); if (!datatype.empty()) { - stat = (datatype == "0") ? 1 : 0; // 绋虫 - voltage = (datatype == "1") ? 1 : 0; // 鏆傛 + // 鈽呬慨鏀癸細浠呬繚鐣欑ǔ鎬/鏆傛 + if (datatype == "0" || datatype == "绋虫" || datatype == "steady" || datatype == "STEADY") { + stat = 1; voltage = 0; // 绋虫 + } else if (datatype == "1" || datatype == "鏆傛" || datatype == "voltage" || datatype == "VOLTAGE") { + stat = 0; voltage = 1; // 鏆傛 + } else { + stat = voltage = 1; // 鍏朵粬鎯呭喌鎸夊叏琛 + } } else { - stat = voltage = 1; // 鍏ㄨˉ + stat = voltage = 1; // 鍏ㄨˉ } - // 2.2 澶勭悊 monitorId 鏁扮粍 - auto& midArr = item["monitorId"]; - auto& tiArr = item["timeInterval"]; - if (midArr.is_array() && tiArr.is_array() && !midArr.empty()) { - for (auto& idItem : midArr) { - std::string monitorId = idItem.get(); + // 鈽呮柊澧烇細瀹氫綅骞舵牎楠岃 terminal 鏄惁褰掑睘褰撳墠杩涚▼ + std::lock_guard lock(ledgermtx); - // 鍒ゆ柇姝ょ洃娴嬬偣鏄惁褰掑睘褰撳墠杩涚▼ - bool mppair = false; - for (const auto& dev : terminal_devlist) { - // 鍙鐞嗘湰杩涚▼瀵瑰簲鐨勭粓绔 - if (std::stoi(dev.processNo) != g_front_seg_index && - g_front_seg_index != 0) { - continue; - } - for (const auto& mon : dev.line) { - if (mon.monitor_id.empty()) continue; - if (mon.monitor_id == monitorId) { - mppair = true; - std::cout << "Matched monitorId " << monitorId - << " in terminal " << dev.terminal_id - << std::endl; - break; - } - } - if (mppair) break; - } - if (!mppair) continue; - - // 閬嶅巻 timeInterval 鏁扮粍 - for (auto& timeItem : tiArr) { - std::string ti = timeItem.get(); - auto pos = ti.find('~'); - std::string start = ti.substr(0, pos); - std::string end = ti.substr(pos + 1); - - JournalRecall param; - param.MonitorID = monitorId; - param.StartTime = start; - param.EndTime = end; - param.STEADY = std::to_string(stat); - param.VOLTAGE = std::to_string(voltage); - recallParams.push_back(param); - } + const terminal_dev* targetDev = nullptr; + for (const auto& dev : terminal_devlist) { + // 鍙鐞嗘湰杩涚▼瀵瑰簲鐨勭粓绔 + if (dev.terminal_id == terminalId) { + targetDev = &dev; + break; } } - // 2.3 monitorId 鏁扮粍瀛樺湪浣嗕负绌 -> 琛ユ嫑鎵鏈夌洃娴嬬偣 - else if (midArr.is_array() && midArr.empty()) { - std::cout << "monitorIdArray is null,琛ユ嫑鎵鏈夌洃娴嬬偣" << std::endl; - for (const auto& dev : terminal_devlist) { - if (std::stoi(dev.processNo) != g_front_seg_index && - g_front_seg_index != 0) { + if (!targetDev) { + std::cout << "terminalId鏈尮閰嶅綋鍓嶈繘绋嬪唴瑁呯疆: " << terminalId << std::endl; + continue; + } + + // 鈽呮柊澧烇細鎸夋柊缁撴瀯瑙f瀽 monitor 灞傜骇 + auto& monitors = item["monitor"]; + if (!monitors.is_array() || monitors.empty()) { + std::cout << "monitor鏁扮粍涓虹┖鎴栭潪鏁扮粍绫诲瀷" << std::endl; + continue; + } + + for (auto& mobj : monitors) { + if (!mobj.contains("monitorId") || !mobj.contains("timeInterval")) { + std::cout << "monitor椤圭己灏 monitorId 鎴 timeInterval" << std::endl; + continue; + } + + std::string monitorId = mobj["monitorId"].get(); + if (monitorId.empty()) continue; + + // 涓嶅彧鏄垽鏂瓨鍦紝杩樿鎷垮埌鎸囬拡 lm 浠ヤ究鍚庣画 push_back + ledger_monitor* lm = nullptr; + for (auto& mon : const_cast(targetDev)->line) { + if (!mon.monitor_id.empty() && mon.monitor_id == monitorId) { + lm = &mon; + break; + } + } + if (!lm) { + std::cout << "monitorId鏈湪terminal鍐呮壘鍒: " << monitorId + << " @ " << terminalId << std::endl; + continue; + } + + auto& tiArr = mobj["timeInterval"]; + if (!tiArr.is_array() || tiArr.empty()) { + std::cout << "timeInterval涓虹┖鎴栭潪鏁扮粍绫诲瀷: monitorId=" << monitorId << std::endl; + continue; + } + + // 杩欓噷鎷嗗垎鏃堕棿娈靛苟 push 鍒 lm->recall_list + for (auto& timeItem : tiArr) { + std::string ti = timeItem.get(); + auto pos = ti.find('~'); + if (pos == std::string::npos) { + std::cout << "timeInterval鏍煎紡閿欒: " << ti << std::endl; continue; } - for (const auto& mon : dev.line) { - if (mon.monitor_id.empty()) continue; - for (auto& timeItem : tiArr) { - std::string ti = timeItem.get(); - auto pos = ti.find('~'); - std::string start = ti.substr(0, pos); - std::string end = ti.substr(pos + 1); - - JournalRecall param; - param.MonitorID = mon.monitor_id; - param.StartTime = start; - param.EndTime = end; - param.STEADY = std::to_string(stat); - param.VOLTAGE = std::to_string(voltage); - recallParams.push_back(param); - } + std::string start = ti.substr(0, pos); + std::string end = ti.substr(pos + 1); + + // 鎷嗗垎鏃堕棿娈典负 1 灏忔椂涓娈碉紝骞跺瓨鍏 recall_list + std::vector recallinfo_list_hour; + Get_Recall_Time_Char(start, end, recallinfo_list_hour); + + for (auto& info : recallinfo_list_hour) { + RecallMonitor rm; + rm.recall_status = 0; // 鍒濆鐘舵侊細鏈ˉ鎷 + rm.StartTime = epoch_to_datetime_str(info.starttime); // 闇瑕佷綘宸叉湁鐨勫伐鍏峰嚱鏁 + rm.EndTime = epoch_to_datetime_str(info.endtime); + rm.STEADY = std::to_string(stat); + rm.VOLTAGE = std::to_string(voltage); + + lm->recall_list.push_back(std::move(rm)); // 鈽呴愪竴鍘嬪叆 + + // 鍙夛細璋冭瘯鎵撳嵃 + std::cout << "[recall_json_handle] terminal=" << terminalId + << " monitor=" << monitorId + << " start=" << lm->recall_list.back().StartTime + << " end=" << lm->recall_list.back().EndTime + << " steady="<< lm->recall_list.back().STEADY + << " voltage="<< lm->recall_list.back().VOLTAGE + << std::endl; } } - } else { - std::cout << "monitorIdArray 涓嶅瓨鍦ㄦ垨绫诲瀷涓嶆纭" << std::endl; - } - } - - // 3. 鐢熸垚鍏蜂綋琛ユ嫑璁板綍 - for (auto& rp : recallParams) { - std::string start_time = rp.StartTime; - std::string end_time = rp.EndTime; - - std::cout << "mp_id " << rp.MonitorID - << " start_time " << start_time - << " end_time " << end_time - << " stat " << rp.STEADY - << " voltage " << rp.VOLTAGE - << std::endl; - - std::vector recallinfo_list_hour; - Get_Recall_Time_Char(start_time, end_time, recallinfo_list_hour); - - for (auto& info : recallinfo_list_hour) { - JournalRecall jr; - jr.MonitorID = rp.MonitorID; - - // 杞崲 starttime - char buf[20]; - std::tm tm{}; - time_t st = static_cast(info.starttime); - localtime_r(&st, &tm); - std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); - jr.StartTime = buf; - - // 杞崲 endtime - std::tm tm2{}; - time_t et = static_cast(info.endtime); - localtime_r(&et, &tm2); - std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm2); - jr.EndTime = buf; - - jr.STEADY = rp.STEADY; - jr.VOLTAGE = rp.VOLTAGE; - - std::lock_guard lock(g_StatisticLackList_list_mutex); - g_StatisticLackList.push_back(jr); } } } @@ -3764,4 +3760,400 @@ bool send_internal_value_reply(const std::string &dev_id, const std::vector lock(ledgermtx); // 鍔犻攣淇濊瘉绾跨▼瀹夊叏 + + for (auto& dev : terminal_devlist) { + if (dev.terminal_id == id) { + dev.guid.clear(); // 娓呯┖ guid + dev.busytype = 0; // 涓氬姟绫诲瀷褰掗浂 + dev.isbusy = 0; // 娓呯┖涓氬姟鏍囧織 + dev.busytimecount = 0; // 璁℃椂褰掗浂 + std::cout << "[clear_terminal_runtime_state] Cleared runtime state for terminal_id=" + << id << std::endl; + break; // 鎵惧埌鍚庤烦鍑 + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////澶勭悊琛ユ嫑閫昏緫 +// ===== 涓娆¢亶鍘嗗彲涓嬪彂鈥滃涓粓绔殑涓鏉♀ ===== +void check_recall_event() { + + std::vector tasks; // 鏈疆瑕佸彂閫佺殑鈥滄瘡缁堢涓鏉♀ + std::vector empty_devs_to_clear; // 鏈疆鍙戠幇宸叉棤浠诲姟鐨勭粓绔紝瑙i攣鍚庣粺涓娓呯悊 + + { //閿佷綔鐢ㄥ煙 + std::lock_guard lock(ledgermtx); + + // 閬嶅巻鎵鏈 terminal 鈥斺 姣忎釜 terminal 鍙寫涓鏉 + for (auto& dev : terminal_devlist) { + // 1) 鍏堝脊鎺夐鏉′负 DONE/FAILED 鐨勮褰曪紙鎵鏈 monitor 閮借澶勭悊棣栨潯锛 + bool any_non_empty = false; + for (auto& lm : dev.line) { + while (!lm.recall_list.empty()) { + const RecallMonitor& front = lm.recall_list.front(); + if (front.recall_status == static_cast(RecallStatus::DONE)) { + std::cout << "[check_recall_work] DONE dev=" << dev.terminal_id + << " monitor=" << lm.monitor_id + << " " << front.StartTime << " ~ " << front.EndTime << std::endl; + + //璋冪敤reply鎺ュ彛閫氱煡web绔ˉ鎷涘畬鎴 + + + lm.recall_list.pop_front(); // 寮规帀棣栨潯 + } else if (front.recall_status == static_cast(RecallStatus::FAILED)) { + std::cout << "[check_recall_work] FAILED dev=" << dev.terminal_id + << " monitor=" << lm.monitor_id + << " " << front.StartTime << " ~ " << front.EndTime << std::endl; + + //璋冪敤reply鎺ュ彛閫氱煡web绔ˉ鎷涘け璐 + + + lm.recall_list.pop_front(); // 寮规帀棣栨潯 + } else { + break; // 棣栨潯涓嶆槸 2/3锛屽仠 + } + } + if (!lm.recall_list.empty()) any_non_empty = true; // 澶勭悊浜嗘垚鍔熷拰澶辫触鐨勪互鍚庡彧瑕佹湁涓鏉¢潪绌哄氨鏍囪锛屽彲鑳芥槸寰呭鐞嗘垨鑰呮鍦ㄥ鐞嗙殑琛ユ嫑 + } + + if (!any_non_empty) { + // 璇ョ粓绔湰杞凡鏃犱换浣曡ˉ鎷涙潯鐩紝绛夎В閿佸悗娓呯┖杩愯鎬 + empty_devs_to_clear.push_back(dev.terminal_id); + continue; + } + + // 2) 鑻ヤ换涓 monitor 鐨勯鏉′负 RUNNING锛屽垯璇ョ粓绔鍦ㄨˉ鎷涗腑 -> 璺宠繃璇ョ粓绔 + bool has_running = false; + for (auto& lm : dev.line) { + if (!lm.recall_list.empty() && + lm.recall_list.front().recall_status == static_cast(RecallStatus::RUNNING)) { + has_running = true; + break; + } + } + if (has_running) continue; + + // 3) 閫夋嫨璇ョ粓绔殑鈥滅涓鏉 NOT_STARTED(0)鈥濅綔涓烘湰缁堢鏈疆浠诲姟 + bool picked = false; + for (auto& lm : dev.line) { + if (lm.recall_list.empty()) continue; + + RecallMonitor& front = lm.recall_list.front(); + if (front.recall_status == static_cast(RecallStatus::NOT_STARTED)) { + // 鏍囪涓 RUNNING锛屽苟璁剧疆缁堢蹇欑姸鎬 + front.recall_status = static_cast(RecallStatus::RUNNING); + + dev.isbusy = 1; + dev.busytype = static_cast(DeviceState::READING_EVENTLOG); + dev.busytimecount = 0; + // 濡傞渶 guid锛屽彲鍦ㄦ鐢熸垚 dev.guid = new_guid(); + + // 璁板綍浠诲姟锛堟瘡缁堢鍙彇杩欎竴鏉★級 + tasks.push_back(RecallTask{ + dev.terminal_id, + front.StartTime, + front.EndTime, + lm.monitor_id + }); + picked = true; + break; + } + } + // 鑻ヨ缁堢娌℃湁 NOT_STARTED 鐨勯鏉★紙鍙兘鍓╀笅鐨勯兘鏄 RUNNING 鎴栧唴閮ㄥ凡缁忚娓呯┖锛夛紝 + // 灏辩暀寰呬笅涓杞紱涓嶈娓呯┖杩愯鎬侊紝鐩村埌鎵鏈夋潯鐩澶勭悊涓烘銆 + } + } // 瑙i攣 + + // 鍏堝鐞嗏滃凡绌虹粓绔濈殑杩愯鎬佹竻鐞嗭紝濡傛灉鍦ㄤ笂闈㈠惊鐜腑鐩存帴娓呯悊锛屽彲鑳戒細涓庢鍦ㄥ鐞嗙殑琛ユ嫑鍐茬獊銆傝屼笖灏辩畻涓婇潰瑙i攣鍚庡啓浜嗘柊鐨勮ˉ鎷涳紝涔熶細鍦ㄤ笅涓杞鎵ц銆 + for (const auto& id : empty_devs_to_clear) { + clear_terminal_runtime_state(id); + } + + // 瀵逛簬鏈疆鎸戦夊埌鐨勪换鍔★紝閫愮粓绔笅鍙戜竴鏉★紝杩欎簺缁堢鐨勭姸鎬侀兘宸茶涓鸿ˉ鎷 + for (const auto& t : tasks) { + std::tm tm1{}, tm2{}; + if (!parse_datetime_tm(t.start_time, tm1) || !parse_datetime_tm(t.end_time, tm2)) { + std::cout << "[check_recall_event] parse time fail: " + << t.start_time << " ~ " << t.end_time << std::endl; + // 瑙嗘儏鍐碉細鏍囪澶辫触/寮瑰嚭/缁х画涓嬩竴涓 + continue; + } + + uint8_t mp = 1; // 榛樿 + try { + mp = static_cast(std::stoi(t.monitor_index)); + } catch (...) { /* 淇濇寔榛樿1鎴栨牴鎹渶瑕佸鐞 */ } + + ClientManager::instance().read_eventlog_action_to_device( + t.dev_id, tm1, tm2, 2, mp);//2鏄殏鎬佷簨浠 + + std::cout << "[check_recall_event] SEND dev=" << t.dev_id + << " monitor=" << mp + << " start=" << t.start_time + << " end=" << t.end_time + << " action(2)" << std::endl; + } + + // 閲嶈锛氭湰鍑芥暟涓嶆妸 RUNNING 鏀规垚 DONE/FAILED锛 + // 搴旂敱璁惧鍥炶皟/缁撴灉澶勭悊閫昏緫鍦ㄥ畬鎴愬悗璋冪敤閫氱煡鍑芥暟锛屾妸瀵瑰簲 monitor.front().recall_status 浠1缃负 2/3锛 + // 涓嬩竴杞湰鍑芥暟浼氬脊鎺 2/3锛屽苟鍦ㄨ缁堢鎵鏈 recall_list 鍏ㄩ儴娓呯┖鍚庤皟鐢 clear_terminal_runtime_state()銆 +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////閫氳鍝嶅簲澶勭悊 +void on_device_response_minimal(int response_code, + const std::string& id, + unsigned char cid, + int device_state_int) +{ + const bool ok = is_ok(response_code); + DeviceState state = static_cast(device_state_int); + + switch (state) { + // ================= 鐗规畩锛氳ˉ鎷涗簨浠舵棩蹇 ================= + case DeviceState::READING_EVENTLOG: { + std::lock_guard lk(ledgermtx); + + terminal_dev* dev = nullptr; + for (auto& d : terminal_devlist) { + if (d.terminal_id == id) { dev = &d; break; } + } + if (!dev) { + std::cout << "[RESP][EVENTLOG] dev not found, id=" << id + << " rc=" << response_code << std::endl; + return; + } + + // 鎵惧埌鈥滈鏉 RUNNING鈥濈殑琛ユ嫑鏉$洰锛屾寜 rc==200 鎴愬姛/澶辫触鏍囪 + bool updated = false; + + // 1) 鎵惧埌 logical_device_seq 涓 cid 鍖归厤鐨 monitor + ledger_monitor* matched_monitor = nullptr; + + // 灏 cid 杞垚鍗佽繘鍒跺瓧绗︿覆鐢ㄤ簬鐩存帴姣旇緝 + const std::string cid_str = std::to_string(static_cast(cid)); + + for (auto& lm : dev->line) { + // 鐩存帴瀛楃涓茬浉绛 + if (lm.logical_device_seq == cid_str) { + matched_monitor = &lm; + break; + } + } + + if (!matched_monitor) { //娌℃湁鍖归厤鐨勭洃娴嬬偣 + std::cout << "[RESP][EVENTLOG][WARN] dev=" << id + << " cannot find monitor by cid=" << static_cast(cid) + << " (no logical_device_seq match)" << std::endl; + } + else { + + // 鍑嗗鏃ュ織鐢ㄧ殑 key + std::ostringstream mon_key_c, mon_key_d; + mon_key_c << "monitor." << matched_monitor->terminal_id << "." << matched_monitor->logical_device_seq << ".COM"; + mon_key_d << "monitor." << matched_monitor->terminal_id << "." << matched_monitor->logical_device_seq << ".DATA"; + + // 2) 浠呮洿鏂拌鐩戞祴鐐 recall_list 鐨勯鏉★紝涓旇姹傚浜 RUNNING + if (!matched_monitor->recall_list.empty()) { + RecallMonitor& front = matched_monitor->recall_list.front(); //鍙栧嚭棣栨潯 + if (front.recall_status == static_cast(RecallStatus::RUNNING)) { //姝e湪琛ユ嫑 + if (ok) { //琛ユ嫑鎴愬姛 + front.recall_status = static_cast(RecallStatus::DONE); //鏍囪涓哄畬鎴愶紝琛ユ嫑浠诲姟浼氭墽琛屼笅涓鏉 + std::cout << "[RESP][EVENTLOG][OK] dev=" << id + << " mon=" << matched_monitor->monitor_id + << " " << front.StartTime << "~" << front.EndTime + << std::endl; + } else { //琛ユ嫑澶辫触 + front.recall_status = static_cast(RecallStatus::FAILED); + std::cout << "[RESP][EVENTLOG][FAIL] dev=" << id + << " mon=" << matched_monitor->monitor_id + << " " << front.StartTime << "~" << front.EndTime + << " rc=" << response_code << std::endl; //閿欒鍝嶅簲鐮 + + //璁板綍鏃ュ織 + DIY_ERRORLOG_CODE(mon_key_d.str().c_str(),static_cast(LogCode::LOG_CODE_RECALL),"銆怑RROR銆戠洃娴嬬偣:%s 琛ユ嫑鏁版嵁澶辫触 - 澶辫触鏃堕棿鐐:%lld 鑷 %lld",mon_key_d.str().c_str(),front.StartTime,front.EndTime); + } + updated = true; + } else { //棣栨潯涓嶆槸 RUNNING 鐘舵侊紝涓嶅簲璇ユ敹鍒拌繖鏉″搷搴 + std::cout << "[RESP][EVENTLOG][WARN] dev=" << id + << " mon=" << matched_monitor->monitor_id + << " first item not RUNNING (status=" + << front.recall_status << ")" << std::endl; //鎵撳嵃璋冭瘯 + } + } else { //琛ユ嫑鍒楄〃涓虹┖锛屼笉搴旇鏀跺埌杩欐潯鍝嶅簲 + std::cout << "[RESP][EVENTLOG][WARN] dev=" << id + << " mon=" << matched_monitor->monitor_id + << " recall_list empty" << std::endl; + } + } + + if (!updated) {//涓嶆洿鏂拌ˉ鎷涘垪琛 + std::cout << "[RESP][EVENTLOG][WARN] no RUNNING item, dev=" << id + << " rc=" << response_code << std::endl; + } + + break; + } + + // ================= 鐗规畩锛氳鍙栨枃浠剁洰褰 ================= + case DeviceState::READING_FILEMENU: { + std::lock_guard lk(ledgermtx); + + // 1) 鎵惧埌瀵瑰簲缁堢 + terminal_dev* dev = nullptr; + for (auto& d : terminal_devlist) { + if (d.terminal_id == id) { dev = &d; break; } + } + if (!dev) { + std::cout << "[RESP][FILEMENU] dev not found, id=" << id + << " rc=" << response_code << std::endl; + break; + } + + // 2) 鎸夎缁堢褰撳墠 busytype 鍒嗘敮澶勭悊 + const int bt = dev->busytype; + if (bt == static_cast(DeviceState::READING_FILEMENU)) { + // ====== 鍒嗘敮 A锛氬綋鍓嶄笟鍔″氨鏄滆鍙栨枃浠剁洰褰曗 ====== + if (ok) { + // 鎴愬姛锛氬浣 + dev->guid.clear(); + dev->isbusy = 0; + dev->busytype = 0; + dev->busytimecount = 0; + std::cout << "[RESP][FILEMENU->FILEMENU][OK] dev=" << id << std::endl; + } else { + // 澶辫触锛氬搷搴攚eb骞跺浣嶄负绌洪棽 + send_reply_to_cloud(response_code, id, static_cast(DeviceState::READING_FILEMENU)); + + dev->guid.clear(); + dev->isbusy = 0; + dev->busytype = 0; + dev->busytimecount = 0; + std::cout << "[RESP][FILEMENU->FILEMENU][FAIL] dev=" << id + << " rc=" << response_code << std::endl; + } + } + else if ( + bt == static_cast(DeviceState::READING_EVENTFILE) + || bt == static_cast(DeviceState::READING_STATSFILE) + ) { + // ====== 鍒嗘敮 B锛氬綋鍓嶄笟鍔′负鈥滀笅杞戒簨浠舵枃浠/缁熻鏂囦欢鈥濓紙涓よ呭鐞嗙浉鍚岋級 ====== + if (ok) { + // 鎴愬姛锛氶氬父绱ф帴鐫杩涘叆璇诲彇鏂囦欢鏁版嵁闃舵 + + std::cout << "[RESP][FILEMENU->FILEDATA][OK] dev=" << id << std::endl; + } else { + // 澶辫触锛氬皾璇曚笅涓涓洰褰 + + std::cout << "[RESP][FILEMENU->(EVENT/STATS)FILE][FAIL] dev=" << id + << " rc=" << response_code << std::endl; + } + } + else { + // ====== 鍒嗘敮 C锛氬叾浠栦笟鍔″満鏅笅鏀跺埌 FILEMENU 鍝嶅簲锛岀粺涓澶勭悊 鎵撳嵃鎻愮ず====== + if (ok) { + // 鎴愬姛锛 + + std::cout << "[unknown][RESP][FILEMENU->OTHER][OK] dev=" << id + << " keep busytype=" << bt << std::endl; + } else { + // 澶辫触锛 + + std::cout << "[unknown][RESP][FILEMENU->OTHER][FAIL] dev=" << id + << " rc=" << response_code << " prev busytype=" << bt << std::endl; + } + } + break; + } + + // ================= 鐗规畩锛氫笅杞芥枃浠 ================= + case DeviceState::READING_FILEDATA: { + std::lock_guard lk(ledgermtx); + + // 1) 鎵惧埌瀵瑰簲缁堢 + terminal_dev* dev = nullptr; + for (auto& d : terminal_devlist) { + if (d.terminal_id == id) { dev = &d; break; } + } + if (!dev) { + std::cout << "[RESP][FILEDATA] dev not found, id=" << id + << " rc=" << response_code << std::endl; + break; + } + + // 2) 鎸夎缁堢褰撳墠 busytype 鍒嗘敮澶勭悊 + const int bt = dev->busytype; + if (bt == static_cast(DeviceState::READING_FILEDATA)) { + // ====== 鍒嗘敮 A锛氬綋鍓嶄笟鍔″氨鏄滆鍙栨枃浠舵暟鎹 ====== + if (ok) { + // 鎴愬姛锛氬浣 + send_reply_to_cloud(static_cast(ResponseCode::OK), id, static_cast(DeviceState::READING_FILEDATA)); + + dev->guid.clear(); + dev->isbusy = 0; + dev->busytype = 0; + dev->busytimecount = 0; + std::cout << "[RESP][FILEDATA->FILEDATA][OK] dev=" << id << std::endl; + } else { + // 澶辫触锛氬搷搴攚eb骞跺浣 + send_reply_to_cloud(response_code, id, static_cast(DeviceState::READING_FILEDATA)); + + dev->guid.clear(); + dev->isbusy = 0; + dev->busytype = 0; + dev->busytimecount = 0; + std::cout << "[RESP][FILEDATA->FILEDATA][FAIL] dev=" << id + << " rc=" << response_code << std::endl; + } + } + else if ( + bt == static_cast(DeviceState::READING_EVENTFILE) + || bt == static_cast(DeviceState::READING_STATSFILE) + ) { + // ====== 鍒嗘敮 B锛氬綋鍓嶄笟鍔′负鈥滀笅杞戒簨浠舵枃浠/缁熻鏂囦欢鈥濓紙涓よ呭鐞嗙浉鍚岋級 ====== + if (ok) { + // 鎴愬姛锛氶氬父绱ф帴鐫杩涘叆璇诲彇鏂囦欢鏁版嵁闃舵 + + std::cout << "[RESP][FILEDATA->(EVENT/STATS)FILE][OK] dev=" << id << std::endl; + } else { + // 澶辫触锛氬皾璇曚笅涓涓洰褰 + + std::cout << "[RESP][FILEDATA->(EVENT/STATS)FILE][FAIL] dev=" << id + << " rc=" << response_code << std::endl; + } + } + else { + // ====== 鍒嗘敮 C锛氬叾浠栦笟鍔″満鏅笅鏀跺埌 FILEDATA 鍝嶅簲锛岀粺涓澶勭悊 鎵撳嵃鎻愮ず====== + if (ok) { + // 鎴愬姛锛 + + std::cout << "[unknown][RESP][FILEDATA->OTHER][OK] dev=" << id + << " keep busytype=" << bt << std::endl; + } else { + // 澶辫触锛 + + std::cout << "[unknown][RESP][FILEDATA->OTHER][FAIL] dev=" << id + << " rc=" << response_code << " prev busytype=" << bt << std::endl; + } + } + break; + } + + // ================= 鍏跺畠鐘舵佺粺涓澶勭悊 ================= + default: { + + //鐩存帴鏍规嵁杈撳叆鍝嶅簲mq + send_reply_to_cloud(response_code, id, device_state_int); + + //鍏朵粬鐨勯敊璇拰鎴愬姛閮戒細缁撴潫涓氬姟 + clear_terminal_runtime_state(id); + + break; + } + } } \ No newline at end of file diff --git a/LFtid1056/cloudfront/code/interface.h b/LFtid1056/cloudfront/code/interface.h index e48203b..be0323d 100644 --- a/LFtid1056/cloudfront/code/interface.h +++ b/LFtid1056/cloudfront/code/interface.h @@ -30,7 +30,7 @@ class Front; /////////////////////////////////////////////////////////////////////////////////////////// -//鍗曟潯琛ユ嫑缁撴瀯 +//鍗曟潯琛ユ嫑鏃堕棿缁撴瀯 class RecallInfo { public: @@ -38,10 +38,37 @@ public: long long endtime; //缁撴潫鏃堕棿 }; -//鏃ュ織琛ユ嫑缁撴瀯绫 +//娴嬬偣璁板綍鐨勮ˉ鎷涚粨鏋 +class RecallMonitor +{ +public: + int recall_status; //琛ユ嫑鐘舵 0-鏈ˉ鎷 1-琛ユ嫑涓 2-琛ユ嫑瀹屾垚 3-琛ユ嫑澶辫触 + std::string StartTime; //鏁版嵁琛ユ嫑璧峰鏃堕棿 + std::string EndTime; //鏁版嵁琛ユ嫑缁撴潫鏃堕棿 + std::string STEADY; //琛ユ嫑鍘嗗彶缁熻鏁版嵁鏍囪瘑 0-涓嶈ˉ鎷涳紱1-琛ユ嫑 + std::string VOLTAGE; //琛ユ嫑鏆傛佷簨浠舵爣璇 0-涓嶈ˉ鎷涳紱1-琛ユ嫑 +}; + +enum class RecallStatus { + NOT_STARTED = 0, // 鏈ˉ鎷 + RUNNING = 1, // 琛ユ嫑涓 + DONE = 2, // 琛ユ嫑瀹屾垚 + FAILED = 3 // 琛ユ嫑澶辫触 +}; + +// 鏈疆瑕佷笅鍙戠殑涓鏉′换鍔★紙姣忎釜缁堢鏈澶氫竴鏉★級 +struct RecallTask { + std::string dev_id; + std::string start_time; + std::string end_time; + std::string monitor_index; +}; + +//鏃ュ織琛ユ嫑缁撴瀯绫,褰撳墠涓嶄娇鐢 class JournalRecall { public: + std::string DevID; //瑁呯疆鍙 std::string MonitorID; //绾胯矾鐩戞祴鐐瑰彿 std::string StartTime; //鏁版嵁琛ユ嫑璧峰鏃堕棿 std::string EndTime; //鏁版嵁琛ユ嫑缁撴潫鏃堕棿 @@ -84,7 +111,7 @@ class ledger_monitor { public: std::string monitor_id; //鐩戞祴鐐筰d - std::string terminal_id; //鐩戞祴鐐 + std::string terminal_id; //鐩戞祴鐐圭殑缁堢id std::string monitor_name; //鐩戞祴鐐瑰悕 std::string logical_device_seq; //鐩戞祴鐐瑰簭鍙 std::string voltage_level; //鐩戞祴鐐圭數鍘嬬瓑绾 @@ -99,6 +126,9 @@ public: //鏆傛佷簨浠 qvvr_event qvvrevent; + //琛ユ嫑鍒楄〃 + std::list recall_list; + //瀹氬糽ist std::list set_values; std::vector dz_info_list; //瀹氬间俊鎭垪琛 @@ -511,7 +541,7 @@ 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 @@ -538,6 +568,18 @@ void SendFileWeb(const std::string& strUrl, const std::string& localpath, const //鐘舵佺炕杞 void connect_status_update(const std::string& id, int status); +//涓氬姟鍋滄 +void clear_terminal_runtime_state(const std::string& id); + +//涓氬姟鍝嶅簲 +void on_device_response_minimal(int response_code, + const std::string& id, + unsigned char cid, + int device_state_int); + +//澶勭悊琛ユ嫑鐨勪换鍔 +void check_recall_event(); + //灏忓伐鍏 inline std::string trim_cstr(const char* s, size_t n) { if (!s) return {}; @@ -570,7 +612,12 @@ enum class ResponseCode : int { TIMEOUT = 406, // 璇锋眰瓒呭嚭浜嗙瓑寰呮椂闂 INTERNAL_ERROR = 500 // 鍏朵粬閿欒 }; +static inline bool is_ok(int rc) { return rc == static_cast(ResponseCode::OK); } +static bool parse_datetime_tm(const std::string& s, std::tm& out) { + std::memset(&out, 0, sizeof(out)); + return strptime(s.c_str(), "%Y-%m-%d %H:%M:%S", &out) != nullptr; +} #endif diff --git a/LFtid1056/cloudfront/code/log4.h b/LFtid1056/cloudfront/code/log4.h index ef8cf07..581ff4e 100644 --- a/LFtid1056/cloudfront/code/log4.h +++ b/LFtid1056/cloudfront/code/log4.h @@ -73,8 +73,7 @@ void process_log_command(const std::string& id, const std::string& level, const void update_log_entries_countdown(); -extern "C" { -#endif + void remove_loggers_by_terminal_id(const std::string& terminal_id_cstr); void init_logger_process(); void init_loggers(); @@ -152,10 +151,7 @@ typedef enum LogCode { LOG_CODE_SPACE_ALARM = 700 /* 绌洪棿鍛婅 */ } LogCode; - -#ifdef __cplusplus -} -#endif +#endif // __cplusplus diff --git a/LFtid1056/cloudfront/code/main.cpp b/LFtid1056/cloudfront/code/main.cpp index a75453e..ed10c90 100644 --- a/LFtid1056/cloudfront/code/main.cpp +++ b/LFtid1056/cloudfront/code/main.cpp @@ -317,8 +317,8 @@ void Front::FrontThread() { try { while (!m_bIsFrontThreadCancle) { - //check_3s_config(); // 瀹炴椂鏁版嵁瑙﹀彂 - //create_recall_xml(); // 鐢熸垚寰呰ˉ鎷泋ml鏂囦欢 + + check_recall_event(); // 澶勭悊琛ユ嫑浜嬩欢锛屼粠list涓鍙栫劧鍚庣洿鎺ヨ皟鐢ㄦ帴鍙,姣忎竴鏉″彲鑳介兘涓嶅悓娴嬬偣锛屾瘡涓祴鐐硅嚜宸卞仛濂借褰 check_ledger_update(); // 瑙﹀彂鍙拌处鏇存柊 std::this_thread::sleep_for(std::chrono::milliseconds(100)); diff --git a/LFtid1056/cloudfront/code/rocketmq.cpp b/LFtid1056/cloudfront/code/rocketmq.cpp index 50638f4..35ed6d4 100644 --- a/LFtid1056/cloudfront/code/rocketmq.cpp +++ b/LFtid1056/cloudfront/code/rocketmq.cpp @@ -1007,7 +1007,6 @@ rocketmq::ConsumeStatus myMessageCallbackrecall(const rocketmq::MQMessageExt& ms if (!result.empty()) { - std::lock_guard lock(ledgermtx); recall_json_handle(result);//涓嶅啀浣跨敤鏂囦欢琛ユ嫑鏂瑰紡 } else { @@ -1824,7 +1823,7 @@ bool parsemsg(const std::string& devid, const std::string& guid, const nlohmann: ClientManager::instance().get_fixedvalue_action_to_device( devid, static_cast(parsed.cldid)); // 鑾峰彇瑁呯疆娴嬬偣瀹氬兼暟鎹 - ClientManager::instance().get_fixedvaluedes_action_to_device(devid); // 鑾峰彇瑁呯疆瀹氬兼弿杩 + ClientManager::instance().get_fixedvaluedes_action_to_device(devid); // 鑾峰彇瑁呯疆瀹氬兼弿杩 鍙湁杩欎竴姝ュ彲浠ュ搷搴旀垚鍔熷拰鍏抽棴 break; } case 2: { // 鍐 @@ -1871,7 +1870,7 @@ bool parsemsg(const std::string& devid, const std::string& guid, const nlohmann: 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-鎺у埗瀛楁弿杩 + ClientManager::instance().get_fixedvalucontrolword_action_to_device(devid, 2); // 2-鎺у埗瀛楁弿杩 鍙湁杩欎竴姝ュ彲浠ュ搷搴旀垚鍔熷拰鍏抽棴 break; } case 2: { // 鍐 diff --git a/LFtid1056/dealMsg.cpp b/LFtid1056/dealMsg.cpp index 106c9ca..1f5172b 100644 --- a/LFtid1056/dealMsg.cpp +++ b/LFtid1056/dealMsg.cpp @@ -617,7 +617,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_REALSTAT)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id,0, static_cast(DeviceState::READING_REALSTAT)); // 接收实时数据错误,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -706,8 +706,8 @@ void process_received_message(string mac, string id,const char* data, size_t len << ", Error: " << strerror(errno) << std::endl; // 文件保存失败,通知云端 - send_reply_to_cloud(static_cast(ResponseCode::BAD_REQUEST), - id, static_cast(DeviceState::READING_EVENTFILE)); + on_device_response_minimal(static_cast(ResponseCode::BAD_REQUEST), + id, 0, static_cast(DeviceState::READING_EVENTFILE)); } //当前文件下载完毕,调整为空闲处理下一项工作(如果这里后续有新文件等待下载,一般已经存入等待队列等候处理了,调成空闲状态后直接就会开始新文件的下载工作) @@ -716,7 +716,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_EVENTFILE)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_EVENTFILE)); // 接收波形文件数据错误,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -761,7 +761,7 @@ void process_received_message(string mac, string id,const char* data, size_t len else { std::cout << "reason code: " << static_cast(udata[8]) << "-" << static_cast(udata[9]) << "-" << static_cast(udata[10]) << "-" << static_cast(udata[11]) << std::endl; // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_FILEMENU)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_FILEMENU)); // 接收目录数据错误,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -859,7 +859,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_FILEDATA)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_FILEDATA)); // 下载文件数据错误,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -932,7 +932,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR),id,static_cast(DeviceState::READING_FIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_FIXEDVALUE)); // 读取定值错误,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1018,7 +1018,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR),id,static_cast(DeviceState::READING_FIXEDVALUEDES)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR),id,0,static_cast(DeviceState::READING_FIXEDVALUEDES)); // 读取定值描述,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1031,7 +1031,7 @@ void process_received_message(string mac, string id,const char* data, size_t len std::cout << "set success" << mac << std::endl; //响应lnk20250828 - send_reply_to_cloud(static_cast(ResponseCode::OK),id,static_cast(DeviceState::SET_FIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::OK),id,0,static_cast(DeviceState::SET_FIXEDVALUE)); //定值设置成功,调整为空闲,处理后续工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1041,7 +1041,7 @@ void process_received_message(string mac, string id,const char* data, size_t len // 装置否定应答,定值设置失败 //响应lnk20250828 - send_reply_to_cloud(static_cast(ResponseCode::BAD_REQUEST),id,static_cast(DeviceState::SET_FIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::BAD_REQUEST),id,0,static_cast(DeviceState::SET_FIXEDVALUE)); // 设置装置定值失败,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1051,7 +1051,7 @@ void process_received_message(string mac, string id,const char* data, size_t len // 设置装置定值失败,调整为空闲状态,处理下一项工作。 //响应lnk20250828 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR),id,static_cast(DeviceState::SET_FIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR),id,0,static_cast(DeviceState::SET_FIXEDVALUE)); ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -1103,7 +1103,7 @@ void process_received_message(string mac, string id,const char* data, size_t len else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_INTERFIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_INTERFIXEDVALUE)); // 读取装置内部定值失败,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1182,7 +1182,7 @@ void process_received_message(string mac, string id,const char* data, size_t len else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_INTERFIXEDVALUEDES)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_INTERFIXEDVALUEDES)); // 读取装置内部定值描述失败,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1246,7 +1246,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::READING_CONTROLWORD)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::READING_CONTROLWORD)); // 读取装置控制字描述失败,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -1257,7 +1257,7 @@ 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; //内部定值设置成功,调整为空闲,处理后续工作。 - send_reply_to_cloud(static_cast(ResponseCode::OK), id, static_cast(DeviceState::SET_INTERFIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::OK), id, 0, static_cast(DeviceState::SET_INTERFIXEDVALUE)); ClientManager::instance().change_device_state(id, DeviceState::IDLE); } @@ -1267,14 +1267,14 @@ void process_received_message(string mac, string id,const char* data, size_t len std::cout << "reason code: " << static_cast(udata[8]) << "-" << static_cast(udata[9]) << "-" << static_cast(udata[10]) << "-" << static_cast(udata[11]) << std::endl; // 装置否定应答,内部定值设置失败 - send_reply_to_cloud(static_cast(ResponseCode::BAD_REQUEST), id, static_cast(DeviceState::SET_INTERFIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::BAD_REQUEST), id, 0, static_cast(DeviceState::SET_INTERFIXEDVALUE)); // 设置装置内部定值失败,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } else { // 装置答非所问异常 - send_reply_to_cloud(static_cast(ResponseCode::INTERNAL_ERROR), id, static_cast(DeviceState::SET_INTERFIXEDVALUE)); + on_device_response_minimal(static_cast(ResponseCode::INTERNAL_ERROR), id, 0, static_cast(DeviceState::SET_INTERFIXEDVALUE)); // 设置装置内部定值失败,调整为空闲状态,处理下一项工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); }