增加业务数据解析的控制

main
BlueMatthew 2 years ago
parent 1113098dd9
commit 1d82a73560

@ -51,3 +51,7 @@ thread_respone_num = 2
[HT_LOGGER] [HT_LOGGER]
logger = console,debug,error,warning,package logger = console,debug,error,warning,package
#logger = error,warning #logger = error,warning
[HT_BUSINESS]
parse_busi_data = 1

@ -122,6 +122,9 @@ public:
char isLogConsole(void); char isLogConsole(void);
char isLogMessage(void); char isLogMessage(void);
void setParseBusiData(unsigned char flag);
unsigned char shouldParseBusiData (void);
// version infomation functios // version infomation functios
void setServerVersion(char *pver) ; void setServerVersion(char *pver) ;
char *getServerVersion(); char *getServerVersion();
@ -172,6 +175,9 @@ private:
char m_logpack; // package print logger char m_logpack; // package print logger
char m_logconsole; // console print char m_logconsole; // console print
char m_logmessage; // message print char m_logmessage; // message print
// Business Data
unsigned char m_parseBusiData;
}; };
#endif #endif

@ -46,6 +46,13 @@ typedef struct tagIEC_DEVICE
unsigned char one_dtime; unsigned char one_dtime;
}IEC_DEVICE; }IEC_DEVICE;
typedef struct tagIEC_FIELD
{
std::string name;
float value;
time_t ts;
} IEC_FIELD;
typedef struct tagIEC_POINT typedef struct tagIEC_POINT
{ {
unsigned int sadr; // 信息体地址map.key unsigned int sadr; // 信息体地址map.key

@ -44,6 +44,8 @@ TConfig::TConfig()
m_opration_num = 1; m_opration_num = 1;
m_respone_num = 1 ; m_respone_num = 1 ;
m_parseBusiData = 1;
} }
TConfig::~TConfig() TConfig::~TConfig()
@ -367,6 +369,16 @@ unsigned int TConfig::getResponeThreadNumber()
{ {
return m_respone_num ; return m_respone_num ;
} }
void TConfig::setParseBusiData(unsigned char flag)
{
m_parseBusiData = flag;
}
unsigned char TConfig::shouldParseBusiData(void)
{
return m_parseBusiData;
}
/************************************************************************* /*************************************************************************
Function iniGetString Function iniGetString
Rectives a character string from the specified section in the Rectives a character string from the specified section in the
@ -671,6 +683,13 @@ bool TConfig::getIniConfig()
} }
setResponeThreadNumber((unsigned int)atoi(szTmp)); 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; return true;
} }

@ -1418,6 +1418,7 @@ bool bSetPointTableValueYC(float v, unsigned int adr)
return true; return true;
} }
bool bSetPointTableValueYC(const std::vector<IEC_OBJVAL_NEW>& values) bool bSetPointTableValueYC(const std::vector<IEC_OBJVAL_NEW>& values)
{ {
// Save the origin data into database first // Save the origin data into database first
@ -1426,107 +1427,114 @@ bool bSetPointTableValueYC(const std::vector<IEC_OBJVAL_NEW>& values)
addOriginDataListNew(*it); addOriginDataListNew(*it);
} }
std::string tableName; if (g_TConfig.shouldParseBusiData() != 0)
std::string dtimeFildName;
std::string devidFildName;
unsigned int devId = 0;
bool one_dtime = true;
time_t ts = 0;
std::map<unsigned int, IEC_POINT>::const_iterator itPoint;
std::map<unsigned int, IEC_DEVICE>::const_iterator itDev;
std::string fields, fieldValues;
char dataBuf[32] = { 0 };
mutex_lock(g_map_iec_mutex_new);
for (std::vector<IEC_OBJVAL_NEW>::const_iterator it = values.begin(); it != values.end(); ++it)
{ {
itPoint = g_map_iec_new.find(it->sadr); time_t ts = 0;
if (itPoint != g_map_iec_new.end()) std::map<unsigned int, IEC_POINT>::const_iterator itPoint;
{ std::map<unsigned int, IEC_DEVICE>::const_iterator itDev;
continue; std::string fields, fieldValues;
}
itDev = g_map_devices.find(itPoint->second.sensor_id); std::map<unsigned int, std::vector<IEC_FIELD> > records;
if (itDev != g_map_devices.end()) std::map<unsigned int, std::vector<IEC_FIELD> >::iterator itRecord;
{ std::vector<IEC_FIELD>::iterator itField;
continue;
} char dataBuf[32] = { 0 };
IEC_FIELD field;
if (!tableName.empty()) mutex_lock(g_map_iec_mutex_new);
for (std::vector<IEC_OBJVAL_NEW>::const_iterator it = values.begin(); it != values.end(); ++it)
{ {
tableName = (const char *)itDev->second.tableName; itPoint = g_map_iec_new.find(it->sadr);
dtimeFildName = (const char *)itDev->second.dtimeFieldName; if (itPoint == g_map_iec_new.end() || strlen((const char*)itPoint->second.fieldName) == 0)
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())
{ {
break; continue;
}
itRecord = records.find(itPoint->second.sensor_id);
if (itRecord == records.end())
{
itRecord = records.insert(records.end(), std::make_pair<>(itPoint->second.sensor_id, std::vector<IEC_FIELD>()));
} }
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; continue;
} }
}
fields.append((const char *)itPoint->second.fieldName); fields.clear();
fields.append(","); fieldValues.clear();
sql.clear();
fieldValues.append("'"); for (itField = itRecord->second.begin(); itField != itRecord->second.end(); ++itField)
snprintf(dataBuf, sizeof(dataBuf), "%0.4f", it->fval); {
fieldValues.append(dataBuf); ts = itField->ts;
fieldValues.append("',"); fields.append(itField->name);
fields.append(",");
if (!one_dtime) fieldValues.append("'");
{ snprintf(dataBuf, sizeof(dataBuf), "%0.4f", itField->value);
fields.append((const char *)itPoint->second.fieldName); fieldValues.append(dataBuf);
fields.append("_time,"); fieldValues.append("',");
fieldValues.append("FROM_UNIXTIME("); if ((itDev->second.one_dtime == 0))
snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)it->dtime); {
fieldValues.append(dataBuf); fields.append((const char *)itPoint->second.fieldName);
fieldValues.append("),"); fields.append("_time,");
}
}
mutex_unlock(g_map_iec_mutex_new);
if (!tableName.empty()) fieldValues.append("FROM_UNIXTIME(");
{ snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)ts);
// Assume they belongs the same object fieldValues.append(dataBuf);
std::string sql = "INSERT INTO "; fieldValues.append("),");
sql.append(tableName); }
sql.append("("); }
sql.append(devidFildName);
sql.append(",");
sql.append(fields, 0, fields.size() - 1); sql = "INSERT INTO ";
sql.append(" VALUES("); 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(") VALUES(");
sql.append(dataBuf);
sql.append(",");
if (one_dtime) snprintf(dataBuf, sizeof(dataBuf), "%u", itDev->second.sensor_id);
{
sql.append("FROM_UNIXTIME(");
snprintf(dataBuf, sizeof(dataBuf), "%lld", (long long)ts);
sql.append(dataBuf); 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(fieldValues, 0, fieldValues.size() - 1);
sql.append(")"); sql.append(")");
std::list<std::string>::iterator it; vPrtLogMsg(LOG_DEBUG, RET_OK, "Insert busi data %s", sql.c_str());
mutex_lock(g_list_busi_data_mutex);
it = g_list_busi_data.insert(g_list_busi_data.end(), std::string()); std::list<std::string>::iterator it;
it->swap(sql); mutex_lock(g_list_busi_data_mutex);
mutex_unlock(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);
} }
/* /*

Loading…
Cancel
Save