Parcourir la source

修复BUG,稳定版本

chenyi406 il y a 4 ans
Parent
commit
9a241c3c69

+ 1 - 1
src/main/java/com/zy/bms/common/Constant.java

@@ -28,7 +28,7 @@ public class Constant {
 
     /**
      * 主题前缀
-     * SERVER为服务器订阅主题  用来接收设备发来消息￿
+     * SERVER为服务器订阅主题  用来接收设备发来消息
      * CLIENT为设备订阅主题    用来发送消息给设备
      */
     public static final String TOPIC_REGISTER_SERVER = "$regdtx";

+ 3 - 3
src/main/java/com/zy/bms/config/InterceptorConfig.java

@@ -37,9 +37,9 @@ public class InterceptorConfig implements WebMvcConfigurer {
      */
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(verifyInterceptor)
-                .addPathPatterns("/zy4g/api/pc/**");
-
+//        registry.addInterceptor(verifyInterceptor)
+//                .addPathPatterns("/zy4g/api/pc/**");
+//
 //        registry.addInterceptor(authInterceptor)
 //                .addPathPatterns("/zy4g/api/pc/**")
 //                .excludePathPatterns(whiteList);

+ 3 - 3
src/main/java/com/zy/bms/config/mqtt/MqttCallbackHandler.java

@@ -71,7 +71,7 @@ public class MqttCallbackHandler {
      * 注册设备
      */
     private void registerDeviceHandler(MqttMsgDto obj) {
-        String num = obj.getString("num");
+        String num = obj.getString("regnum");
         //查询数据库中是否有此设备
         Device device = deviceService.getByNum(num);
         //没有该设备,保存至数据库
@@ -169,9 +169,9 @@ public class MqttCallbackHandler {
         mqttLog.setTopic(topic);
         mqttLog.setTag(0);
         //设备注册报文
-        if (topic.equals("$regdtx")) {
+        if (topic.equals(Constant.TOPIC_REGISTER_SERVER)) {
             MqttMsgDto msgObject = JSON.parseObject(payload, MqttMsgDto.class);
-            mqttLog.setDeviceId(msgObject.getString("regnum￿￿"));
+            mqttLog.setDeviceId(msgObject.getString("regnum"));
         } else {
             mqttLog.setDeviceId(topic.split("/")[1]);
         }

+ 6 - 7
src/main/java/com/zy/bms/controller/RelationController.java

@@ -46,8 +46,8 @@ public class RelationController extends BaseController {
      * 解除绑定关系
      */
     @PostMapping("unbind.do")
-    public ServerResponse unbind(String deviceNum, String userId) {
-        relationService.unbind(deviceNum, userId);
+    public ServerResponse unbind(String deviceNum) {
+        relationService.unbind(deviceNum, getUserId());
         return ServerResponse.createBySuccess();
     }
 
@@ -55,22 +55,21 @@ public class RelationController extends BaseController {
      * 查询用户的所有设备
      */
     @GetMapping("getListByUserId.do")
-    public ServerResponse getListByUserId(String userId) {
-        return ServerResponse.createBySuccess(relationService.getListByUserId(userId));
+    public ServerResponse getListByUserId() {
+        return ServerResponse.createBySuccess(relationService.getListByUserId(getUserId()));
     }
 
     /**
      * 修改默认设备
      * 即登陆以后使用那个设备
      *
-     * @param userId    用户ID
      * @param deviceNum 设备码
      */
     @PostMapping("changeDefault.do")
-    public ServerResponse changeDefault(String userId, String deviceNum) {
+    public ServerResponse changeDefault(String deviceNum) {
         //删除上一个默认设备
         relationService.update(Wrappers.<UserDeviceRelation>lambdaUpdate().eq(UserDeviceRelation::getIsDefault, 1)
-                .eq(UserDeviceRelation::getUserId, userId).set(UserDeviceRelation::getIsDefault, 0));
+                .eq(UserDeviceRelation::getUserId, getUserId()).set(UserDeviceRelation::getIsDefault, 0));
         //添加新的默认设备
         relationService.update(Wrappers.<UserDeviceRelation>lambdaUpdate().eq(UserDeviceRelation::getDeviceNum, deviceNum)
                 .set(UserDeviceRelation::getIsDefault, 1));

+ 2 - 4
src/main/java/com/zy/bms/controller/SetController.java

@@ -5,9 +5,7 @@ import com.zy.bms.common.controller.BaseController;
 import com.zy.bms.common.io.wechat.*;
 import com.zy.bms.service.RelationService;
 import com.zy.bms.service.SetService;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 
@@ -29,7 +27,7 @@ public class SetController extends BaseController {
     /**
      * 校验设备是否是该用户的设备
      */
-    public boolean verify(SimpleSetIO io) {
+    private boolean verify(SimpleSetIO io) {
         boolean flag = relationService.checkDeviceIsBelongByDeviceId(getUserId(), io.getDeviceId());
         if (!flag) {
             System.out.println("非法请求----" + getUserId() + "-----" + io.getDeviceId());

+ 49 - 4
src/main/java/com/zy/bms/controller/pc/PcSetController.java

@@ -2,14 +2,14 @@ package com.zy.bms.controller.pc;
 
 import com.zy.bms.common.ServerResponse;
 import com.zy.bms.common.io.wechat.*;
+import com.zy.bms.config.mqtt.MqttGateway;
 import com.zy.bms.service.SetBaseService;
 import com.zy.bms.service.SetService;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.zy.bms.service.SetToDeviceService;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.Map;
 
 /**
  * 设备设置相关
@@ -26,6 +26,51 @@ public class PcSetController {
     @Resource
     private SetService setService;
 
+    @Resource
+    private MqttGateway mqttGateway;
+
+    @Resource
+    private SetToDeviceService setToDeviceService;
+
+
+
+    /**
+     * 发送消息
+     */
+    @GetMapping("registerMqtt.do")
+    public ServerResponse registerMqtt(String clientId, String password) {
+        setToDeviceService.registerMqtt(clientId, password);
+        return ServerResponse.createBySuccess();
+    }
+    /**
+     * 发送消息
+     */
+    @GetMapping("addUser.do")
+    public ServerResponse addUser(String clientId, String password) {
+        setToDeviceService.addRabbitMqUser(clientId, password);
+        return ServerResponse.createBySuccess();
+    }
+
+    /**
+     * 发送消息
+     */
+    @GetMapping("setPermission.do")
+    public ServerResponse setPermission(String clientId) {
+        setToDeviceService.setPermission(clientId);
+        return ServerResponse.createBySuccess();
+    }
+
+    /**
+     * 发送消息
+     */
+    @PostMapping("sendMessage.do")
+    public ServerResponse sendMessage(@RequestBody Map<String, String> param) {
+        String topic = param.get("topic");
+        String message = param.get("message");
+        mqttGateway.sendMsgToMqtt(message, topic);
+        return ServerResponse.createBySuccess();
+    }
+
     /**
      * 其他设置
      *

+ 1 - 1
src/main/java/com/zy/bms/mapper/UserDeviceRelationMapper.java

@@ -47,5 +47,5 @@ public interface UserDeviceRelationMapper extends BaseMapper<UserDeviceRelation>
      * @param userId   用户ID
      * @param deviceId 设备ID
      */
-    int checkDeviceIsBelongByDeviceId(@Param("userId") String userId, @Param("deviceNum") String deviceId);
+    int checkDeviceIsBelongByDeviceId(@Param("userId") String userId, @Param("deviceId") String deviceId);
 }

+ 95 - 1
src/main/java/com/zy/bms/service/SetToDeviceService.java

@@ -1,14 +1,22 @@
 package com.zy.bms.service;
 
+import com.alibaba.fastjson.JSON;
 import com.zy.bms.common.Constant;
 import com.zy.bms.config.mqtt.MqttGateway;
 import com.zy.bms.model.Device;
 import com.zy.bms.model.MqttLog;
 import com.zy.bms.model.MqttMsgDto;
 import com.zy.bms.common.io.wechat.*;
+import com.zy.bms.utils.HttpUtil;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
 
 import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -36,7 +44,13 @@ public class SetToDeviceService {
         MqttLog mqttLog = new MqttLog();
         mqttLog.setTopic(topic);
         mqttLog.setTag(1);
-        mqttLog.setDeviceId(topic.split("/")[1]);
+        //设备注册报文
+        if (topic.equals(Constant.TOPIC_REGISTER_CLIENT)) {
+            MqttMsgDto msgObject = JSON.parseObject(msg, MqttMsgDto.class);
+            mqttLog.setDeviceId(msgObject.getString("regnum"));
+        } else {
+            mqttLog.setDeviceId(topic.split("/")[1]);
+        }
         mqttLog.setContent(msg);
         mqttLogService.save(mqttLog);
         //发送消息
@@ -133,6 +147,86 @@ public class SetToDeviceService {
         data.put("deviceid", device.getClientId());
         data.put("password", device.getPassword());
         msg.setData(data);
+        registerMqtt(device.getClientId(),device.getPassword());
         sendMsgToMqtt(msg.toJson(), Constant.TOPIC_REGISTER_CLIENT);
     }
+
+    /**
+     * 向 MQTT 服务器申请用户,供设备进行登录
+     * <p>
+     * 因为存在先后问题,需要先注册用户,在开通虚拟机权限,
+     * 所以逻辑为
+     * 发送注册用户请求
+     * 尝试申请权限
+     * 如果失败,则间隔一秒再次请求
+     * 如果申请次数超过3次,则尝试重新注册
+     * 重新注册后再次尝试申请
+     * 如果申请五次都失败,则结束方法,记录日志
+     *
+     * @param clientId 设备登录ID
+     * @param password 设备登录密码
+     */
+    public void registerMqtt(String clientId, String password) {
+        addRabbitMqUser(clientId, password);
+        int count = 0;
+        while (!setPermission(clientId)) {
+            try {
+                Thread.sleep(1000);
+                if (count == 2) {
+                    addRabbitMqUser(clientId, password);
+                }
+                if (count > 4) {
+                    break;
+                }
+                count++;
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                break;
+            }
+        }
+    }
+
+    /**
+     * 注册 RabbitMQ 用户
+     *
+     * @param clientId 用户名
+     * @param password 用户密码
+     */
+    public void addRabbitMqUser(String clientId, String password) {
+        String url = "http://view.ailishi.org:15672/api/users/" + clientId;
+        //请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
+        //请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("username", clientId);
+        params.put("password", password);
+        params.put("tags", "");
+        HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
+    }
+
+    /**
+     * 申请虚拟机权限
+     *
+     * @param clientId 用户ID
+     */
+    public boolean setPermission(String clientId) {
+        String url = "http://view.ailishi.org:15672/api/permissions/%2F/" + clientId;
+        //请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
+        //请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("username", clientId);
+        params.put("vhost", "/");
+        params.put("configure", ".*");
+        params.put("write", ".*");
+        params.put("read", ".*");
+        try {
+            HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
+        } catch (Exception e) {
+            return false;
+        }
+        return true;
+    }
 }

+ 13 - 4
src/main/java/com/zy/bms/utils/HttpUtil.java

@@ -1,12 +1,10 @@
 package com.zy.bms.utils;
 
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
+import java.net.URI;
 import java.util.Map;
 
 /**
@@ -19,6 +17,17 @@ public class HttpUtil {
 
     private static final RestTemplate restTemplate = new RestTemplate();
 
+    /**
+     * 发送 PUT 请求
+     *
+     * @param url 请求地址
+     */
+    public static String putForJSONEntity(String url, HttpHeaders header, String json) {
+        header.setContentType(MediaType.APPLICATION_JSON_UTF8);
+        HttpEntity<String> httpEntity = new HttpEntity<>(json, header);
+        return restTemplate.exchange(URI.create(url), HttpMethod.PUT, httpEntity, String.class).getBody();
+    }
+
     /**
      * 发送 Get 请求
      *

+ 8 - 31
src/main/resources/mapper/DeviceMapping.xml

@@ -1,7 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zy.bms.mapper.DeviceMapper">
 
     <select id="getListPage" resultType="com.zy.bms.model.Device">
@@ -10,7 +8,7 @@
         FROM zy_device
         <where>
             <if test="io.num != null and io.num != ''">
-                AND num LIKE CONCAT("%",#{io.num},"%")
+                AND (num LIKE CONCAT("%",#{io.num},"%") OR clientId LIKE CONCAT("%",#{io.num},"%"))
             </if>
             <if test="io.status != null and io.status > -1">
                 AND status = #{io.status}
@@ -19,40 +17,19 @@
                 AND groupId = #{io.groupId}
             </if>
         </where>
-    </select>
-
-    <select id="getByUserId" resultType="com.zy.bms.model.Device">
-        SELECT
-            t2.id,
-            t2.num,
-            t2.clientId,
-            t2.password,
-            t2.createTime,
-            t2.tags,
-            t2.status,
-            t2.groupId
-        FROM
-            db_user_device_relation t1
-        LEFT JOIN zy_device t2 ON t1.deviceNum = t2.num
-        WHERE
-            t1.userId = #{userId}
+        ORDER BY createTime DESC
     </select>
 
     <select id="getClientIdList" resultType="java.lang.String">
-        SELECT
-            clientId
-        FROM
-            zy_device
-        WHERE
-            status = 1
+        SELECT clientId
+        FROM zy_device
+        WHERE status = 1
     </select>
 
     <update id="updateName">
         UPDATE
             zy_device
-        SET
-            name = #{name}
-        WHERE
-            num = #{num}
+        SET name = #{name}
+        WHERE num = #{num}
     </update>
 </mapper>

+ 1 - 1
src/main/resources/mapper/UserDeviceRelationMapping.xml

@@ -33,7 +33,7 @@
         INNER JOIN
             user_device_relation t2 ON t1.num = t2.deviceNum
         WHERE
-            t2.deviceNum = #{deviceNum} AND t2.userId = #{userId} LIMIT 1
+            t1.clientId = #{deviceId} AND t2.userId = #{userId} LIMIT 1
         ),0)
     </select>
 </mapper>