Milo库
今天跟大家来介绍一下一个OPC UA协议的开源库,我们使用的现场设备为西门子的S7-1500 CPU,西门子的S7-1500在V2.1版本后就直接可以作为OPC UA的服务器来供其他客户端访问。所以用OPC协议来进行数据采集就是最好的方式。
计算机语言采用java,所以也花了很大的力气来找OPC UA通信协议的java实现库,尽管OPC Foundation在Github上也有协议的java实现,但是各种学习的资源很有限,学习曲线比较陡峭。然后碰巧在Github上找到了一个OPC UA的开源库,就是今天要介绍的 Milo
,据了解该项目的Eclipse旗下的一个物联网的项目,是一个高性能的OPC UA栈,提供了一组客户端和服务端的API,支持对实时数据的访问,监控,报警,订阅数据,支持事件,历史数据访问,和数据建模。

Milo 初探
在Milo中大量的采用了java 8
的新特性CompletableFuture
来进行异步操作,Milo中有大量的操作都是直接返回CompletableFuture
对象,所以JDK的版本必须要8.0,对CompletableFuture
不太熟悉的可以先去了解CompletableFuture
的相关概念在来看Milo的官方例子会轻松很多。
添加依赖
好了,下面就添加相关依赖,Milo的依赖有三个Stack,Client SDK,Server SDK。
Client SDK依赖
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-client</artifactId>
<version>0.2.4</version>
</dependency>
Server SDK依赖
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-server</artifactId>
<version>0.2.4</version>
</dependency>
Stack依赖
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>stack-client</artifactId>
<version>0.2.4</version>
</dependency>
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>stack-server</artifactId>
<version>0.2.4</version>
</dependency>
目前最新的版本是0.2.4
开发客户端就添加客户端的依赖,开发服务端就添加服务端的依赖。一般来说Stack依赖并不需要手动添加,在我们添加Client SDK或者Server SDK的时候会包含了Stack依赖。
添加bouncycastle依赖
为什么需要添加bouncycastle依赖?因为创建OPC UA客户端必须要有相关的数字证书,而bouncycastle就作为解析相关的数字证书的库所以要添加相关的bouncycastle依赖。
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.57</version>
</dependency>
所以如果我们开发OPC UA客户端,总的依赖项也很简单,如下:
<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-client</artifactId>
<version>0.2.4</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.57</version>
</dependency>
搜索服务节点
首先要创建OPC客户端第一件事当然是指定一个URL。以S7-1500的CPU为例,可以在博图软件的组态界面双击CPU然后再属性窗口里面找到OPC选项卡然后里面就会有这个CPU的OPC UA的URL。拿到这个URL后就可以在java中定义这个地址。
//在西门子S7-1500中OPC UA服务器的端口默认为4840
String EndPointUrl = "o