Bläddra i källkod

增加mqtt消息日志存储方法

yangxiaokun 4 år sedan
förälder
incheckning
e8ac21064f

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

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

+ 0 - 8
src/main/java/com/zy/bms/config/BeanConfig.java

@@ -16,14 +16,6 @@ import java.time.format.DateTimeFormatter;
  */
 @Configuration
 public class BeanConfig {
-    /**
-     * http请求相关
-     */
-    @Bean
-    public RestTemplate restTemplate() {
-        return new RestTemplate();
-    }
-
     /**
      * LocalDateTime 全局格式化配置
      */

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

@@ -37,6 +37,8 @@ public class MqttCallbackHandler {
     private WebSocketServer webSocketServer;
     @Resource
     private CallRecordsService callRecordsService;
+    @Resource
+    private MqttLogService mqttLogService;
 
     /**
      * 处理消息
@@ -45,13 +47,12 @@ public class MqttCallbackHandler {
      * @param payload 消息内容
      */
     void handle(String topic, String payload) {
-        System.out.println(payload);
-        System.out.println("-------------------------------------------------------------------------");
-        if (topic.contains("/")) {
-            webSocketServer.massMessage(topic.split("/")[1], payload);
-        }
+        //存储日志
+        saveLog(topic, payload);
         //消息返回JSON转Object
         MqttMsgDto msgObject = JSON.parseObject(payload, MqttMsgDto.class);
+        //转发消息至网页
+        webSocketServer.massMessage(msgObject.getDeviceId(), payload);
         //根据报文标识代码 M 处理消息
         switch (msgObject.getM()) {
             case Constant.M_CODE_REGISTER://设备端注册报文
@@ -99,7 +100,7 @@ public class MqttCallbackHandler {
      */
     private void uploadCallRecordsHandler(MqttMsgDto obj) {
         CallRecords callRecords = new CallRecords();
-        callRecords.setDeviceId(obj.getR().split("/")[1]);
+        callRecords.setDeviceId(obj.getDeviceId());
         callRecords.setCallType(obj.getInt("type"));
         callRecords.setKeyNum(obj.getString("key"));
         callRecords.setPhoneNum(obj.getString("phnoenum"));
@@ -121,7 +122,9 @@ public class MqttCallbackHandler {
         device.setPassword(MD5Util.MD5Encode(clientId));
         device.setGroupId(1);
         deviceService.save(device);
-        setBaseService.initSetBase(device.getClientId());
+        SetBase setBase = new SetBase();
+        setBase.setDeviceId(device.getClientId());
+        setBaseService.save(setBase);
         return device;
     }
 
@@ -153,4 +156,19 @@ public class MqttCallbackHandler {
             throw new ApiRuntimeException("处理设备上传位置定位信息出错");
         }
     }
+
+    /**
+     * 存储 收发 日志
+     *
+     * @param topic   主题
+     * @param payload 消息
+     */
+    private void saveLog(String topic, String payload) {
+        MqttLog mqttLog = new MqttLog();
+        mqttLog.setTopic(topic);
+        mqttLog.setTag(0);
+        mqttLog.setDeviceId(topic.split("/")[1]);
+        mqttLog.setContent(payload);
+        mqttLogService.save(mqttLog);
+    }
 }

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

@@ -0,0 +1,17 @@
+package com.zy.bms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.bms.model.MqttLog;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * MQTT 收发日志 Mapper
+ * <p>
+ * Create on 2020/4/10
+ */
+@Mapper
+@Repository
+public interface MqttLogMapper extends BaseMapper<MqttLog> {
+
+}

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

@@ -0,0 +1,45 @@
+package com.zy.bms.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * mqtt消息收发记录
+ *
+ * @author yang xiao kun
+ * create on 2021/4/14
+ */
+@Data
+@TableName("mqtt_log")
+public class MqttLog {
+    @TableId
+    private Integer id;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 类型
+     */
+    private Integer tag;
+
+    /**
+     * 发送内容
+     */
+    private String content;
+
+    /**
+     * 主题
+     */
+    private String topic;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

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

@@ -0,0 +1,17 @@
+package com.zy.bms.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.mapper.MqttLogMapper;
+import com.zy.bms.model.MqttLog;
+import org.springframework.stereotype.Service;
+
+/**
+ * MQTT 收发日志 Service
+ *
+ * @author chenyi
+ * Create on 2020/4/10
+ */
+@Service
+public class MqttLogService extends ServiceImpl<MqttLogMapper, MqttLog> {
+
+}

+ 0 - 13
src/main/java/com/zy/bms/service/SetBaseService.java

@@ -28,19 +28,6 @@ public class SetBaseService extends ServiceImpl<SetBaseMapper, SetBase> {
         return baseMapper.selectOne(queryWrapper);
     }
 
-    /**
-     * 设备刚注册时,调用此方法,初始化创建设置相关关联关系
-     *
-     * @param deviceId 设备ID
-     */
-    public void initSetBase(String deviceId) {
-        QueryWrapper<SetBase> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("deviceId", deviceId);
-        SetBase setBase = new SetBase();
-        setBase.setDeviceId(deviceId);
-        this.saveOrUpdate(setBase, queryWrapper);
-    }
-
     /**
      * 获取音量设置信息
      */

+ 30 - 9
src/main/java/com/zy/bms/service/SetToDeviceService.java

@@ -3,6 +3,7 @@ package com.zy.bms.service;
 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 org.springframework.stereotype.Component;
@@ -21,6 +22,26 @@ import java.util.Map;
 public class SetToDeviceService {
     @Resource
     private MqttGateway mqttGateway;
+    @Resource
+    private MqttLogService mqttLogService;
+
+    /**
+     * 发送消息
+     *
+     * @param msg   消息
+     * @param topic 主题
+     */
+    private void sendMsgToMqtt(String msg, String topic) {
+        //存储记录
+        MqttLog mqttLog = new MqttLog();
+        mqttLog.setTopic(topic);
+        mqttLog.setTag(1);
+        mqttLog.setDeviceId(topic.split("/")[1]);
+        mqttLog.setContent(msg);
+        mqttLogService.save(mqttLog);
+        //发送消息
+        mqttGateway.sendMsgToMqtt(msg, topic);
+    }
 
     /**
      * 设置音量
@@ -34,7 +55,7 @@ public class SetToDeviceService {
         msg.set("msgvol", io.getMsgVol())
                 .set("phonevol", io.getPhoneVol())
                 .set("msgtype", 1);
-        mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
     /**
@@ -46,7 +67,7 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_GPS_RATE, io.getDeviceId());
         msg.set("GPS_rate", io.getGpsRate());
-        mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
     /**
@@ -58,7 +79,7 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_AUTO_ANSWER, io.getDeviceId());
         msg.set("autoanswer", io.getAutoAnswer());
-        mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
     /**
@@ -70,7 +91,7 @@ public class SetToDeviceService {
         msg.set("newstype", io.getNewsType())
                 .set("newstime", io.getNewsTime())
                 .set("news", io.getNews());
-        mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
     /**
@@ -85,7 +106,7 @@ public class SetToDeviceService {
                 .set("key1_phone", io.getKey1Phone())
                 .set("key2_name", io.getKey2Name())
                 .set("key2_phone", io.getKey2Phone());
-        mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
     /**
@@ -95,7 +116,7 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto(Constant.M_CODE_CONTINUE_GPS, io.getDeviceId());
         msg.set("highfreq", io.getHighFreq());
-        mqttGateway.sendMsgToMqtt(msg.toJson(), io.getTopic());
+        sendMsgToMqtt(msg.toJson(), io.getTopic());
     }
 
     /**
@@ -105,13 +126,13 @@ public class SetToDeviceService {
         //发送模板消息给设备
         MqttMsgDto msg = new MqttMsgDto();
         msg.setM(Constant.M_CODE_RETURN_CODE);
-        msg.setR("$regdtx");
-        msg.setT("$regdrx");
+        msg.setR(Constant.TOPIC_REGISTER_CLIENT);
+        msg.setT(Constant.TOPIC_REGISTER_SERVER);
         Map<String, Object> data = new HashMap<>();
         data.put("regnum", device.getNum());
         data.put("deviceid", device.getClientId());
         data.put("password", device.getPassword());
         msg.setData(data);
-        mqttGateway.sendMsgToMqtt(msg.toJson(), Constant.TOPIC_REGISTER_CLIENT);
+        sendMsgToMqtt(msg.toJson(), Constant.TOPIC_REGISTER_CLIENT);
     }
 }

+ 167 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,167 @@
+<!--<?xml version="1.0" encoding="UTF-8"?>-->
+<!--&lt;!&ndash; 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 &ndash;&gt;-->
+<!--&lt;!&ndash; scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true &ndash;&gt;-->
+<!--&lt;!&ndash; scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 &ndash;&gt;-->
+<!--&lt;!&ndash; debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 &ndash;&gt;-->
+<!--<configuration scan="true" scanPeriod="10 seconds">-->
+
+<!--    <contextName>Logback For Boss</contextName>-->
+<!--    &lt;!&ndash; name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 &ndash;&gt;-->
+<!--    <property name="log.path" value="F:/locakback"/>-->
+<!--    &lt;!&ndash; 定义日志文件 输入位置 &ndash;&gt;-->
+<!--    <property name="logDir" value="F:/logbak"/>-->
+<!--    &lt;!&ndash; 日志最大的历史 30天 &ndash;&gt;-->
+<!--    <property name="maxHistory" value="30"/>-->
+
+
+<!--    &lt;!&ndash; 控制台输出日志 &ndash;&gt;-->
+<!--    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">-->
+<!--        <encoder>-->
+<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern>-->
+<!--            <charset class="java.nio.charset.Charset">UTF-8</charset>-->
+<!--        </encoder>-->
+<!--    </appender>-->
+
+
+<!--    &lt;!&ndash; ERROR级别日志 &ndash;&gt;-->
+<!--    <appender name="ERROR"-->
+<!--              class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
+<!--            <level>ERROR</level>-->
+<!--            <onMatch>ACCEPT</onMatch>-->
+<!--            <onMismatch>DENY</onMismatch>-->
+<!--        </filter>-->
+<!--        <rollingPolicy-->
+<!--                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
+<!--            <fileNamePattern>${logDir}\%d{yyyyMMdd}\error.log</fileNamePattern>-->
+<!--            <maxHistory>${maxHistory}</maxHistory>-->
+<!--        </rollingPolicy>-->
+<!--        <encoder>-->
+<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - -->
+<!--                %msg%n-->
+<!--            </pattern>-->
+<!--            <charset class="java.nio.charset.Charset">UTF-8</charset>-->
+<!--        </encoder>-->
+<!--        <append>false</append>-->
+<!--        <prudent>false</prudent>-->
+<!--    </appender>-->
+
+<!--    &lt;!&ndash; WARN级别日志 &ndash;&gt;-->
+<!--    <appender name="WARN"-->
+<!--              class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
+<!--            <level>WARN</level>-->
+<!--            <onMatch>ACCEPT</onMatch>-->
+<!--            <onMismatch>DENY</onMismatch>-->
+<!--        </filter>-->
+<!--        <rollingPolicy-->
+<!--                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
+<!--            <fileNamePattern>${logDir}\%d{yyyyMMdd}\warn.log</fileNamePattern>-->
+<!--            <maxHistory>${maxHistory}</maxHistory>-->
+<!--        </rollingPolicy>-->
+<!--        <encoder>-->
+<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern>-->
+<!--            <charset class="java.nio.charset.Charset">UTF-8</charset>-->
+<!--        </encoder>-->
+<!--        <append>false</append>-->
+<!--        <prudent>false</prudent>-->
+<!--    </appender>-->
+
+<!--    &lt;!&ndash; INFO级别日志 &ndash;&gt;-->
+<!--    <appender name="INFO"-->
+<!--              class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
+<!--            <level>INFO</level>-->
+<!--            <onMatch>ACCEPT</onMatch>-->
+<!--            <onMismatch>DENY</onMismatch>-->
+<!--        </filter>-->
+<!--        <rollingPolicy-->
+<!--                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
+<!--            <fileNamePattern>${logDir}\%d{yyyyMMdd}\info.log</fileNamePattern>-->
+<!--            <maxHistory>${maxHistory}</maxHistory>-->
+<!--        </rollingPolicy>-->
+<!--        <encoder>-->
+<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern>-->
+<!--            <charset class="java.nio.charset.Charset">UTF-8</charset>-->
+<!--        </encoder>-->
+<!--        <append>false</append>-->
+<!--        <prudent>false</prudent>-->
+<!--    </appender>-->
+
+<!--    &lt;!&ndash; DEBUG级别日志 &ndash;&gt;-->
+<!--    <appender name="DEBUG"-->
+<!--              class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
+<!--            <level>DEBUG</level>-->
+<!--            <onMatch>ACCEPT</onMatch>-->
+<!--            <onMismatch>DENY</onMismatch>-->
+<!--        </filter>-->
+<!--        <rollingPolicy-->
+<!--                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
+<!--            <fileNamePattern>${logDir}\%d{yyyyMMdd}\debug.log</fileNamePattern>-->
+<!--            <maxHistory>${maxHistory}</maxHistory>-->
+<!--        </rollingPolicy>-->
+<!--        <encoder>-->
+<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern>-->
+<!--            <charset class="java.nio.charset.Charset">UTF-8</charset>-->
+<!--        </encoder>-->
+<!--        <append>false</append>-->
+<!--        <prudent>false</prudent>-->
+<!--    </appender>-->
+
+<!--    &lt;!&ndash;文件日志, 按照每天生成日志文件 &ndash;&gt;-->
+<!--    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
+<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
+<!--            &lt;!&ndash;日志文件输出的文件名&ndash;&gt;-->
+<!--            <FileNamePattern>${logDir}/%d{yyyyMMdd}/boss.%d{yyyy-MM-dd}.log</FileNamePattern>-->
+<!--            &lt;!&ndash;日志文件保留天数&ndash;&gt;-->
+<!--            <MaxHistory>30</MaxHistory>-->
+<!--        </rollingPolicy>-->
+<!--        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
+<!--            &lt;!&ndash;格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符&ndash;&gt;-->
+<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
+<!--        </encoder>-->
+<!--        &lt;!&ndash;日志文件最大的大小&ndash;&gt;-->
+<!--        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
+<!--            <MaxFileSize>10MB</MaxFileSize>-->
+<!--        </triggeringPolicy>-->
+<!--    </appender>-->
+
+<!--    &lt;!&ndash; 异步输出 &ndash;&gt;-->
+<!--    <appender name="dayLogAsyncAppender" class="ch.qos.logback.classic.AsyncAppender">-->
+<!--        <includeCallerData>true</includeCallerData>-->
+<!--        &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
+<!--        <discardingThreshold>0</discardingThreshold>-->
+<!--        &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
+<!--        <queueSize>512</queueSize>-->
+<!--        <appender-ref ref="FILE"/>-->
+<!--    </appender>-->
+
+<!--    &lt;!&ndash;专为 spring 定制-->
+<!--     &ndash;&gt;-->
+<!--    <logger name="org.springframework" level="info"/>-->
+<!--    &lt;!&ndash; show parameters for hibernate sql 专为 Hibernate 定制 &ndash;&gt;-->
+<!--    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>-->
+<!--    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG"/>-->
+<!--    <logger name="org.hibernate.SQL" level="DEBUG"/>-->
+<!--    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>-->
+<!--    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG"/>-->
+
+<!--    &lt;!&ndash;myibatis log configure&ndash;&gt;-->
+<!--    &lt;!&ndash;-->
+<!--    <logger name="com.apache.ibatis" level="TRACE"/>-->
+<!--    <logger name="java.sql.Connection" level="DEBUG"/>-->
+<!--    <logger name="java.sql.Statement" level="DEBUG"/>-->
+<!--    <logger name="java.sql.PreparedStatement" level="DEBUG"/>-->
+<!--     &ndash;&gt;-->
+<!--    &lt;!&ndash; root级别 DEBUG &ndash;&gt;-->
+<!--    <root level="INFO">-->
+<!--        &lt;!&ndash; 控制台输出 &ndash;&gt;-->
+<!--        <appender-ref ref="STDOUT"/>-->
+<!--        &lt;!&ndash; 文件输出 &ndash;&gt;-->
+<!--        <appender-ref ref="ERROR"/>-->
+<!--        <appender-ref ref="INFO"/>-->
+<!--        <appender-ref ref="WARN"/>-->
+<!--        <appender-ref ref="DEBUG"/>-->
+<!--    </root>-->
+<!--</configuration>-->