|  |  | 
 |  |  | 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; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |  * @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); | 
 |  |  |         System.out.println(mac); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @OnClose | 
 |  |  | 
 |  |  |  | 
 |  |  |     public void sendMessage(String message) throws Exception { | 
 |  |  |         if (this.session.isOpen()) { | 
 |  |  |             synchronized (session) { | 
 |  |  |                 this.session.getBasicRemote().sendText(message); | 
 |  |  |             } | 
 |  |  |             //  synchronized (session) { | 
 |  |  |             this.session.getBasicRemote().sendText(message); | 
 |  |  |             // } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |