diff --git a/LFtid1056/PQSMsg.cpp b/LFtid1056/PQSMsg.cpp index 7a8bac5..9042ab2 100644 --- a/LFtid1056/PQSMsg.cpp +++ b/LFtid1056/PQSMsg.cpp @@ -765,4 +765,16 @@ std::vector generate_recallevent_message(const std::tm& Time1, const st // 调用已有的GetMsg函数生成完整报文,功能码0x0D(事件补招功能码) return GetMsg(DataBuf, static_cast(MsgRequestType::Request_Read_Event)); +} + +/** + * @brief 生成装置心跳报文 + * @return 包含完整报文的字节向量 + */ +std::vector generate_requestHeartBeat_message() { + // 创建3字节缓冲区并初始化 + std::vector DataBuf(3, 0x00); + + // 生成完整报文 + return GetMsg(DataBuf, static_cast(MsgRequestType::Request_HeartBeat)); } \ No newline at end of file diff --git a/LFtid1056/PQSMsg.h b/LFtid1056/PQSMsg.h index 4cb0216..b682b9c 100644 --- a/LFtid1056/PQSMsg.h +++ b/LFtid1056/PQSMsg.h @@ -18,6 +18,8 @@ float ShorToFloat1000(short num); float ShorToFloat10000(short num); // 发送报文功能码枚举 enum class MsgRequestType : unsigned char { + //询问装置心跳 + Request_HeartBeat = 0x01, //询问统计数据时间 Request_StatTime = 0x8b, //询问统计数据 @@ -49,6 +51,8 @@ enum class MsgRequestType : unsigned char { }; // 接收报文功能码枚举 enum class MsgResponseType : unsigned char { + //询问装置心跳应答 + Response_HeartBeat = 0x81, //询问统计数据时间 Response_StatTime = 0x27, //询问统计数据 @@ -2417,4 +2421,9 @@ std::vector generate_righttime_message(const std::tm& time); * @param monitorPoint 监测点,默认1-监测点1 1-6 对应测点 * @return 包含完整报文的字节向量 */ -std::vector generate_recallevent_message(const std::tm& Time1, const std::tm& Time2, uint8_t eventType = 2, uint8_t monitorPoint = 1); \ No newline at end of file +std::vector generate_recallevent_message(const std::tm& Time1, const std::tm& Time2, uint8_t eventType = 2, uint8_t monitorPoint = 1); +/** + * @brief 生成装置心跳报文 + * @return 包含完整报文的字节向量 + */ +std::vector generate_requestHeartBeat_message(); \ No newline at end of file diff --git a/LFtid1056/client2.cpp b/LFtid1056/client2.cpp index b233c3e..91bf576 100644 --- a/LFtid1056/client2.cpp +++ b/LFtid1056/client2.cpp @@ -479,6 +479,17 @@ void on_timer(uv_timer_t* handle) { auto sendbuff = generate_statequerytime_message();//缁勮璇㈤棶缁熻鏁版嵁鏃堕棿鎶ユ枃 ctx->add_action(DeviceState::READING_STATS_TIME, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 } + + //30绉掍竴娆 鎵ц璇㈤棶瑁呯疆蹇冭烦 + now = uv_now(ctx->loop); + if (ctx->current_state_ == DeviceState::IDLE && now - ctx->heartbeat_time >= 30000) { + //鏇存柊瑁呯疆蹇冭烦鏈鏂板彂閫佹椂闂 + ctx->heartbeat_time = now; + + auto sendbuff = generate_requestHeartBeat_message();//缁勮瑁呯疆蹇冭烦鎶ユ枃 + ctx->add_action(DeviceState::HEART_BEAT, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 + } + //涓绉掍竴娆 鎵ц瀹炴椂鏁版嵁璇㈤棶 浠呮墽琛屾寚瀹氭鏁 now = uv_now(ctx->loop); if (ctx->current_state_ == DeviceState::IDLE && now - ctx->real_state_query_time_ >= 1000 && ctx->real_state_count > 0) { @@ -489,6 +500,7 @@ void on_timer(uv_timer_t* handle) { auto sendbuff = generate_realstat_message(static_cast(ctx->real_point_id_), static_cast(0x01), static_cast(0x01));//缁勮璇㈤棶瀹炴椂鏁版嵁鎶ユ枃 ctx->add_action(DeviceState::READING_REALSTAT, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 } + //30鍒嗛挓涓娆 璇诲彇瑁呯疆杩愯淇℃伅 now = uv_now(ctx->loop); if (ctx->current_state_ == DeviceState::IDLE && now - ctx->read_runninginformationMsg >= 60000 * 30) @@ -499,7 +511,8 @@ 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 + + //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")) { @@ -515,6 +528,7 @@ void on_timer(uv_timer_t* handle) { //auto sendbuff = generate_machinestatus_message();//缁勮璇诲彇瑁呯疆杩愯淇℃伅鎶ユ枃 //ctx->add_action(DeviceState::READING_RUNNINGINFORMATION_2, sendbuff);//灏嗚鐘舵佷互鍙婂緟鍙戦佹姤鏂囧瓨鍏ラ槦鍒 } + //澶勭悊鍚庣画宸ヤ綔闃熷垪鐨勫伐浣 鍙栧嚭涓涓苟鎵ц if (ctx->current_state_ == DeviceState::IDLE) { ctx->process_next_action(); @@ -717,6 +731,7 @@ void on_connect(uv_connect_t* req, int status) { ctx->state = ConnectionState::CONNECTED; ctx->reconnect_attempts = 0; // 鏂板锛氬垵濮嬪寲鍚勪釜璁℃椂鏃堕棿鎴 + ctx->heartbeat_time = uv_now(ctx->loop);//鍒濆鍖栧績璺虫姤鏂囨椂闂存埑 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);//鍒濆鍖栬鍙栬缃繍琛屼俊鎭椂闂存埑 diff --git a/LFtid1056/client2.h b/LFtid1056/client2.h index c68ec93..25ab048 100644 --- a/LFtid1056/client2.h +++ b/LFtid1056/client2.h @@ -44,6 +44,7 @@ enum class ConnectionState { // 添加的状态枚举 enum class DeviceState { IDLE, // 空闲状态 + HEART_BEAT, // 装置心跳 READING_STATS, // 读取统计数据 READING_STATS_TIME, // 读取统计时间 READING_REALSTAT, // 读取实时数据 @@ -83,6 +84,7 @@ public: ConnectionState state; int reconnect_attempts; volatile bool shutdown; + uint64_t heartbeat_time = 0;// 心跳报文计时时间戳 uint64_t last_state_query_time_ = 0; // 统计数据计时时间戳 uint64_t real_state_query_time_ = 0; // 实时数据计时时间戳 std::atomic real_state_count{ 0 };//实时数据收发计数 原子操作保证线程安全 diff --git a/LFtid1056/dealMsg.cpp b/LFtid1056/dealMsg.cpp index b611cec..d56240c 100644 --- a/LFtid1056/dealMsg.cpp +++ b/LFtid1056/dealMsg.cpp @@ -398,6 +398,19 @@ void process_received_message(string mac, string id,const char* data, size_t len // 杩欓噷鍙互娣诲姞澶勭悊涓诲姩涓婃姤鏁版嵁鐨勯昏緫 break; + case DeviceState::HEART_BEAT: + //鎺ユ敹鍒板績璺虫姤鏂囧簲绛 + if (udata[8] == static_cast(MsgResponseType::Response_HeartBeat)) { + std::cout << "heartbeat success" << mac << std::endl; + //蹇冭烦璁剧疆鎴愬姛锛岃皟鏁翠负绌洪棽锛屽鐞嗗悗缁伐浣溿 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + else { + // 瑁呯疆绛旈潪鎵闂紓甯 + // 鎺ユ敹蹇冭烦鎶ユ枃閿欒锛岃皟鏁翠负绌洪棽鐘舵侊紝澶勭悊涓嬩竴椤瑰伐浣溿 + ClientManager::instance().change_device_state(id, DeviceState::IDLE); + } + case DeviceState::READING_STATS: // 璇诲彇缁熻鏁版嵁鐘舵 if (udata[8] == static_cast(MsgResponseType::Response_Stat)) {