最近由于需要编写 OPC UA 服务器和客户端便找到了搜索找到了 open62541 这个开源库,由于该开源库采用了 C99 和 C++ 98 的通用子集进行编写,因此可以十分方便的在使用 C++编写的 Qt 项目中调用该开源库编写需要的 server 或者 client 端.同时该开源库采用了 Mozilla Public License v2.0 开源许可证,该许可证比 GPL 许可证更加宽松,根据作者自己理解只要在不修改源代码的情况下可以自由的使用该开源库开发和发布私有软件(当然,如果确定要用于商业用途还是建议咨询专业的法律人士).
由于目前网上关于在 Qt 中使用 open62541 的介绍还不多,现存的教程有的较为复杂或者没有涵盖完整的过程,因此我总结了一下我认为最为简单的在 Qt 中使用 open62541 的方法.
软件环境(仅列出作者测试过的环境)
- 操作系统: windows 11、windows7
- C++编译器: visual studio 2015、visual studio 2019
- Qt 版本: qtcreator + qt5.15
- open62541 版本: v1.3-rc1
- 其它工具: make(本文使用 cmake-gui)
操作步骤
进过测试,发现使用整合好的 open62541.c 和 open62541.h 文件的方式是在 Qt 项目中使用 open62541 最为简单的方式,因此本章主要介绍生成 open62541 整合文件和在 Qt 项目中调用整合好的文件.
1. 整合文件的获取
整合文件的获取主要有两种方式:
1.1. 官网下载
直接在 open62541官网首页中的single file release进行下载,但是这里的文件相对滞后, 截止到本文撰写时只能下载到 1.2 版的 open62541,而 github 上最新的版本已经到了 1.3-rc1
1.2. 自行编译整合文件
前面提到的官网下载的方法虽然很方便,但是你如果是一个像我一样追求最新版本的可以直接在官方的 github repo 的Releases 标签直接下载最新版本的源码自行编译整合文件,具体操作步骤如下:
1.2.1 通过 git clone 或者直接下载代码压缩文件的方式获取源代码,并在源代码文件夹中建立一个新的名为 build 的空文件夹,后续的编译等操作会在新建的文件夹中进行.本文使用编写时最新的 v1.3-rc1 版本进行演示.
1.2.2 在 cmake-gui 的 Browse Source…中选择下载好的代码的文件夹,同时在 Browse Build…中选择上一步中建立的 build 文件夹.随后点击 Configure 按钮.
1.2.3 当 Configure 结束后会出现下图所示的画面,此处出现的参数可以根据 open62541 进行按需定制, 由于我们目前仅仅是先生成一个最基本的整合文件让我们的代码先跑起来,因此只需要确保勾选 UA_ENABLE_AMALGAMATION 选项即可.在勾选好对应选项后直接点击 Generate 按钮即可生成 Visual Studio 的 sln 文件.
1.2.4 使用 Visual Studio 直接打开上一步中在 build 文件夹下生成的.sln 文件打开工程,然后直接在工程中右键选择 Build Solution 或者使用快捷键 Ctrl+Shift+B 即可.
![](https://raw.githubusercontent.com/omegatao/FigureBed/master/img/visual studio_build.png)
1.2.5 当 Visual Studio 顺利执行完编译过程后即可在 build 文件夹中获得我们需要的整合文件 open62541.h 和 open62541.c 文件.
2. 在 Qt 中使用整合好的 open62541 文件
通过第一步中的方式获得整合文件后,即可方便的在 Qt creator 的工程中调用 open62541 进行自己的工作.具体步骤如下:
2.1 首先按照往常的步骤建立 Qt 工程,本文使用 qmake 进行讲解.然后将整合好的两个文件拷贝到 Qt 工程目录中.
2.2 在 pro 文件中添加两个刚拷贝过来的文件.
2.3 完成上述步骤后即可在 qt 工程中通过 #include “open6251.h”开始编写自己需要的服务器或者客户端了.为了演示效果, 本文中按照 open62541 的 git repo 中提供的 client 示例编写一个简单的客户端并连接一个测试用的服务器.
2.3.1 打开测试用服务器并获取服务器地址和端口, 建议大家可以去 prosys 注册并获取一个免费的 Prosys OPC UA Simulation Server. 安装并打开该软件后即可在首页获取 opc ua 模拟服务器的地址.
3.![](https://raw.githubusercontent.com/omegatao/FigureBed/master/img/prosys ua 服务器.png)
2.3.2 按照 open62541 的 client 示例编写下图所示的代码并编译
2.3.3 编译成功后即可获得下图所示的输出,表明我们成功在 Qt 项目中调用 open62541 并成功连接测试用服务器.
编译过程中可能遇到的问题
在 qt creator 中调用 open62541 整合文件可能会遇到一些问题,此处列举了作者遇到的一些问题和相应的解决方案
- LNK2019: 无法解析的外部符号 __WSAFDIsSet@8 等链接错误问题:
该问题是由于项目中没有指明在 windows 系统中依赖的 winsocket 库造成的,解决方案也十分简单,直接在 pro 中加入 win32: LIBS += -lws2_32
这一行代码添加依赖的库即可.
- C2011: “sockaddr”: “struct”类型重定义错误问题:
这个问题是在使用 Visual Studio 2015 在 win7 系统下遇到的,通过查找资料发现应该是 open62541 的在引入头文件时造成了#include <winsocks2.h> 和 #include <windows.h>两个头文件顺序的错误.
在 qtcreator 中解决该问题有两个办法: - 在 pro 文件中添加
win32: DEFINES += _WINSOCKAPI_
- 在 pro 文件中添加
win32: DEFINES += WIN32_LEAN_AND_MEAN
如下图所示,个人更加倾向于使用第二种方法,这样还可以防止引入一些其它的不必要的依赖.