由于目前已知的OPC UA的SDK基本都是收费的,只找到这个open62541是免费开源的。所以决定使用open62541做开发。
一 简介:
open62541(http://open62541.org) 是一个开源的免费实现OPC UA(OPC统一架构),用C99和C ++ 98语言的通用子集编写。该库可与所有主要编译器一起使用,并提供实现专用OPC UA客户端和服务器的必要工具,或将基于OPC UA的通信集成到现有应用程序中。open62541库与平台无关。所有特定于平台的功能都是通过可交换的插件实现的。为主要操作系统提供了插件实现。
open62541根据Mozilla Public License v2.0获得许可。因此open62541库可用于非开源项目。只有对open62541库本身的更改才需要在同一许可下发布。插件以及服务器和客户端示例都属于公共域(CC0许可证)。它们可以在任何许可下重复使用,并且不必发布更改。
二 资源:
1、官方网站:https://open62541.org/
2、GitHub:https://github.com/open62541/open62541
3、文档:https://blog.csdn.net/mikasoi/article/details/84799078
4、参考:https://www.cnblogs.com/eatfishcat/p/9929524.html
5、测试工具:https://blog.csdn.net/han_better/article/details/81666740
三 过程:
1、先从官网下载库文件,我下载的是Win64位的,解压后如下:
其中bin文件夹下面有2个可执行文件,分别是Server和Client的Demo。
我只使用了这里的“.c”和“.h”2个文件。
2、建立工程:
打开VS2017,建立名为“open62541Test”的C++空项目。
open62541.c和open62541.h这2个文件到“open62541Test\open62541Test\”文件夹下。
打开C:\Windows\System32目录,复制其中的ws2_32.dll文件到“open62541Test\open62541Test\”文件夹下。
将上面三个文件分别添加到工程中相应位置:
在源文件中新建一个Test.cpp文件:
按照之前链接上的文档,添加client的测试代码:
#include
#include "open62541.h"
#pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll的语句,必须要有,否则报错
int main(void) {
UA_Client *client = UA_Client_new(UA_ClientConfig_default);
UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://127.0.0.1:49320");
//opc.tcp://localhost:4840 此处填写服务器的Access我使用的KepServer默认设置
if (retval != UA_STATUSCODE_GOOD)
{
UA_Client_delete(client);
return (int)retval;
}
/* Read the value attribute of the node. UA_Client_readValueAttribute is a
* wrapper for the raw read service available as UA_Client_Service_read. */
UA_Variant value; /* Variants can hold scalar values and arrays of any type */
UA_Variant_init(&value);
/* NodeId of the variable holding the current time */
const UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
retval = UA_Client_readValueAttribute(client, nodeId, &value);
if (retval == UA_STATUSCODE_GOOD &&
UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
UA_DateTime raw_date = *(UA_DateTime *)value.data;
UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "date is: %u-%u-%u %u:%u:%u.%03u\n",
dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
}
/* Clean up */
UA_Variant_deleteMembers(&value);
UA_Client_delete(client); /* Disconnects the client internally */
return UA_STATUSCODE_GOOD;
}
配置Debug平台为X64。
3、测试:
按照前面链接上的说明进行KepServer配置。
然后在上面代码中“if”的前面打个断点,运行到这里就会看到是否成功创建了client。同时也可以在KepServer中看到客户端数量变为“1”,说明连接成功。