whyclxw
2022-02-10 5e91a968afb35b6e4467d498777ad2275c74a409
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
package com.whyc.webSocket;
 
import com.whyc.dto.Response;
import com.whyc.dto.paramter.RealTimePar;
import com.whyc.service.*;
import com.whyc.util.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
 
@Component
@ServerEndpoint(value = "/RealTime",encoders = WebSocketEncoder.class)
public class RealTimeWebsocket {
    private volatile Thread thread;
 
    private static final int executeTime = 5000;
 
    private static boolean exit=false;
 
    private static Map<String,Thread> threadMap = new HashMap<>();
 
    private static BattRtstateService rtstateservice;   //组端
 
    private static Fbs9100StateService f9100service;    //fbs9100
 
    private static BattRtdataService rtdataservice;     //单体
 
    private static Fbs9100sFodStateService fodservice;  //除硫
 
    private static BattRtalarmService rtalarmService;  //电池告警
 
    private static BattRsalarmService rsalarmService;  //组端告警
 
    private static Ld9StateService ld9Service;  //ld9
 
    private static Li9130BmsStateService li9130Service;  //li9130
 
 
    private Session session;
 
    @Autowired
    public void setService(BattRtstateService rtstateservice) {
        RealTimeWebsocket.rtstateservice = rtstateservice;
    }
 
    @Autowired
    public void setService(Fbs9100StateService f9100service) {
        RealTimeWebsocket.f9100service = f9100service;
    }
 
    @Autowired
    public void setService(BattRtdataService rtdataservice) {
        RealTimeWebsocket.rtdataservice = rtdataservice;
    }
 
    @Autowired
    public void setService(Fbs9100sFodStateService fodservice) {
        RealTimeWebsocket.fodservice = fodservice;
    }
 
    @Autowired
    public void setService(BattRtalarmService rtalarmService) {
        RealTimeWebsocket.rtalarmService = rtalarmService;
    }
 
    @Autowired
    public void setService(BattRsalarmService rsalarmService) {
        RealTimeWebsocket.rsalarmService = rsalarmService;
    }
 
    @Autowired
    public void setService(Ld9StateService ld9Service) {
        RealTimeWebsocket.ld9Service = ld9Service;
    }
 
    @Autowired
    public void setService(Li9130BmsStateService li9130Service) {
        RealTimeWebsocket.li9130Service = li9130Service;
    }
 
 
    @OnOpen
    public void  onOpen(Session session){
        this.session=session;
    }
    @OnMessage
    public void onMessage(Session session, String message){
        //停止当前socket的线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            threadBefore.interrupt();
            exit=true;
        }
        RealTimePar realTimePar= ActionUtil.getGson().fromJson(message,RealTimePar.class);
        realTimePar.setDevType(realTimePar.getDevId()/100000);
        thread = new Thread("Thread_RealTime") {
            public void run() {
                exit=false;
                while ( !thread.isInterrupted()&&!exit) {
                    try {
                        if (session.isOpen()) {
                            Map<String,Response> res=new HashMap<>();
                            //查询fbs9100信息
                            Response f9100stateRes=f9100service.serchContactorState(realTimePar.getDevId());
                            res.put("f9100state",f9100stateRes);
                            //查询电池组端信息
                            Response rtstateRes=rtstateservice.serchByCondition(realTimePar.getBattGroupId());
                            res.put("rtstate",rtstateRes);
                            //查询电池组单体信息
                            Response rtdataRes=rtdataservice.serchByCondition(realTimePar.getBattGroupId());
                            res.put("rtdata",rtdataRes);
                            //查询fod信息
                            Response fodRes=fodservice.serchByCondition(realTimePar.getBattGroupId());
                            res.put("fod",fodRes);
                            //电池告警
                            Response rtalarmRes=rtalarmService.getInfo(realTimePar.getBattGroupId());
                            res.put("rtalarm",rtalarmRes);
                            //组端告警
                            Response rsalarmRes=rsalarmService.getInfo(realTimePar.getBattGroupId());
                            res.put("rsalarm",rsalarmRes);
                            if(realTimePar.getDevType()==4019){//ld-9
                                //ld-9数据
                                Response ld9Res=ld9Service.searchByDevId(realTimePar.getDevId());
                                res.put("ld9",ld9Res);
                            }
                            if(realTimePar.getDevType()==9130){//正常锂电池
                                //锂电池数据
                                Response li9130Res=li9130Service.searchParam(realTimePar.getDevId());
                                res.put("li9130",li9130Res);
                            }
                            //推送信息
                            session.getBasicRemote().sendObject(new Response().set(1,res));
                        }
                        sleep(executeTime);
                    } catch ( IOException | InterruptedException | EncodeException e ) {
                        interrupt();
                    }
                }
            }
        };
        thread.start();
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
 
    @OnClose
    public void onClose(){
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
    }
 
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
    }
}