websocket客户端

package com.mp.core.websocket;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.mp.common.core.utils.DateUtils;
import com.mp.common.core.utils.ResponseUtil;
import com.mp.core.model.consts.CacheKeyConst;
import com.mp.core.model.consts.OnlineStatusDataConst;
import com.mp.core.model.dto.business.CameraEventDataDTO;
import com.mp.core.model.dto.business.CameraStateDataDTO;
import com.mp.core.model.entity.safety.SafetyCamera;
import com.mp.core.model.entity.safety.SafetyCameraEvent;
import com.mp.core.model.enums.EventStatusEnum;
import com.mp.core.model.enums.OnlineStatusEnum;
import com.mp.core.model.query.safety.SafetyEventInfoQuery;
import com.mp.core.service.safety.SafetyCameraEventService;
import com.mp.core.service.safety.SafetyCameraService;
import com.mp.core.utils.SpringUtilsAuTo;
import com.mp.core.utils.VideoOrPictureDownloadUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * @author lrx
 * @description: TODO 摄像头事件socket控制台
 * @date 2022/10/12 10:13
 */
@Slf4j
@Component
@ClientEndpoint
public class CameraEventSocketClient {

    private static SafetyCameraService safetyCameraService = SpringUtilsAuTo.getBean(SafetyCameraService.class);
    private static SafetyCameraEventService safetyCameraEventService = SpringUtilsAuTo.getBean(SafetyCameraEventService.class);
    private static SimpMessagingTemplate simpMessagingTemplate = SpringUtilsAuTo.getBean(SimpMessagingTemplate.class);
    private static RedissonClient redissonClient = SpringUtilsAuTo.getBean(RedissonClient.class);
    private String serverUrl = "ws://192.168.4.95:8063/snapPush";
    private Session session;

    @PostConstruct
    void init() {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            URI uri = URI.create(serverUrl);
            session = container.connectToServer(CameraEventSocketClient.class, uri);
        } catch (DeploymentException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打开连接
     *
     * @param session
     */
    @OnOpen
    public void onOpen(Session session) {
        log.info("Websocket open..........");
        this.session = session;
    }

    /**
     * 接收消息
     *
     * @param text
     */
    @OnMessage
    public void onMessage(String text) throws ParseException {
            Map<String, Object> dataMap = JSONObject.parseObject(text);
            CameraEventDataDTO cameraEventDateDTO = null;
            CameraStateDataDTO cameraStateDataDTO = null;
            if (dataMap.containsKey("event_path")) {
                cameraEventDateDTO = CameraEventDataDTO.builder().eventPath(dataMap.get("event_path").toString()).devID(dataMap.get("devID").toString())
                        .code(Integer.parseInt(dataMap.get("code").toString())).cameraNumber(dataMap.get("cameranumber").toString())
                        .cameraNote(dataMap.get("cameranote").toString()).time(DateUtils.toDateTime(dataMap.get("time").toString()))
                        .type(dataMap.get("type").toString()).build();
            }
            if (dataMap.containsKey("cameraNumber")) {
                cameraStateDataDTO = CameraStateDataDTO.builder().cameraNumber(dataMap.get("cameraNumber").toString())
                        .code(Integer.parseInt(dataMap.get("code").toString())).type(dataMap.get("type").toString())
                        .status(dataMap.get("status").toString()).build();
            }
            //后面离线,或者在线通过判断{"cameraNumber":"1","code":0,"type":"refresh","status":"fail"}
            if (cameraEventDateDTO != null) {
                log.info("接收消息:" + cameraEventDateDTO);
                SafetyCamera safetyCameraByCameraNumber = safetyCameraService.getOne(Wrappers.<SafetyCamera>lambdaQuery().eq(SafetyCamera::getValid, 1).eq(SafetyCamera::getCameraNumber, cameraEventDateDTO.getCameraNumber()));
                if (safetyCameraByCameraNumber != null) {
                    if (!cameraEventDateDTO.getEventPath().endsWith(".mp4")){
                        return;
                    }
                    SafetyCameraEvent safetyCameraEvent = new SafetyCameraEvent();
                    safetyCameraEvent.setCameraId(safetyCameraByCameraNumber.getId());
                    safetyCameraEvent.setEventDate(cameraEventDateDTO.getTime());
                    safetyCameraEvent.setEventStatus(EventStatusEnum.WAITING_PROCESS);
                    safetyCameraEvent.setEventContent(cameraEventDateDTO.getType());
                    safetyCameraEvent.setEventNumber(getEventNumber());
                    safetyCameraEventService.save(safetyCameraEvent);
                    String videoOrPictureUrl = "http://192.168.4.95:8063/openapi/photo/fetch" + cameraEventDateDTO.getEventPath();
                    //下载视频到本地保存
                    VideoOrPictureDownloadUtils.videoOrPictureDownload(safetyCameraEvent, videoOrPictureUrl);
                    //从缓存中获取Token
                    RBucket<String> bucket = redissonClient.getBucket(CacheKeyConst.USER_PUSH);
                    if (!StringUtils.isBlank(bucket.get())) {
                        List<Long> userPushList = JSONObject.parseArray(bucket.get(), Long.class);
                        for (Long userId : userPushList) {
                            log.info("----------------------推送" + simpMessagingTemplate + "-----------------------------");
                            SafetyEventInfoQuery safetyEventInfoQuery = new SafetyEventInfoQuery();
                            safetyEventInfoQuery.setPage(1);
                            safetyEventInfoQuery.setRows(15);
                            simpMessagingTemplate.convertAndSend("/topic/safetyEventInfoDetailsByPush/" + userId, ResponseUtil.responseSuccess(safetyCameraEventService.safetyEventInfoDetails(safetyEventInfoQuery)));
                        }
                    }
                }
            }
            //处理摄像头状态数据
            if (cameraStateDataDTO != null) {
                log.info("接收消息:" + cameraStateDataDTO);
                SafetyCamera safetyCameraByCameraNumber = safetyCameraService.getOne(Wrappers.<SafetyCamera>lambdaQuery().eq(SafetyCamera::getValid, 1).eq(SafetyCamera::getCameraNumber, cameraStateDataDTO.getCameraNumber()));
                if (safetyCameraByCameraNumber != null) {
                    switch (cameraStateDataDTO.getStatus()) {
                        case OnlineStatusDataConst.ON_LINE:
                            safetyCameraByCameraNumber.setOnlineStatus(OnlineStatusEnum.ON_LINE);
                            break;
                        case OnlineStatusDataConst.OFF_LINE:
                            safetyCameraByCameraNumber.setOnlineStatus(OnlineStatusEnum.OFF_LINE);
                            break;

                    }
                }
                safetyCameraService.saveOrUpdate(safetyCameraByCameraNumber);

            }
    }

    /**
     * 获取事件编号
     *
     * @return
     */
    private String getEventNumber() {
        //设置事件编号(递增)
        String eventNumber = safetyCameraEventService.getObj(new QueryWrapper<SafetyCameraEvent>().select("event_number").orderByDesc("event_number")
                .last("limit 1"), item -> (String) item);
        if (eventNumber == null) {
            eventNumber = String.format("%08d", Integer.valueOf(1));
        } else {
            eventNumber = String.format("%08d", Integer.valueOf(Integer.parseInt(eventNumber) + 1));
        }
        return eventNumber;
    }

    /**
     * 异常处理
     *
     * @param throwable
     */
    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

    /**
     * 关闭连接
     */
    @OnClose
    public void onClosing() throws IOException {
        log.error("websocket关闭");
        session.close();
    }

    /**
     * 主动发送消息
     */
    public void send(String message) {
        this.session.getAsyncRemote().sendText(message);
    }

    public void close() throws IOException {
        if (this.session.isOpen()) {
            this.session.close();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/LRXmrlirixing/article/details/130045263