新增了装置重启命令的校验和执行流程。
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>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_HeartBeat));
|
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>ʱ
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||||
Request_RightTime = 0x86,
|
Request_RightTime = 0x86,
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
//<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>
|
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||||
enum class MsgResponseType : unsigned char {
|
enum class MsgResponseType : unsigned char {
|
||||||
@@ -85,6 +87,8 @@ enum class MsgResponseType : unsigned char {
|
|||||||
Response_RightTime = 0x86,
|
Response_RightTime = 0x86,
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||||
Response_Read_Event = 0x8D,
|
Response_Read_Event = 0x8D,
|
||||||
|
//ִ<>п<EFBFBD><D0BF><EFBFBD><EFBFBD>¼<EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||||
|
Response_Ctrl = 0x8a,
|
||||||
//Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6>
|
//Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6>
|
||||||
Response_NewACK = 0x40,
|
Response_NewACK = 0x40,
|
||||||
//Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ӧ<EFBFBD><D3A6>
|
//Ĭ<>Ϸ<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>
|
* @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>
|
* @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; // 设备未找到
|
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 补招事件日志动作
|
* @brief 补招事件日志动作
|
||||||
* @param Time1 起始时间
|
* @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>
|
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_EVENTLOG, // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
||||||
READING_STATSFILE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<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>״̬
|
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
||||||
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
||||||
};
|
};
|
||||||
@@ -459,6 +460,13 @@ public:
|
|||||||
* @return <20><><EFBFBD>óɹ<C3B3><C9B9><EFBFBD>ʧ<EFBFBD>ܵĽ<DCB5><C4BD><EFBFBD>
|
* @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);
|
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:
|
private:
|
||||||
ClientManager() : loop_(nullptr) {}
|
ClientManager() : loop_(nullptr) {}
|
||||||
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
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().set_cloud_status(id, 1); //设置了云前置登录状态为已登录
|
||||||
ClientManager::instance().read_devversion_action_to_device(id);//主动触发,读取装置版本配置信息,仅在装置登录后执行一次,当前获取版本信息确认对时报文结构。
|
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().get_dev_status(id);//设备在线情况判断 ture在线 false离线
|
||||||
//ClientManager::instance().set_real_state_count("D002", 1,1);//登录后测试实时
|
//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);
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case DeviceState::READING_STATS:
|
case DeviceState::READING_STATS:
|
||||||
// 读取统计数据状态
|
// 读取统计数据状态
|
||||||
@@ -2232,6 +2236,39 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
}
|
}
|
||||||
break;
|
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:
|
case DeviceState::CUSTOM_ACTION:
|
||||||
// 自定义动作状态
|
// 自定义动作状态
|
||||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||||
|
|||||||
Reference in New Issue
Block a user