Explorar el Código

host 代码优化提交

jingyuanchao hace 1 año
padre
commit
5b68e60a3b

+ 1 - 1
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteHostService.java

@@ -22,7 +22,7 @@ public interface RemoteHostService {
     @PostMapping("/getDiskInfos")
     AjaxResult getDiskInfos(@RequestBody DiskInfoGetReq req);
 
-    @PostMapping("/getDevices")
+    @GetMapping("/getDevices")
     AjaxResult getDevices();
 
     @GetMapping("/closeSession")

+ 1 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/BaseDeviceTypeEnum.java

@@ -33,6 +33,7 @@ public enum BaseDeviceTypeEnum {
     FSU_Theft("18", "盗情传感器"),
     subsystem("19", "子系统"),
     sensor("20", "防区"),
+    FSU_DoPowerCollection("21", "DO8小时采集"),
 
     ;
     private String code;

+ 15 - 10
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceInfoServiceImpl.java

@@ -24,6 +24,7 @@ import com.xunmei.host.server.service.IotServerInfoService;
 import com.xunmei.host.websocket.constant.WebSocketConstants;
 import com.xunmei.host.websocket.dto.DeviceStatusInfo;
 import com.xunmei.host.websocket.dto.WebsocketExecuteReq;
+import com.xunmei.host.websocket.dto.WebsocketResult;
 import com.xunmei.host.websocket.dto.dvs.DvsBaseInfo;
 import com.xunmei.host.websocket.dto.dvs.SubDeviceInfo;
 import com.xunmei.host.websocket.enums.DeviceCacheEnum;
@@ -255,6 +256,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void deviceStatusChange(List<DeviceStatusInfo> statusInfos,IotServerInfo serverInfo) {
         if (ObjectUtil.isEmpty(statusInfos)) {
             return;
@@ -281,7 +283,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     public String routerKey() {
         StringJoiner result = new StringJoiner(",");
         //设备基础数据
-        result.add(WebSocketConstants.GET_DEVICES);
+        result.add(WebSocketConstants.GET_DEVICES_SERVICES);
         result.add(WebSocketConstants.DEVICES_EVENT);
         //设备状态数据
         result.add(WebSocketConstants.DEVICES_STATUS_EVENT);
@@ -301,7 +303,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         Object data = req.getData();
         JSONArray dataArray = (JSONArray) data;
         if (ObjectUtil.isEmpty(dataArray)) {
-            return "";
+            return WebsocketResult.replySuccess(req.getTopic(),req.getId(), req.getProductName(), req.getDeviceName());
         }
         String token = req.getToken();
         IotServerInfo serverInfo = iotServerInfoService.selectByToken(token);
@@ -312,14 +314,15 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         String event = req.getEvent();
         switch (event) {
             case WebSocketConstants.DEVICES_EVENT:
-            case WebSocketConstants.GET_DEVICES:
+            case WebSocketConstants.GET_DEVICES_SERVICES:
                 List<DvsBaseInfo> dataList = dataArray.toJavaList(DvsBaseInfo.class);
                 String lockKey = LOCK_DEVICE_BASE_INFO + token;
                 String key = LOCK_ALARM_HOST_BASE_INFO + token;
-
-                lockAndExecute(lockKey, () -> handleDvsAndFSUDeviceInfo(dataList, serverInfo));
-                lockAndExecute(key, () -> handleAlarmHostDeviceInfo(dataList, serverInfo));
-                break;
+                handleDvsAndFSUDeviceInfo(dataList, serverInfo);
+                handleAlarmHostDeviceInfo(dataList, serverInfo);
+                /*lockAndExecute(lockKey, () -> handleDvsAndFSUDeviceInfo(dataList, serverInfo));
+                lockAndExecute(key, () -> handleAlarmHostDeviceInfo(dataList, serverInfo));*/
+                return WebsocketResult.replySuccess(req.getTopic(),req.getId(), req.getProductName(), req.getDeviceName());
             case WebSocketConstants.DEVICES_STATUS_EVENT:
                 List<DeviceStatusInfo> statusInfos = dataArray.toJavaList(DeviceStatusInfo.class);
                 deviceStatusChange(statusInfos,serverInfo);
@@ -331,7 +334,8 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         return null;
     }
 
-    private void handleAlarmHostDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo) {
+    @Transactional(rollbackFor = Exception.class)
+    public void handleAlarmHostDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo) {
         List<DvsBaseInfo> alarmHostList = dataList.stream().filter(r -> ObjectUtil.equal(r.getType(), BaseDeviceTypeEnum.AlarmHost.name())).collect(Collectors.toList());
         if (ObjectUtil.isEmpty(alarmHostList)) {
             return;
@@ -422,7 +426,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         saveOrUpdateBatches(addSubSystemList, updateSubSystemList, addDefenceAreaList, updateDefenceAreaList, addExtendList, updateExtendList);
     }
 
-    private void lockAndExecute(String lockKey, Runnable action) {
+    public void lockAndExecute(String lockKey, Runnable action) {
         //String lockKey = LOCK_ACCPET_KEY_PREFIX + token;
         RLock lock = RedisUtils.getClient().getLock(lockKey);
         try {
@@ -444,7 +448,8 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         }
     }
 
-    private void handleDvsAndFSUDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo) {
+    @Transactional
+    public void handleDvsAndFSUDeviceInfo(List<DvsBaseInfo> dataList, IotServerInfo serverInfo) {
 
         //逻辑删除所有设备
         deleteDeviceByToken(serverInfo.getIotCode());

+ 1 - 1
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/constant/WebSocketConstants.java

@@ -90,7 +90,7 @@ public interface WebSocketConstants {
     /**
      * 获取所有主机基础信息
      */
-    String GET_DEVICES = "getDevices";
+    String GET_DEVICES_SERVICES = "getDevices";
 
     /**
      * 获取监控主机下通道、硬盘和监控主机扩展信息

+ 31 - 0
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/dto/WebsocketResult.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.HttpStatus;
 import com.xunmei.host.websocket.constant.WebSocketConstants;
+import com.xunmei.host.websocket.enums.TopicTypeEnums;
 import com.xunmei.system.api.dto.protection.ReceiveErrorDto;
 import io.netty.util.internal.StringUtil;
 import lombok.AllArgsConstructor;
@@ -85,5 +86,35 @@ public class WebsocketResult implements Serializable {
         return result;
     }
 
+    public static WebsocketResult of(String topic, String id,boolean success,String msg) {
+        WebsocketResult result = new WebsocketResult();
+        result.setId(id);
+        result.setTopic(topic);
+        result.setTimestamp(DateUtil.format(new Date(), Constants.UTC_FORMAT));
+        Map<String, Object> map = new HashMap<>();
+        map.put(WebSocketConstants.STATUS_CODE,success ? HttpStatus.SUCCESS : HttpStatus.ERROR);
+        map.put(WebSocketConstants.STATUS_DESCRIPTION, msg);
+        map.put(WebSocketConstants.HEADER, new JSONObject());
+        result.setPayload(map);
+        return result;
+    }
+    public static WebsocketResult replySuccess(String topic, String id,String productName,String deviceName) {
+        WebsocketResult result = new WebsocketResult();
+        result.setId(id);
+        result.setTopic(topic.contains("reply") ? topic : String.format("things/%s/%s/service/invoke/reply", productName, deviceName));
+        result.setTimestamp(DateUtil.format(new Date(), Constants.UTC_FORMAT));
+
+        JSONObject payload = new JSONObject();
+        payload.put(WebSocketConstants.STATUS_CODE, HttpStatus.SUCCESS);
+        payload.put(WebSocketConstants.STATUS_DESCRIPTION, StringUtil.EMPTY_STRING);
+
+        final JSONObject header = new JSONObject();
+        header.put(WebSocketConstants.PRODUCT_NAME, productName);
+        header.put(WebSocketConstants.DEVICE_NAME, deviceName);
+        header.put(WebSocketConstants.REPLY_ID, id);
+        result.setHeaders(header);
+        result.setPayload(payload);
+        return result;
+    }
 }
 

+ 9 - 11
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/handler/SocWebSocketHandler.java

@@ -9,7 +9,6 @@ import com.xunmei.common.core.domain.iot.domain.IotServerInfo;
 import com.xunmei.common.core.enums.iot.IotServerConnectStatus;
 import com.xunmei.common.core.utils.JacksonUtils;
 import com.xunmei.common.core.utils.StringUtils;
-import com.xunmei.host.iot.service.IotDeviceStatusService;
 import com.xunmei.host.server.service.IotServerInfoService;
 import com.xunmei.host.websocket.dto.WebsocketExecuteReq;
 import com.xunmei.host.websocket.dto.WebsocketPayloadResolve;
@@ -22,7 +21,6 @@ import com.xunmei.host.websocket.utils.WebSocketUtils;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.util.LogUtils;
-import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -33,8 +31,8 @@ import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * @author gaoxiong
@@ -75,15 +73,15 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
             }
             WebsocketResult register = createWebsocketResult(null, "register", map);
             WebSocketUtils.sendMessage(session, JacksonUtils.toJSONString(register));
-            LogUtils.WEBSOCKET_MSG.info("[建立注册连接],registerCode:{},返回信息:{}", registerCode,JacksonUtils.toJSONString(register));
+            LogUtils.WEBSOCKET_MSG.info("[建立注册连接],registerCode:{},返回信息:{}", registerCode, JacksonUtils.toJSONString(register));
             session.close();
             return;
         }
 
         String token = (String) session.getAttributes().get("token");
         if (StringUtils.isNotEmpty(token)) {
-            String ip =WebSocketUtils.getIp(session);
-            LogUtils.WEBSOCKET_MSG.info("[准备建立连接],ip:{},token:{}", ip,token);
+            String ip = WebSocketUtils.getIp(session);
+            LogUtils.WEBSOCKET_MSG.info("[准备建立连接],ip:{},token:{}", ip, token);
             IotServerInfo serverInfo = iotServerInfoService.selectByToken(token);
             Map<String, Object> map = new HashMap<>();
             if (serverInfo == null) {
@@ -92,7 +90,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
                 WebsocketResult result = createWebsocketResult(null, "login", map);
                 WebSocketUtils.sendMessage(session, JacksonUtils.toJSONString(result));
                 session.close();
-                LogUtils.WEBSOCKET_MSG.info("准备建立连接时,token不可用,ip:{},返回信息:{}", ip,JacksonUtils.toJSONString(result));
+                LogUtils.WEBSOCKET_MSG.info("准备建立连接时,token不可用,ip:{},返回信息:{}", ip, JacksonUtils.toJSONString(result));
                 return;
             }
             serverInfo.setIotIp(ip);
@@ -113,7 +111,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
 
     private WebsocketResult createWebsocketResult(String id, String topic, Object object) {
         WebsocketResult result = new WebsocketResult();
-        result.setId(id);
+        result.setId(id == null ? UUID.randomUUID().toString() : id);
         result.setTopic(topic);
         //当前时间转换为 格式:2024-07-02T14:17:32
         result.setTimestamp(DateUtil.format(new Date(), Constants.UTC_FORMAT));
@@ -204,9 +202,9 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
      */
     @Override
     protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
-        LogUtils.WEBSOCKET_MSG.info("收到来自 {} 心跳消息",WebSocketUtils.getIp(session));
+        LogUtils.WEBSOCKET_MSG.info("收到来自 {} 心跳消息", WebSocketUtils.getIp(session));
         String token = WebSocketSessionHolder.updateToken(session);
-        iotServerInfoService.updateConnectTimeByToken(token,new Date());
+        iotServerInfoService.updateConnectTimeByToken(token, new Date());
         WebSocketUtils.sendPongMessage(session);
     }
 
@@ -238,7 +236,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
             serverInfo.setIotStatus(IotServerConnectStatus.OFFLINE.getIdx());
             iotServerInfoService.updateByToken(serverInfo);
         }
-        LogUtils.WEBSOCKET_MSG.info("[断开连接],token:{}", token);
+        LogUtils.WEBSOCKET_MSG.info("[断开连接],ip:{}", WebSocketUtils.getIp(session));
     }
 
     /**

+ 0 - 2
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/interceptor/WebSocketInterceptor.java

@@ -35,7 +35,6 @@ public class WebSocketInterceptor implements HandshakeInterceptor {
      */
     @Override
     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
-        LogUtils.WEBSOCKET_MSG.info("接收到链接请求");
         // 从请求中获取查询参数并存入attributes中
         String queryString = request.getURI().getQuery();
         if (queryString != null) {
@@ -61,6 +60,5 @@ public class WebSocketInterceptor implements HandshakeInterceptor {
     @Override
     public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
         // 在这个方法中可以执行一些握手成功后的后续处理逻辑,比如记录日志或者其他操作
-        LogUtils.WEBSOCKET_MSG.info("WebSocket握手成功");
     }
 }

+ 1 - 3
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/websocket/service/impl/WebsocketServiceImpl.java

@@ -1,6 +1,5 @@
 package com.xunmei.host.websocket.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.xunmei.common.core.utils.JacksonUtils;
 import com.xunmei.common.redis.utils.RedisUtils;
@@ -19,7 +18,6 @@ import com.xunmei.host.websocket.service.WebsocketService;
 import com.xunmei.host.websocket.utils.IotServerUtils;
 import com.xunmei.host.websocket.utils.WebSocketUtils;
 import com.xunmei.system.api.domain.websocket.RedisWebsocketMsg;
-import com.xunmei.system.api.util.LogUtils;
 import org.redisson.api.RKeys;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -61,7 +59,7 @@ public class WebsocketServiceImpl implements WebsocketService {
     @Override
     public void getDevices() {
         final String topic = TopicTypeEnums.formatUrl(TopicTypeEnums.PRODUCT_SERVICE_INVOKE.getUrl(),ProductEnums.DETECTION_HOST.getProductName()[0], ProductEnums.DETECTION_HOST.getProductName()[1]);
-        final WebsocketResult result = IotServerUtils.invokeHostServer(topic, new JSONObject(), WebSocketConstants.GET_DEVICES, new JSONObject());
+        final WebsocketResult result = IotServerUtils.invokeHostServer(topic, new JSONObject(), WebSocketConstants.GET_DEVICES_SERVICES, new JSONObject());
         WebSocketUtils.sendAll(JacksonUtils.toJSONString(result));
     }