新增了装置重启命令的校验和执行流程。
This commit is contained in:
@@ -777,4 +777,22 @@ std::vector<unsigned char> generate_requestHeartBeat_message() {
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_HeartBeat));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD>װ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB1A8>
|
||||
* @param type <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-װ<>ø<EFBFBD>λ<EFBFBD><CEBB>2-<2D><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>3-<2D><><EFBFBD><EFBFBD>200ms<6D><73><EFBFBD>ݼ<EFBFBD>¼<EFBFBD><C2BC>4-<2D><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>¼
|
||||
* @param ctrlflag <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> <20>״δ<D7B4><CEB4><EFBFBD>0 <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> 0x01ִ<31><D6B4> 0x02ȡ<32><C8A1>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<unsigned char> generate_control_message(uint8_t type, uint8_t ctrlflag) {
|
||||
// <20><><EFBFBD><EFBFBD>3<EFBFBD>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
std::vector<unsigned char> DataBuf(3, 0x00);
|
||||
|
||||
DataBuf[0] = type; // 1-װ<>ø<EFBFBD>λ<EFBFBD><CEBB>2-<2D><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>3-<2D><><EFBFBD><EFBFBD>200ms<6D><73><EFBFBD>ݼ<EFBFBD>¼<EFBFBD><C2BC>4-<2D><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>¼
|
||||
DataBuf[1] = ctrlflag; // 0x01ִ<31><D6B4> 0x02ȡ<32><C8A1>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_Ctrl));
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,9 @@ enum class MsgRequestType : unsigned char {
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||
Request_RightTime = 0x86,
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||
Request_Read_Event = 0x0D
|
||||
Request_Read_Event = 0x0D,
|
||||
//ִ<>п<EFBFBD><D0BF><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
Request_Ctrl = 0x0A
|
||||
};
|
||||
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||
enum class MsgResponseType : unsigned char {
|
||||
@@ -85,6 +87,8 @@ enum class MsgResponseType : unsigned char {
|
||||
Response_RightTime = 0x86,
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||
Response_Read_Event = 0x8D,
|
||||
//ִ<>п<EFBFBD><D0BF><EFBFBD><EFBFBD>¼<EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
Response_Ctrl = 0x8a,
|
||||
//Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6>
|
||||
Response_NewACK = 0x40,
|
||||
//Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
@@ -2426,4 +2430,11 @@ std::vector<uint8_t> generate_recallevent_message(const std::tm& Time1, const st
|
||||
* @brief <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<unsigned char> generate_requestHeartBeat_message();
|
||||
std::vector<unsigned char> generate_requestHeartBeat_message();
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD>װ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB1A8>
|
||||
* @param type <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-װ<>ø<EFBFBD>λ<EFBFBD><CEBB>2-<2D><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>3-<2D><><EFBFBD><EFBFBD>200ms<6D><73><EFBFBD>ݼ<EFBFBD>¼<EFBFBD><C2BC>4-<2D><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>¼
|
||||
* @param ctrlflag <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> <20>״δ<D7B4><CEB4><EFBFBD>0 <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> 0x01ִ<31><D6B4> 0x02ȡ<32><C8A1>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<unsigned char> generate_control_message(uint8_t type, uint8_t ctrlflag);
|
||||
@@ -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<std::mutex> 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 起始时间
|
||||
|
||||
@@ -65,6 +65,7 @@ enum class DeviceState {
|
||||
SET_RIGHTTIME_2, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
READING_EVENTLOG, // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||
READING_STATSFILE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
SET_CTRL, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
||||
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
||||
};
|
||||
@@ -459,6 +460,13 @@ public:
|
||||
* @return <20><><EFBFBD>óɹ<C3B3><C9B9><EFBFBD>ʧ<EFBFBD>ܵĽ<DCB5><C4BD><EFBFBD>
|
||||
*/
|
||||
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 <20><><EFBFBD><EFBFBD>װ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB1A8>
|
||||
* @param type <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-װ<>ø<EFBFBD>λ<EFBFBD><CEBB>2-<2D><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>3-<2D><><EFBFBD><EFBFBD>200ms<6D><73><EFBFBD>ݼ<EFBFBD>¼<EFBFBD><C2BC>4-<2D><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>¼
|
||||
* @param ctrlflag <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> <20>״δ<D7B4><CEB4><EFBFBD>0x00 <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> 0x01ִ<31><D6B4> 0x02ȡ<32><C8A1>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
bool set_ctrl_action_to_device(const std::string& identifier, uint8_t type, uint8_t ctrlflag);
|
||||
private:
|
||||
ClientManager() : loop_(nullptr) {}
|
||||
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
||||
|
||||
@@ -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<unsigned char>(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<unsigned char>(MsgResponseType::Response_NewACK)) {
|
||||
std::cout << "***ctrl success" << mac << std::endl;
|
||||
//控制命令执行完毕,调整为空闲,处理后续工作。
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else if (udata[8] == static_cast<unsigned char>(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;
|
||||
|
||||
Reference in New Issue
Block a user