dbpclient OK

This commit is contained in:
2022-11-08 13:49:53 +08:00
commit 53d6c7efe7
13 changed files with 1000 additions and 0 deletions

37
.gitignore vendored Normal file
View 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
View 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
View 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表示全部
&ltagnum //查询到的标签数
);//返回错误码
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, //错误代码
&ltagflag0, //标签标志,
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
View 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

View 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);
}
}

View 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

Binary file not shown.

BIN
dbpapi/include/._dbpapi_j.h Normal file

Binary file not shown.

View 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
View 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_MEMORYdwsize返回最小所需空间大小
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

Binary file not shown.

BIN
dbpapi/lib/libdbpapi.a Normal file

Binary file not shown.

13
main.cpp Normal file
View 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;
}