Explorar o código

定时一分钟更新投影灯在线状态

zhj hai 1 ano
pai
achega
8d6097063e

+ 5 - 16
src/main/java/com/welampiot/controller/ProjectionLightController.java

@@ -75,20 +75,7 @@ public class ProjectionLightController extends BaseController {
         ProjectionLightDTO projectionLightDTO = projectionLightService.getProjectionLightDetailsById(id);
         if (projectionLightDTO == null) return toolUtils.response(InterfaceResultEnum.PARAM_FAIL, version);
 
-        String sendTopic;
-        String resTopic;
-        if (projectionLightDTO.getWifiModel() == 3 || projectionLightDTO.getWifiModel() == 6) {
-            sendTopic = "/WEGW3/TransIn/";
-            resTopic = "/WEGW3/TransOut/";
-        } else if (projectionLightDTO.getWifiModel() == 1 || projectionLightDTO.getWifiModel() == 5) {
-            sendTopic = "/WEGW2/TransIn/";
-            resTopic = "/WEGW2/TransOut/";
-        } else {
-            sendTopic = "/WEGW/TransIn/";
-            resTopic = "/WEGW/TransOut/";
-        }
-        sendTopic += projectionLightDTO.getWifiNum();
-        resTopic += projectionLightDTO.getWifiNum();
+        projectionLightDTO.setTopic(projectionLightDTO.getWifiModel(), projectionLightDTO.getWifiNum());
 
         // 发送的指令内容:投影灯选择图案片
         String cmd;
@@ -104,15 +91,17 @@ public class ProjectionLightController extends BaseController {
             return toolUtils.response(InterfaceResultEnum.IMAGE_NUMBER_ERROR, version);
         }
 
-        projectionLightDTO.setSerialNum(projectionLightDTO.getSerialPort());
         String cmdInfo;
         if (projectionLightDTO.getWifiModel() == 3 || projectionLightDTO.getWifiModel() == 6) { // 云盒G300
+            projectionLightDTO.setSerialNum(projectionLightDTO.getSerialPort());
             cmdInfo = ToolUtils.getRandomString() + projectionLightDTO.getSerialNum() + cmd;
         } else {
             cmdInfo = ToolUtils.getRandomString() + cmd;
         }
 
-        String backResult = toolUtils.sendMqttCmd(sendTopic, toolUtils.hexString2Bytes(cmdInfo), resTopic);
+        String sendTopic = projectionLightDTO.getSendTopic();
+        String backTopic = projectionLightDTO.getBackTopic();
+        String backResult = toolUtils.sendMqttCmd(sendTopic, toolUtils.hexString2Bytes(cmdInfo), backTopic);
         if (backResult != null && !backResult.trim().isEmpty()) {
             projectionLightDTO.setUpdateTime(ToolUtils.getNowTime());
             projectionLightDTO.setImageNumber(imageNumber);

+ 2 - 0
src/main/java/com/welampiot/dao/ProjectionLightDao.java

@@ -14,4 +14,6 @@ public interface ProjectionLightDao {
     void addProjectionLight(ProjectionLightDTO projectionLightDTO);
     void updateProjectionLight(ProjectionLightDTO projectionLightDTO);
     void updateImageNumber(ProjectionLightDTO projectionLightDTO);
+    List<ProjectionLightDTO> getAllProjectionLightList();
+    void updateProjectionLightOnline(ProjectionLightDTO projectionLightDTO);
 }

+ 28 - 0
src/main/java/com/welampiot/dto/ProjectionLightDTO.java

@@ -36,8 +36,14 @@ public class ProjectionLightDTO {
     private String expirationDate;
     /** 云盒型号 */
     private Integer wifiModel;
+    /** 云盒序列号 */
     private String wifiNum;
+    /** 串口字符串 */
     private String serialNum;
+    /** 发送主题 */
+    private String sendTopic;
+    /** 接收主题 */
+    private String backTopic;
 
     public void setSerialNum(Integer serialPort) {
         if (serialPort == 2) {
@@ -49,6 +55,28 @@ public class ProjectionLightDTO {
         }
     }
 
+    /**
+     * 设置主题
+     * @param wifiModel 云盒型号
+     * @param wifiNum 云盒序列号
+     */
+    public void setTopic(Integer wifiModel, String wifiNum) {
+        String sendTopic;
+        String resTopic;
+        if (wifiModel == 3 || wifiModel == 6) {
+            sendTopic = "/WEGW3/TransIn/";
+            resTopic = "/WEGW3/TransOut/";
+        } else if (wifiModel == 1 || wifiModel == 5) {
+            sendTopic = "/WEGW2/TransIn/";
+            resTopic = "/WEGW2/TransOut/";
+        } else {
+            sendTopic = "/WEGW/TransIn/";
+            resTopic = "/WEGW/TransOut/";
+        }
+        this.sendTopic = sendTopic + wifiNum;
+        this.backTopic = resTopic + wifiNum;
+    }
+
     public static List<ProjectionLightDTO> getProjectionLightListByMap(List<Map<String, String>> projectionLightMap) {
         List<ProjectionLightDTO> projectionLightList = new ArrayList<>();
 

+ 2 - 0
src/main/java/com/welampiot/service/ProjectionLightService.java

@@ -12,4 +12,6 @@ public interface ProjectionLightService {
     void addProjectionLight(ProjectionLightDTO projectionLightDTO);
     void updateProjectionLight(ProjectionLightDTO projectionLightDTO);
     void updateImageNumber(ProjectionLightDTO projectionLightDTO);
+    List<ProjectionLightDTO> getAllProjectionLightList();
+    void updateProjectionLightOnline(ProjectionLightDTO projectionLightDTO);
 }

+ 10 - 0
src/main/java/com/welampiot/service/impl/ProjectionLightServiceImpl.java

@@ -44,4 +44,14 @@ public class ProjectionLightServiceImpl implements ProjectionLightService {
     public void updateImageNumber(ProjectionLightDTO projectionLightDTO) {
         projectionLightDao.updateImageNumber(projectionLightDTO);
     }
+
+    @Override
+    public List<ProjectionLightDTO> getAllProjectionLightList() {
+        return projectionLightDao.getAllProjectionLightList();
+    }
+
+    @Override
+    public void updateProjectionLightOnline(ProjectionLightDTO projectionLightDTO) {
+        projectionLightDao.updateProjectionLightOnline(projectionLightDTO);
+    }
 }

+ 68 - 0
src/main/java/com/welampiot/tasks/Task.java

@@ -0,0 +1,68 @@
+package com.welampiot.tasks;
+
+import com.welampiot.dto.ProjectionLightDTO;
+import com.welampiot.service.ProjectionLightService;
+import com.welampiot.utils.ToolUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Component
+@EnableScheduling
+@EnableAsync
+public class Task {
+    @Autowired
+    private ProjectionLightService projectionLightService;
+    @Autowired
+    private ToolUtils toolUtils;
+
+    private final ExecutorService executorService = Executors.newFixedThreadPool(2);
+
+    /**
+     * 每分钟更新投影灯在线状态
+     */
+    @Scheduled(fixedRate = 1000 * 60)
+    public void updateProjectionLightOnlineStatus() {
+        List<ProjectionLightDTO> projectionLightList = projectionLightService.getAllProjectionLightList();
+
+        projectionLightList.forEach(projectionLightDTO -> executorService.submit(() -> updateLightStatus(projectionLightDTO)));
+    }
+
+    private synchronized void updateLightStatus(ProjectionLightDTO projectionLightDTO) {
+        projectionLightDTO.setTopic(projectionLightDTO.getWifiModel(), projectionLightDTO.getWifiNum());
+        String sendTopic = projectionLightDTO.getSendTopic();
+        String backTopic = projectionLightDTO.getBackTopic();
+
+        // 发送指令内容:设置马达速度为中速
+        String cmd = "E0070001011201FCEE";
+        String cmdInfo;
+        if (projectionLightDTO.getWifiModel() == 3 || projectionLightDTO.getWifiModel() == 6) { // 云盒G300
+            projectionLightDTO.setSerialNum(projectionLightDTO.getSerialPort());
+            cmdInfo = ToolUtils.getRandomString() + projectionLightDTO.getSerialNum() + cmd;
+        } else {
+            cmdInfo = ToolUtils.getRandomString() + cmd;
+        }
+
+        String backResult = toolUtils.sendMqttCmd(sendTopic, toolUtils.hexString2Bytes(cmdInfo), backTopic);
+        if (backResult != null && !backResult.trim().isEmpty()) {
+            projectionLightDTO.setOnline(1);
+        } else {
+            projectionLightDTO.setOnline(0);
+        }
+        projectionLightDTO.setUpdateTime(ToolUtils.getNowTime());
+        projectionLightService.updateProjectionLightOnline(projectionLightDTO);
+    }
+
+    @PreDestroy
+    public void shutdown() {
+        executorService.shutdown();
+    }
+
+}

+ 20 - 0
src/main/resources/mapper/ProjectionLightMapper.xml

@@ -121,6 +121,26 @@
             projection_light
         set
             image_number = #{imageNumber},
+            `online` = 1,
+            updatetime = #{updateTime}
+        where
+            id = #{id}
+    </update>
+
+    <select id="getAllProjectionLightList" resultType="com.welampiot.dto.ProjectionLightDTO">
+        select p.id,p.lamp_pole_id as lampPoleId,p.address,p.createtime as createTime,p.image_number as imageNumber,
+               lp.name as lampPoleName,p.name,p.online,p.updatetime as updateTime,p.serial_port as serialPort,
+               p.install_date as installDate,p.expiration_date as expirationDate,w.model as wifiModel,w.num as wifiNum
+        from projection_light p
+        left join lamp_pole lp on p.lamp_pole_id = lp.id
+        left join wifi w on lp.id = w.lamp_pole_id
+    </select>
+
+    <update id="updateProjectionLightOnline" parameterType="com.welampiot.dto.ProjectionLightDTO">
+        update
+            projection_light
+        set
+            `online` = #{online},
             updatetime = #{updateTime}
         where
             id = #{id}