DELL
2024-03-14 c4e51877fd5231fb4fd06030c6b703d5c9ff9fa0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
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) {
                    
                    logger.info("Error Parsing ICD File: " + e1.getMessage());
                    
                }
                if(null==m_ServerModel) {
                    m_ServerModel = m_Association.retrieveModel();
                }
                if(null==m_ServerModel) {
                    param.setFail_reasion(IEDScout_Param.FAILREASION_FILEERROR);
                    param.setConn_st(IEDScout_Param.CONN_STATE_FAIL);
                    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();
        
    }
}