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); 
 | 
            // } 
 | 
        } 
 | 
    } 
 | 
} 
 |