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();
}
}
}
websocket client
Guess you like
Origin blog.csdn.net/LRXmrlirixing/article/details/130045263
Recommended
Ranking