From 1d82a73560061149a8f0e55ed2bb07087a44b1a2 Mon Sep 17 00:00:00 2001 From: BlueMatthew Date: Sat, 18 Nov 2023 18:06:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=9A=E5=8A=A1=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A7=A3=E6=9E=90=E7=9A=84=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etc/ht_service.conf | 4 + include/HTConfig.h | 6 ++ include/HTHP104Table.h | 7 ++ src/HTConfig.cpp | 19 +++++ src/HTIEC104.cpp | 174 +++++++++++++++++++++-------------------- 5 files changed, 127 insertions(+), 83 deletions(-) diff --git a/etc/ht_service.conf b/etc/ht_service.conf index a4e973f..d8c39b1 100644 --- a/etc/ht_service.conf +++ b/etc/ht_service.conf @@ -51,3 +51,7 @@ thread_respone_num = 2 [HT_LOGGER] logger = console,debug,error,warning,package #logger = error,warning + + +[HT_BUSINESS] +parse_busi_data = 1 \ No newline at end of file diff --git a/include/HTConfig.h b/include/HTConfig.h index 42bec77..6c9dba9 100644 --- a/include/HTConfig.h +++ b/include/HTConfig.h @@ -122,6 +122,9 @@ public: char isLogConsole(void); char isLogMessage(void); + void setParseBusiData(unsigned char flag); + unsigned char shouldParseBusiData (void); + // version infomation functios void setServerVersion(char *pver) ; char *getServerVersion(); @@ -172,6 +175,9 @@ private: char m_logpack; // package print logger char m_logconsole; // console print char m_logmessage; // message print + + // Business Data + unsigned char m_parseBusiData; }; #endif diff --git a/include/HTHP104Table.h b/include/HTHP104Table.h index d9be2a9..01b5c64 100644 --- a/include/HTHP104Table.h +++ b/include/HTHP104Table.h @@ -46,6 +46,13 @@ typedef struct tagIEC_DEVICE unsigned char one_dtime; }IEC_DEVICE; +typedef struct tagIEC_FIELD +{ + std::string name; + float value; + time_t ts; +} IEC_FIELD; + typedef struct tagIEC_POINT { unsigned int sadr; // 信息体地址,map.key diff --git a/src/HTConfig.cpp b/src/HTConfig.cpp index ba3e870..4c05cdc 100644 --- a/src/HTConfig.cpp +++ b/src/HTConfig.cpp @@ -44,6 +44,8 @@ TConfig::TConfig() m_opration_num = 1; m_respone_num = 1 ; + m_parseBusiData = 1; + } TConfig::~TConfig() @@ -367,6 +369,16 @@ unsigned int TConfig::getResponeThreadNumber() { return m_respone_num ; } + +void TConfig::setParseBusiData(unsigned char flag) +{ + m_parseBusiData = flag; +} +unsigned char TConfig::shouldParseBusiData(void) +{ + return m_parseBusiData; +} + /************************************************************************* Function iniGetString Rectives a character string from the specified section in the @@ -670,6 +682,13 @@ bool TConfig::getIniConfig() return false; } setResponeThreadNumber((unsigned int)atoi(szTmp)); + + memset(szTmp, 0x00, sizeof(szTmp)); + if ((iRet = iniGetString("HT_BUSINESS", "parse_busi_data", szTmp, sizeof(szTmp))) < 0) { + vPrtLogMsg(LOG_ERROR, iRet, "get db_max_conn parameter failed"); + return false; + } + setParseBusiData((unsigned char)atoi(szTmp)); return true; } diff --git a/src/HTIEC104.cpp b/src/HTIEC104.cpp index f560ac3..6232530 100644 --- a/src/HTIEC104.cpp +++ b/src/HTIEC104.cpp @@ -1418,6 +1418,7 @@ bool bSetPointTableValueYC(float v, unsigned int adr) return true; } + bool bSetPointTableValueYC(const std::vector& values) { // Save the origin data into database first @@ -1426,109 +1427,116 @@ bool bSetPointTableValueYC(const std::vector& values) addOriginDataListNew(*it); } - std::string tableName; - std::string dtimeFildName; - std::string devidFildName; - unsigned int devId = 0; - bool one_dtime = true; - time_t ts = 0; - std::map::const_iterator itPoint; - std::map::const_iterator itDev; - std::string fields, fieldValues; - - char dataBuf[32] = { 0 }; - mutex_lock(g_map_iec_mutex_new); - for (std::vector::const_iterator it = values.begin(); it != values.end(); ++it) + if (g_TConfig.shouldParseBusiData() != 0) { - itPoint = g_map_iec_new.find(it->sadr); - if (itPoint != g_map_iec_new.end()) - { - continue; - } - itDev = g_map_devices.find(itPoint->second.sensor_id); - if (itDev != g_map_devices.end()) + time_t ts = 0; + std::map::const_iterator itPoint; + std::map::const_iterator itDev; + std::string fields, fieldValues; + + std::map > records; + std::map >::iterator itRecord; + std::vector::iterator itField; + + char dataBuf[32] = { 0 }; + IEC_FIELD field; + mutex_lock(g_map_iec_mutex_new); + for (std::vector::const_iterator it = values.begin(); it != values.end(); ++it) { - continue; - } - - if (!tableName.empty()) - { - tableName = (const char *)itDev->second.tableName; - dtimeFildName = (const char *)itDev->second.dtimeFieldName; - devidFildName = (const char *)itDev->second.devidFieldName; - devId = itDev->second.sensor_id; - one_dtime = (itDev->second.one_dtime != 0); - ts = it->dtime; - - vPrtLogMsg(LOG_DEBUG, RET_OK, "Table: %s oneTime=%u", tableName.c_str(), (unsigned int)itDev->second.one_dtime); - if (tableName.empty()) + itPoint = g_map_iec_new.find(it->sadr); + if (itPoint == g_map_iec_new.end() || strlen((const char*)itPoint->second.fieldName) == 0) + { + continue; + } + itRecord = records.find(itPoint->second.sensor_id); + if (itRecord == records.end()) { - break; + itRecord = records.insert(records.end(), std::make_pair<>(itPoint->second.sensor_id, std::vector())); } + + field.name = (const char*)itPoint->second.fieldName; + field.ts = it->dtime; + field.value = it->fval; + + itRecord->second.push_back(field); } - else + + std::string sql; + for (itRecord = records.begin(); itRecord != records.end(); ++itRecord) { - if (tableName.compare((const char *)itDev->second.tableName) != 0) + itDev = g_map_devices.find(itRecord->first); + if (itDev == g_map_devices.end() || strlen((const char*)itDev->second.tableName) == 0) { continue; } - } - - fields.append((const char *)itPoint->second.fieldName); - fields.append(","); - fieldValues.append("'"); - snprintf(dataBuf, sizeof(dataBuf), "%0.4f", it->fval); - fieldValues.append(dataBuf); - fieldValues.append("',"); + fields.clear(); + fieldValues.clear(); + sql.clear(); - if (!one_dtime) - { - fields.append((const char *)itPoint->second.fieldName); - fields.append("_time,"); + for (itField = itRecord->second.begin(); itField != itRecord->second.end(); ++itField) + { + ts = itField->ts; + fields.append(itField->name); + fields.append(","); - fieldValues.append("FROM_UNIXTIME("); - snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)it->dtime); - fieldValues.append(dataBuf); - fieldValues.append("),"); - } - } - mutex_unlock(g_map_iec_mutex_new); + fieldValues.append("'"); + snprintf(dataBuf, sizeof(dataBuf), "%0.4f", itField->value); + fieldValues.append(dataBuf); + fieldValues.append("',"); - if (!tableName.empty()) - { - // Assume they belongs the same object - std::string sql = "INSERT INTO "; - sql.append(tableName); - sql.append("("); - sql.append(devidFildName); - sql.append(","); + if ((itDev->second.one_dtime == 0)) + { + fields.append((const char *)itPoint->second.fieldName); + fields.append("_time,"); + + fieldValues.append("FROM_UNIXTIME("); + snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)ts); + fieldValues.append(dataBuf); + fieldValues.append("),"); + } + } - sql.append(fields, 0, fields.size() - 1); - sql.append(" VALUES("); + sql = "INSERT INTO "; + sql.append((const char *)itDev->second.tableName); + sql.append("("); + sql.append((const char *)itDev->second.devidFieldName); + sql.append(","); + if (itDev->second.one_dtime != 0) + { + sql.append((const char *)itDev->second.dtimeFieldName); + sql.append(","); + } + sql.append(fields, 0, fields.size() - 1); - snprintf(dataBuf, sizeof(dataBuf), "%u", devId); - sql.append(dataBuf); - sql.append(","); + sql.append(") VALUES("); - if (one_dtime) - { - sql.append("FROM_UNIXTIME("); - snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)ts); + snprintf(dataBuf, sizeof(dataBuf), "%u", itDev->second.sensor_id); sql.append(dataBuf); - sql.append("),"); - } + sql.append(","); + if (itDev->second.one_dtime != 0) + { + sql.append("FROM_UNIXTIME("); + snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)ts); + sql.append(dataBuf); + sql.append("),"); + } - sql.append(fieldValues, 0, fieldValues.size() - 1); - sql.append(")"); + sql.append(fieldValues, 0, fieldValues.size() - 1); + sql.append(")"); - std::list::iterator it; - mutex_lock(g_list_busi_data_mutex); - it = g_list_busi_data.insert(g_list_busi_data.end(), std::string()); - it->swap(sql); - mutex_unlock(g_list_busi_data_mutex); - } + vPrtLogMsg(LOG_DEBUG, RET_OK, "Insert busi data %s", sql.c_str()); + std::list::iterator it; + mutex_lock(g_list_busi_data_mutex); + it = g_list_busi_data.insert(g_list_busi_data.end(), std::string()); + it->swap(sql); + mutex_unlock(g_list_busi_data_mutex); + } + + mutex_unlock(g_map_iec_mutex_new); + } + /* IEC_OBJVAL_NEW objVal = { 0 }; objVal.stype = 2;