From 722512fad6b02f2c2d1ab5281e6147d75e96db19 Mon Sep 17 00:00:00 2001 From: zw <3466561528@qq.com> Date: Thu, 4 Sep 2025 15:37:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E8=A3=85=E7=BD=AE?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86=E7=8A=B6=E6=80=81=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=96=B9=E6=B3=95=E3=80=82=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=8630=E5=88=86=E9=92=9F=E5=AE=9A=E6=97=B6=E5=AF=B9?= =?UTF-8?q?=E6=97=B6=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LFtid1056/PQSMsg.cpp | 39 +++++++++++ LFtid1056/PQSMsg.h | 14 +++- LFtid1056/client2.cpp | 140 +++++++++++++++++++++++++++++++++++++- LFtid1056/client2.h | 13 +++- LFtid1056/dealMsg.cpp | 48 ++++++++++--- LFtid1056/main_thread.cpp | 4 +- 6 files changed, 243 insertions(+), 15 deletions(-) diff --git a/LFtid1056/PQSMsg.cpp b/LFtid1056/PQSMsg.cpp index 8372e90..5c06d94 100644 --- a/LFtid1056/PQSMsg.cpp +++ b/LFtid1056/PQSMsg.cpp @@ -663,4 +663,43 @@ std::vector generate_machineversion_message() // 调用通用报文生成函数,功能码14对应装置状态读取 return GetMsg(DataBuf, static_cast(MsgRequestType::Request_Read_RunningInformation)); +} + +/** + * @brief 生成设置装置对时的报文 + * @param time 下发的对时时间 (tm值) + * @return 包含完整报文的字节向量 + */ +std::vector generate_righttime_message(const std::tm& time) { + std::vector DataBuf(15, 0x00); // 创建15字节缓冲区并初始化为0 + + // 前3字节为备用,已初始化为0 + + // 直接填充年月日时分秒(各占2字节,大端序) + uint16_t year = static_cast(time.tm_year + 1900); + DataBuf[3] = static_cast((year >> 8) & 0xFF); // 高字节 + DataBuf[4] = static_cast(year & 0xFF); // 低字节 + + uint16_t month = static_cast(time.tm_mon + 1); + DataBuf[5] = static_cast((month >> 8) & 0xFF); + DataBuf[6] = static_cast(month & 0xFF); + + uint16_t day = static_cast(time.tm_mday); + DataBuf[7] = static_cast((day >> 8) & 0xFF); + DataBuf[8] = static_cast(day & 0xFF); + + uint16_t hour = static_cast(time.tm_hour); + DataBuf[9] = static_cast((hour >> 8) & 0xFF); + DataBuf[10] = static_cast(hour & 0xFF); + + uint16_t minute = static_cast(time.tm_min); + DataBuf[11] = static_cast((minute >> 8) & 0xFF); + DataBuf[12] = static_cast(minute & 0xFF); + + uint16_t second = static_cast(time.tm_sec); + DataBuf[13] = static_cast((second >> 8) & 0xFF); + DataBuf[14] = static_cast(second & 0xFF); + + // 调用已有的GetMsg函数生成完整报文,功能码134(0x86) + return GetMsg(DataBuf, static_cast(MsgRequestType::Request_RightTime)); } \ No newline at end of file diff --git a/LFtid1056/PQSMsg.h b/LFtid1056/PQSMsg.h index 68d62e5..4fbc9a2 100644 --- a/LFtid1056/PQSMsg.h +++ b/LFtid1056/PQSMsg.h @@ -41,7 +41,9 @@ enum class MsgRequestType : unsigned char { //设置内部定值 Request_Set_InterFix = 0x25, //询问装置运行信息 - Request_Read_RunningInformation = 0x0e + Request_Read_RunningInformation = 0x0e, + //设置装置对时 + Request_RightTime = 0x86 }; // 接收报文功能码枚举 enum class MsgResponseType : unsigned char { @@ -73,6 +75,8 @@ enum class MsgResponseType : unsigned char { Response_Set_InterFix = 0xA5, //询问装置运行信息 Response_Read_RunningInformation = 0x8e, + //设置装置对时(未使用,采用默认肯定与否定应答) + Response_RightTime = 0x86, //默认肯定应答 Response_NewACK = 0x40, //默认否定应答 @@ -2179,4 +2183,10 @@ std::vector generate_machinestatus_message(); * @brief 生成装置版本配置信息读取指令报文 * @return 包含完整报文的字节向量 */ -std::vector generate_machineversion_message(); \ No newline at end of file +std::vector generate_machineversion_message(); +/** + * @brief 生成设置装置对时的报文 + * @param time 下发的对时时间 (tm值) + * @return 包含完整报文的字节向量 + */ +std::vector generate_righttime_message(const std::tm& time); \ No newline at end of file diff --git a/LFtid1056/client2.cpp b/LFtid1056/client2.cpp index f05efda..9edabc9 100644 --- a/LFtid1056/client2.cpp +++ b/LFtid1056/client2.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include // 閰嶇疆鍙傛暟 constexpr int BASE_RECONNECT_DELAY = 20000; // 鍩虹閲嶈繛寤惰繜(ms) @@ -312,6 +314,48 @@ void ClientContext::clear_float_cache() { std::lock_guard lock(float_cache_mutex_); point_float_cache_.clear(); } +// 鐗堟湰姣旇緝鍑芥暟鐨勮緟鍔╁嚱鏁帮細鍒嗗壊瀛楃涓插苟杞崲涓烘暣鏁板悜閲 +std::vector splitVersionString(const std::string& versionStr) { + std::vector segments; + std::stringstream ss(versionStr); + std::string segment; + + while (std::getline(ss, segment, '.')) { + segments.push_back(std::stoi(segment)); + } + return segments; +} +// 鐗堟湰姣旇緝鍑芥暟 +bool isVersionGreaterOrEqual(const std::string& version1, const std::string& version2) { + // 鍘婚櫎寮澶寸殑'V'锛堝鏋滃瓨鍦級 + std::string v1 = version1; + if (!v1.empty() && v1[0] == 'V') { + v1.erase(0, 1); + } + + std::string v2 = version2; + if (!v2.empty() && v2[0] == 'V') { + v2.erase(0, 1); + } + + // 鍒嗗壊鐗堟湰鍙 + std::vector seg1 = splitVersionString(v1); + std::vector seg2 = splitVersionString(v2); + + // 閫愭姣旇緝鐗堟湰鍙 + size_t maxSize = std::max(seg1.size(), seg2.size()); + for (size_t i = 0; i < maxSize; ++i) { + int num1 = (i < seg1.size()) ? seg1[i] : 0; + int num2 = (i < seg2.size()) ? seg2[i] : 0; + + if (num1 != num2) { + return num1 > num2; + } + } + + return true; // 鎵鏈夋閮界浉绛 +} + /* 缂撳啿鍖哄垎閰嶅洖璋 */ void alloc_buffer(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { buf->base = new char[suggested_size]; @@ -365,6 +409,14 @@ void on_timer(uv_timer_t* handle) { // 妫鏌ョ姸鎬佽秴鏃 30绉掔姸鎬佹湭鏇存柊鍒欓噸缃负绌洪棽鐘舵 ctx->check_state_timeout(); + //妫鏌ュ綋鍓嶈缃渶鏂伴氳鏃堕棿鏄惁瓒呰繃1鍒嗛挓锛屽鏋1鍒嗛挓鍐呮病鏈夋敹鍒颁换浣曡缃氳娑堟伅锛屽垯璋冩暣涓烘湭鐧诲綍鐘舵侊紝閫氳鐘舵佽缃负绂荤嚎. + uint64_t timecheck = uv_now(ctx->loop);//褰撳墠鏃堕棿鎴 + if (timecheck - ctx->get_cloudmessage_time >= 60000) { + ctx->get_cloudmessage_time = timecheck; + //涓嶇鍘熺姸鎬佹槸浠涔堬紝杩欓噷閮借缃缃櫥褰曠姸鎬佷负鏈櫥褰 + ClientManager::instance().set_cloud_status(ctx->device_info.device_id, 0); + } + // 瑁呯疆鐧诲綍鎴愬姛鍚庯紝鍙湪绌洪棽鐘舵佸鐞嗗悗缁姩浣 if (ctx->cloudstatus == 1) { uint64_t now = uv_now(ctx->loop);//褰撳墠鏃堕棿鎴 @@ -396,11 +448,39 @@ void on_timer(uv_timer_t* handle) { auto sendbuff = generate_machinestatus_message();//缁勮璇诲彇瑁呯疆杩愯淇℃伅鎶ユ枃 ctx->add_action(DeviceState::READING_RUNNINGINFORMATION_2, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 } + //30鍒嗛挓涓娆 鍚姩瑁呯疆瀵规椂 浠呭湪鍙拌处寮鍚鏃朵笖浜戝崗璁増鏈ぇ浜1.5鏃跺紑鍚鏃 60000 * 30 + now = uv_now(ctx->loop); + if (ctx->current_state_ == DeviceState::IDLE && now - ctx->right_time >= 60000 * 30 && ctx->device_info.righttime && isVersionGreaterOrEqual(ctx->dev_CloudProtocolVer,"V1.5")) + { + // 鏇存柊瀵规椂鍔熻兘鏈鍚庤繍琛屾椂闂 + ctx->right_time = now; + + // 鑾峰彇褰撳墠鏃堕棿 + auto now = std::chrono::system_clock::now(); + std::time_t time = std::chrono::system_clock::to_time_t(now); + std::tm tm_time = *std::localtime(&time); + auto sendbuff = generate_righttime_message(tm_time);//缁勮瑁呯疆瀵规椂鎶ユ枃 + ctx->add_action(DeviceState::SET_RIGHTTIME, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 + //auto sendbuff = generate_machinestatus_message();//缁勮璇诲彇瑁呯疆杩愯淇℃伅鎶ユ枃 + //ctx->add_action(DeviceState::READING_RUNNINGINFORMATION_2, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 + } //澶勭悊鍚庣画宸ヤ綔闃熷垪鐨勫伐浣 鍙栧嚭涓涓苟鎵ц if (ctx->current_state_ == DeviceState::IDLE) { ctx->process_next_action(); } } + else { + //瑁呯疆鐧诲綍鐘舵佸紓甯革紝棰勫閲嶅彂鐧诲綍鎶ユ枃锛屾鏌ユ渶鏂扮櫥褰曟姤鏂囧彂閫佹椂闂达紝瓒呰繃闄愬埗鍒欓噸鍙戠櫥褰曟姤鏂 + uint64_t now = uv_now(ctx->loop);//褰撳墠鏃堕棿鎴 + if (now - ctx->login_cloud_time >= 60000) { + //鏇存柊鏈鍚庝竴娆$櫥褰曟姤鏂囧彂閫佹椂闂 + ctx->login_cloud_time = now; + + //瑁呯疆鏈櫥褰曪紝涓60绉掑唴娌℃湁鍙戦佽缃櫥褰曟姤鏂囷紝棰勫鍙戦佺櫥褰曟姤鏂 + auto binary_data = generate_frontlogin_message(ctx->device_info.mac); + safe_send_binary_data(ctx, binary_data); + } + } } /* 鍙戦佷簩杩涘埗鎶ユ枃鍑芥暟 */ @@ -470,8 +550,8 @@ void on_close(uv_handle_t* handle) { ctx->clear_stat_cache(); // 娓呴櫎娴偣鏁版嵁缂撳瓨 ctx->clear_float_cache(); - - ctx->cloudstatus = 0; + // 瑁呯疆鐧诲綍鐘舵佽皟鏁翠负绂荤嚎 + ClientManager::instance().set_cloud_status(ctx->device_info.device_id, 0); { std::lock_guard state_lock(ctx->state_mutex_); ctx->current_state_ = DeviceState::IDLE; // 鐩存帴淇敼鐘舵 @@ -542,6 +622,9 @@ void on_connect(uv_connect_t* req, int status) { ctx->last_state_query_time_ = uv_now(ctx->loop);//鍒濆鍖栫粺璁℃暟鎹椂闂存埑 ctx->real_state_query_time_ = uv_now(ctx->loop);//鍒濆鍖栧疄鏃舵暟鎹椂闂存埑 ctx->read_runninginformationMsg = uv_now(ctx->loop);//鍒濆鍖栬鍙栬缃繍琛屼俊鎭椂闂存埑 + ctx->right_time = uv_now(ctx->loop);//鍒濆鍖栧鏃舵椂闂存埑 + ctx->get_cloudmessage_time = uv_now(ctx->loop);//鍒濆鍖栨渶鏂拌缃氳鎶ユ枃鏃堕棿鎴 + ctx->login_cloud_time = uv_now(ctx->loop);//鍒濆鍖栬缃櫥褰曟姤鏂囪秴鏃跺彂閫佹椂鏍 ctx->real_state_count = 0;//瀹炴椂鏁版嵁鏀跺彂璁℃暟 //瀹㈡埛绔繛鎺ュ畬姣曞悗锛屽彂閫佽缃櫥闄嗘秷鎭 std::cout << "connected: " << ctx->device_info.mac << " send login msg!" << std::endl; @@ -727,6 +810,17 @@ bool ClientManager::set_cloud_status(const std::string& identifier, int status) if (ctx->device_info.device_id == identifier || ctx->device_info.mac == identifier) { + if (ctx->cloudstatus == 0 && status == 1) { + //璁惧浠庣绾胯浆鎹㈣嚦鍦ㄧ嚎锛岄氱煡鍓嶅彴鐘舵佸彂鐢熺炕杞 + std::cout << "[Device " << identifier + << "] ****Cloud status: " << ctx->cloudstatus << " updated to: " << status << std::endl; + } + else if (ctx->cloudstatus == 1 && status == 0) { + //璁惧浠庡湪绾胯浆鎹㈣嚦绂荤嚎锛岄氱煡鍓嶅彴鐘舵佸彂鐢熺炕杞 + std::cout << "[Device " << identifier + << "] ****Cloud status: " << ctx->cloudstatus << " updated to: " << status << std::endl; + } + // 淇敼浜戝墠缃櫥褰曠姸鎬 ctx->cloudstatus = status; std::cout << "[Device " << identifier @@ -739,6 +833,48 @@ bool ClientManager::set_cloud_status(const std::string& identifier, int status) return false; } +//鍒锋柊瀹㈡埛绔缃渶鏂版帴鏀堕氳鎶ユ枃鏃堕棿 +bool ClientManager::set_cloudmessage_time(const std::string& identifier) { + std::lock_guard lock(mutex_); + + for (auto& pair : clients_) { + auto& ctx = pair.second; + // 鍖归厤瑁呯疆ID鎴朚AC鍦板潃 + if (ctx->device_info.device_id == identifier || + ctx->device_info.mac == identifier) { + + // 淇敼浜戝墠缃櫥褰曠姸鎬 + ctx->get_cloudmessage_time = uv_now(ctx->loop);//鍒锋柊鏈鏂拌缃氳鎶ユ枃鏃堕棿鎴 + return true; + } + } + + std::cerr << "[set_cloud_status] Device not found: " << identifier << std::endl; + return false; +} + +//淇敼瀹㈡埛绔鍙栧埌鐨勯厤缃俊鎭細浜戝崗璁増鏈 +bool ClientManager::set_versioninformation(const std::string& identifier, string cloud_version) { + std::lock_guard lock(mutex_); + + for (auto& pair : clients_) { + auto& ctx = pair.second; + // 鍖归厤瑁呯疆ID鎴朚AC鍦板潃 + if (ctx->device_info.device_id == identifier || + ctx->device_info.mac == identifier) { + + // 淇敼浜戝墠缃櫥褰曠姸鎬 + ctx->dev_CloudProtocolVer = cloud_version; + std::cout << "[Device " << identifier + << "] Cloud version updated to: " << cloud_version << std::endl; + return true; + } + } + + std::cerr << "[set_cloud_status] Device not found: " << identifier << std::endl; + return false; +} + bool ClientManager::add_action_to_device(const std::string& identifier, DeviceState state, const std::vector& packet) { diff --git a/LFtid1056/client2.h b/LFtid1056/client2.h index db3f453..6476a58 100644 --- a/LFtid1056/client2.h +++ b/LFtid1056/client2.h @@ -60,6 +60,7 @@ enum class DeviceState { READING_RUNNINGINFORMATION_1,// 读取装置运行信息(主动触发) READING_RUNNINGINFORMATION_2,// 读取装置运行信息(定时执行) READING_DEVVERSION, // 读取装置版本配置信息 + SET_RIGHTTIME, // 设置装置对时 // 可根据需要添加更多状态 CUSTOM_ACTION // 自定义动作 }; @@ -84,9 +85,13 @@ public: std::atomic real_state_count{ 0 };//实时数据收发计数 原子操作保证线程安全 std::atomic real_point_id_{ 1 }; // 新增:实时数据读取的测点序号(原子操作) uint64_t read_runninginformationMsg = 0; // 装置定时读取运行信息时间戳 + uint64_t right_time = 0; // 装置定时对时时间戳 DeviceInfo device_info; // 装置信息 - int cloudstatus; // 云前置登录状态(0:未登录 1:已登录) + int cloudstatus = 0; // 云前置登录状态(0:未登录 1:已登录)初始化默认为0 + uint64_t get_cloudmessage_time = 0;//获取最新装置通讯报文时标 + uint64_t login_cloud_time = 0;//装置登录报文超时发送时标 + std::string dev_CloudProtocolVer = "V1.0";//装置云协议版本号 例:V1.5(装置登录后获取一次,当前用于判断对时版本),不存在则默认为V1.0 // 新增状态管理成员 DeviceState current_state_; // 当前装置状态 @@ -374,6 +379,12 @@ public: std::string get_current_filename(const std::string& identifier); + //刷新客户端装置最新接收通讯报文时间 + bool set_cloudmessage_time(const std::string& identifier); + + //读取并修改客户端的装置运维信息以备后续各类功能使用 + bool set_versioninformation(const std::string& identifier, string cloud_version); + //读取文件目录调用 传入mac/id + 文件路径 bool add_file_menu_action_to_device(const std::string& identifier, const std::string& file_path); diff --git a/LFtid1056/dealMsg.cpp b/LFtid1056/dealMsg.cpp index c859240..cfdcb3a 100644 --- a/LFtid1056/dealMsg.cpp +++ b/LFtid1056/dealMsg.cpp @@ -51,7 +51,9 @@ std::string extract_filename(const std::string& path) { void process_received_message(string mac, string id,const char* data, size_t length) { // 实际的消息处理逻辑 std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl; - // 示例:解析消息并处理 + + // 接收到消息后,先找到指定装置刷新对应最新通讯时间戳 + ClientManager::instance().set_cloudmessage_time(id); //数据处理逻辑 if (length > 0) { @@ -70,6 +72,8 @@ void process_received_message(string mac, string id,const char* data, size_t len std::cout << "cloud login: " << mac << " state: success!" << std::endl; //装置登录成功 ClientManager::instance().set_cloud_status(id, 1); //设置了云前置登录状态为已登录 + ClientManager::instance().read_devversion_action_to_device(id);//主动触发,读取装置版本配置信息,仅在装置登录后执行一次,当前获取版本信息确认对时报文结构。 + //ClientManager::instance().set_real_state_count("D002", 1,1);//登录后测试实时 //ClientManager::instance().add_file_menu_action_to_device("D002","/etc");//测试文件目录读取 //ClientManager::instance().add_file_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//测试文件下载 @@ -80,7 +84,8 @@ void process_received_message(string mac, string id,const char* data, size_t len //ClientManager::instance().get_fixedvalucontrolword_action_to_device(id,1);//获取 1-内部定值描述 或者 2-控制字描述 //ClientManager::instance().set_interfixedvalue_action_to_device();装置修改内部定值测试(参数由外部提供) //ClientManager::instance().read_runninginformation_action_to_device(id);//主动触发,读取装置运行信息 - ClientManager::instance().read_devversion_action_to_device(id);//主动触发,读取装置版本配置信息 + + } if (udata[19] == 0x00) { std::cout << "cloud login: " << mac << " state: fail!" << std::endl; @@ -795,7 +800,7 @@ void process_received_message(string mac, string id,const char* data, size_t len //使用接口上送文件lnk20250826 std::string filename; - SendFileWeb(WEB_FILEUPLOAD, file_path, file_path, filename); + //SendFileWeb(WEB_FILEUPLOAD, file_path, file_path, filename); std::cout << "File upload: " << filename << std::endl; } @@ -873,7 +878,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } //存储定值lnk20250827 - save_internal_value(id, monitor_index, fList); + //save_internal_value(id, monitor_index, fList); //测试定值修改功能 //ClientManager::instance().set_fixedvalue_action_to_device(id, monitor_index, fList); @@ -960,7 +965,7 @@ void process_received_message(string mac, string id,const char* data, size_t len // 提取测点序号 (第一个字节) 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); + //send_set_value_reply(id, monitor_index, dz_list); //定值描述读取完毕,调整为空闲,处理后续工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1031,7 +1036,7 @@ void process_received_message(string mac, string id,const char* data, size_t len } //存储定值lnk20250827 - save_internal_value(id, fList); + //save_internal_value(id, fList); //内部定值修改测试 //ClientManager::instance().set_interfixedvalue_action_to_device(id, fList); @@ -1748,8 +1753,12 @@ void process_received_message(string mac, string id,const char* data, size_t len } } + //云协议版本非空则赋值,未赋值则使用默认的V1.0 + if (!versionInfo.CloudProtocolVer.empty()) { + ClientManager::instance().set_versioninformation(id, versionInfo.CloudProtocolVer); + } // 打印解析结果 - std::cout << "Device Version Info (" << mac << "):\n" + /*std::cout << "Device Version Info (" << mac << "):\n" << " Base Model: " << versionInfo.BaseModel << "\n" << " Cloud Protocol: " << versionInfo.CloudProtocolVer << "\n" << " App Version: " << versionInfo.AppVersion << "\n" @@ -1759,7 +1768,7 @@ void process_received_message(string mac, string id,const char* data, size_t len << " Wave File Types: " << versionInfo.WaveFileTypeCount << "\n" << " Comm Protocols: 0x" << std::hex << versionInfo.CommProtocols << "\n" << " Time Sync Methods: 0x" << versionInfo.TimeSyncMethods << "\n" - << " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n"; + << " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n";*/ //读取装置版本配置信息成功,调整为空闲,处理后续工作。 ClientManager::instance().change_device_state(id, DeviceState::IDLE); @@ -1771,6 +1780,29 @@ void process_received_message(string mac, string id,const char* data, size_t len } break; + case DeviceState::SET_RIGHTTIME: + //设置装置对时 + if (udata[8] == static_cast(MsgResponseType::Response_NewACK)) { + std::cout << "set success" << mac << std::endl; + //对时设置成功,调整为空闲,处理后续工作。 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + else if (udata[8] == static_cast(MsgResponseType::Response_NewNACK)) { + std::cout << "set error" << mac << std::endl; + + std::cout << "reason code: " << static_cast(udata[8]) << "-" << static_cast(udata[9]) << "-" << static_cast(udata[10]) << "-" << static_cast(udata[11]) << 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; diff --git a/LFtid1056/main_thread.cpp b/LFtid1056/main_thread.cpp index 9515631..86f6b9f 100644 --- a/LFtid1056/main_thread.cpp +++ b/LFtid1056/main_thread.cpp @@ -158,7 +158,7 @@ void* client_manager_thread(void* arg) { {"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0}, {"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0} }; - //00B78DA800D6 00-B7-8D-01-79-06 + //00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 // 创建装置列表 std::vector devices = { { @@ -391,7 +391,7 @@ int main(int argc ,char** argv) {// std::vector points2 = { {"P101", "Generator Output", "D002",1 ,1, 1, 1, 1,"0.38k",0} }; - //00B78DA800D6 00-B7-8D-01-79-06 + //00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 // 创建装置列表 std::vector devices = { {