修改了装置重连相关代码,调整了状态翻转通知方法。增加了30分钟定时对时功能。
This commit is contained in:
@@ -663,4 +663,43 @@ std::vector<unsigned char> generate_machineversion_message()
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ͨ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>14<31><34>Ӧװ<D3A6><D7B0>״̬<D7B4><CCAC>ȡ
|
||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_Read_RunningInformation));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
|
||||
* @param time <20>·<EFBFBD><C2B7>Ķ<EFBFBD>ʱʱ<CAB1><CAB1> (tmֵ)
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<uint8_t> generate_righttime_message(const std::tm& time) {
|
||||
std::vector<uint8_t> DataBuf(15, 0x00); // <20><><EFBFBD><EFBFBD>15<31>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
|
||||
|
||||
// ǰ3<C7B0>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ã<EFBFBD><C3A3>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
|
||||
|
||||
// ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>루<EFBFBD><EBA3A8>ռ2<D5BC>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
uint16_t year = static_cast<uint16_t>(time.tm_year + 1900);
|
||||
DataBuf[3] = static_cast<uint8_t>((year >> 8) & 0xFF); // <20><><EFBFBD>ֽ<EFBFBD>
|
||||
DataBuf[4] = static_cast<uint8_t>(year & 0xFF); // <20><><EFBFBD>ֽ<EFBFBD>
|
||||
|
||||
uint16_t month = static_cast<uint16_t>(time.tm_mon + 1);
|
||||
DataBuf[5] = static_cast<uint8_t>((month >> 8) & 0xFF);
|
||||
DataBuf[6] = static_cast<uint8_t>(month & 0xFF);
|
||||
|
||||
uint16_t day = static_cast<uint16_t>(time.tm_mday);
|
||||
DataBuf[7] = static_cast<uint8_t>((day >> 8) & 0xFF);
|
||||
DataBuf[8] = static_cast<uint8_t>(day & 0xFF);
|
||||
|
||||
uint16_t hour = static_cast<uint16_t>(time.tm_hour);
|
||||
DataBuf[9] = static_cast<uint8_t>((hour >> 8) & 0xFF);
|
||||
DataBuf[10] = static_cast<uint8_t>(hour & 0xFF);
|
||||
|
||||
uint16_t minute = static_cast<uint16_t>(time.tm_min);
|
||||
DataBuf[11] = static_cast<uint8_t>((minute >> 8) & 0xFF);
|
||||
DataBuf[12] = static_cast<uint8_t>(minute & 0xFF);
|
||||
|
||||
uint16_t second = static_cast<uint16_t>(time.tm_sec);
|
||||
DataBuf[13] = static_cast<uint8_t>((second >> 8) & 0xFF);
|
||||
DataBuf[14] = static_cast<uint8_t>(second & 0xFF);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>134(0x86)
|
||||
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_RightTime));
|
||||
}
|
||||
@@ -41,7 +41,9 @@ enum class MsgRequestType : unsigned char {
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
||||
Request_Set_InterFix = 0x25,
|
||||
//ѯ<><D1AF>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
Request_Read_RunningInformation = 0x0e
|
||||
Request_Read_RunningInformation = 0x0e,
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||
Request_RightTime = 0x86
|
||||
};
|
||||
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
|
||||
enum class MsgResponseType : unsigned char {
|
||||
@@ -73,6 +75,8 @@ enum class MsgResponseType : unsigned char {
|
||||
Response_Set_InterFix = 0xA5,
|
||||
//ѯ<><D1AF>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
Response_Read_RunningInformation = 0x8e,
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ(δʹ<CEB4><CAB9>,<2C><><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ͽ϶<CFBF><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>)
|
||||
Response_RightTime = 0x86,
|
||||
//Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6>
|
||||
Response_NewACK = 0x40,
|
||||
//Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
@@ -2179,4 +2183,10 @@ std::vector<unsigned char> generate_machinestatus_message();
|
||||
* @brief <20><><EFBFBD><EFBFBD>װ<EFBFBD>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡָ<C8A1><EFBFBD><EEB1A8>
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<unsigned char> generate_machineversion_message();
|
||||
std::vector<unsigned char> generate_machineversion_message();
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
|
||||
* @param time <20>·<EFBFBD><C2B7>Ķ<EFBFBD>ʱʱ<CAB1><CAB1> (tmֵ)
|
||||
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
std::vector<uint8_t> generate_righttime_message(const std::tm& time);
|
||||
@@ -7,6 +7,8 @@
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <unordered_map>
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
|
||||
// 配置参数
|
||||
constexpr int BASE_RECONNECT_DELAY = 20000; // 基础重连延迟(ms)
|
||||
@@ -312,6 +314,48 @@ void ClientContext::clear_float_cache() {
|
||||
std::lock_guard<std::mutex> lock(float_cache_mutex_);
|
||||
point_float_cache_.clear();
|
||||
}
|
||||
// 版本比较函数的辅助函数:分割字符串并转换为整数向量
|
||||
std::vector<int> splitVersionString(const std::string& versionStr) {
|
||||
std::vector<int> 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<int> seg1 = splitVersionString(v1);
|
||||
std::vector<int> 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<std::mutex> 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<std::mutex> lock(mutex_);
|
||||
|
||||
for (auto& pair : clients_) {
|
||||
auto& ctx = pair.second;
|
||||
// 匹配装置ID或MAC地址
|
||||
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<std::mutex> lock(mutex_);
|
||||
|
||||
for (auto& pair : clients_) {
|
||||
auto& ctx = pair.second;
|
||||
// 匹配装置ID或MAC地址
|
||||
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<unsigned char>& packet) {
|
||||
|
||||
@@ -60,6 +60,7 @@ enum class DeviceState {
|
||||
READING_RUNNINGINFORMATION_1,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
READING_RUNNINGINFORMATION_2,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱִ<CAB1><D6B4>)
|
||||
READING_DEVVERSION, // <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
SET_RIGHTTIME, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
||||
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
||||
};
|
||||
@@ -84,9 +85,13 @@ public:
|
||||
std::atomic<int> real_state_count{ 0 };//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> ԭ<>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>̰߳<DFB3>ȫ
|
||||
std::atomic<ushort> real_point_id_{ 1 }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>
|
||||
uint64_t read_runninginformationMsg = 0; // װ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʱ<CFA2><CAB1><EFBFBD><EFBFBD>
|
||||
uint64_t right_time = 0; // װ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD>
|
||||
|
||||
DeviceInfo device_info; // װ<><D7B0><EFBFBD><EFBFBD>Ϣ
|
||||
int cloudstatus; // <20><>ǰ<EFBFBD>õ<EFBFBD>¼״̬<D7B4><CCAC>0<EFBFBD><30>δ<EFBFBD><CEB4>¼ 1<><31><EFBFBD>ѵ<EFBFBD>¼<EFBFBD><C2BC>
|
||||
int cloudstatus = 0; // <20><>ǰ<EFBFBD>õ<EFBFBD>¼״̬<D7B4><CCAC>0<EFBFBD><30>δ<EFBFBD><CEB4>¼ 1<><31><EFBFBD>ѵ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>Ϊ0
|
||||
uint64_t get_cloudmessage_time = 0;//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
uint64_t login_cloud_time = 0;//װ<>õ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ij<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
std::string dev_CloudProtocolVer = "V1.0";//װ<><D7B0><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>汾<EFBFBD><E6B1BE> <20><><EFBFBD><EFBFBD>V1.5<EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡһ<EFBFBD>Σ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж϶<EFBFBD>ʱ<EFBFBD>汾<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ΪV1.0
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||||
DeviceState current_state_; // <20><>ǰװ<C7B0><D7B0>״̬
|
||||
@@ -374,6 +379,12 @@ public:
|
||||
|
||||
std::string get_current_filename(const std::string& identifier);
|
||||
|
||||
//ˢ<>¿ͻ<C2BF><CDBB><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
bool set_cloudmessage_time(const std::string& identifier);
|
||||
|
||||
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>Ŀͻ<C4BF><CDBB>˵<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ά<EFBFBD><CEAC>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B9A6>ʹ<EFBFBD><CAB9>
|
||||
bool set_versioninformation(const std::string& identifier, string cloud_version);
|
||||
|
||||
//<2F><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20>ļ<EFBFBD>·<EFBFBD><C2B7>
|
||||
bool add_file_menu_action_to_device(const std::string& identifier, const std::string& file_path);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
|
||||
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ָ<EFBFBD><D6B8>װ<EFBFBD><D7B0>ˢ<EFBFBD>¶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ͨѶʱ<D1B6><CAB1><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().set_cloudmessage_time(id);
|
||||
|
||||
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
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;
|
||||
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
|
||||
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
|
||||
ClientManager::instance().read_devversion_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>¼<EFBFBD><C2BC>ִ<EFBFBD><D6B4>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>ǰ<EFBFBD><C7B0>ȡ<EFBFBD>汾<EFBFBD><E6B1BE>Ϣȷ<CFA2>϶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ľṹ<C4BD><E1B9B9>
|
||||
|
||||
//ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ
|
||||
//ClientManager::instance().add_file_menu_action_to_device("D002","/etc");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ
|
||||
//ClientManager::instance().add_file_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -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);//<2F><>ȡ 1-<2D>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 2-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ClientManager::instance().set_interfixedvalue_action_to_device();װ<><D7B0><EFBFBD><EFBFBD><DEB8>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>ṩ<EFBFBD><E1B9A9>
|
||||
//ClientManager::instance().read_runninginformation_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
ClientManager::instance().read_devversion_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
|
||||
|
||||
}
|
||||
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
|
||||
|
||||
//ʹ<>ýӿ<C3BD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>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
|
||||
}
|
||||
|
||||
//<2F>洢<EFBFBD><E6B4A2>ֵlnk20250827
|
||||
save_internal_value(id, monitor_index, fList);
|
||||
//save_internal_value(id, monitor_index, fList);
|
||||
|
||||
//<2F><><EFBFBD>Զ<EFBFBD>ֵ<EFBFBD>Ĺ<DEB8><C4B9><EFBFBD>
|
||||
//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
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>)
|
||||
uint8_t monitor_index = parser.RecvData[0];
|
||||
std::cout << "Monitor Index: " << static_cast<int>(monitor_index) << std::endl;
|
||||
send_set_value_reply(id, monitor_index, dz_list);
|
||||
//send_set_value_reply(id, monitor_index, dz_list);
|
||||
|
||||
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
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
|
||||
}
|
||||
|
||||
//<2F>洢<EFBFBD><E6B4A2>ֵlnk20250827
|
||||
save_internal_value(id, fList);
|
||||
//save_internal_value(id, fList);
|
||||
|
||||
//<2F>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD>IJ<DEB8><C4B2><EFBFBD>
|
||||
//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
|
||||
}
|
||||
}
|
||||
|
||||
//<2F><>Э<EFBFBD><D0AD><EFBFBD>汾<EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>δ<EFBFBD><CEB4>ֵ<EFBFBD><D6B5>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD>ϵ<EFBFBD>V1.0
|
||||
if (!versionInfo.CloudProtocolVer.empty()) {
|
||||
ClientManager::instance().set_versioninformation(id, versionInfo.CloudProtocolVer);
|
||||
}
|
||||
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
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";*/
|
||||
|
||||
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
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:
|
||||
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewACK)) {
|
||||
std::cout << "set success" << mac << std::endl;
|
||||
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>óɹ<C3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewNACK)) {
|
||||
std::cout << "set error" << mac << std::endl;
|
||||
|
||||
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
|
||||
|
||||
// װ<>÷<EFBFBD><C3B7><EFBFBD>Ӧ<EFBFBD>𣬶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
// <20><><EFBFBD>ö<EFBFBD>ʱʧ<CAB1>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
else {
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><><EFBFBD>ö<EFBFBD>ʱʧ<CAB1>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::CUSTOM_ACTION:
|
||||
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||
|
||||
@@ -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
|
||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
||||
std::vector<DeviceInfo> devices = {
|
||||
{
|
||||
@@ -391,7 +391,7 @@ int main(int argc ,char** argv) {//
|
||||
std::vector<PointInfo> 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
|
||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
|
||||
std::vector<DeviceInfo> devices = {
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user