dbpclient OK
This commit is contained in:
37
.gitignore
vendored
Normal file
37
.gitignore
vendored
Normal file
@@ -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-*
|
||||
23
CMakeLists.txt
Normal file
23
CMakeLists.txt
Normal file
@@ -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
|
||||
)
|
||||
227
DBPclient/DBPclient.cpp
Normal file
227
DBPclient/DBPclient.cpp
Normal file
@@ -0,0 +1,227 @@
|
||||
//
|
||||
// Created by test on 2022/11/3.
|
||||
//
|
||||
|
||||
#include "DBPclient.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <windows.h>
|
||||
|
||||
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<double> 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<double> time_used = std::chrono::duration_cast<std::chrono::duration<double>>(
|
||||
// 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<char, 80> szSName = {0};
|
||||
std::array<char, 16> szSDBName = {0};
|
||||
std::array<char, 80> szSDBTagName = {0};
|
||||
std::array<char, 80> szSDes = {0};
|
||||
std::array<char, 16> szSUnit = {0};
|
||||
DWORD szDWid;
|
||||
WORD szWType;
|
||||
};
|
||||
|
||||
|
||||
void DBPclient::readValue(const std::vector <std::string> &node_ids) {
|
||||
std::vector <DataInfo> vData;
|
||||
std::vector<char *> 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<double> 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<long> ltimes;
|
||||
std::vector<short> snqas;
|
||||
std::vector<double> dblals;
|
||||
std::vector<long> lvals;
|
||||
std::vector<int> ntypes;
|
||||
std::vector<short> 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<double> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
48
DBPclient/DBPclient.h
Normal file
48
DBPclient/DBPclient.h
Normal file
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// Created by test on 2022/11/3.
|
||||
//
|
||||
|
||||
#ifndef OPCUA_EXPORTER_DBPCLIENT_H
|
||||
#define OPCUA_EXPORTER_DBPCLIENT_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
|
||||
#include <minwindef.h>
|
||||
#include "dbpapi_j.h"
|
||||
#include <array>
|
||||
#include <chrono>
|
||||
|
||||
|
||||
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 <std::string> const &node_ids);
|
||||
|
||||
private:
|
||||
std::string dbp_endpoint;
|
||||
std::string dbp_username;
|
||||
std::string dbp_password;
|
||||
DWORD m_dwHandle;
|
||||
|
||||
bool running{true};
|
||||
|
||||
std::map<std::string, double> dbp_read_value;
|
||||
};
|
||||
|
||||
|
||||
#endif //OPCUA_EXPORTER_DBPCLIENT_H
|
||||
97
DBPcollector/DBPcollector.cpp
Normal file
97
DBPcollector/DBPcollector.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
//
|
||||
// Created by test on 2022/11/3.
|
||||
//
|
||||
|
||||
#include "DBPcollector.h"
|
||||
|
||||
DBPcollector::DBPcollector(const YAML::Node &config, std::shared_ptr<DBPclient> dbp_client) :
|
||||
registry_(std::make_shared<prometheus::Registry>()),
|
||||
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<std::string>();
|
||||
auto name = item["name"].as<std::string>();
|
||||
auto help = item["help"].as<std::string>(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<prometheus::MetricFamily> DBPcollector::Collect() const {
|
||||
if (const_cast<DBPcollector *>(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);
|
||||
}
|
||||
}
|
||||
55
DBPcollector/DBPcollector.h
Normal file
55
DBPcollector/DBPcollector.h
Normal file
@@ -0,0 +1,55 @@
|
||||
//
|
||||
// Created by test on 2022/11/3.
|
||||
//
|
||||
|
||||
#ifndef OPCUA_EXPORTER_DBPCOLLECTOR_H
|
||||
#define OPCUA_EXPORTER_DBPCOLLECTOR_H
|
||||
|
||||
#include <prometheus/collectable.h>
|
||||
#include <prometheus/family.h>
|
||||
#include <prometheus/labels.h>
|
||||
#include <prometheus/metric_family.h>
|
||||
#include <prometheus/registry.h>
|
||||
#include <prometheus/gauge.h>
|
||||
#include <yaml-cpp/yaml.h>
|
||||
#include <DBPclient/DBPclient.h>
|
||||
#include <json.hpp>
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
class DBPcollector : public prometheus::Collectable {
|
||||
public:
|
||||
explicit DBPcollector(YAML::Node const &config, std::shared_ptr<DBPclient> dbp_client);
|
||||
|
||||
~DBPcollector() override = default;
|
||||
|
||||
std::vector<prometheus::MetricFamily> 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<prometheus::Registry> registry_;
|
||||
std::shared_ptr<DBPclient> dbp_client_;
|
||||
std::vector<std::string> dbp_read_node_ids;
|
||||
|
||||
struct st_node {
|
||||
std::string name;
|
||||
prometheus::Family<prometheus::Gauge> *family{nullptr};
|
||||
prometheus::Gauge *data{nullptr};
|
||||
void setValue(double val);
|
||||
};
|
||||
|
||||
std::map<std::string, st_node> nodes;
|
||||
nlohmann::json metrics_json_;
|
||||
};
|
||||
|
||||
|
||||
#endif //OPCUA_EXPORTER_DBPCOLLECTOR_H
|
||||
BIN
dbpapi/include/._dbpapi_err.h
Normal file
BIN
dbpapi/include/._dbpapi_err.h
Normal file
Binary file not shown.
BIN
dbpapi/include/._dbpapi_j.h
Normal file
BIN
dbpapi/include/._dbpapi_j.h
Normal file
Binary file not shown.
77
dbpapi/include/dbpapi_err.h
Normal file
77
dbpapi/include/dbpapi_err.h
Normal file
@@ -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_ */
|
||||
423
dbpapi/include/dbpapi_j.h
Normal file
423
dbpapi/include/dbpapi_j.h
Normal file
@@ -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 // 该标签或组被设置为非活动,表示该标签由于某种原因不被服务器更新
|
||||
|
||||
#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 // 返回值超出了该值定义的范围。请注意,该状态并不意味着该值是超限的
|
||||
#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/out服务器IP 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_BEFORE、RHV_AFTER、RHV_INTERP
|
||||
char* sTagNames[], //标签名字符串指针数组 //apistring
|
||||
long ltimes[], //in/out,标签名对应时标数组,如果为RHV_BEFORE、RHV_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==NULL或dwsize空间不足,则函数返回APIE_MEMORY,dwsize返回最小所需空间大小
|
||||
DWORD dwErrorCode,// in,API调用返回的错误码
|
||||
char* sval, // out, 存放返回的错误信息,如果传递NULL,则pnrecsize返回所需空间大小
|
||||
DWORD *dwsize // in/out, 存放返回的错误信息缓冲区的大小,128长度的sval空间是安全的
|
||||
);
|
||||
|
||||
}
|
||||
#endif //_DPAPI2_J_H_I
|
||||
BIN
dbpapi/lib/dbpapi.dll
Normal file
BIN
dbpapi/lib/dbpapi.dll
Normal file
Binary file not shown.
BIN
dbpapi/lib/libdbpapi.a
Normal file
BIN
dbpapi/lib/libdbpapi.a
Normal file
Binary file not shown.
13
main.cpp
Normal file
13
main.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <iostream>
|
||||
#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<std::string> s;
|
||||
client.readValue(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user