装置运行信息报文与装置版本配置信息报文读取
This commit is contained in:
@@ -79,6 +79,8 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
//ClientManager::instance().get_interfixedvalue_action_to_device(id);//װ<>û<EFBFBD>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
||||
//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;
|
||||
@@ -97,7 +99,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
//װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD> <20><>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>/<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Event)) {
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
||||
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||
@@ -1179,6 +1181,575 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::READING_RUNNINGINFORMATION_1:
|
||||
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_RunningInformation)) {
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<uint8_t>& recvData = parser.RecvData;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
||||
if (recvData.size() < 2) {
|
||||
std::cerr << "Invalid running information data: too short ("
|
||||
<< recvData.size() << " bytes)" << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>Ч<EFBFBD>غɳ<D8BA><C9B3><EFBFBD>
|
||||
size_t payloadLength = recvData.size() - 2;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<uint8_t> payloadBytes(payloadLength);
|
||||
if (recvData.size() >= 2 + payloadLength) {
|
||||
std::copy(recvData.begin() + 2, recvData.begin() + 2 + payloadLength, payloadBytes.begin());
|
||||
}
|
||||
else {
|
||||
std::cerr << "Invalid payload length: " << payloadLength
|
||||
<< ", available: " << (recvData.size() - 2) << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// ת<><D7AA>ΪUTF-8<>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
std::string payload(payloadBytes.begin(), payloadBytes.end());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>New_MachMessage<67>Ľṹ<C4BD><E1B9B9>
|
||||
struct RunningInformation {
|
||||
std::string Time;
|
||||
std::string CpuLoad;
|
||||
std::string FreeMemory;
|
||||
std::string TotalMemory;
|
||||
std::string FreeStorage;
|
||||
std::string TotalStorage;
|
||||
std::string HardTimeSync;
|
||||
std::string SntpTimeSync;
|
||||
std::string CloudTimeSync;
|
||||
std::string SignalStrength;
|
||||
} result;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
auto trimQuotes = [](const std::string& str) -> std::string {
|
||||
if (str.size() >= 2 && str.front() == '"' && str.back() == '"') {
|
||||
return str.substr(1, str.size() - 2);
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD>ֵ
|
||||
auto processCpuLoad = [](const std::string& cpuValue) -> std::string {
|
||||
if (cpuValue.empty()) return cpuValue;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>"39_38"<22><>
|
||||
if (cpuValue.find('_') != std::string::npos) {
|
||||
std::vector<std::string> cores;
|
||||
size_t start = 0, end;
|
||||
while ((end = cpuValue.find('_', start)) != std::string::npos) {
|
||||
cores.push_back(cpuValue.substr(start, end - start));
|
||||
start = end + 1;
|
||||
}
|
||||
cores.push_back(cpuValue.substr(start)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
||||
|
||||
for (auto& core : cores) {
|
||||
// <20>ֶ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>std::stoi<6F><69>
|
||||
const char* str = core.c_str();
|
||||
char* endptr = nullptr;
|
||||
long value = strtol(str, &endptr, 10);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
if (endptr != str && *endptr == '\0') {
|
||||
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χֵ
|
||||
if (value > 100) value /= 100;
|
||||
core = std::to_string(value);
|
||||
}
|
||||
// ת<><D7AA>ʧ<EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>ԭֵ
|
||||
}
|
||||
|
||||
std::string result;
|
||||
for (size_t i = 0; i < cores.size(); ++i) {
|
||||
if (i > 0) result += '_';
|
||||
result += cores[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ
|
||||
else {
|
||||
const char* str = cpuValue.c_str();
|
||||
char* endptr = nullptr;
|
||||
long value = strtol(str, &endptr, 10);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
if (endptr != str && *endptr == '\0') {
|
||||
if (value > 100) value /= 100;
|
||||
return std::to_string(value);
|
||||
}
|
||||
return cpuValue;
|
||||
}
|
||||
};
|
||||
|
||||
// <20>ָ<EFBFBD><D6B8>ֶβ<D6B6><CEB2><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<std::string> fields;
|
||||
size_t start = 0;
|
||||
while (start < payload.length()) {
|
||||
size_t end = payload.find(',', start);
|
||||
if (end == std::string::npos) {
|
||||
fields.push_back(payload.substr(start));
|
||||
break;
|
||||
}
|
||||
fields.push_back(payload.substr(start, end - start));
|
||||
start = end + 1;
|
||||
}
|
||||
|
||||
for (const auto& field : fields) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
||||
if (field.empty()) continue;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ð<EFBFBD><C3B0>λ<EFBFBD><CEBB>
|
||||
size_t colonPos = field.find(':');
|
||||
if (colonPos == std::string::npos || colonPos == 0 || colonPos == field.length() - 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// <20>ָ<EFBFBD><D6B8><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
std::string key = field.substr(0, colonPos);
|
||||
std::string value = field.substr(colonPos + 1);
|
||||
|
||||
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>Ŀհ<C4BF>
|
||||
size_t keyStart = key.find_first_not_of(" \t");
|
||||
size_t keyEnd = key.find_last_not_of(" \t");
|
||||
if (keyStart != std::string::npos && keyEnd != std::string::npos) {
|
||||
key = key.substr(keyStart, keyEnd - keyStart + 1);
|
||||
}
|
||||
|
||||
// ȥ<><C8A5>ֵ<EFBFBD>Ŀհ<C4BF>
|
||||
size_t valStart = value.find_first_not_of(" \t");
|
||||
size_t valEnd = value.find_last_not_of(" \t");
|
||||
if (valStart != std::string::npos && valEnd != std::string::npos) {
|
||||
value = value.substr(valStart, valEnd - valStart + 1);
|
||||
}
|
||||
|
||||
// ȥ<><C8A5>ֵ<EFBFBD><D6B5><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (value.size() >= 2 && value.front() == '"' && value.back() == '"') {
|
||||
value = value.substr(1, value.size() - 2);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
||||
const char* keyStr = key.c_str();
|
||||
char* endPtr = nullptr;
|
||||
long fieldId = strtol(keyStr, &endPtr, 10);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
if (endPtr != keyStr && *endPtr == '\0' && fieldId >= 1 && fieldId <= 10) {
|
||||
switch (fieldId) {
|
||||
case 1: result.Time = value; break;
|
||||
case 2: result.CpuLoad = value; break;
|
||||
case 3: result.FreeMemory = value; break;
|
||||
case 4: result.TotalMemory = value; break;
|
||||
case 5: result.FreeStorage = value; break;
|
||||
case 6: result.TotalStorage = value; break;
|
||||
case 7: result.HardTimeSync = value; break;
|
||||
case 8: result.SntpTimeSync = value; break;
|
||||
case 9: result.CloudTimeSync = value; break;
|
||||
case 10: result.SignalStrength = value; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><E2B4A6>CPU<50><55><EFBFBD><EFBFBD>
|
||||
result.CpuLoad = processCpuLoad(result.CpuLoad);
|
||||
|
||||
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>п<EFBFBD><D0BF>滻Ϊ<E6BBBB><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD>
|
||||
std::cout << "Device Running Information (" << mac << "):\n"
|
||||
<< " Time: " << result.Time << "\n"
|
||||
<< " CPU Load: " << result.CpuLoad << "\n"
|
||||
<< " Memory: " << result.FreeMemory << "/" << result.TotalMemory << " MB\n"
|
||||
<< " Storage: " << result.FreeStorage << "/" << result.TotalStorage << " GB\n"
|
||||
<< " Time Sync: Hard=" << result.HardTimeSync
|
||||
<< ", SNTP=" << result.SntpTimeSync
|
||||
<< ", Cloud=" << result.CloudTimeSync << "\n"
|
||||
<< " Signal: " << result.SignalStrength << std::endl;
|
||||
|
||||
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ɹ<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);
|
||||
}
|
||||
else {
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)ʧ<>ܣ<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::READING_RUNNINGINFORMATION_2:
|
||||
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>Ͳ<EFBFBD><CDB2><EFBFBD>
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_RunningInformation)) {
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<uint8_t>& recvData = parser.RecvData;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
||||
if (recvData.size() < 2) {
|
||||
std::cerr << "Invalid running information data: too short ("
|
||||
<< recvData.size() << " bytes)" << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>Ч<EFBFBD>غɳ<D8BA><C9B3><EFBFBD>
|
||||
size_t payloadLength = recvData.size() - 2;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<uint8_t> payloadBytes(payloadLength);
|
||||
if (recvData.size() >= 2 + payloadLength) {
|
||||
std::copy(recvData.begin() + 2, recvData.begin() + 2 + payloadLength, payloadBytes.begin());
|
||||
}
|
||||
else {
|
||||
std::cerr << "Invalid payload length: " << payloadLength
|
||||
<< ", available: " << (recvData.size() - 2) << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// ת<><D7AA>ΪUTF-8<>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
std::string payload(payloadBytes.begin(), payloadBytes.end());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>New_MachMessage<67>Ľṹ<C4BD><E1B9B9>
|
||||
struct RunningInformation {
|
||||
std::string Time;
|
||||
std::string CpuLoad;
|
||||
std::string FreeMemory;
|
||||
std::string TotalMemory;
|
||||
std::string FreeStorage;
|
||||
std::string TotalStorage;
|
||||
std::string HardTimeSync;
|
||||
std::string SntpTimeSync;
|
||||
std::string CloudTimeSync;
|
||||
std::string SignalStrength;
|
||||
} result;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
auto trimQuotes = [](const std::string& str) -> std::string {
|
||||
if (str.size() >= 2 && str.front() == '"' && str.back() == '"') {
|
||||
return str.substr(1, str.size() - 2);
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD>ֵ
|
||||
auto processCpuLoad = [](const std::string& cpuValue) -> std::string {
|
||||
if (cpuValue.empty()) return cpuValue;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>"39_38"<22><>
|
||||
if (cpuValue.find('_') != std::string::npos) {
|
||||
std::vector<std::string> cores;
|
||||
size_t start = 0, end;
|
||||
while ((end = cpuValue.find('_', start)) != std::string::npos) {
|
||||
cores.push_back(cpuValue.substr(start, end - start));
|
||||
start = end + 1;
|
||||
}
|
||||
cores.push_back(cpuValue.substr(start)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
||||
|
||||
for (auto& core : cores) {
|
||||
// <20>ֶ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>std::stoi<6F><69>
|
||||
const char* str = core.c_str();
|
||||
char* endptr = nullptr;
|
||||
long value = strtol(str, &endptr, 10);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
if (endptr != str && *endptr == '\0') {
|
||||
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χֵ
|
||||
if (value > 100) value /= 100;
|
||||
core = std::to_string(value);
|
||||
}
|
||||
// ת<><D7AA>ʧ<EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>ԭֵ
|
||||
}
|
||||
|
||||
std::string result;
|
||||
for (size_t i = 0; i < cores.size(); ++i) {
|
||||
if (i > 0) result += '_';
|
||||
result += cores[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ
|
||||
else {
|
||||
const char* str = cpuValue.c_str();
|
||||
char* endptr = nullptr;
|
||||
long value = strtol(str, &endptr, 10);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
if (endptr != str && *endptr == '\0') {
|
||||
if (value > 100) value /= 100;
|
||||
return std::to_string(value);
|
||||
}
|
||||
return cpuValue;
|
||||
}
|
||||
};
|
||||
|
||||
// <20>ָ<EFBFBD><D6B8>ֶβ<D6B6><CEB2><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<std::string> fields;
|
||||
size_t start = 0;
|
||||
while (start < payload.length()) {
|
||||
size_t end = payload.find(',', start);
|
||||
if (end == std::string::npos) {
|
||||
fields.push_back(payload.substr(start));
|
||||
break;
|
||||
}
|
||||
fields.push_back(payload.substr(start, end - start));
|
||||
start = end + 1;
|
||||
}
|
||||
|
||||
for (const auto& field : fields) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
||||
if (field.empty()) continue;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ð<EFBFBD><C3B0>λ<EFBFBD><CEBB>
|
||||
size_t colonPos = field.find(':');
|
||||
if (colonPos == std::string::npos || colonPos == 0 || colonPos == field.length() - 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// <20>ָ<EFBFBD><D6B8><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
std::string key = field.substr(0, colonPos);
|
||||
std::string value = field.substr(colonPos + 1);
|
||||
|
||||
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>Ŀհ<C4BF>
|
||||
size_t keyStart = key.find_first_not_of(" \t");
|
||||
size_t keyEnd = key.find_last_not_of(" \t");
|
||||
if (keyStart != std::string::npos && keyEnd != std::string::npos) {
|
||||
key = key.substr(keyStart, keyEnd - keyStart + 1);
|
||||
}
|
||||
|
||||
// ȥ<><C8A5>ֵ<EFBFBD>Ŀհ<C4BF>
|
||||
size_t valStart = value.find_first_not_of(" \t");
|
||||
size_t valEnd = value.find_last_not_of(" \t");
|
||||
if (valStart != std::string::npos && valEnd != std::string::npos) {
|
||||
value = value.substr(valStart, valEnd - valStart + 1);
|
||||
}
|
||||
|
||||
// ȥ<><C8A5>ֵ<EFBFBD><D6B5><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (value.size() >= 2 && value.front() == '"' && value.back() == '"') {
|
||||
value = value.substr(1, value.size() - 2);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
||||
const char* keyStr = key.c_str();
|
||||
char* endPtr = nullptr;
|
||||
long fieldId = strtol(keyStr, &endPtr, 10);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
if (endPtr != keyStr && *endPtr == '\0' && fieldId >= 1 && fieldId <= 10) {
|
||||
switch (fieldId) {
|
||||
case 1: result.Time = value; break;
|
||||
case 2: result.CpuLoad = value; break;
|
||||
case 3: result.FreeMemory = value; break;
|
||||
case 4: result.TotalMemory = value; break;
|
||||
case 5: result.FreeStorage = value; break;
|
||||
case 6: result.TotalStorage = value; break;
|
||||
case 7: result.HardTimeSync = value; break;
|
||||
case 8: result.SntpTimeSync = value; break;
|
||||
case 9: result.CloudTimeSync = value; break;
|
||||
case 10: result.SignalStrength = value; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><E2B4A6>CPU<50><55><EFBFBD><EFBFBD>
|
||||
result.CpuLoad = processCpuLoad(result.CpuLoad);
|
||||
|
||||
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>п<EFBFBD><D0BF>滻Ϊ<E6BBBB><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD>
|
||||
std::cout << "Device Running Information (" << mac << "):\n"
|
||||
<< " Time: " << result.Time << "\n"
|
||||
<< " CPU Load: " << result.CpuLoad << "\n"
|
||||
<< " Memory: " << result.FreeMemory << "/" << result.TotalMemory << " MB\n"
|
||||
<< " Storage: " << result.FreeStorage << "/" << result.TotalStorage << " GB\n"
|
||||
<< " Time Sync: Hard=" << result.HardTimeSync
|
||||
<< ", SNTP=" << result.SntpTimeSync
|
||||
<< ", Cloud=" << result.CloudTimeSync << "\n"
|
||||
<< " Signal: " << result.SignalStrength << std::endl;
|
||||
|
||||
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ɹ<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);
|
||||
}
|
||||
else {
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>)ʧ<>ܣ<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::READING_DEVVERSION:
|
||||
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1>(<28><>άЭ<CEAC><D0AD>ȷ<EFBFBD>϶<EFBFBD>ʱ<EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶг<C6B5><D0B3><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_RunningInformation)) {
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<uint8_t>& recvData = parser.RecvData;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
||||
if (recvData.size() < 2) {
|
||||
std::cerr << "Invalid running information data: too short ("
|
||||
<< recvData.size() << " bytes)" << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>Ч<EFBFBD>غɳ<D8BA><C9B3><EFBFBD>
|
||||
size_t payloadLength = recvData.size() - 2;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<uint8_t> payloadBytes(payloadLength);
|
||||
if (recvData.size() >= 2 + payloadLength) {
|
||||
std::copy(recvData.begin() + 2, recvData.begin() + 2 + payloadLength, payloadBytes.begin());
|
||||
}
|
||||
else {
|
||||
std::cerr << "Invalid payload length: " << payloadLength
|
||||
<< ", available: " << (recvData.size() - 2) << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
break;
|
||||
}
|
||||
|
||||
// ת<><D7AA>ΪUTF-8<>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
std::string payload(payloadBytes.begin(), payloadBytes.end());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>洢װ<E6B4A2>ð汾<C3B0><E6B1BE>Ϣ<EFBFBD>Ľṹ<C4BD><E1B9B9>
|
||||
struct DeviceVersionInfo {
|
||||
std::string BaseModel; // 1: װ<>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ͺ<EFBFBD>
|
||||
std::string CloudProtocolVer; // 2: <20>Ʒ<EFBFBD><C6B7><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>汾
|
||||
std::string AppVersion; // 3: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>
|
||||
std::string AppDate; // 4: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD>
|
||||
std::string AppChecksum; // 5: Ӧ<>ó<EFBFBD><C3B3><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
||||
std::string VoltageWiring; // 6: <20><>ѹ<EFBFBD><D1B9><EFBFBD>߷<EFBFBD>ʽ
|
||||
std::string CurrentBSynthetic; // 7: <20><><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>Ƿ<EFBFBD><C7B7>ϳ<EFBFBD>
|
||||
int DataStatInterval = 0; // 8: <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
||||
float RatedVoltage = 0.0f; // 9: <20><EFBFBD><EEB6A8>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>λV<CEBB><56>
|
||||
float PTRatio = 0.0f; // 10: PT<50><54><EFBFBD><EFBFBD>
|
||||
float CTRatio = 0.0f; // 11: CT<43><54><EFBFBD><EFBFBD>
|
||||
std::string SntpIP; // 12: sntp<74><70>ʱIP
|
||||
int SntpPort = 0; // 13: sntp<74><70>ʱ<EFBFBD>˿<EFBFBD>
|
||||
int SntpInterval = 0; // 14: sntp<74><70>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
||||
int WebPort = 0; // 15: Web<65>˿<EFBFBD>
|
||||
int FtpPort = 0; // 16: ftp<74>˿<EFBFBD>
|
||||
int PqdifInterval = 0; // 17: Pqdif<69>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>
|
||||
int WaveFileTypeCount = 0; // 18: ¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string SpecialVersion; // 19: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>Ϣ
|
||||
std::string DeviceModel; // 20: װ<><D7B0><EFBFBD>ͺ<EFBFBD>
|
||||
int HarmonicEnergyFlag = 0; // 21: г<><D0B3><EFBFBD><EFBFBD><EFBFBD>Ȱ汾<C8B0><E6B1BE>־
|
||||
std::string PhysicalName; // 22: <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
||||
std::string WaveLDName; // 23: ¼<><C2BC>LD<4C><44><EFBFBD><EFBFBD>
|
||||
int HighFreqHarmonicFlag = 0; // 24: <20><>Ƶг<C6B5><D0B3><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD>־
|
||||
unsigned int CommProtocols = 0; // 51: Ͷ<><CDB6><EFBFBD><EFBFBD>ͨѶЭ<D1B6><D0AD>
|
||||
unsigned int TimeSyncMethods = 0;// 52: Ͷ<><CDB6><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>ʽ
|
||||
unsigned int DeviceFunctions = 0;// 53: װ<>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
} versionInfo;
|
||||
|
||||
// <20>ָ<EFBFBD><D6B8>ֶ<EFBFBD>
|
||||
std::vector<std::string> fields;
|
||||
size_t start = 0;
|
||||
while (start < payload.length()) {
|
||||
size_t end = payload.find(',', start);
|
||||
if (end == std::string::npos) {
|
||||
fields.push_back(payload.substr(start));
|
||||
break;
|
||||
}
|
||||
fields.push_back(payload.substr(start, end - start));
|
||||
start = end + 1;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ֶ<EFBFBD>
|
||||
for (const auto& field : fields) {
|
||||
if (field.empty()) continue;
|
||||
|
||||
// <20>ָ<EFBFBD><D6B8><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
size_t colonPos = field.find(':');
|
||||
if (colonPos == std::string::npos || colonPos == 0) continue;
|
||||
|
||||
std::string key = field.substr(0, colonPos);
|
||||
std::string value = field.substr(colonPos + 1);
|
||||
|
||||
// ȥ<><C8A5><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>˵Ŀհ<D5B0><D7BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
auto trim = [](std::string str) -> std::string {
|
||||
size_t start = str.find_first_not_of(" \t\"");
|
||||
size_t end = str.find_last_not_of(" \t\"");
|
||||
return (start == std::string::npos) ? "" : str.substr(start, end - start + 1);
|
||||
};
|
||||
key = trim(key);
|
||||
value = trim(value);
|
||||
|
||||
// ת<><D7AA>Ϊ<EFBFBD><CEAA>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ID
|
||||
try {
|
||||
int fieldId = std::stoi(key);
|
||||
switch (fieldId) {
|
||||
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
||||
case 1: versionInfo.BaseModel = value; break;
|
||||
case 2: versionInfo.CloudProtocolVer = value; break;
|
||||
case 3: versionInfo.AppVersion = value; break;
|
||||
case 4: versionInfo.AppDate = value; break;
|
||||
case 5: versionInfo.AppChecksum = value; break;
|
||||
case 6: versionInfo.VoltageWiring = value; break;
|
||||
case 7: versionInfo.CurrentBSynthetic = value; break;
|
||||
case 12: versionInfo.SntpIP = value; break;
|
||||
case 19: versionInfo.SpecialVersion = value; break;
|
||||
case 20: versionInfo.DeviceModel = value; break;
|
||||
case 22: versionInfo.PhysicalName = value; break;
|
||||
case 23: versionInfo.WaveLDName = value; break;
|
||||
|
||||
// <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
||||
case 8: versionInfo.DataStatInterval = std::stoi(value); break;
|
||||
case 9: versionInfo.RatedVoltage = std::stof(value); break;
|
||||
case 10: versionInfo.PTRatio = std::stof(value); break;
|
||||
case 11: versionInfo.CTRatio = std::stof(value); break;
|
||||
case 13: versionInfo.SntpPort = std::stoi(value); break;
|
||||
case 14: versionInfo.SntpInterval = std::stoi(value); break;
|
||||
case 15: versionInfo.WebPort = std::stoi(value); break;
|
||||
case 16: versionInfo.FtpPort = std::stoi(value); break;
|
||||
case 17: versionInfo.PqdifInterval = std::stoi(value); break;
|
||||
case 18: versionInfo.WaveFileTypeCount = std::stoi(value); break;
|
||||
case 21: versionInfo.HarmonicEnergyFlag = std::stoi(value); break;
|
||||
case 24: versionInfo.HighFreqHarmonicFlag = std::stoi(value); break;
|
||||
|
||||
// ʮ<><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶΣ<D6B6>51+<2B><>
|
||||
case 51:
|
||||
case 52:
|
||||
case 53: {
|
||||
if (value.size() > 2 && value.substr(0, 2) == "0x") {
|
||||
unsigned int hexValue = std::stoul(value.substr(2), nullptr, 16);
|
||||
switch (fieldId) {
|
||||
case 51: versionInfo.CommProtocols = hexValue; break;
|
||||
case 52: versionInfo.TimeSyncMethods = hexValue; break;
|
||||
case 53: versionInfo.DeviceFunctions = hexValue; break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "Error parsing field: " << field
|
||||
<< ", error: " << e.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::cout << "Device Version Info (" << mac << "):\n"
|
||||
<< " Base Model: " << versionInfo.BaseModel << "\n"
|
||||
<< " Cloud Protocol: " << versionInfo.CloudProtocolVer << "\n"
|
||||
<< " App Version: " << versionInfo.AppVersion << "\n"
|
||||
<< " App Date: " << versionInfo.AppDate << "\n"
|
||||
<< " PT Ratio: " << versionInfo.PTRatio << "\n"
|
||||
<< " CT Ratio: " << versionInfo.CTRatio << "\n"
|
||||
<< " 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";
|
||||
|
||||
//<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);
|
||||
}
|
||||
else {
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<CFA2>ܣ<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;
|
||||
|
||||
Reference in New Issue
Block a user