package com.moral.api.websocket;
|
|
import com.moral.api.entity.Device;
|
import lombok.Data;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.ObjectUtils;
|
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
import javax.websocket.OnClose;
|
import javax.websocket.OnError;
|
import javax.websocket.OnMessage;
|
import javax.websocket.OnOpen;
|
import javax.websocket.Session;
|
import javax.websocket.server.PathParam;
|
import javax.websocket.server.ServerEndpoint;
|
|
import com.moral.api.entity.SpecialDevice;
|
import com.moral.api.entity.UnitConversion;
|
import com.moral.api.pojo.redisBean.SpecialDeviceInfoDTO;
|
import com.moral.constant.RedisConstants;
|
|
//走航车实时websocket
|
@ServerEndpoint("/cruiserWebsocket/{mac}")
|
@Component
|
@Data
|
public class CruiserWebSocketServer {
|
|
//线程安全集合,用于存放server对象
|
public static CopyOnWriteArraySet<CruiserWebSocketServer> sockets = new CopyOnWriteArraySet<>();
|
|
public static RedisTemplate redisTemplate;
|
|
private Session session;
|
|
private String mac;
|
|
private SpecialDevice deviceAlarmInfo;
|
|
private Map<String, Object> adjustFormula;
|
|
private SpecialDevice specialDevice;
|
|
private Map<String, Object> regionAqi;
|
|
private List<UnitConversion> unitConversions;
|
|
@OnOpen
|
public void onOpen(Session session, @PathParam("mac") String mac) {
|
this.session = session;
|
this.mac = mac;
|
this.deviceAlarmInfo = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, mac);
|
this.unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1);
|
this.adjustFormula = redisTemplate.opsForHash().entries("adjust_"+mac);
|
this.specialDevice = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, mac);
|
try {
|
//获取设备信息
|
SpecialDeviceInfoDTO deviceInfo = (SpecialDeviceInfoDTO) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE, mac);
|
//获取与设备绑定的国控站guid,
|
String guid = deviceInfo.getSpecialDevice().getGuid();
|
if (!ObjectUtils.isEmpty(guid)) {
|
//获取国控aqi数据,用于补偿
|
this.regionAqi = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.AQI_DATA, guid);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
sockets.add(this);
|
}
|
|
@OnClose
|
public void onClose() {
|
sockets.remove(this);
|
}
|
|
@OnMessage
|
public void onMessage(String message, Session session) {
|
System.out.println("websocket==" + message);
|
}
|
|
@OnError
|
public void onError(Session session, Throwable error) {
|
}
|
|
public void sendMessage(String message) throws Exception {
|
if (this.session.isOpen()) {
|
// synchronized (session) {
|
this.session.getBasicRemote().sendText(message);
|
// }
|
}
|
}
|
}
|