package com.iedscout;
|
|
import java.io.File;
|
import java.io.FileNotFoundException;
|
import java.io.IOException;
|
import java.io.UnsupportedEncodingException;
|
import java.net.InetAddress;
|
import java.util.Collection;
|
import java.util.HashMap;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Map;
|
|
import org.apache.logging.log4j.Level;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.openmuc.openiec61850.BasicDataAttribute;
|
import org.openmuc.openiec61850.BdaBoolean;
|
import org.openmuc.openiec61850.BdaFloat32;
|
import org.openmuc.openiec61850.BdaFloat64;
|
import org.openmuc.openiec61850.BdaInt128;
|
import org.openmuc.openiec61850.BdaInt16;
|
import org.openmuc.openiec61850.BdaInt16U;
|
import org.openmuc.openiec61850.BdaInt32;
|
import org.openmuc.openiec61850.BdaInt32U;
|
import org.openmuc.openiec61850.BdaInt64;
|
import org.openmuc.openiec61850.BdaInt8;
|
import org.openmuc.openiec61850.BdaInt8U;
|
import org.openmuc.openiec61850.BdaType;
|
import org.openmuc.openiec61850.BdaUnicodeString;
|
import org.openmuc.openiec61850.ClientAssociation;
|
import org.openmuc.openiec61850.ClientSap;
|
import org.openmuc.openiec61850.DataSet;
|
import org.openmuc.openiec61850.Fc;
|
import org.openmuc.openiec61850.FcModelNode;
|
import org.openmuc.openiec61850.ModelNode;
|
import org.openmuc.openiec61850.ServerModel;
|
import org.openmuc.openiec61850.ServerSap;
|
import org.openmuc.openiec61850.ServiceError;
|
|
import com.dec.fbs9100.MysqlConnPool;
|
import com.iedscout.BTS61850_IEDScout_Task_Thread.IEDScout_Param;
|
|
public class BTS61850_IEDScout_Task {
|
private MysqlConnPool pool;
|
private IEDScout_Param param;
|
private Logger logger = null;
|
|
private ServerModel m_ServerModel = null;
|
private ClientSap m_ClientSap;
|
private ClientAssociation m_Association;
|
|
private boolean m_App_IsConnect = true;
|
|
private BTS_ScoutData_Array m_ScoutData;
|
private boolean is_clear_data = false;
|
|
private UpdateDataToMySQL_Task mySQL_Task; //数据更新线程
|
|
public BTS61850_IEDScout_Task(MysqlConnPool pool,IEDScout_Param param) {
|
this.param = param;
|
this.pool = pool;
|
this.logger = LogManager.getFormatterLogger();
|
this.m_ScoutData = new BTS_ScoutData_Array();
|
this.mySQL_Task = new UpdateDataToMySQL_Task(m_ScoutData, pool);
|
|
}
|
|
public void connectIEDDevice() throws FileNotFoundException {
|
try {
|
while(m_App_IsConnect) {
|
try {
|
logger.info("BTS_IEC61850_Client Start to connect to device IP:" + param.target_ip + " Port:" + param.target_port);
|
m_App_IsConnect = true;
|
|
m_ClientSap = new ClientSap();
|
// m_ClientSap.setMaxMmsPduSize(65000);
|
// m_ClientSap.setResponseTimeout(50000);
|
// m_ClientSap.setMessageFragmentTimeout(50000);
|
m_Association = m_ClientSap.associate(InetAddress.getByName(param.target_ip), param.target_port, null, null);
|
|
} catch (Exception e) {
|
logger.error(e.toString(), e);
|
m_App_IsConnect = false;
|
param.setFail_reasion(IEDScout_Param.FAILREASION_PARAMERROR);
|
param.setConn_st(IEDScout_Param.CONN_STATE_FAIL);
|
logger.info("BTS_IEC61850_Client Unable to connect to device IP:" + param.target_ip);
|
break;
|
}
|
logger.info("Start Load ICD File '" + param.target_icd + "'");
|
File file = new File(param.target_icd);
|
if(!file.exists()) {
|
param.setFail_reasion(IEDScout_Param.FAILREASION_FILENOTFOUND);
|
param.setConn_st(IEDScout_Param.CONN_STATE_FAIL);
|
logger.info("ICD File '" + param.target_icd + "' Not EXISTS ");
|
break;
|
}
|
|
try {
|
//加载模型文件
|
List<ServerSap> serverSaps = ServerSap.getSapsFromSclFile(param.target_icd);
|
m_ServerModel = serverSaps.get(0).serverModel;
|
}catch (Exception e1) {
|
|
param.setFail_reasion(IEDScout_Param.FAILREASION_FILEERROR);
|
param.setConn_st(IEDScout_Param.CONN_STATE_FAIL);
|
|
logger.info("Error Parsing ICD File: " + e1.getMessage());
|
break;
|
}
|
logger.info("Successfully Read Model ");
|
List<BasicDataAttribute> ms = m_ServerModel.getBasicDataAttributes();
|
|
m_ScoutData.clear();
|
for (BasicDataAttribute basicData : ms) {
|
//ModelNode mode = basicDataAttribute.getParent();
|
if(null == basicData) {
|
continue;
|
}
|
ScoutData data = new ScoutData();
|
data.setNode_path(basicData.toString1());
|
//System.out.println(basicData.toString1() + "==" + basicData.getBasicType());
|
m_ScoutData.addScoutData(data);
|
//System.out.println(basicDataAttribute.toString1()+"=="+basicDataAttribute.getParent().toString1());
|
// System.out.println(basicDataAttribute.toString1()+"=="+basicDataAttribute.getParent());
|
}
|
//System.out.println("点位数量:"+m_ScoutData.getDataCount());
|
|
Collection<DataSet> m_DataSets = m_ServerModel.getDataSets();
|
// System.err.println("m_DataSets.size:"+m_DataSets.size());
|
// System.out.println("#######################"+m_App_IsConnect);
|
if(m_App_IsConnect) {
|
new Thread(mySQL_Task).start();
|
is_clear_data = true;
|
}
|
BTS61850_IEDScout_Task_Thread_SQL.updateConnect_Inf_Table(pool, param);
|
while(m_App_IsConnect) {
|
//读取数据集合
|
Iterator<DataSet> DataSetIt = m_DataSets.iterator();
|
while(null != DataSetIt && DataSetIt.hasNext()) {
|
//System.out.println((null != DataSetIt)+"%%%%%%%%%%%%%%%%%%%%%%%"+DataSetIt.hasNext());
|
DataSet m_DataSet = DataSetIt.next();
|
//读取点位中的数据
|
//-------------------------------------------------------------------------------------//
|
//logger.printf(Level.ERROR,m_DataSet.getReferenceStr(), m_DataSet.getReferenceStr());
|
//-------------------------------------------------------------------------------------//
|
DataSet tmp_ds = m_ServerModel.getDataSet(m_DataSet.getReferenceStr());
|
if(null == tmp_ds) {
|
continue;
|
}
|
DataSet ds = tmp_ds.copy();
|
m_Association.getDataSetValues(ds);
|
List<FcModelNode> fcMode = ds.getMembers();
|
//System.err.println(fcMode.size());
|
if(null != fcMode && fcMode.size() >0) {
|
for (int n = 0; n<fcMode.size(); n++) {
|
FcModelNode fcData = fcMode.get(n);
|
Collection<BasicDataAttribute> child = fcData.getBasicDataAttributes();
|
for (BasicDataAttribute modelNode : child) {
|
//System.out.println(modelNode.toString1());
|
ScoutData data = m_ScoutData.getScoutData(modelNode.toString1());
|
if(null != data) {
|
if(data.getNode_name().length() < 1 && !data.isRead_note()) {
|
//读取中文注释
|
String zh_name = readUnicodeStringNodeData(fcData.toString1()+".dU",Fc.DC);
|
//System.err.println(fcData.toString1()+"=="+fcData.getFc()+"-"+zh_name);
|
|
data.setRead_note(true);
|
if(null == zh_name) {
|
continue;
|
}
|
data.setNode_name(zh_name);
|
}
|
data.setNode_path(modelNode.toString1());
|
data.setNode_value(getBasicDataAttributeData(modelNode));
|
// if(data.node_path.equals("ZJDYCPSS/btgGGIO1.AnIn1.mag.f")) {
|
// System.out.println(data.getNode_name()+getBasicDataAttributeData(modelNode));
|
// }
|
BTS61850_IEDScout_Task_Thread_SQL.updateupdateIed_NodeState_Table(pool, data);
|
}
|
}
|
param.addCommNum();
|
}
|
}else {
|
param.addErrorNum();
|
}
|
param.setConn_st(IEDScout_Param.CONN_STATE_SUCCESS);
|
BTS61850_IEDScout_Task_Thread_SQL.updateConnect_Inf_Table(pool, param);
|
|
ds = null;
|
|
//BTS61850_IEDScout_Task_Thread_SQL.updateIed_NodeState_Table(pool, m_ScoutData);
|
Thread.sleep(100);
|
}
|
if(is_clear_data) {
|
is_clear_data = false;
|
mySQL_Task.setM_initTask(true);
|
}
|
|
//手动停止连接
|
if(BTS61850_IEDScout_Task_Thread_SQL.queryIed_NodeState_TableStopConnect(pool)) {
|
m_App_IsConnect = false;
|
logger.error("DevIp:"+param.target_ip + " Remote DisConnect ... ");
|
}
|
|
if(null == DataSetIt) {
|
param.addErrorNum();
|
}
|
Thread.sleep(100);
|
if(param.getErrcount() > 10) {
|
param.setFail_reasion(IEDScout_Param.FAILREASION_TIMEOUT);
|
logger.error("Error Comm Count OverMuch ,DisConnect to Device IP:" + param.target_ip);
|
m_App_IsConnect = false;
|
}
|
}
|
}
|
} catch (Exception e) {
|
logger.error(this.getClass() + e.getMessage());
|
} finally {
|
//连接断开之后
|
mySQL_Task.setApp_UpdateAlive(false);
|
|
param.setConn_st(IEDScout_Param.CONN_STATE_FAIL);
|
BTS61850_IEDScout_Task_Thread_SQL.updateConnect_Inf_Table(pool, param);
|
|
logger.error("DevIp:"+param.target_ip + " DisConnect ... ");
|
}
|
}
|
|
public void setAppIsConnect(boolean state) {
|
this.m_App_IsConnect = state;
|
}
|
|
|
public String readUnicodeStringNodeData(String reference, Fc fc) {
|
FcModelNode fcModelNode = (FcModelNode)m_ServerModel.findModelNode(reference, fc);
|
if(null == fcModelNode) {
|
return "";
|
}
|
String res = "";
|
try {
|
m_Association.getDataValues(fcModelNode);
|
res = new String(((BdaUnicodeString)fcModelNode).getValue(),"UTF-8");
|
} catch (ServiceError | IOException e1) {
|
return "";
|
}
|
return res;
|
}
|
|
public float getBasicDataAttributeData(BasicDataAttribute modelNode) {
|
float f = 0;
|
BdaType nodeType = modelNode.getBasicType();
|
if(BdaType.BOOLEAN == nodeType) {
|
BdaBoolean bda = (BdaBoolean)modelNode;
|
f = bda.getValue()?1:0;
|
}else if(BdaType.INT8 == nodeType) {
|
BdaInt8 bda = (BdaInt8)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT16 == nodeType) {
|
BdaInt16 bda = (BdaInt16)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT32 == nodeType) {
|
BdaInt32 bda = (BdaInt32)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT64 == nodeType) {
|
BdaInt64 bda = (BdaInt64)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT128 == nodeType) {
|
BdaInt128 bda = (BdaInt128)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT8U == nodeType) {
|
BdaInt8U bda = (BdaInt8U)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT16U == nodeType) {
|
BdaInt16U bda = (BdaInt16U)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.INT32U == nodeType) {
|
BdaInt32U bda = (BdaInt32U)modelNode;
|
f = bda.getValue();
|
}else if(BdaType.FLOAT32 == nodeType) {
|
BdaFloat32 bda = (BdaFloat32)modelNode;
|
f = bda.getFloat();
|
}else if(BdaType.FLOAT64 == nodeType) {
|
BdaFloat64 bda = (BdaFloat64)modelNode;
|
f = Float.parseFloat(Double.toHexString(bda.getDouble()));
|
}
|
return f;
|
}
|
|
|
public static void main(String[] args) {
|
MysqlConnPool pool = new MysqlConnPool("192.168.10.82",3360,10);
|
|
BTS61850_IEDScout_Task_Thread thread = new BTS61850_IEDScout_Task_Thread(pool);
|
thread.start();
|
|
}
|
}
|