使用Java实现IEC104协议的主站
由于最近项目上要使用Java程序作为主站,连接从站服务器,并获取数据。
这里使用了openmuc提供的jar包依赖,点击查看java文档
点击下载104协议模拟软件,可以模拟主站以及从站,构造测试数据等(建议使用PMA软件进行模拟)
Maven项目中在POM表引用:
<!-- 104协议 -->
<dependency>
<groupId>org.openmuc</groupId>
<artifactId>j60870</artifactId>
<version>1.4.0</version>
</dependency>
流程:
- 使用ClientConnectionBuilder类来构造连接参数
- 使用ClientConnectionBuilder.build();方法来创建连接
- 实现ConnectionEventListener接口
- 使用Connection.startDataTransfer(ConnectionEventListener);来进行数据监听
- 在 ConnectionEventListener.newASdu(ASdu)中进行逻辑处理
代码(要先运行从站,再运行java)
import org.openmuc.j60870.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import java.io.*;
//由于可能要监听多个从站,这里使用多线程处理
public class J60870Client implements Runnable {
//监听类,后面代码会给出
private J60870ClientListener listener;
//连接类
private Connection connection;
//连接参数,可以配置的参数有好多,比如t0,t1,t2等等
private ClientConnectionBuilder clientConnectionBuilder;
public J60870Client() throws IOException{
try {
//获取server端、从站的ip地址对象,这里使用本地ip
InetAddress address = InetAddress.getByName("127.0.0.1");
//创建连接参数对象
clientConnectionBuilder = new ClientConnectionBuilder(address);
//设置socket的连接超时时间
clientConnectionBuilder.setConnectionTimeout(60000);
}
catch (Exception e) {
e.printStackTrace();
}
}
//Runnable的run方法重写
public void run() {
try {
//主站与从站连接
connection = clientConnectionBuilder.build();
//配置数据回调类
listener = new J60870ClientListener();
connection.startDataTransfer(listener);
}
catch (Exception e) {
e.printStackTrace();
}
}
//关闭连接
public void disconnect() {
try {
this.connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
监听类代码
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Map;
import java.util.Date;
import org.openmuc.j60870.ASdu;
import org.openmuc.j60870.ConnectionEventListener;
import org.openmuc.j60870.ie.InformationObject;
public class J60870ClientListener implements ConnectionEventListener{
//监听从站发来的数据
public void newASdu(ASdu aSdu) {
//打印数据,效果见下图
System.out.println(aSdu.toString());
}
//监听连接关闭
public void connectionClosed(IOException cause) {
cause.printStackTrace();
}
}
Asdu数据打印
连接成功后,从站模拟软件的显示
模拟从站发送数据
在监听处debug