package com.iedscout; 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() { try { param.setFail_reasion(IEDScout_Param.FAILREASION_NULL); 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("BTS_IEC61850_Client Unable to connect to device IP:" + param.target_ip); logger.error(e.toString(), e); m_App_IsConnect = false; param.setFail_reasion(IEDScout_Param.FAILREASION_PARAMERROR); param.setConn_st(IEDScout_Param.CONN_STATE_FAIL); break; } logger.info("Start Load ICD File '" + param.target_icd + "'"); try { //加载模型文件 List serverSaps = ServerSap.getSapsFromSclFile(param.target_icd); m_ServerModel = serverSaps.get(0).serverModel; } catch (Exception e1) { m_App_IsConnect = false; param.setFail_reasion(IEDScout_Param.FAILREASION_FILENOTFOUND); param.setConn_st(IEDScout_Param.CONN_STATE_FAIL); logger.error("Error Parsing ICD File: " + e1.getMessage()); } logger.info("Successfully Read Model "); List 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 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; param.setConn_st(IEDScout_Param.CONN_STATE_SUCCESS); } BTS61850_IEDScout_Task_Thread_SQL.updateConnect_Inf_Table(pool, param); while(m_App_IsConnect) { //读取数据集合 Iterator 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 fcMode = ds.getMembers(); //System.err.println(fcMode.size()); if(null != fcMode && fcMode.size() >0) { for (int n = 0; n 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)); } } param.addCommNum(); } }else { param.addErrorNum(); } 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 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("127.0.0.1",3360,10); BTS61850_IEDScout_Task_Thread thread = new BTS61850_IEDScout_Task_Thread(pool); thread.start(); } }