Skip to content

Commit

Permalink
OPC UA 修改 C/S 初始化的方式
Browse files Browse the repository at this point in the history
  • Loading branch information
zhaoxi-scut committed Jul 10, 2024
1 parent 9f7e340 commit bb9e2dd
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 137 deletions.
58 changes: 29 additions & 29 deletions doc/tutorials/modules/tools/opcua.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,14 @@ OPC UA 的设计目标是建立一种通用的、独立于厂商和平台的通
int main()
{
// 创建 OPC UA 服务器,端口为 4840
rm::Server svr(4840);
rm::Server srv(4840);
// 服务器运行
svr.start();
srv.start();

/* other code */

// 线程阻塞,直到调用了 svr.stop(),线程才会继续执行。
svr.join();
// 线程阻塞,直到调用了 srv.stop(),线程才会继续执行。
srv.join();
}
```

Expand Down Expand Up @@ -114,8 +114,8 @@ int main()

int main()
{
rm::Server svr(4840);
svr.start();
rm::Server srv(4840);
srv.start();

// 定义 double 型变量,如果要强制使用 3.14 定义 float 型变量,
// 可以使用 rm::Variable num = float(3.14);
Expand All @@ -127,9 +127,9 @@ int main()
// 描述
num.description = "数字";
// 添加到服务器的默认位置(默认被添加至 ObjectsFolder 下)
svr.addVariableNode(num);
srv.addVariableNode(num);

svr.join();
srv.join();
}
```

Expand Down Expand Up @@ -168,8 +168,8 @@ int main()

int main()
{
rm::Server svr(4840);
svr.start();
rm::Server srv(4840);
srv.start();

// 定义方法
rm::Method method;
Expand Down Expand Up @@ -198,7 +198,7 @@ int main()
// 方法节点添加至服务器
server.addMethodNode(method);

svr.join();
srv.join();
}
```

Expand Down Expand Up @@ -244,13 +244,13 @@ int main()

int main()
{
rm::Server svr(4840);
svr.start();
rm::Server srv(4840);
srv.start();
// 准备对象节点数据 A
rm::Object a;
a.browse_name = a.description = a.display_name = "A";
// 添加对象节点 A 至服务器
auto node_a = svr.addObjectNode(a);
auto node_a = srv.addObjectNode(a);
// 准备对象节点数据 B1
rm::Object b1;
b1.browse_name = b1.description = b1.display_name = "B1";
Expand All @@ -263,7 +263,7 @@ int main()
c2.browse_name = c2.description = c2.display_name = "C2";
b1.add(c2);
// 添加对象节点 B1 至服务器
svr.addObjectNode(b1, node_a);
srv.addObjectNode(b1, node_a);
// 准备对象节点数据 B2
rm::Object b2;
b2.browse_name = b2.description = b2.display_name = "B2";
Expand All @@ -272,9 +272,9 @@ int main()
c3.browse_name = c3.description = c3.display_name = "C3";
b2.add(c3);
// 添加对象节点 B2 至服务器
svr.addObjectNode(b2, node_a);
srv.addObjectNode(b2, node_a);

svr.join();
srv.join();
}
```

Expand Down Expand Up @@ -312,27 +312,27 @@ int main()

int main()
{
rm::Server svr(4840);
svr.start();
rm::Server srv(4840);
srv.start();
// 准备对象节点数据 A
rm::Object a;
a.browse_name = a.description = a.display_name = "A";
// 这里使用宏来创建 num1
uaCreateVariable(num1, 1);
a.add(num1);
auto node_a = svr.addObjectNode(a);
auto node_num1 = node_a | svr.find("num1");
auto node_a = srv.addObjectNode(a);
auto node_num1 = node_a | srv.find("num1");
// 这里使用宏来创建 num2
uaCreateVariable(num2, 2);
auto node_num2 = svr.addVariableNode(num2);
auto node_num2 = srv.addVariableNode(num2);

// 创建视图
rm::View num_view;
// 添加节点至视图(这里使用的是变量节点的 NodeId,实际上其他节点也是允许的)
num_view.add(node_num1, node_num2);
// 添加至服务器
svr.addViewNode(num_view);
svr.join();
srv.addViewNode(num_view);
srv.join();
}
```

Expand All @@ -346,18 +346,18 @@ int main()

int main()
{
rm::Server svr(4840);
svr.start();
rm::Server srv(4840);
srv.start();

// 定义 int 型变量
rm::Variable num = 100;
num.browse_name = "number";
num.display_name = "Number";
num.description = "数字";
// 添加到服务器的默认位置
svr.addVariableNode(num);
srv.addVariableNode(num);

svr.join();
srv.join();
}
```

Expand Down Expand Up @@ -605,7 +605,7 @@ method.func = [](UA_Server *p_server, const UA_NodeId *, void *, const UA_NodeId
return UA_STATUSCODE_GOOD;
};
method.iargs = {{"input", UA_TYPES_INT32, 1, "输入值"}};
svr.addMethodNode(method);
srv.addMethodNode(method);
```
---
Expand Down
6 changes: 3 additions & 3 deletions modules/opcua/include/rmvl/opcua/server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class ServerView final
* @brief 获取路径搜索必要信息
* @brief 需要配合管道运算符 `|` 完成路径搜索
* @code{.cpp}
* auto dst_mode = src_node | svr.find("person") | svr.find("name");
* auto dst_mode = src_node | srv.find("person") | srv.find("name");
* @endcode
*
* @param[in] browse_name 浏览名
Expand Down Expand Up @@ -130,7 +130,7 @@ class Server
Server(ServerUserConfig on_config, uint16_t port, std::string_view name = {}, const std::vector<UserConfig> &users = {});

Server(const Server &) = delete;
Server(Server &&svr) = delete;
Server(Server &&srv) = delete;

operator ServerView() const { return _server; }

Expand All @@ -155,7 +155,7 @@ class Server
* @brief 获取路径搜索必要信息
* @brief 需要配合管道运算符 `|` 完成路径搜索
* @code{.cpp}
* auto dst_mode = src_node | svr.find("person") | svr.find("name");
* auto dst_mode = src_node | srv.find("person") | srv.find("name");
* @endcode
*
* @param[in] browse_name 浏览名
Expand Down
23 changes: 11 additions & 12 deletions modules/opcua/src/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,29 +26,28 @@ namespace rm

Client::Client(std::string_view address, UserConfig usr)
{
_client = UA_Client_new();
UA_ClientConfig *config = UA_Client_getConfig(_client);
UA_ClientConfig init_config{};
// 修改日志
#if OPCUA_VERSION < 10400
config->logger = UA_Log_Stdout_withLevel(UA_LOGLEVEL_ERROR);
init_config.logger = UA_Log_Stdout_withLevel(UA_LOGLEVEL_ERROR);
#else
config->logging = UA_Log_Stdout_new(UA_LOGLEVEL_ERROR);
init_config.logging = UA_Log_Stdout_new(UA_LOGLEVEL_ERROR);
#endif
// 设置默认配置
auto status = UA_ClientConfig_setDefault(config);
if (status == UA_STATUSCODE_GOOD)
{
if (usr.id.empty() || usr.passwd.empty())
status = UA_Client_connect(_client, address.data());
else
status = UA_Client_connectUsername(_client, address.data(), usr.id.c_str(), usr.passwd.c_str());
}
auto status = UA_ClientConfig_setDefault(&init_config);
if (status != UA_STATUSCODE_GOOD)
{
ERROR_("Failed to create client: %s", UA_StatusCode_name(status));
UA_Client_delete(_client);
_client = nullptr;
return;
}
_client = UA_Client_newWithConfig(&init_config);

if (usr.id.empty() || usr.passwd.empty())
status = UA_Client_connect(_client, address.data());
else
status = UA_Client_connectUsername(_client, address.data(), usr.id.c_str(), usr.passwd.c_str());
}

Client::~Client()
Expand Down
16 changes: 9 additions & 7 deletions modules/opcua/src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,18 @@ namespace rm

Server::Server(uint16_t port, std::string_view name, const std::vector<UserConfig> &users)
{
_server = UA_Server_new();

UA_ServerConfig *config = UA_Server_getConfig(_server);
UA_ServerConfig init_config{};
// 修改日志
#if OPCUA_VERSION < 10400
config->logger = UA_Log_Stdout_withLevel(UA_LOGLEVEL_ERROR);
init_config.logger = UA_Log_Stdout_withLevel(UA_LOGLEVEL_ERROR);
#else
config->logging = UA_Log_Stdout_new(UA_LOGLEVEL_ERROR);
init_config.logging = UA_Log_Stdout_new(UA_LOGLEVEL_ERROR);
#endif
// 设置服务器配置
UA_ServerConfig_setMinimal(config, port, nullptr);
UA_ServerConfig_setMinimal(&init_config, port, nullptr);
// 初始化服务器
_server = UA_Server_newWithConfig(&init_config);
UA_ServerConfig *config = UA_Server_getConfig(_server);
// 修改名字
if (!name.empty())
{
Expand All @@ -52,6 +53,7 @@ Server::Server(uint16_t port, std::string_view name, const std::vector<UserConfi
// 修改采样间隔和发布间隔
config->samplingIntervalLimits.min = 2.0;
config->publishingIntervalLimits.min = 2.0;

if (!users.empty())
{
std::vector<UA_UsernamePasswordLogin> usr_passwd;
Expand All @@ -63,7 +65,7 @@ Server::Server(uint16_t port, std::string_view name, const std::vector<UserConfi
each.password = UA_STRING(helper::to_char(passwd));
usr_passwd.emplace_back(each);
}
// 配置
// 修改访问控制
config->accessControl.clear(&config->accessControl);
#if OPCUA_VERSION >= 10400
UA_AccessControl_default(config, false, nullptr, usr_passwd.size(), usr_passwd.data());
Expand Down
Loading

0 comments on commit bb9e2dd

Please sign in to comment.