增加业务数据解析的控制

main
BlueMatthew 2 years ago
parent 1113098dd9
commit 1d82a73560

@ -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

@ -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

@ -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

@ -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
@ -671,6 +683,13 @@ bool TConfig::getIniConfig()
}
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;
}

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

Loading…
Cancel
Save