package com.moral.api.websocket; 
 | 
  
 | 
import com.moral.api.entity.Device; 
 | 
import com.moral.api.entity.MonitorPoint; 
 | 
import com.moral.api.entity.Sensor; 
 | 
import com.moral.api.entity.UnitConversion; 
 | 
import com.moral.constant.RedisConstants; 
 | 
import lombok.Data; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.stereotype.Component; 
 | 
import org.springframework.util.ObjectUtils; 
 | 
import org.springframework.web.bind.annotation.PathVariable; 
 | 
  
 | 
import javax.websocket.*; 
 | 
import javax.websocket.server.PathParam; 
 | 
import javax.websocket.server.ServerEndpoint; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
import java.util.concurrent.CopyOnWriteArraySet; 
 | 
  
 | 
/** 
 | 
 * @ClassName SingleDeviceServer 
 | 
 * @Description TODO 
 | 
 * @Author 陈凯裕 
 | 
 * @Date 2021/6/15 13:56 
 | 
 * @Version TODO 
 | 
 **/ 
 | 
  
 | 
@ServerEndpoint("/singleDevice/{mac}") 
 | 
@Component 
 | 
@Data 
 | 
public class SingleDeviceServer { 
 | 
  
 | 
    //线程安全集合,用于存放server对象 
 | 
    public static CopyOnWriteArraySet<SingleDeviceServer> sockets = new CopyOnWriteArraySet<>(); 
 | 
  
 | 
    public static RedisTemplate redisTemplate; 
 | 
  
 | 
    private Session session; 
 | 
  
 | 
    private String mac; 
 | 
  
 | 
    private Device deviceAlarmInfo; 
 | 
  
 | 
    private List<UnitConversion> unitConversions; 
 | 
  
 | 
    private Map<String, Object> regionAqi; 
 | 
  
 | 
    private Map<String,Object> adjustFormula; 
 | 
  
 | 
    @OnOpen 
 | 
    public void onOpen(Session session, @PathParam("mac") String mac) throws Exception { 
 | 
        this.session = session; 
 | 
        this.mac = mac; 
 | 
        this.deviceAlarmInfo = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac); 
 | 
        this.unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1); 
 | 
        this.adjustFormula = redisTemplate.opsForHash().entries("adjust_"+mac); 
 | 
        //获取设备地区对应的AQI用于补偿使用 
 | 
        Map<String, Object> deviceInfo = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DEVICE, mac); 
 | 
        Map<String, Object> monitorPointMap = (Map<String, Object>) deviceInfo.get("monitorPoint"); 
 | 
        String areaCode = String.valueOf(monitorPointMap.get("areaCode")); 
 | 
        String cityCode = String.valueOf(monitorPointMap.get("cityCode")); 
 | 
        try { 
 | 
            this.regionAqi = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.CITY_AQI, 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(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); 
 | 
            // } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |