package com.moral.api.websocket;
|
|
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.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 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.specialDevice = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, mac);
|
//获取设备地区对应的AQI用于补偿使用
|
/*Map<String, Object> deviceInfo = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DEVICE, mac);
|
Map<String, Object> orgInfo = (Map<String, Object>) deviceInfo.get("organization");
|
String areaCode = String.valueOf(orgInfo.get("areaCode"));
|
String cityCode = String.valueOf(orgInfo.get("cityCode"));
|
try {
|
this.regionAqi = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.AQI_DATA, areaCode);
|
if (ObjectUtils.isEmpty(this.regionAqi))
|
this.regionAqi = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.AQI_DATA, cityCode);
|
} 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);
|
// }
|
}
|
}
|
}
|