使用Java实现IEC104协议的主站

使用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>

流程:

  1. 使用ClientConnectionBuilder类来构造连接参数
  2. 使用ClientConnectionBuilder.build();方法来创建连接
  3. 实现ConnectionEventListener接口
  4. 使用Connection.startDataTransfer(ConnectionEventListener);来进行数据监听
  5. 在 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
在这里插入图片描述

  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值