commit 53d6c7efe71884fa061f52aaa547a998af73ee9f Author: SharpClaws <625237490@qq.com> Date: Tue Nov 8 13:49:53 2022 +0800 dbpclient OK diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb87310 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +### C++ template +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +#*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +#*.a +*.lib + +# Executables +*.exe +*.out +*.app + +#Clion +.idea +cmake-build-* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..977cd86 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.24) +project(DBP_exporter) + +set(CMAKE_CXX_STANDARD 20) + +include_directories(dbpapi/include) +link_directories(dbpapi/lib) + +set( + DBP_EXPORTER_SRCS + main.cpp + DBPclient/DBPclient.cpp + DBPclient/DBPclient.h +# DBPcollector/DBPcollector.cpp +# DBPcollector/DBPcollector.h +) + +add_executable(DBP_exporter ${DBP_EXPORTER_SRCS}) + +target_link_libraries( + DBP_exporter + libdbpapi.a +) \ No newline at end of file diff --git a/DBPclient/DBPclient.cpp b/DBPclient/DBPclient.cpp new file mode 100644 index 0000000..6b22560 --- /dev/null +++ b/DBPclient/DBPclient.cpp @@ -0,0 +1,227 @@ +// +// Created by test on 2022/11/3. +// + +#include "DBPclient.h" + +#include +#include + +DBPclient::DBPclient(std::string endpoint, std::string username, std::string password) : + dbp_endpoint(std::move(endpoint)), dbp_username(std::move(username)), dbp_password(std::move(password)) { + m_dwHandle = 0; + +} + +DBPclient::~DBPclient() { + +} + +bool DBPclient::connect() { + // 设置连接参数 + WORD wport = 12084; + + m_dwHandle = DBPCreate2(dbp_endpoint.data(), dbp_username.data(), dbp_password.data(), wport, false); //创建对象 + + std::chrono::steady_clock::time_point t_begin = std::chrono::steady_clock::now(); + //创建对象 启动连接 + DWORD ret; + if (m_dwHandle) { + ret = DBPConnect(m_dwHandle); + if (ret == 0) { + //取连接信息 + char sip[16]; + int pnNum; + DBPGetSvrConInfo(m_dwHandle, sip, &pnNum); + + std::chrono::steady_clock::time_point t_end = std::chrono::steady_clock::now(); + std::chrono::duration time_used = std::chrono::duration_cast < std::chrono::duration < double >> ( + t_end - t_begin); + std::cout << "connect use:" << time_used << std::endl; + return true; + } else { + std::cout << "connect failed"; +// std::chrono::steady_clock::time_point t_end = std::chrono::steady_clock::now(); +// std::chrono::duration time_used = std::chrono::duration_cast>( +// t_end - t_begin); +// std::cout << "connect failed use:" << time_used << std::endl; + return false; + } + } + return true; +} + +void DBPclient::disconnect() { + int pnCon; + DWORD ret; + ret = DBPIsConnect(m_dwHandle, &pnCon); + if (ret == 0 && pnCon != 0) //连接 + { + DBPDisConnect(m_dwHandle);//关闭连接 + DBPDestroy(m_dwHandle);//删除对象 + std::cout << "disconnected"; + } +} + +struct DataInfo { + std::array szSName = {0}; + std::array szSDBName = {0}; + std::array szSDBTagName = {0}; + std::array szSDes = {0}; + std::array szSUnit = {0}; + DWORD szDWid; + WORD szWType; +}; + + +void DBPclient::readValue(const std::vector &node_ids) { + std::vector vData; + std::vector vTags; + +// 读全部标签 + if (m_dwHandle) { + // 查询标签,获取标签个数 + DWORD ret; + long ltagnum, count = 0, nIndex = 0; + + ret = DBPQueryTagFromDbp(//查询标签,查询后结果保存在对象中,下次用EnumTagAttr逐个取属性 + m_dwHandle, + NULL, //标签名过滤传,NULL或空串表示全部 + NULL, //描述过滤传,NULL或空串表示全部 + -1, //类型,-1表示全部 + <agnum //查询到的标签数 + );//返回错误码 + if (ret != 0) { + std::cout << "query tag error"; + return; + } + + std::cout << "tag num:" << ltagnum << std::endl; + + vData.resize(ltagnum); + + // 读标签属性 + short errcode0; //错误代码 + long ltagflag0; //标签标志, + + std::chrono::steady_clock::time_point t_begin = std::chrono::steady_clock::now(); + + std::cout << "read tag" << std::endl; + for (long i = 0; i < vData.size(); i++) { + ret = DBPEnumTagAttr( //枚举查询后标签属性 + m_dwHandle, + vData[i].szSName.data(), //标签名 80 + vData[i].szSDBName.data(), //数据库实例名 16 + vData[i].szSDBTagName.data(), //数据库标签名 80 + vData[i].szSDes.data(), //描述 80 + vData[i].szSUnit.data(), //单位 16 + &vData[i].szDWid, //标签ID + &vData[i].szWType, //数据类型 + &errcode0, //错误代码 + <agflag0, //标签标志, + i //位置 0到查询的标签数-1 + ); //返回 DBP_OK表示成功,否则错误或没有了} + if (ret == 0) { +// for (auto const &t: vData[i].szSName) { +// std::cout << t; +// } +// std::cout << std::endl; + } else { + std::cout << i << "error code:" << errcode0 << std::endl; + return; + } + } + + std::chrono::steady_clock::time_point t_end = std::chrono::steady_clock::now(); + std::chrono::duration time_used = std::chrono::duration_cast < std::chrono::duration < double >> ( + t_end - t_begin); + std::cout << "read tag use:" << time_used << std::endl; + + for (auto &d: vData) { + vTags.emplace_back(d.szSName.data()); + } + + std::vector ltimes; + std::vector snqas; + std::vector dblals; + std::vector lvals; + std::vector ntypes; + std::vector errs; + + ltimes.resize(ltagnum); + snqas.resize(ltagnum); + dblals.resize(ltagnum); + lvals.resize(ltagnum); + ntypes.resize(ltagnum); + errs.resize(ltagnum); + + + std::cout << "read value" << std::endl; + std::chrono::steady_clock::time_point v_begin = std::chrono::steady_clock::now(); + ret = DBPGetSnapshot( //读快照 + m_dwHandle, + vTags.data(), //标签名数组 + ltimes.data(), //in/out, 时标 + snqas.data(), //in/out, 质量 + dblals.data(), //in/out, 存放double值,DT_FLOAT32,DT_FLOAT64存放区 + lvals.data(), //in/out, 存放Long值,DT_DIGITAL,DT_INT32,DT_INT64存放区 + ntypes.data(), //in/out, 数据类型,DT_INT32,DT_FLOAT32等。 + errs.data(), //in/out, 错误码 + ltagnum //in, 个数 + );//返回错误码 + if (ret != 0) { + return; + } + + std::chrono::steady_clock::time_point v_end = std::chrono::steady_clock::now(); + std::chrono::duration read_value_time_used = + std::chrono::duration_cast < std::chrono::duration < double >> ( + v_end - v_begin); + std::cout << "read value use:" << read_value_time_used << std::endl; + for (int j = 0; j < ltagnum; j++) { + //std::cout << j << ":" << ntypes[j] << std::endl; + switch (ntypes[j]) { + case DT_DIGITAL: + dbp_read_value[vTags[j]] = lvals[j]; + case DT_INT32: + dbp_read_value[vTags[j]] = lvals[j]; + case DT_INT64: + //std::cout << lvals[j] << std::endl; + dbp_read_value[vTags[j]] = lvals[j]; + break; + case DT_FLOAT32: + dbp_read_value[vTags[j]] = lvals[j]; + case DT_FLOAT64: + //std::cout << dblals[j] << std::endl; + dbp_read_value[vTags[j]] = dblals[j]; + break; + default: + dbp_read_value[vTags[j]] = 0; + } + } + } + std::fstream fs; + fs.open("value.txt", std::ios::ate | std::ios::out); + for (auto iter: dbp_read_value) { + fs << iter.first << ":" << iter.second << std::endl; + } + fs.close(); +} + +void DBPclient::stop() { + running = false; + disconnect(); +} + +void DBPclient::run() { + while (running) { + if (!connect()) { + //disconnect(); +// spdlog::error("OPC-UA Server({}) not connected({}). Retrying to connect in 1 second.", ua_endpoint, +// retval); + std::cout << "Retrying to connect in 1 second." << std::endl; + Sleep(1000); + continue; + } + } +} diff --git a/DBPclient/DBPclient.h b/DBPclient/DBPclient.h new file mode 100644 index 0000000..0253bdc --- /dev/null +++ b/DBPclient/DBPclient.h @@ -0,0 +1,48 @@ +// +// Created by test on 2022/11/3. +// + +#ifndef OPCUA_EXPORTER_DBPCLIENT_H +#define OPCUA_EXPORTER_DBPCLIENT_H + +#include +#include +#include +#include +#include + +#include +#include "dbpapi_j.h" +#include +#include + + +class DBPclient { +public: + explicit DBPclient(std::string endpoint, std::string username, std::string password); + + ~DBPclient(); + + void stop(); + + void run(); + + bool connect(); + + void disconnect(); + + void readValue(std::vector const &node_ids); + +private: + std::string dbp_endpoint; + std::string dbp_username; + std::string dbp_password; + DWORD m_dwHandle; + + bool running{true}; + + std::map dbp_read_value; +}; + + +#endif //OPCUA_EXPORTER_DBPCLIENT_H diff --git a/DBPcollector/DBPcollector.cpp b/DBPcollector/DBPcollector.cpp new file mode 100644 index 0000000..0e9a26e --- /dev/null +++ b/DBPcollector/DBPcollector.cpp @@ -0,0 +1,97 @@ +// +// Created by test on 2022/11/3. +// + +#include "DBPcollector.h" + +DBPcollector::DBPcollector(const YAML::Node &config, std::shared_ptr dbp_client) : + registry_(std::make_shared()), + dbp_client_(dbp_client) { + buildMetrics(config); +} + +void DBPcollector::clearMetrics() { + dbp_read_node_ids.clear(); + for (auto &node: nodes) { + if (nullptr != node.second.family) { + if (nullptr != node.second.data) { + node.second.family->Remove(node.second.data); + } + registry_->Remove(*node.second.family); + } + } + nodes.clear(); + metrics_json_.clear(); +} + +void DBPcollector::buildMetrics(const YAML::Node &config) { + clearMetrics(); + for (auto item: config) { + if (item.IsNull() || item["name"].IsNull() || item["nodeid"].IsNull() || item["type"].IsNull()) { + continue; + } + auto node_id = item["nodeid"].as(); + auto name = item["name"].as(); + auto help = item["help"].as(std::string()); + metrics_json_.push_back({ + {"node_id", node_id}, + {"name", name}, + {"help", help} + }); + dbp_read_node_ids.emplace_back(node_id); + spdlog::info("load metrics {}({}).", name, node_id); + auto &node_family = prometheus::BuildGauge() + .Name(name) + .Help(help) + .Labels(getNodeLabels(item["labels"])) + .Register(*registry_); + nodes[node_id] = { + name, + &node_family, + &(node_family.Add({{"data", "data"}})), + }; + + } +} + +bool DBPcollector::updateMetrics() { + do { + if (dbp_read_node_ids.empty()) { + break; + } + auto values = dbp_client_->readValue(dbp_read_node_ids); + if (values.empty()) { // none value return + break; + } + for (auto const &value: values) { + auto node_iter = nodes.find(value.first); + if (node_iter != nodes.end()) { + node_iter->second.setValue(value.second); + } + } + return true; + } while (false); + return false; +} + + +prometheus::Labels DBPcollector::getNodeLabels(const YAML::Node &labels) { + return prometheus::Labels(); +} + +std::vector DBPcollector::Collect() const { + if (const_cast(this)->updateMetrics()) { + return registry_->Collect(); + } + return {}; +} + +nlohmann::json const &DBPcollector::getMetricsJson() { + return metrics_json_; +} + +void DBPcollector::st_node::setValue(double val) { + if (nullptr != data) { + data->Set(val); + } +} diff --git a/DBPcollector/DBPcollector.h b/DBPcollector/DBPcollector.h new file mode 100644 index 0000000..94d367d --- /dev/null +++ b/DBPcollector/DBPcollector.h @@ -0,0 +1,55 @@ +// +// Created by test on 2022/11/3. +// + +#ifndef OPCUA_EXPORTER_DBPCOLLECTOR_H +#define OPCUA_EXPORTER_DBPCOLLECTOR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class DBPcollector : public prometheus::Collectable { +public: + explicit DBPcollector(YAML::Node const &config, std::shared_ptr dbp_client); + + ~DBPcollector() override = default; + + std::vector Collect() const override; + + nlohmann::json const &getMetricsJson(); + +private: + void buildMetrics(YAML::Node const &config); + + bool updateMetrics(); + + void clearMetrics(); + + prometheus::Labels getNodeLabels(YAML::Node const &labels); + +private: + std::shared_ptr registry_; + std::shared_ptr dbp_client_; + std::vector dbp_read_node_ids; + + struct st_node { + std::string name; + prometheus::Family *family{nullptr}; + prometheus::Gauge *data{nullptr}; + void setValue(double val); + }; + + std::map nodes; + nlohmann::json metrics_json_; +}; + + +#endif //OPCUA_EXPORTER_DBPCOLLECTOR_H diff --git a/dbpapi/include/._dbpapi_err.h b/dbpapi/include/._dbpapi_err.h new file mode 100644 index 0000000..1db6797 Binary files /dev/null and b/dbpapi/include/._dbpapi_err.h differ diff --git a/dbpapi/include/._dbpapi_j.h b/dbpapi/include/._dbpapi_j.h new file mode 100644 index 0000000..1db6797 Binary files /dev/null and b/dbpapi/include/._dbpapi_j.h differ diff --git a/dbpapi/include/dbpapi_err.h b/dbpapi/include/dbpapi_err.h new file mode 100644 index 0000000..5c218da --- /dev/null +++ b/dbpapi/include/dbpapi_err.h @@ -0,0 +1,77 @@ +#ifndef __DBPAPI_ERR_H_ +#define __DBPAPI_ERR_H_ + +//ͨô +#define DBERR_OK 0x00 //ɹ +#define DBERR_FAIL 0x01 //ʧ +//ݿ⼶ +#define DBERR_CONNECT 0x02 //ûӣʧ +#define DBERR_NOINTERFACE 0x03 //޴˽ӿ +#define DBERR_HANDLE 0x04 // +#define DBERR_RECS 0x05 //ļ¼ +#define DBERR_MEMEORY 0x06 //ڴ +#define DBERR_NOTSUPPORT 0x07 //֧ +#define DBERR_NOMOREREC 0x08 //ûм¼ +#define DBERR_NOTAG 0x09 //޴˱ǩ +#define DBERR_TYPE 0x0A //޷ת +#define DBERR_TIME 0x0B //ʱ +#define DBERR_NOVAL 0x0C //û +#define DBERR_NOALL_OK 0x0D //ǩȫɹ +#define DBERR_BUF_FULL 0x0E //Ժٲ +#define DBERR_NODRV 0X1E //޴ + +// +#define DBPE_OK 0x00 //ɹ +#define DBPE_ERR 0x01 // +#define DBPE_NOTAG 0xA1 //ǩ +#define DBPE_TAGID_EXIST 0xA2 //ID +#define DBPE_TAGNAME_EXIST 0xA3 //ƴ +#define DBPE_TAG_EXIST 0xA4 //IDƴ +#define DBPE_TYPE 0xA5 //ʹ +#define DBPE_MODIFYTYPE 0xA6 //޸ +#define DBPE_MEMORY 0xA7 //ڴ +#define DBPE_NODB 0xA8 //ݿ +#define DBPE_CONBUSY 0xA9 //ݿæ +#define DBPE_MANING 0xAA //ݿ +#define DBPE_DBCONID 0xAB //ݿID +#define DBPE_TIMEOUT 0xAC //ʱ +#define DBPE_NODATA 0xAD // +#define DBPE_WORKBUSY 0xAE //ݿ⹤æ +#define DBPE_INVALID_SESSION 0xAF //ЧSessionҲǶӦSessionıǩѾɾҪ + +//ǩֵ +#define ERRTV_OK DBERR_OK //ɹ +#define ERRTV_NOTAG DBERR_NOTAG //޴˱ǩ +#define ERRTV_TYPE DBERR_TYPE //ʹ޷ת +#define ERRTV_TIME DBERR_TIME //ʱ +#define ERRTV_ERR DBERR_FAIL //ǩֵЧ +#define ERRTV_BUF_FULL DBERR_BUF_FULL //Ժٲ + +// ȫ +#define DS_OK 0 // +#define DS_ERR 1 //ʧ +#define DS_ACTOR_FULL 0x20 //ɫ +#define DS_OPERATOR_FULL 0x21 //û +#define DS_TRUSTIP_FULL 0x22 // +#define DS_NOACTOR 0x23 //޴˽ɫ +#define DS_NOOPERATOR 0x24 //޴˺ +#define DS_NOTRUSTIP 0x25 //޴IP +#define DS_ACTOR_EXIST 0x26 //ɫ +#define DS_OPERATOR_EXIST 0x27 //˺Ŵ +#define DS_TRUSTIP_EXIST 0x28 //IP +#define DS_NOPOWER 0x29 //޴Ȩ +#define DS_PASSERR 0x2A // +#define DS_USERLOCK 0x2B //˺Ž +#define DS_ACTORUSE 0x2C //ɫʹ + + +//API +#define APIE_OK 0x00 +//#define APIE_ERR 0x01 +#define APIE_HANDLE 0xC0 //ľ +#define APIE_CONNECT 0xC1 //û +#define APIE_MEMORY 0xC2 //APIڴ +#define APIE_NOMOREBUF 0xC3 // +#define APIE_ERR 0xC4 //¶ֵDBPE_ERR + +#endif /* __DBPAPI_ERR_H_ */ \ No newline at end of file diff --git a/dbpapi/include/dbpapi_j.h b/dbpapi/include/dbpapi_j.h new file mode 100644 index 0000000..168b8b6 --- /dev/null +++ b/dbpapi/include/dbpapi_j.h @@ -0,0 +1,423 @@ +#if !defined _DPAPI2_J_H_I +#define _DPAPI2_J_H_I + +// +#define DT_VOID 0 // +#define DT_DIGITAL 1 // ,Ҳ4ֽ +#define DT_INT32 2 //4ֽ +#define DT_FLOAT32 3 //4ֽڸ +#define DT_INT64 4 //8ֽ +#define DT_FLOAT64 5 //8ֽڸ +#define DT_STRING 6 //ַ +#define DT_BLOB 7 //ݿ + +// +#define DBP_QUALITY_GOOD 0x00 // GOOD +#define DBP_QUALITY_BAD 0x01 // ֵûضԭ +#define DBP_QUALITY_BAD_CONFIG_ERROR 0x02 // ô磬ǩеķɾ +#define DBP_QUALITY_BAD_NOT_CONNECTED 0x03 // ҪӵĿ꣬޷ɹӡ˵ڸʱϵֵţΪһԴδṩ +#define DBP_QUALITY_BAD_DEVICE_FAIL 0x04 // ⵽豸 +#define DBP_QUALITY_BAD_SENSOR_FAIL 0x05 // ⵽ +#define DBP_QUALITY_BAD_LAST 0x06 // 豸ͨѶʧܣǣЧֵǿõġע⣬ʱǵһЧֵʱ꣬ʱ +#define DBP_QUALITY_BAD_COMM_FAIL 0x07 // 豸ͨѶʧܣûõЧֵ +#define DBP_QUALITY_BAD_OUT_OF_SERVICE 0x08 // ñǩ鱻Ϊǻʾñǩijԭ򲻱 + +#define DBP_QUALITY_UNCERTAIN 0xE0 // ֵЧԲȷûضԭ +#define DBP_QUALITY_UNCERTAIN_LAST 0xE1 // ѾֹͣдֵֵӦΪȥֵע⣬״̬ʾΪڹ涨ʱڱǩδ¡Bad/Last Usable ValueʾΪ⵽ͨѶ +#define DBP_QUALITY_UNCERTAIN_SENSOR 0xE2 // ̷ֵΧߴڲΪ׼ȷ +#define DBP_QUALITY_UNCERTAIN_EU_EXCEEDED 0xE3 // ֵ˸ֵķΧע⣬״̬ζŸֵdz޵ +#define DBP_QUALITY_UNCERTAIN_SUB_NORMAL 0xE4 // ֵԶԴ״̬ΪGOODԴڹ涨ֵ + +#define DBP_QUALITY_CALC_OFF 0xF0 // ֹͣ + +#define DBP_QUALITY_LOLO_LIMIT 0xF9 // ͵ͱ +#define DBP_QUALITY_LO_LIMIT 0xFA // ͱ +#define DBP_QUALITY_HI_LIMIT 0xFB // ߱ +#define DBP_QUALITY_HIHI_LIMIT 0xFC // ߸߱ +#define DBP_QUALITY_NOT_INIT 0xFD // űδʼ +#define DBP_QUALITY_SHUTDOWN 0xFE // ر +#define DBP_QUALITY_UNKOWN 0xFF // δ֪ + +// ʷstr,ʷblob,SOEʱ +#define RST_CUR 1 //ǰʱ괦 +#define RST_AFTER 2 //ǰ֮һ +#define RST_DEFAULT (RST_CUR | RST_AFTER) //ǰ֮һ + +// GetHisVal3ʹãʾָʱֵʱȡֵ +#define RHV_BEFORE 1 // ȡǰһֵ +#define RHV_AFTER 2 // ȡһֵ +#define RHV_INTERP 3 // ȡֵ + +//Ȩ +#define DS_POWERMAN 0x00000001 //˺Ź +#define DS_SYSMAN 0x00000002 //ϵͳ,ݿǩ +#define DS_WRITE 0x00000004 //дȨ +#define DS_READ 0x00000008 //Ȩ + +//ǩ +#define TAG_FLAG_DDC 0 //ֳݱǩ(ʵʱǩ) "ddctag" +#define TAG_FLAG_DEF 1 //ǩ(ֹǩ) "deftag" +#define TAG_FLAG_PRE 2 //Ԥǩ(Ԥǩ) "pretag" +#define TAG_FLAG_CUR 3 //߱ǩ "curtag" +#define TAG_FLAG_CALC 4 //ǩ "calctag" + +//ʷ +#define HISTORY_RAW 0 +#define HISTORY_INSTEP 1 +#define HISTPRY_PLOT 2 + +// Ϊ˹淶javaӿ +#define DBPGetVersion DBP_GetVersion + +extern "C"{ + +// dbpapi汾ţ汾V2.5.4.0ʾΪ0x02050400 +DWORD __stdcall DBP_GetVersion(); + +/////////////////////////////////////////////////////////// +// +DWORD __stdcall DBPCreate( // + char* sips[], //IP 16ֽ + char* susers[], //¼˺ 16ֽ + char* spasss[], //¼ 16ֽ + WORD wport[], //˿ + int nsize // + ); //ض + +DWORD __stdcall DBPCreate2( //֧Ⱥ + char* sip, // IP 16ֽ + char* suser, // ¼˺ 16ֽ + char* spass, // ¼ 16ֽ + WORD wport, // ˿ + BOOL bUseGroup //ǷʹȺ + ); //ض + +DWORD __stdcall DBPDestroy( //ٶ + DWORD h //Destroy󣬸òͲʹ + );//ش + +/////////////////////////////////////////////////////////// +//ӹ +DWORD __stdcall DBPConnect( //ӷ + DWORD h + );//ش + +DWORD __stdcall DBPDisConnect( //Ͽ + DWORD h + );//ش + +DWORD __stdcall DBPIsConnect( //жϷ + DWORD h, + int* pnCon //in/out, 0ʾûӣ0ʾ + );//ش + +DWORD __stdcall DBPGetSvrConInfo( //ȡϢ + DWORD h, + char* sip, //in/outIP 16ֽ + int* pnNum // in/out ͻ + );//ش +/////////////////////////////////////////////////////////// +//ǩ +DWORD __stdcall DBPQueryTagFromDbp(//ѯǩ,ѯڶУ´EnumTagAttrȡ + DWORD h, + const char* snameflt, //ǩ˴NULLմʾȫ + const char* sdesflt, //˴NULLմʾȫ + int ntype, //,-1ʾȫ + long* pltagnum //ѯıǩ + );//ش + +DWORD __stdcall DBPQueryTagFromDbp2(//ѯǩ,ѯڶУ´EnumTagAttrȡ + DWORD h, + const char* snameflt, //ǩ˴NULLմʾȫ + const char* sdesflt, //˴NULLմʾȫ + int ntype, //,-1ʾȫ + int ntagtype, //ǩ,-1ʾȫ + long* pltagnum //ѯıǩ + );//ش + +DWORD __stdcall DBPEnumTagAttr( //öٲѯǩ + DWORD h, + char* sname, //ǩ 80 + char* sdbname, //ݿʵ 16 + char* sdbtagname, //ݿǩ 80 + char* sdes, // 80 + char* sunit, //λ 16 + DWORD* dwid, //ǩID + WORD* wtype, // + short* errcode, // + long* ltagflag, //ǩ + int nIndex //λ 0ѯıǩ-1 + ); // DBP_OKʾɹû + +DWORD __stdcall DBPGetTagAttrFromDbp( //ӷȡǩ + DWORD h, + char* sname[], //in/outǩ 80 + char* sdbname[], //in/outݿʵ 16 + char* sdbtagname[], //in/outݿǩ 80 + char* sdes[], //in/out 80 + char* sunit[], //in/outλ 16 + DWORD dwid[], //in/outǩID + WORD wtype[], //in/out + short errcode[], //in/out + long ltagflag[], //in/outǩ, + int nsize + );//ش + + +DWORD __stdcall DBPGetTagAttr( //ӷȡǩ + DWORD h, + char* sname, //in/outǩ 80 + char* sdbname, //in/outݿʵ 16 + char* sdbtagname, //in/outݿǩ 80 + char* sdes, //in/out 80 + char* sunit, //in/outλ 16 + DWORD* dwid, //in/outǩID + WORD* wtype, //in/out + short* errcode, //in/out + long* ltagflag //in/outǩ, + );//ش +/////////////////////////////////////////////////////////// +//ֵ + +DWORD __stdcall DBPGetSnapshotStr( //,string + DWORD h, + const char* sname, //ǩ + long* pltime, + short* psnqa, + char sval[], //,ַβ0 + int nsize, //С + int* pndatasize //յֽ0 + ); //ش + +DWORD __stdcall DBPGetSnapshotBlob( //,blob + DWORD h, + const char* sname, //ǩ + long* pltime, + short* psnqa, + char sval[], //,ַβ0 + int nsize, //С + int* pndatasize //ֽ + );//ش + +DWORD __stdcall DBPGetHisVal( //ʷ + DWORD h, + const char* sname, //ǩ + long lts, //in,ʼʱ + long lte, //in,ʱ + long linsertsec, //in,ֵʱ + long lflag, //in,־ + double dblvals[],//in/out,double + long lvals[], //in/out,long + long ltimes[], //in/out,ʱ + short snqas[], //in/out, + int nsize, //in,ռС + int* pntype, //in/out, + int* pndatasize//in/out,ݸ + ); +DWORD __stdcall DBPGetHisValFilter( + DWORD h, + const char* sname, //ǩ + long lts, //in,ʼʱ + long lte, //in,ʱ + long linsertsec, //in,ֵʱ + long lflag, //in,־ + const char *expression,//ַ + double dblvals[],//in/out,double + long lvals[], //in/out,long + long ltimes[], //in/out,ʱ + short snqas[], //in/out, + int nsize, //in,ռС + int* pntype, //in/out, + int* pndatasize//in/out,ݸ + ); + +DWORD __stdcall DBPGetHisStr( //stringʷ + DWORD h, + const char* sname, //in,ǩ + long ltime, //in,ʼʱ + DWORD dwflag, //in,־,RST_CUR,RST_AFTER,RST_DEFAULT֮һ + long* pltime, //in/out, ʱ + short* psnqa, //in/out, + char sval[], //,ַβ0 + int nsize, //in,С + int* pndatasize //in/out,յֽ0 + ); //ش + +DWORD __stdcall DBPGetHisBlob( //BLOBʷ + DWORD h, + const char* sname, //in,ǩ + long ltime, //in,ʼʱ + DWORD dwflag, //int,־,RST_CUR,RST_AFTER,RST_DEFAULT֮һ + long* pltime, //in/out, ʱ + short* psnqa, //in/out, + char sval[], //in/out, ,ַβ0 + int nsize, //in,С + int* pndatasize //in/out,ֽ + );//ش + +/////////////////////////////////////////////////////////// +// дֵ +DWORD __stdcall DBPWriteSnapshotStr( //дstring + DWORD h, + const char* sname, //ǩ + long ltime, //ʱ + short snqa, // + const char* sval //ֵַβ0 + ); //ش + +DWORD __stdcall DBPWriteHisStr( //дstringʷ + DWORD h, + const char* sname, //ǩ + long ltime, //ʱ + short snqa, // + const char* sval //ֵַβ0 + ); //ش + +DWORD __stdcall DBPWriteSnapshotBlob( //дBLOB + DWORD h, + const char* sname, //ǩ + long ltime, //ʱ + short snqa, // + char* pval, //ֵ + int ndatasize //ֵ + ); //ش + +DWORD __stdcall DBPWriteHisBlob( //дBLOBʷ + DWORD h, + const char* sname, //ǩ + long ltime, //ʱ + short snqa, // + char* pval, //ֵ + int ndatasize //ֵ + ); //ش + +DWORD __stdcall DBPDelHis( //ɾʷ + DWORD h, + const char* sname, //in ǩ + long lts, //in ʼʱ + long lte //in ʱ + ); + +DWORD __stdcall DBPGetSumVal( + DWORD h, + const char* sname, //in,ǩ + long lts, //in,ʼʱ + long lte, //in,ʱ + long ltype, //in,ͳ + long lds, //in,ֶʱ + long ltimes[], //in/out,ʱ + short snqas[], //in/out, + double dblvals[], //in/out,dblvalֵ + int lvals[], //in/out,longֵ + int nsize, //in,ֵռС + int* pntype, //in/out,ǩֵDT_FLOAT32 + int* pnrecsize //in/out,ʵݸ + );//ͳֵnsize¼ + +DWORD __stdcall DBPDelHis2( //ɾʷ + DWORD h, + char* sTagNames[], //in,ǩַָ + long ltimes[], //in, ʱ + short errs[], //in/out, + int nsize //in, + ); + +/* ָ֧ýӿڣDBPGetMultiPointHisVal() +DWORD __stdcall DBPGetHisVal2( //ʷ + DWORD h, + long ltime, //in,ʱ + char* sTagNames[], //ǩַָ //apistring + int ntypes[], //in/out,,DT_INT32,DT_FLOAT32 + double dblvals[], //in/out,ֵռ + long lvals[], //in/out,ֵռ + short snqas[], //in/out, + short snerrs[], //in/out, + int nsize //in,ǩ + ); +*/ +DWORD __stdcall DBPGetSnapshot( // + DWORD h, + char* sTagNames[],//in,ǩַָ + long ltimes[], //in/out, ʱ + short snqas[], //in/out, + double dblvals[], //in/out, doubleֵ,DT_FLOAT32,DT_FLOAT64 + long lvals[], //in/out, Longֵ,DT_DIGITAL,DT_INT32,DT_INT64 + int ntypes[], //in/out, ,DT_INT32,DT_FLOAT32ȡ + short errs[], //in/out, + int nsize //in, + );//ش + +DWORD __stdcall DBPWriteHis( //дʷ + DWORD h, + char* sTagNames[], //in,ǩַָ + long ltimes[], //in, ʱ + short snqas[], //in, + double dblvals[], //in, doubleֵ,DT_FLOAT32,DT_FLOAT64 + long lvals[], //in, Longֵ,DT_DIGITAL,DT_INT32,DT_INT64 + int ntypes[], //in, ,DT_INT32,DT_FLOAT32ȡ + short errs[], //in/out, + int nsize //in, + ); + +DWORD __stdcall DBPWriteSnapshot( //д + DWORD h, + char* sTagNames[], //in,ǩַָ + long ltimes[], //in, ʱ + short snqas[], //in, + double dblvals[], //in, doubleֵ,DT_FLOAT32,DT_FLOAT64 + long lvals[], //in, Longֵ,DT_DIGITAL,DT_INT32,DT_INT64 + int ntypes[], //in, ,DT_INT32,DT_FLOAT32ȡ + short errs[], //in/out, + int nsize //in, + ); + +DWORD __stdcall DBPGetServerInfo( + DWORD h, + DWORD *dwVersion, // 汾 + long *lNowTime, // ǰʱ + long *lStartupTime, // ʱ + DWORD *dwConnectCount, // ǰ + DWORD *dwTagCount, // ǰǩ + float *fCPUUsage, // CPUռ + DWORD *dwHandleCount, // + DWORD *dwThreadsCount, // ߳ + DWORD *dwMemoryBytes, // ڴʹ + DWORD *dwMemoryBytesPeak, // ߷ڴʹ + DWORD *dwVirtualBytes, // ڴС + DWORD *dwVirtualBytesPeak // ߷ڴС + ); + +DWORD __stdcall DBPGetMultiPointHisVal( + DWORD h, + long lMode, //ȡֵģʽRHV_BEFORERHV_AFTERRHV_INTERP + char* sTagNames[], //ǩַָ //apistring + long ltimes[], //in/out,ǩӦʱ飬ΪRHV_BEFORERHV_AFTERͣ᷵رֵʵʱ + int ntypes[], //in/out,,DT_INT32,DT_FLOAT32 + double dblvals[], //in/out,ֵռ + long lvals[], //in/out,ֵռ + short snqas[], //in/out, + short snerrs[], //in/out, + int nsize //in,ǩ + ); + +DWORD __stdcall DBPGetDiSumVal( + DWORD h, + const char* sname, //in,ǩ + long lts, //in,ʼʱ + long lte, //in,ʱ + long lds, //in,ֶʱ + long lval, //in,ͳƿֵ + long lpSumCount[], //in/out,صͳƴ + long lpSumTimes[], //in/out,صͳʱ + int nsize, //in,ֵռС + int* pnrecsize //in/out,ʵݸ + ); + +DWORD __stdcall DBPGetErrorMessage( //ȡϢsval==NULLdwsizeռ䲻㣬APIE_MEMORYdwsizeСռС + DWORD dwErrorCode,// in,API÷صĴ + char* sval, // out, ŷصĴϢNULLpnrecsizeռС + DWORD *dwsize // in/out, ŷصĴϢĴС128ȵsvalռǰȫ + ); + +} +#endif //_DPAPI2_J_H_I \ No newline at end of file diff --git a/dbpapi/lib/dbpapi.dll b/dbpapi/lib/dbpapi.dll new file mode 100644 index 0000000..36fcd42 Binary files /dev/null and b/dbpapi/lib/dbpapi.dll differ diff --git a/dbpapi/lib/libdbpapi.a b/dbpapi/lib/libdbpapi.a new file mode 100644 index 0000000..c5d729e Binary files /dev/null and b/dbpapi/lib/libdbpapi.a differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..eb6adb9 --- /dev/null +++ b/main.cpp @@ -0,0 +1,13 @@ +#include +#include "DBPclient/DBPclient.h" + +int main() { + std::cout << "connect to 10.42.0.63" << std::endl; + DBPclient client("10.42.0.63", "admin_sipai", "admin_sipai"); + if (!client.connect()) + return 0; + std::vector s; + client.readValue(s); + + return 0; +}