From bf1eccf4361b9e8ebdb940bd16e5ceda389a5059 Mon Sep 17 00:00:00 2001 From: zhangwen <3466561528@qq.com> Date: Thu, 5 Mar 2026 15:38:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E8=A3=85=E7=BD=AE?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E5=91=BD=E4=BB=A4=E7=9A=84=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=92=8C=E6=89=A7=E8=A1=8C=E6=B5=81=E7=A8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LFtid1056/PQSMsg.cpp | 20 +++++++++++++++++++- LFtid1056/PQSMsg.h | 15 +++++++++++++-- LFtid1056/client2.cpp | 32 ++++++++++++++++++++++++++++++++ LFtid1056/client2.h | 8 ++++++++ LFtid1056/dealMsg.cpp | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 109 insertions(+), 3 deletions(-) diff --git a/LFtid1056/PQSMsg.cpp b/LFtid1056/PQSMsg.cpp index 9042ab2..5c4bec6 100644 --- a/LFtid1056/PQSMsg.cpp +++ b/LFtid1056/PQSMsg.cpp @@ -777,4 +777,22 @@ std::vector generate_requestHeartBeat_message() { // 生成完整报文 return GetMsg(DataBuf, static_cast(MsgRequestType::Request_HeartBeat)); -} \ No newline at end of file +} + +/** + * @brief 生成装置控制命令报文 + * @param type 命令类型 1-装置复位,2-启动录波,3-启动200ms数据记录,4-启动3秒数据记录 + * @param ctrlflag 命令校验 首次传入0 接收校验应答后 0x01执行 0x02取消 + * @return 包含完整报文的字节向量 + */ +std::vector generate_control_message(uint8_t type, uint8_t ctrlflag) { + // 创建3字节缓冲区并初始化 + std::vector DataBuf(3, 0x00); + + DataBuf[0] = type; // 1-装置复位,2-启动录波,3-启动200ms数据记录,4-启动3秒数据记录 + DataBuf[1] = ctrlflag; // 0x01执行 0x02取消 + + // 生成完整报文 + return GetMsg(DataBuf, static_cast(MsgRequestType::Request_Ctrl)); +} + diff --git a/LFtid1056/PQSMsg.h b/LFtid1056/PQSMsg.h index b682b9c..1f44b8e 100644 --- a/LFtid1056/PQSMsg.h +++ b/LFtid1056/PQSMsg.h @@ -47,7 +47,9 @@ enum class MsgRequestType : unsigned char { //设置装置对时 Request_RightTime = 0x86, //补招事件日志 - Request_Read_Event = 0x0D + Request_Read_Event = 0x0D, + //执行控制事件 + Request_Ctrl = 0x0A }; // 接收报文功能码枚举 enum class MsgResponseType : unsigned char { @@ -85,6 +87,8 @@ enum class MsgResponseType : unsigned char { Response_RightTime = 0x86, //补招事件日志 Response_Read_Event = 0x8D, + //执行控制事件应答 + Response_Ctrl = 0x8a, //默认肯定应答 Response_NewACK = 0x40, //默认否定应答 @@ -2426,4 +2430,11 @@ std::vector generate_recallevent_message(const std::tm& Time1, const st * @brief 生成装置心跳报文 * @return 包含完整报文的字节向量 */ -std::vector generate_requestHeartBeat_message(); \ No newline at end of file +std::vector generate_requestHeartBeat_message(); +/** + * @brief 生成装置控制命令报文 + * @param type 命令类型 1-装置复位,2-启动录波,3-启动200ms数据记录,4-启动3秒数据记录 + * @param ctrlflag 命令校验 首次传入0 接收校验应答后 0x01执行 0x02取消 + * @return 包含完整报文的字节向量 + */ +std::vector generate_control_message(uint8_t type, uint8_t ctrlflag); \ No newline at end of file diff --git a/LFtid1056/client2.cpp b/LFtid1056/client2.cpp index 91bf576..0824a88 100644 --- a/LFtid1056/client2.cpp +++ b/LFtid1056/client2.cpp @@ -1730,6 +1730,38 @@ bool ClientManager::read_devversion_action_to_device(const std::string& identifi return false; // 璁惧鏈壘鍒 } +/** + * @brief 鐢熸垚瑁呯疆鎺у埗鍛戒护鎶ユ枃 + * @param type 鍛戒护绫诲瀷 1-瑁呯疆澶嶄綅锛2-鍚姩褰曟尝锛3-鍚姩200ms鏁版嵁璁板綍锛4-鍚姩3绉掓暟鎹褰 + * @param ctrlflag 鍛戒护鏍¢獙 棣栨浼犲叆0x00 鎺ユ敹鏍¢獙搴旂瓟鍚 0x01鎵ц 0x02鍙栨秷 + * @return 鍖呭惈瀹屾暣鎶ユ枃鐨勫瓧鑺傚悜閲 + */ +bool ClientManager::set_ctrl_action_to_device(const std::string& identifier, uint8_t type, uint8_t ctrlflag) { + std::lock_guard 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_control_message(type, ctrlflag); + + // 娣诲姞鍔ㄤ綔鍒伴槦鍒 (鐘舵: 璁剧疆瑁呯疆鎺у埗鍛戒护) + ctx->add_action(DeviceState::SET_CTRL, packet); + + // 濡傛灉褰撳墠绌洪棽鍒欑珛鍗虫墽琛 + if (ctx->current_state_ == DeviceState::IDLE) { + ctx->process_next_action(); + } + + return true; // 鎴愬姛娣诲姞 + } + } + return false; // 璁惧鏈壘鍒 +} + /** * @brief 琛ユ嫑浜嬩欢鏃ュ織鍔ㄤ綔 * @param Time1 璧峰鏃堕棿 diff --git a/LFtid1056/client2.h b/LFtid1056/client2.h index 25ab048..4ff2b8b 100644 --- a/LFtid1056/client2.h +++ b/LFtid1056/client2.h @@ -65,6 +65,7 @@ enum class DeviceState { SET_RIGHTTIME_2, // 设置装置对时(主动触发) READING_EVENTLOG, // 补招事件日志 READING_STATSFILE, // 补招稳态数据文件 + SET_CTRL, // 设置装置控制命令 // 可根据需要添加更多状态 CUSTOM_ACTION // 自定义动作 }; @@ -459,6 +460,13 @@ public: * @return 调用成功或失败的结果 */ bool read_eventlog_action_to_device(const std::string& identifier, const std::tm& Time1, const std::tm& Time2,uint8_t eventType = 2, uint8_t monitorPoint = 1); + /** + * @brief 生成装置控制命令报文 + * @param type 命令类型 1-装置复位,2-启动录波,3-启动200ms数据记录,4-启动3秒数据记录 + * @param ctrlflag 命令校验 首次传入0x00 接收校验应答后 0x01执行 0x02取消 + * @return 包含完整报文的字节向量 + */ + bool set_ctrl_action_to_device(const std::string& identifier, uint8_t type, uint8_t ctrlflag); private: ClientManager() : loop_(nullptr) {} std::unordered_map> clients_; diff --git a/LFtid1056/dealMsg.cpp b/LFtid1056/dealMsg.cpp index d56240c..59a7bff 100644 --- a/LFtid1056/dealMsg.cpp +++ b/LFtid1056/dealMsg.cpp @@ -93,6 +93,9 @@ void process_received_message(string mac, string id,const char* data, size_t len //瑁呯疆鐧诲綍鎴愬姛 ClientManager::instance().set_cloud_status(id, 1); //璁剧疆浜嗕簯鍓嶇疆鐧诲綍鐘舵佷负宸茬櫥褰 ClientManager::instance().read_devversion_action_to_device(id);//涓诲姩瑙﹀彂锛岃鍙栬缃増鏈厤缃俊鎭紝浠呭湪瑁呯疆鐧诲綍鍚庢墽琛屼竴娆★紝褰撳墠鑾峰彇鐗堟湰淇℃伅纭瀵规椂鎶ユ枃缁撴瀯銆 + + //ClientManager::instance().set_ctrl_action_to_device(id,0x01,0x00);//灏濊瘯瑁呯疆閲嶅惎鎸囦护锛佺涓姝ユ牎楠 + //ClientManager::instance().set_ctrl_action_to_device(id, 0x01, 0x01);//灏濊瘯瑁呯疆閲嶅惎鎸囦护锛佹牎楠屽畬姣曞悗灏濊瘯鎵ц閲嶅惎鎸囦护 //ClientManager::instance().get_dev_status(id);//璁惧鍦ㄧ嚎鎯呭喌鍒ゆ柇 ture鍦ㄧ嚎 false绂荤嚎 //ClientManager::instance().set_real_state_count("D002", 1,1);//鐧诲綍鍚庢祴璇曞疄鏃 @@ -410,6 +413,7 @@ void process_received_message(string mac, string id,const char* data, size_t len // 鎺ユ敹蹇冭烦鎶ユ枃閿欒锛岃皟鏁翠负绌洪棽鐘舵侊紝澶勭悊涓嬩竴椤瑰伐浣溿 ClientManager::instance().change_device_state(id, DeviceState::IDLE); } + break; case DeviceState::READING_STATS: // 璇诲彇缁熻鏁版嵁鐘舵 @@ -2232,6 +2236,39 @@ void process_received_message(string mac, string id,const char* data, size_t len } break; + case DeviceState::SET_CTRL: + //瑁呯疆鎺у埗鍛戒护 + if (udata[8] == static_cast(MsgResponseType::Response_Ctrl)) { + //绗竴娆℃帴鏀跺埌鎺у埗鍛戒护搴旂瓟锛屽皾璇曟牎楠屽懡浠ゆ槸鍚﹀悎娉曪紒 + if (udata[9] == 0x01) { + //褰撳墠浠呮鏌0x01澶嶄綅鎸囦护锛佸叾浣欐帶鍒舵寚浠ゅ叏閮ㄤ緷鐓т笉鍚堟硶澶勭悊锛 + std::cout << "***ctrl do next" << mac << std::endl; + //鎺у埗鍛戒护鏍¢獙鍚堟硶锛岃皟鏁翠负绌洪棽锛屽鐞嗗悗缁伐浣溿 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + else { + std::cout << "***ctrl fail" << mac << std::endl; + //鎺у埗鍛戒护鏍¢獙涓嶅悎娉曪紝璋冩暣涓虹┖闂诧紝澶勭悊鍚庣画宸ヤ綔銆 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + } + else if (udata[8] == static_cast(MsgResponseType::Response_NewACK)) { + std::cout << "***ctrl success" << mac << std::endl; + //鎺у埗鍛戒护鎵ц瀹屾瘯锛岃皟鏁翠负绌洪棽锛屽鐞嗗悗缁伐浣溿 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + else if (udata[8] == static_cast(MsgResponseType::Response_NewNACK)) { + std::cout << "***ctrl fail" << mac << std::endl; + //鎺у埗鍛戒护鎵ц澶辫触锛岃皟鏁翠负绌洪棽锛屽鐞嗗悗缁伐浣溿 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + else { + // 瑁呯疆绛旈潪鎵闂紓甯 + // 鎺у埗鍛戒护澶辫触锛岃皟鏁翠负绌洪棽鐘舵侊紝澶勭悊涓嬩竴椤瑰伐浣溿 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + break; + case DeviceState::CUSTOM_ACTION: // 鑷畾涔夊姩浣滅姸鎬 std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;