Forráskód Böngészése

增加mqtt日志查询接口

yangxiaokun 4 éve
szülő
commit
a0d61f09e0
27 módosított fájl, 312 hozzáadás és 185 törlés
  1. 1 1
      src/main/java/com/zy/bms/common/Constant.java
  2. 4 4
      src/main/java/com/zy/bms/common/enums/ResponseCode.java
  3. 29 0
      src/main/java/com/zy/bms/common/io/pc/MqttLogsIO.java
  4. 81 17
      src/main/java/com/zy/bms/config/mqtt/MqttCallbackHandler.java
  5. 1 1
      src/main/java/com/zy/bms/controller/pc/AdminController.java
  6. 1 1
      src/main/java/com/zy/bms/controller/pc/PcDeviceController.java
  7. 1 1
      src/main/java/com/zy/bms/controller/pc/PcLocationController.java
  8. 59 0
      src/main/java/com/zy/bms/controller/pc/PcMqttLogController.java
  9. 1 32
      src/main/java/com/zy/bms/controller/pc/PcSetController.java
  10. 1 1
      src/main/java/com/zy/bms/controller/pc/PcUserController.java
  11. 1 1
      src/main/java/com/zy/bms/controller/wx/DeviceController.java
  12. 1 1
      src/main/java/com/zy/bms/controller/wx/IdiomsController.java
  13. 1 1
      src/main/java/com/zy/bms/controller/wx/LocationController.java
  14. 1 1
      src/main/java/com/zy/bms/controller/wx/RelationController.java
  15. 1 1
      src/main/java/com/zy/bms/controller/wx/SetController.java
  16. 1 1
      src/main/java/com/zy/bms/controller/wx/SetInfoController.java
  17. 1 1
      src/main/java/com/zy/bms/controller/wx/UserController.java
  18. 11 0
      src/main/java/com/zy/bms/mapper/MqttLogMapper.java
  19. 5 0
      src/main/java/com/zy/bms/model/MqttLog.java
  20. 21 2
      src/main/java/com/zy/bms/model/MqttMsgDto.java
  21. 2 2
      src/main/java/com/zy/bms/redis/DeviceManager.java
  22. 2 1
      src/main/java/com/zy/bms/redis/SessionManager.java
  23. 38 0
      src/main/java/com/zy/bms/service/MqttLogService.java
  24. 21 113
      src/main/java/com/zy/bms/service/SetToDeviceService.java
  25. 1 1
      src/main/resources/application-dev.yml
  26. 1 1
      src/main/resources/application-prod.yml
  27. 24 0
      src/main/resources/mapper/MqttLogMapping.xml

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

@@ -22,7 +22,7 @@ public class Constant {
     public static final String M_CODE_SOS = "33";//紧急呼救
     public static final String M_CODE_VOLUME = "34";//音量
     public static final String M_CODE_AUTO_ANSWER = "36";//自动接听
-    public static final String M_CODE_NEWS = "39";//语音播报D
+    public static final String M_CODE_NEWS = "39";//语音播报
     public static final String M_CODE_UPLOAD_CALL_RECORD = "40";//设备上传通话记录
     public static final String M_CODE_CONTINUE_GPS = "41";//设备连续定位设置
 

+ 4 - 4
src/main/java/com/zy/bms/common/enums/ResponseCode.java

@@ -4,11 +4,11 @@ package com.zy.bms.common.enums;
  * 接口返回常量
  */
 public enum ResponseCode {
-    SUCCESS(200, "SUCCESS"),//成功
-    WARNING(300, "WARNING"),//警告,不进入成功回调函数,直接alert
+    SUCCESS(200, "Success"),//成功
+    WARNING(300, "Warning"),//警告,不进入成功回调函数,直接alert
     AUTHOR(401, "Forbidden"),//没有权限,跳转登录
-    ILLEGAL(402, "illegal"),//非法请求
-    ERROR(500, "ERROR");//服务器异常
+    ILLEGAL(402, "Illegal"),//非法请求
+    ERROR(500, "Error");//服务器异常
     public final int code;
     public final String msg;
 

+ 29 - 0
src/main/java/com/zy/bms/common/io/pc/MqttLogsIO.java

@@ -0,0 +1,29 @@
+package com.zy.bms.common.io.pc;
+
+import com.zy.bms.common.io.PageIO;
+import lombok.Data;
+
+/**
+ * mqtt 收发日志查询入参
+ *
+ * @author yang xiao kun
+ * create on 2021/4/23
+ */
+@Data
+public class MqttLogsIO extends PageIO {
+
+    /**
+     * 0:发送 1:接收
+     */
+    private Integer tag;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 指令
+     */
+    private Integer instruction;
+}

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

@@ -10,9 +10,12 @@ import com.zy.bms.utils.*;
 import com.zy.bms.utils.CoordTransformUtil;
 import com.zy.bms.utils.GaoDeApiUtil;
 import com.zy.bms.websocket.WebSocketServer;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * MQTT 消息返回处理类
@@ -48,9 +51,9 @@ public class MqttCallbackHandler {
      */
     void handle(String topic, String payload) {
         //存储日志
-        saveLog(topic, payload);
+        mqttLogService.saveLog(topic, payload, 0);
         //消息返回JSON转Object
-        MqttMsgDto msgObject = JSON.parseObject(payload, MqttMsgDto.class);
+        MqttMsgDto msgObject = MqttMsgDto.parse(payload);
         //转发消息至网页
         webSocketServer.massMessage(msgObject.getDeviceId(), payload);
         //根据报文标识代码 M 处理消息
@@ -78,6 +81,8 @@ public class MqttCallbackHandler {
         if (device == null) {
             device = createDevice(num);
         }
+        //mqtt服务器注册用户
+        registerMqtt(device.getClientId(), device.getPassword());
         //发送消息
         setToDeviceService.returnCodeToDevice(device);
     }
@@ -158,24 +163,83 @@ public class MqttCallbackHandler {
         }
     }
 
+
     /**
-     * 存储 收发 日志
+     * 向 MQTT 服务器申请用户,供设备进行登录
+     * <p>
+     * 因为存在先后问题,需要先注册用户,在开通虚拟机权限,
+     * 所以逻辑为
+     * 发送注册用户请求
+     * 尝试申请权限
+     * 如果失败,则间隔一秒再次请求
+     * 如果申请次数超过3次,则尝试重新注册
+     * 重新注册后再次尝试申请
+     * 如果申请五次都失败,则结束方法,记录日志
      *
-     * @param topic   主题
-     * @param payload 消息
+     * @param clientId 设备登录ID
+     * @param password 设备登录密码
+     */
+    private 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 用户密码
+     */
+    private 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
      */
-    private void saveLog(String topic, String payload) {
-        MqttLog mqttLog = new MqttLog();
-        mqttLog.setTopic(topic);
-        mqttLog.setTag(0);
-        //设备注册报文
-        if (topic.equals(Constant.TOPIC_REGISTER_SERVER)) {
-            MqttMsgDto msgObject = JSON.parseObject(payload, MqttMsgDto.class);
-            mqttLog.setDeviceId(msgObject.getString("regnum"));
-        } else {
-            mqttLog.setDeviceId(topic.split("/")[1]);
+    private 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;
         }
-        mqttLog.setContent(payload);
-        mqttLogService.save(mqttLog);
+        return true;
     }
 }

+ 1 - 1
src/main/java/com/zy/bms/controller/pc/AdminController.java

@@ -21,7 +21,7 @@ import java.util.Map;
  * create on 2021/2/24
  */
 @RestController
-@RequestMapping("zy4g/api/pc/admin")
+@RequestMapping("bms/api/pc/admin")
 public class AdminController {
 
     @Resource

+ 1 - 1
src/main/java/com/zy/bms/controller/pc/PcDeviceController.java

@@ -17,7 +17,7 @@ import javax.annotation.Resource;
  * create on 2021/1/21
  */
 @RestController
-@RequestMapping("zy4g/api/pc/device")
+@RequestMapping("bms/api/pc/device")
 public class PcDeviceController {
 
     @Resource

+ 1 - 1
src/main/java/com/zy/bms/controller/pc/PcLocationController.java

@@ -15,7 +15,7 @@ import javax.annotation.Resource;
  * create on 2021/1/21
  */
 @RestController
-@RequestMapping("zy4g/api/pc/location")
+@RequestMapping("bms/api/pc/location")
 public class PcLocationController {
 
     @Resource

+ 59 - 0
src/main/java/com/zy/bms/controller/pc/PcMqttLogController.java

@@ -0,0 +1,59 @@
+package com.zy.bms.controller.pc;
+
+import com.zy.bms.common.Constant;
+import com.zy.bms.common.ServerResponse;
+import com.zy.bms.common.io.pc.MqttLogsIO;
+import com.zy.bms.service.MqttLogService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+
+/**
+ * mqtt收发日志
+ *
+ * @author yang xiao kun
+ * create on 2021/1/21
+ */
+@RestController
+@RequestMapping("bms/api/pc/logs")
+public class PcMqttLogController {
+
+    @Resource
+    private MqttLogService mqttLogService;
+    private static HashMap<String, String> instruction = new HashMap<>();
+
+    /*
+     * 所有指令暂时写死内存中
+     */
+    static {
+        instruction.put(Constant.M_CODE_REGISTER, "注册");
+        instruction.put(Constant.M_CODE_RETURN_CODE, "返回授权码");
+        instruction.put(Constant.M_CODE_UPLOAD_LOCATION, "上传位置信息");
+        instruction.put(Constant.M_CODE_GPS_RATE, "设置定位频率");
+        instruction.put(Constant.M_CODE_SOS, "设置联系人");
+        instruction.put(Constant.M_CODE_VOLUME, "设置音量");
+        instruction.put(Constant.M_CODE_AUTO_ANSWER, "设置自动接听");
+        instruction.put(Constant.M_CODE_NEWS, "设置语音播报");
+        instruction.put(Constant.M_CODE_UPLOAD_CALL_RECORD, "上传通话记录");
+        instruction.put(Constant.M_CODE_CONTINUE_GPS, "设置连续定位");
+    }
+
+    /**
+     * 分页查询日志
+     */
+    @GetMapping("listPage.do")
+    public ServerResponse getListPage(MqttLogsIO io) {
+        return ServerResponse.createBySuccess(mqttLogService.getListPage(io));
+    }
+
+    /**
+     * 查询所有的指令
+     */
+    @GetMapping("getInstruction.do")
+    public ServerResponse getInstruction() {
+        return ServerResponse.createBySuccess(instruction);
+    }
+}

+ 1 - 32
src/main/java/com/zy/bms/controller/pc/PcSetController.java

@@ -18,7 +18,7 @@ import java.util.Map;
  * create on 2021/3/3
  */
 @RestController
-@RequestMapping("zy4g/api/pc/set")
+@RequestMapping("bms/api/pc/set")
 public class PcSetController {
 
     @Resource
@@ -29,37 +29,6 @@ public class PcSetController {
     @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();
-    }
-
     /**
      * 发送消息
      */

+ 1 - 1
src/main/java/com/zy/bms/controller/pc/PcUserController.java

@@ -16,7 +16,7 @@ import javax.annotation.Resource;
  * Create on 2020/8/1
  */
 @RestController
-@RequestMapping("zy4g/api/pc/user")
+@RequestMapping("bms/api/pc/user")
 public class PcUserController {
 
     @Resource

+ 1 - 1
src/main/java/com/zy/bms/controller/DeviceController.java → src/main/java/com/zy/bms/controller/wx/DeviceController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.zy.bms.common.controller.BaseController;
 import com.zy.bms.common.ServerResponse;

+ 1 - 1
src/main/java/com/zy/bms/controller/IdiomsController.java → src/main/java/com/zy/bms/controller/wx/IdiomsController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.zy.bms.common.ServerResponse;
 import com.zy.bms.common.controller.BaseController;

+ 1 - 1
src/main/java/com/zy/bms/controller/LocationController.java → src/main/java/com/zy/bms/controller/wx/LocationController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.zy.bms.common.ServerResponse;
 import com.zy.bms.common.controller.BaseController;

+ 1 - 1
src/main/java/com/zy/bms/controller/RelationController.java → src/main/java/com/zy/bms/controller/wx/RelationController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.zy.bms.common.ServerResponse;

+ 1 - 1
src/main/java/com/zy/bms/controller/SetController.java → src/main/java/com/zy/bms/controller/wx/SetController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.zy.bms.common.ServerResponse;
 import com.zy.bms.common.controller.BaseController;

+ 1 - 1
src/main/java/com/zy/bms/controller/SetInfoController.java → src/main/java/com/zy/bms/controller/wx/SetInfoController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.zy.bms.common.ServerResponse;
 import com.zy.bms.common.controller.BaseController;

+ 1 - 1
src/main/java/com/zy/bms/controller/UserController.java → src/main/java/com/zy/bms/controller/wx/UserController.java

@@ -1,4 +1,4 @@
-package com.zy.bms.controller;
+package com.zy.bms.controller.wx;
 
 import com.zy.bms.common.ServerResponse;
 import com.zy.bms.model.User;

+ 11 - 0
src/main/java/com/zy/bms/mapper/MqttLogMapper.java

@@ -1,8 +1,12 @@
 package com.zy.bms.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.bms.common.io.pc.MqttLogsIO;
 import com.zy.bms.model.MqttLog;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 /**
@@ -14,4 +18,11 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface MqttLogMapper extends BaseMapper<MqttLog> {
 
+    /**
+     * 分页查询日志
+     *
+     * @param page 分页参数
+     * @param io   查询条件
+     */
+    IPage<MqttLog> getListPage(Page<MqttLog> page, @Param("io") MqttLogsIO io);
 }

+ 5 - 0
src/main/java/com/zy/bms/model/MqttLog.java

@@ -38,6 +38,11 @@ public class MqttLog {
      */
     private String topic;
 
+    /**
+     * 指令
+     */
+    private Integer instruction;
+
     /**
      * 创建时间
      */

+ 21 - 2
src/main/java/com/zy/bms/model/MqttMsgDto.java

@@ -40,6 +40,13 @@ public class MqttMsgDto {
         this.data = new HashMap<>();
     }
 
+    /**
+     * 由 JSON 字符串 转 MqttMsgDto 对象
+     */
+    public static MqttMsgDto parse(String jsonStr) {
+        return JSON.parseObject(jsonStr, MqttMsgDto.class);
+    }
+
     /**
      * 往data中添加数据 支持链式
      *
@@ -69,13 +76,16 @@ public class MqttMsgDto {
      * 获取String 数据
      */
     public String getString(String key) {
-        return data.get(key).toString();
+        return data.containsKey(key) ? data.get(key).toString() : null;
     }
 
     /**
      * 获取 Integer 数据
      */
     public Integer getInt(String key) {
+        if (!data.containsKey(key) || data.get(key).toString().equals("")) {
+            return null;
+        }
         return Integer.parseInt(data.get(key).toString());
     }
 
@@ -83,6 +93,9 @@ public class MqttMsgDto {
      * 获取 Double 数据
      */
     public Double getDouble(String key) {
+        if (!data.containsKey(key) || data.get(key).toString().equals("")) {
+            return null;
+        }
         return Double.parseDouble(data.get(key).toString());
     }
 
@@ -90,11 +103,17 @@ public class MqttMsgDto {
      * 获取 日期数据 数据
      */
     public LocalDateTime getDate(String key) {
+        if (!data.containsKey(key) || data.get(key).toString().equals("")) {
+            return null;
+        }
         return DateTimeUtil.strToTime(data.get(key).toString());
     }
 
+    /**
+     * 获取设备ID
+     */
     public String getDeviceId() {
         String[] res = r.split("/");
-        return res.length > 1 ? res[1] : "";
+        return res.length > 1 ? res[1] : null;
     }
 }

+ 2 - 2
src/main/java/com/zy/bms/redis/DeviceManager.java

@@ -28,8 +28,8 @@ public class DeviceManager {
      * @param entity 位置信息
      */
     public void saveLocation(DeviceLocation entity) {
-        redisTemplate.opsForValue().set(Constant.REDIS_PREFIX_LOCATION + entity.getDeviceId(),
-                JSON.toJSONString(entity), 24, TimeUnit.MINUTES);
+        redisTemplate.opsForValue()
+                .set(Constant.REDIS_PREFIX_LOCATION + entity.getDeviceId(), JSON.toJSONString(entity), 24, TimeUnit.HOURS);
     }
 
     /**

+ 2 - 1
src/main/java/com/zy/bms/redis/SessionManager.java

@@ -27,7 +27,8 @@ public class SessionManager {
      */
     public String generateToken(Admin admin) {
         String token = CodeGenerator.generateUUID();
-        stringRedisTemplate.opsForValue().set(Constant.REDIS_TOKEN_PREFIX + token, JSON.toJSONString(admin), 30, TimeUnit.MINUTES);
+        stringRedisTemplate.opsForValue()
+                .set(Constant.REDIS_TOKEN_PREFIX + token, JSON.toJSONString(admin), 30, TimeUnit.MINUTES);
         return token;
     }
 

+ 38 - 0
src/main/java/com/zy/bms/service/MqttLogService.java

@@ -1,8 +1,13 @@
 package com.zy.bms.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.common.Constant;
+import com.zy.bms.common.io.pc.MqttLogsIO;
 import com.zy.bms.mapper.MqttLogMapper;
 import com.zy.bms.model.MqttLog;
+import com.zy.bms.model.MqttMsgDto;
 import org.springframework.stereotype.Service;
 
 /**
@@ -14,4 +19,37 @@ import org.springframework.stereotype.Service;
 @Service
 public class MqttLogService extends ServiceImpl<MqttLogMapper, MqttLog> {
 
+    /**
+     * 保存 日志
+     *
+     * @param topic   主题
+     * @param payload 消息内容
+     * @param tag     0收 1发￿
+     */
+    public void saveLog(String topic, String payload, Integer tag) {
+        MqttLog mqttLog = new MqttLog();
+        mqttLog.setTopic(topic);
+        //mqtt日志类型
+        mqttLog.setTag(tag);
+        //获取消息解析对象
+        MqttMsgDto mqttMsgDto = MqttMsgDto.parse(payload);
+        String regTopic = tag == 0 ? Constant.TOPIC_REGISTER_SERVER : Constant.TOPIC_REGISTER_CLIENT;
+        //区分注册报文和普通报文,注册报文取设备随机码
+        mqttLog.setDeviceId(topic.equals(regTopic) ?
+                mqttMsgDto.getString("regnum") : mqttMsgDto.getDeviceId());
+        //mqtt 指令
+        mqttLog.setInstruction(mqttMsgDto.getInt("m"));
+        mqttLog.setContent(payload);
+        baseMapper.insert(mqttLog);
+    }
+
+    /**
+     * 分页查询日志
+     *
+     * @param io 查询条件
+     */
+    public IPage<MqttLog> getListPage(MqttLogsIO io) {
+        Page<MqttLog> page = new Page<>(io.getCurrent(), io.getSize());
+        return baseMapper.getListPage(page, io);
+    }
 }

+ 21 - 113
src/main/java/com/zy/bms/service/SetToDeviceService.java

@@ -1,22 +1,14 @@
 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 com.zy.bms.websocket.WebSocketServer;
 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;
 
@@ -32,29 +24,25 @@ public class SetToDeviceService {
     private MqttGateway mqttGateway;
     @Resource
     private MqttLogService mqttLogService;
+    @Resource
+    private WebSocketServer webSocketServer;
 
     /**
      * 发送消息
      *
-     * @param msg   消息
-     * @param topic 主题
+     * @param payload 消息
+     * @param topic   主题
      */
-    private void sendMsgToMqtt(String msg, String topic) {
-        //存储记录
-        MqttLog mqttLog = new MqttLog();
-        mqttLog.setTopic(topic);
-        mqttLog.setTag(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]);
+    private void sendMsgToMqtt(String topic, String payload) {
+        // 发送消息
+        mqttGateway.sendMsgToMqtt(payload, topic);
+        // 存储消息日志
+        mqttLogService.saveLog(topic, payload, 1);
+        // 消息转发前端webSocket
+        if (!topic.equals(Constant.TOPIC_REGISTER_CLIENT)) {
+            String deviceId = topic.split("/")[1];
+            webSocketServer.massMessage(deviceId, payload);
         }
-        mqttLog.setContent(msg);
-        mqttLogService.save(mqttLog);
-        //发送消息
-        mqttGateway.sendMsgToMqtt(msg, topic);
     }
 
     /**
@@ -69,7 +57,7 @@ public class SetToDeviceService {
         msg.set("msgvol", io.getMsgVol())
                 .set("phonevol", io.getPhoneVol())
                 .set("msgtype", 1);
-        sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(io.getTopic(), msg.toJson());
     }
 
     /**
@@ -81,7 +69,7 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_GPS_RATE, io.getDeviceId());
         msg.set("GPS_rate", io.getGpsRate());
-        sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(io.getTopic(), msg.toJson());
     }
 
     /**
@@ -93,7 +81,7 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_AUTO_ANSWER, io.getDeviceId());
         msg.set("autoanswer", io.getAutoAnswer());
-        sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(io.getTopic(), msg.toJson());
     }
 
     /**
@@ -105,7 +93,7 @@ public class SetToDeviceService {
         msg.set("newstype", io.getNewsType())
                 .set("newstime", io.getNewsTime())
                 .set("news", io.getNews());
-        sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(io.getTopic(), msg.toJson());
     }
 
     /**
@@ -120,7 +108,7 @@ public class SetToDeviceService {
                 .set("key1_phone", io.getKey1Phone())
                 .set("key2_name", io.getKey2Name())
                 .set("key2_phone", io.getKey2Phone());
-        sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(io.getTopic(), msg.toJson());
     }
 
     /**
@@ -130,7 +118,7 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_CONTINUE_GPS, io.getDeviceId());
         msg.set("highfreq", io.getHighFreq());
-        sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(io.getTopic(), msg.toJson());
     }
 
     /**
@@ -147,86 +135,6 @@ 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;
+        sendMsgToMqtt(Constant.TOPIC_REGISTER_CLIENT, msg.toJson());
     }
 }

+ 1 - 1
src/main/resources/application-dev.yml

@@ -22,7 +22,7 @@ spring:
       max-wait-millis: 2000
   # mybatis-plus
 mybatis-plus:
-  type-aliases-package: com.zhiyun.mqtt.model
+  type-aliases-package: com.zy.bms.model
   mapper-locations: classpath:mapper/*.xml
   configuration:
     map-underscore-to-camel-case: false  # close "user_id"  use userId

+ 1 - 1
src/main/resources/application-prod.yml

@@ -24,7 +24,7 @@ spring:
       max-wait-millis: 2000
 # mybatis-plus
 mybatis-plus:
-  type-aliases-package: com.zhiyun.mqtt.model
+  type-aliases-package: com.zy.bms.model
   mapper-locations: classpath:mapper/*.xml
   configuration:
     map-underscore-to-camel-case: false  # close "user_id"  use userId

+ 24 - 0
src/main/resources/mapper/MqttLogMapping.xml

@@ -0,0 +1,24 @@
+<?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">
+<mapper namespace="com.zy.bms.mapper.MqttLogMapper">
+
+    <select id="getListPage" resultType="com.zy.bms.model.MqttLog">
+        SELECT
+        *
+        FROM
+        mqtt_log
+        <where>
+            <if test="io.deviceId != null and io.deviceId != ''">
+                AND deviceId LIKE CONCAT("%",#{io.deviceId},"%")
+            </if>
+            <if test="io.tag != null and io.tag >-1">
+                AND tag = #{io.tag}
+            </if>
+            <if test="io.instruction != null and io.instruction >-1">
+                AND instruction = #{io.instruction}
+            </if>
+        </where>
+    </select>
+</mapper>