MyWebSocketHandler.java 10.1 KB
package com.objecteye.websocket;

import com.alibaba.fastjson.JSON;
import com.objecteye.entity.CountMsg;
import com.objecteye.entity.DeployAlarmMsg;
import com.objecteye.entity.PlateAlarmMsg;
import com.objecteye.entity.VisualStatisticsMsg;
import com.objecteye.pojo.RabbitMQVehicle;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.List;
import java.util.Map;


/**
 * @Author: lr
 * @Date: 2019/9/3 10:45
 * @Version 1.0
 * @Message:
 */
@Component
public class MyWebSocketHandler extends TextWebSocketHandler {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private SelectMongoData selectMongoData;


    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message)
            throws Exception {
        super.handleTextMessage(session, message);
    }

    /**
     * 抓拍数据和报警数据的json格式
     */
    public String getRealData(Object countMsg, Object captureMsg, Object deployAlarmMsg) {
        JSONObject jsonObject = new JSONObject();
        boolean isNull = true;
        if (countMsg != null) {
            isNull = false;
            jsonObject.put("countMsg", countMsg);
            jsonObject.put("countCode", 0);
        } else {
            jsonObject.put("countCode", 1);
        }
        if (captureMsg != null) {
            isNull = false;
            jsonObject.put("captureMsg", captureMsg);
            jsonObject.put("captureCode", 0);
        } else {
            jsonObject.put("captureCode", 1);
        }
        if (deployAlarmMsg != null) {
            isNull = false;
            jsonObject.put("deployAlarmMsg", deployAlarmMsg);
            jsonObject.put("deployAlarmCode", 0);
        } else {
            jsonObject.put("deployAlarmCode", 1);
        }
        if (isNull) {
            return null;
        }
        return jsonObject.toString();
    }


    @Override
    public void afterConnectionEstablished(WebSocketSession session) {

        //获取请求头中节点id
        String deviceId = session.getAttributes().get("deviceId").toString();
        if (deviceId.equals("0")) { //可视化大屏
            while (session.isOpen()) {
                String data = null;
                try {
                    data = (String) redisTemplate.opsForValue().get("data");
                    if (data == null) { //缓存为空,从库中取数据,存入缓存
                        VisualStatisticsMsg displayData = getDisplayData();
                        data = JSON.toJSONString(displayData);
                        redisTemplate.opsForValue().set("data", data);
                    } else {
                        //推送数据
                        session.sendMessage(new TextMessage(data));
                        Thread.sleep(5000);
                    }
                } catch (Exception e) {
                    //e.printStackTrace();
                }
            }
        } else { //实时预览
            while (session.isOpen()) {
                Object captureMsg = null;
                Object countMsg = null;
                Object deployAlarmMsg = null;

                //对于流量统计和实时抓拍先判断设备是否有效
                //抓拍数据
                boolean havaIpKey = redisTemplate.hasKey("deviceId");
                if (havaIpKey) {
                    Long size = redisTemplate.opsForList().size("deviceId");
                    if (size != 0) {
                        //从redis取数据(直接获取json字符串)
                        captureMsg = redisTemplate.opsForList().rightPop("deviceId");
                        RabbitMQVehicle captureRedis = JSON.parseObject(captureMsg.toString(), RabbitMQVehicle.class);
                        String id = captureRedis.getId();
                        String picurl = captureRedis.getPicurl();
                        JSONObject object = new JSONObject();
                        object.put("id", id);
                        object.put("picurl", picurl);
                        captureMsg = object.toString();
                    }
                }

                //流量统计
                CountMsg countMsg1 = new CountMsg();
                long vehicleCount = selectMongoData.getVehicleCountBydeviceId();
                String strVehicleCount = selectMongoData.changeType(vehicleCount);
                countMsg1.setVehicleCount(strVehicleCount);
                long vehicleCountInHours = selectMongoData.getVehicleCountInHours();
                String strVehicleCountInHours = selectMongoData.changeType(vehicleCountInHours);
                countMsg1.setVehicleCountInHours(strVehicleCountInHours);

                long violateCountByDeviceId = selectMongoData.getViolateCountByDeviceId();
                String strViolateCounts = selectMongoData.changeType(violateCountByDeviceId);
                countMsg1.setViolateCount(strViolateCounts);
                countMsg = JSON.toJSON(countMsg1);

                //布控任务报警
                boolean havedeployKey = redisTemplate.hasKey("ALARM");
                if (havedeployKey) {
                    Long size = redisTemplate.opsForList().size("ALARM");
                    if (size != 0) {
                        //从redis取数据
                        deployAlarmMsg = redisTemplate.opsForList().rightPop("ALARM");
                        DeployAlarmMsg deployMsg = new DeployAlarmMsg();
                        PlateAlarmMsg plateAlarmMsg = JSON.parseObject(deployAlarmMsg.toString(), PlateAlarmMsg.class);
                        String alarmTime = plateAlarmMsg.getAlarmTime();
                        deployMsg.setAlarmTime(alarmTime);
                        Integer alarmType = plateAlarmMsg.getAlarmType();
                        deployMsg.setDeployType(alarmType);
                        String snapshotUrl = plateAlarmMsg.getSnapshotUrl();
                        deployMsg.setCaptureUrl(snapshotUrl);
                        if (alarmType == 0) {
                            String plateNum = plateAlarmMsg.getPlateNum();
                            deployMsg.setDeployUrl(plateNum);
                        } else {
                            String libUrl = plateAlarmMsg.getLibUrl();
                            deployMsg.setDeployUrl(libUrl);
                            double similarity = plateAlarmMsg.getSimilarity();
                            deployMsg.setSimilarity(Double.parseDouble(String.format("%.2f", similarity)));
                        }
                        deployAlarmMsg = JSON.toJSON(deployMsg);
                    }
                }

                String realData = getRealData(countMsg, captureMsg, deployAlarmMsg);
                if (realData != null) {
                    try { //每隔2秒,推送一次
                        session.sendMessage(new TextMessage(realData));
                        //Thread.sleep(2000);
                    } catch (IOException e) {
                        //e.printStackTrace();
                    }
                }
            }
        }

    }

    //抛出异常后处理
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        if (session.isOpen()) {
            session.close();
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        if (session.isOpen()) {
            session.close();
        }
    }

    //从库里查数据
    public VisualStatisticsMsg getDisplayData() {
        //左上角那一块
        VisualStatisticsMsg visualStatisticsMsg = new VisualStatisticsMsg();
        long vehicleCount = selectMongoData.getVehicleCount();
        String strVehicleCount = selectMongoData.changeType(vehicleCount);
        visualStatisticsMsg.setVehicleCount(strVehicleCount);
        long monitorTotalDays = selectMongoData.getMonitorTotalDays();
        String strMonitorTotalDays = selectMongoData.changeType(monitorTotalDays);
        visualStatisticsMsg.setMonitorTotalDays(strMonitorTotalDays);
        int deployCount = selectMongoData.getDeployCount();
        String strDeployCount = selectMongoData.changeType(deployCount);
        visualStatisticsMsg.setDeployCount(strDeployCount);
        long alarmCount = selectMongoData.getAlarmCount();
        String strAlarmCount = selectMongoData.changeType(alarmCount);
        visualStatisticsMsg.setAlarmCount(strAlarmCount);
        long vehicleCountInMonth = selectMongoData.getVehicleCountInMonth();
        String strVehicleCountInMonth = selectMongoData.changeType(vehicleCountInMonth);
        visualStatisticsMsg.setVehicleCountInMonth(strVehicleCountInMonth);
        long vehicleCountInWeek = selectMongoData.getVehicleCountInWeek();
        String strVehicleCountInWeek = selectMongoData.changeType(vehicleCountInWeek);
        visualStatisticsMsg.setVehicleCountInWeek(strVehicleCountInWeek);

        //区域和七日过车
        List<Long> oneWeekVehicleCount = selectMongoData.getOneWeekVehicleCount();
        visualStatisticsMsg.setOneWeekVehicleCount(oneWeekVehicleCount);
        List<long[]> oneWeekSpecialtyVehicleCount = selectMongoData.getOneWeekSpecialtyVehicleCount();
        visualStatisticsMsg.setOneWeekSpecialtyVehicleCount(oneWeekSpecialtyVehicleCount);
        //今日相关数据
        Map<String, Object> todayData = selectMongoData.getTodayData();
        visualStatisticsMsg.setTodayData(todayData);

        return visualStatisticsMsg;
    }


    //隔一分钟更新缓存
    @Scheduled(fixedRate = 60000)
    public void putCache() {
        VisualStatisticsMsg displayData = getDisplayData();
        String displaydata = JSON.toJSONString(displayData);
        redisTemplate.opsForValue().set("data", displaydata);
    }
}