klzhangweiya 2 rokov pred
rodič
commit
c45a005720
32 zmenil súbory, kde vykonal 878 pridanie a 130 odobranie
  1. 1 1
      VB_DSM_V2.1/Scripts/Dockers/docker-compose-iwb.yml
  2. 0 13
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/VbdsmIotApplication.java
  3. 0 16
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/entity/User.java
  4. 0 16
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/model/ClientLoginDto.java
  5. 0 32
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/web/MqttController.java
  6. 0 12
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/resources/application-dev.yml
  7. 33 0
      iwb-iot-project/.gitignore
  8. 50 37
      iwb-iot-project/pom.xml
  9. 25 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/IwbIotProjectApplication.java
  10. 19 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/BaseResponse.java
  11. 22 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/CodeEnum.java
  12. 1 1
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/Constant.java
  13. 51 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/MqResponse/LoginResp.java
  14. 52 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/ResponseData.java
  15. 32 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/config/MqttConfig.java
  16. 44 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/config/SwaggerConfig.java
  17. 77 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/controller/MqttController.java
  18. 22 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/entity/Terminal.java
  19. 25 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/entity/User.java
  20. 13 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/mapper/UserMapper.java
  21. 46 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/model/AuthClientDto.java
  22. 17 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/model/ClientLoginDto.java
  23. 16 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/model/TopicMsgDto.java
  24. 32 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqCallback.java
  25. 179 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqttConnect.java
  26. 9 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/service/IPayloadService.java
  27. 24 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/utils/Md5Util.java
  28. 29 0
      iwb-iot-project/src/main/resources/application-dev.yml
  29. 0 0
      iwb-iot-project/src/main/resources/application.yml
  30. 57 0
      iwb-iot-project/src/main/resources/logback.xml
  31. 0 0
      iwb-iot-project/src/main/resources/static/index.html
  32. 2 2
      iwb-iot-project/src/test/java/com/iwbnet/iot/IwbIotProjectApplicationTests.java

+ 1 - 1
VB_DSM_V2.1/Scripts/Dockers/docker-compose-iwb.yml

@@ -297,7 +297,7 @@ services:
       - "18888:7110"
     environment:
       TZ: Asia/Shanghai
-      PARAMS: --server.port=7110 --vbdsm.ws.url=http://192.168.0.81:7101/services/UploadData?wsdl;http://192.168.0.81:7102/services/UploadData?wsdl --vbdsm.monitor.terminals=3@YC0001,YC0002&7@YD001_01,YD001_02&9@YD002_01,YD002_02&10@YD003_01
+      PARAMS: --server.port=7110 --vbdsm.ws.url=http://192.168.0.81:7101/services/UploadData?wsdl --vbdsm.monitor.terminals=3@YC0001,YC0002&7@YD001_01,YD001_02&9@YD002_01,YD002_02&10@YD003_01
     volumes:
       # 日志文件
       - /home/iwb/vbdsm/server-logs/hj212-upload-mockdata/:/vbdsm/logs/

+ 0 - 13
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/VbdsmIotApplication.java

@@ -1,13 +0,0 @@
-package cn.vbdsm.iot;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class VbdsmIotApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(VbdsmIotApplication.class, args);
-    }
-
-}

+ 0 - 16
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/entity/User.java

@@ -1,16 +0,0 @@
-package cn.vbdsm.iot.entity;
-
-import lombok.Data;
-
-@Data
-public class User {
-
-    private Long id;
-
-    private String username;
-
-    private String password;
-
-    private Integer status;
-
-}

+ 0 - 16
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/model/ClientLoginDto.java

@@ -1,16 +0,0 @@
-package cn.vbdsm.iot.model;
-
-
-import lombok.Data;
-
-@Data
-public class ClientLoginDto {
-
-    private String username;
-
-    private String password;
-
-    private String clientId;
-
-
-}

+ 0 - 32
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/web/MqttController.java

@@ -1,32 +0,0 @@
-package cn.vbdsm.iot.web;
-
-import cn.vbdsm.iot.model.ClientLoginDto;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.PostConstruct;
-import java.util.HashMap;
-import java.util.Map;
-
-@RestController
-@RequestMapping("/mqtt")
-public class MqttController {
-
-
-//    @PostConstruct
-//    public void init(){
-//
-//    }
-
-    @PostMapping("/login")
-    public ResponseEntity authentication(@RequestBody ClientLoginDto client){
-        System.out.println("clientId:"+client.getClientId());
-        System.out.println("username:"+client.getUsername());
-        System.out.println("password:"+client.getPassword());
-
-        return ResponseEntity.badRequest().build();
-    }
-}

+ 0 - 12
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/resources/application-dev.yml

@@ -1,12 +0,0 @@
-#mybatis:
-#    mapper-locations: classpath:mappers/*xml
-#    type-aliases-package: cn.vbdsm.vbdsmhj212iot.mybatis.entity
-server:
-  port: 5080
-# DataSource Config
-spring:
-  datasource:
-    type: com.alibaba.druid.pool.DruidDataSource
-    url: jdbc:mysql://47.112.30.247:43308/iot_com?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
-    username: root
-    password: 123456

+ 33 - 0
iwb-iot-project/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 50 - 37
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/pom.xml → iwb-iot-project/pom.xml

@@ -2,11 +2,11 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>cn.vbdsm</groupId>
-    <artifactId>vbdsm-hj212-iot</artifactId>
-    <version>2.1.0</version>
-    <name>vbdsm-hj212-iot</name>
-
+    <groupId>com.iwbnet</groupId>
+    <artifactId>iwb-iot-project</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>iwb-iot-project</name>
+    <description>iwb-iot-project</description>
     <properties>
         <java.version>1.8</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -14,59 +14,72 @@
         <spring-boot.version>2.6.13</spring-boot.version>
     </properties>
     <dependencies>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+
         <dependency>
-            <groupId>com.mybatis-flex</groupId>
-            <artifactId>mybatis-flex-spring-boot-starter</artifactId>
-            <version>1.6.7</version>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.2.2</version>
         </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
             <version>1.2.16</version>
         </dependency>
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.8.20</version>
-        </dependency>
         <dependency>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.20</version>
+        </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.32</version>
         </dependency>
-    </dependencies>
-<!--    <dependencyManagement>-->
-<!--        <dependencies>-->
-<!--            <dependency>-->
-<!--                <groupId>org.springframework.boot</groupId>-->
-<!--                <artifactId>spring-boot-dependencies</artifactId>-->
-<!--                <version>${spring-boot.version}</version>-->
-<!--                <type>pom</type>-->
-<!--                <scope>import</scope>-->
-<!--            </dependency>-->
-<!--        </dependencies>-->
-<!--    </dependencyManagement>-->
-    <parent>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-dependencies</artifactId>
-        <version>2.6.13</version>
-        <relativePath/>
-    </parent>
 
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+            <version>5.5.14</version>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
 
     <build>
         <plugins>
@@ -83,10 +96,10 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-<!--                <version>${spring-boot.version}</version>-->
+                <version>${spring-boot.version}</version>
                 <configuration>
-                    <mainClass>cn.vbdsm.iot.VbdsmIotApplication</mainClass>
-                    <fork>true</fork>
+                    <mainClass>com.iwbnet.iot.IwbIotProjectApplication</mainClass>
+                    <skip>true</skip>
                 </configuration>
                 <executions>
                     <execution>

+ 25 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/IwbIotProjectApplication.java

@@ -0,0 +1,25 @@
+package com.iwbnet.iot;
+
+import com.iwbnet.iot.mqtt.MqttConnect;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("com.iwbnet.iot.mapper")
+public class IwbIotProjectApplication implements CommandLineRunner {
+    @Autowired
+    private MqttConnect mqttConnect;
+
+    public static void main(String[] args) {
+        SpringApplication.run(IwbIotProjectApplication.class, args);
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        //程序启动时候,创建一个mqtt连接
+        mqttConnect.connect("", "", null);
+    }
+}

+ 19 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/BaseResponse.java

@@ -0,0 +1,19 @@
+package com.iwbnet.iot.common;
+
+import lombok.Data;
+
+@Data
+public class BaseResponse {
+    /**
+     * 状态码
+     */
+    private Integer code;
+
+
+
+    protected BaseResponse(CodeEnum code) {
+        this.code = code.getCode();
+
+    }
+
+}

+ 22 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/CodeEnum.java

@@ -0,0 +1,22 @@
+package com.iwbnet.iot.common;
+
+public enum CodeEnum {
+    SUCCESS(200),
+    FAIL(500),
+    ;
+
+    private final Integer code;
+
+
+
+    CodeEnum(Integer code) {
+        this.code = code;
+
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+
+}

+ 1 - 1
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/java/cn/vbdsm/iot/common/Constant.java → iwb-iot-project/src/main/java/com/iwbnet/iot/common/Constant.java

@@ -1,4 +1,4 @@
-package cn.vbdsm.iot.common;
+package com.iwbnet.iot.common;
 
 public class Constant {
 

+ 51 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/MqResponse/LoginResp.java

@@ -0,0 +1,51 @@
+package com.iwbnet.iot.common.MqResponse;
+
+import lombok.Data;
+
+
+
+public class LoginResp {
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public boolean isIs_superuser() {
+        return is_superuser;
+    }
+
+    public void setIs_superuser(boolean is_superuser) {
+        this.is_superuser = is_superuser;
+    }
+
+    private String result;
+
+    private boolean is_superuser;
+    public LoginResp(String result) {
+        this.result = result;
+    }
+    public LoginResp(String result, boolean is_superuser) {
+        this.result = result;
+        this.is_superuser = is_superuser;
+    }
+
+    public static LoginResp allow(boolean is_superuser) {
+        return new LoginResp("allow", is_superuser);
+    }
+    public static LoginResp allow( ) {
+        return new LoginResp("allow");
+    }
+    public static LoginResp deny(boolean is_superuser) {
+        return new LoginResp("deny", is_superuser);
+    }
+    public static LoginResp deny() {
+        return new LoginResp("deny");
+    }
+    public static LoginResp ignore(boolean is_superuser) {
+        return new LoginResp("ignore", is_superuser);
+    }
+
+}

+ 52 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/ResponseData.java

@@ -0,0 +1,52 @@
+package com.iwbnet.iot.common;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ResponseData<T> extends BaseResponse {
+    /**
+     * 数据
+     */
+    private T data;
+
+
+    private String msg;
+
+    private ResponseData(CodeEnum code) {
+        super(code);
+    }
+
+    private ResponseData(CodeEnum code, T data) {
+        super(code);
+        this.data = data;
+    }
+    private ResponseData(CodeEnum code, T data,String msg) {
+        super(code);
+        this.data = data;
+        this.msg = msg;
+    }
+
+    /**
+     * 对外开放基础响应体已供调用,可用于增、删、改接口操作
+     */
+    public static BaseResponse out(CodeEnum code) {
+        return new BaseResponse(code);
+    }
+
+    /**
+     * 对外开放数据响应体已供调用,可用于查询数据实用,引用了范型设计,支持各种数据类型
+     */
+    public static <T> ResponseData<T> out(CodeEnum code, T data) {
+        return new ResponseData<>(code, data);
+    }
+    public static <T> ResponseData<T> success(T data) {
+        return new ResponseData<>(CodeEnum.SUCCESS, data);
+    }
+
+    public static <T> ResponseData<T> fail(T data,String msg) {
+        return new ResponseData<>(CodeEnum.FAIL, data,msg);
+    }
+}

+ 32 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/config/MqttConfig.java

@@ -0,0 +1,32 @@
+package com.iwbnet.iot.config;
+
+import cn.hutool.core.collection.CollectionUtil;
+import lombok.Data;
+import lombok.var;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "mqtt")
+public class MqttConfig {
+    private String host;
+
+    private String username;
+
+    private String password;
+
+    private String clientId;
+
+    private String sub;
+
+
+    public String[] getInitSub() {
+        if(this.getSub() == null) {
+            return null;
+        }
+        return this.getSub().split(",");
+    }
+}

+ 44 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/config/SwaggerConfig.java

@@ -0,0 +1,44 @@
+package com.iwbnet.iot.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableOpenApi
+public class SwaggerConfig {
+        /**
+     * 用于读取配置文件 application.properties 中 swagger 属性是否开启
+     */
+    @Value("${swagger.enabled}")
+    Boolean swaggerEnabled;
+    @Bean
+    public Docket desertsApi(){
+        return new Docket(DocumentationType.OAS_30)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.iwbnet.iot.controller"))
+                .paths(PathSelectors.any())
+                .build()
+                .groupName("iotServerGroup")
+                .enable(swaggerEnabled);
+    }
+
+    private ApiInfo apiInfo(){
+        return new ApiInfoBuilder()
+                .title("IOT-HTTP-TEST-Swagger3文档")
+                .description("文档描述信息")
+                .contact(new Contact("IWBNET-IOT", "#", "IWBNET@qq.com"))
+                .version("1.0")
+                .build();
+    }
+}

+ 77 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/controller/MqttController.java

@@ -0,0 +1,77 @@
+package com.iwbnet.iot.controller;
+
+import com.alibaba.fastjson2.JSON;
+import com.iwbnet.iot.common.MqResponse.LoginResp;
+import com.iwbnet.iot.common.ResponseData;
+import com.iwbnet.iot.entity.User;
+import com.iwbnet.iot.model.AuthClientDto;
+import com.iwbnet.iot.model.ClientLoginDto;
+import com.iwbnet.iot.model.TopicMsgDto;
+import com.iwbnet.iot.mqtt.MqttConnect;
+import com.iwbnet.iot.utils.Md5Util;
+import io.swagger.annotations.Api;
+import com.iwbnet.iot.mapper.UserMapper;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Api(tags = "mqtt-API")
+@RestController
+@RequestMapping("/mqtt")
+public class MqttController {
+    @Autowired
+    private UserMapper userMapper;
+
+
+    @Autowired
+    private MqttConnect mqttConnect;
+
+    @ApiOperation("认证")
+    @PostMapping(value = "/login",produces = "application/json")
+    public LoginResp authentication(@ApiParam(value = "访问设备客户端用户") @RequestBody ClientLoginDto client){
+        log.info("client:{},username:{},pwd:{},发起连接...",
+                client.getClientId(),client.getUsername(),client.getPassword());
+
+        User user = userMapper.selectUserByUsername(client.getUsername());
+        if(user==null){
+            return LoginResp.deny(false);
+        }
+        String password = user.getPassword().trim();
+        if(!password.equals(Md5Util.getMD5Str(client.getPassword()))){
+            return LoginResp.deny(false);
+        }
+        return LoginResp.allow(user.getIsSuperuser() == 1);
+
+    }
+    @ApiOperation("鉴权")
+    @PostMapping(value = "/auth",produces = "application/json")
+    public LoginResp auth(@RequestBody AuthClientDto client){
+        String jsonString = JSON.toJSONString(client);
+        log.info(jsonString);
+        return LoginResp.allow();
+    }
+
+    @ApiOperation("订阅主题")
+    @GetMapping(value = "/sub")
+    public ResponseData sub(@ApiParam(value = "主题",readOnly = true) @RequestParam(value = "topic") String topic){
+        log.info("订阅主题:{}",topic);
+        if (!mqttConnect.isConnect()) {
+            mqttConnect.connect("", "", null);
+        }
+        return  ResponseData.success(topic+ (mqttConnect.sub(topic)?"订阅成功":"订阅失败"));
+    }
+
+    @ApiOperation("发布主题payload")
+    @PostMapping(value = "/pub")
+    public ResponseData pub(@ApiParam(value = "主题+payload",required = true) @RequestBody TopicMsgDto input){
+        log.info("发布主题:{}",JSON.toJSONString(input));
+        if (!mqttConnect.isConnect()) {
+            mqttConnect.connect("", "", null);
+        }
+        return  ResponseData.success((mqttConnect.pub(input)?"发布成功":"发布失败"));
+    }
+
+}

+ 22 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/entity/Terminal.java

@@ -0,0 +1,22 @@
+package com.iwbnet.iot.entity;
+
+ import lombok.Data;
+
+@Data
+//@Table("t_terminal")
+public class Terminal {
+    //@Id(keyType = KeyType.Auto)
+    private Long id;
+
+    private String clientId;
+
+    private Long userId;
+
+    private String terminalName;
+
+    private String terminalCode;
+
+    private Integer terminalType;
+
+    private Integer terminalStatus;
+}

+ 25 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/entity/User.java

@@ -0,0 +1,25 @@
+package com.iwbnet.iot.entity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.Getter;
+
+//设备厂家账号信息
+@Getter
+//@Table("t_user")
+@ApiModel(value = "User", description = "设备厂家账号信息")
+public class User {
+    //@Id(keyType = KeyType.Auto)
+    private Long id;
+
+    private String username;
+
+    private String password;
+
+    private Integer status;
+
+    private Integer isSuperuser;
+
+
+
+}

+ 13 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/mapper/UserMapper.java

@@ -0,0 +1,13 @@
+package com.iwbnet.iot.mapper;
+
+import com.iwbnet.iot.entity.User;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface UserMapper {
+
+
+    @Select("select * from t_user where username = #{username}")
+    public User selectUserByUsername(String username);
+}

+ 46 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/model/AuthClientDto.java

@@ -0,0 +1,46 @@
+package com.iwbnet.iot.model;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+ @ApiModel("mqtt认证实体")
+@Data
+public class AuthClientDto {
+    //${clientid}: 客户端的 ID
+//    ${username}: 客户端登录时用的用户名
+//    ${peerhost}: 客户端的源 IP 地址
+//    ${proto_name}: 客户端使用的协议名称。例如 MQTT,CoAP 等
+//    ${mountpoint}: 网关监听器的挂载点(主题前缀)
+//    ${action}: 当前执行的动作请求,例如 publish,subscribe
+//    ${topic}: 当前请求想要发布或订阅的主题(或主题过滤器)
+//    ${qos}: 当前请求想要发布或订阅的消息 QoS
+//    ${retain}: 当前请求想要发布的消息是否为保留消息
+    @ApiModelProperty("客户端的ID")
+    private String clientId;
+
+    @ApiModelProperty("客户端登录时用的用户名")
+    private String username;
+
+    @ApiModelProperty("当前请求想要发布或订阅的主题(或主题过滤器)")
+    private String topic;
+
+    @ApiModelProperty("当前执行的动作请求,例如publish,subscribe")
+    private String action;
+
+    @ApiModelProperty("客户端的源IP地址")
+    private String peerHost;
+
+    @ApiModelProperty("客户端使用的协议名称。例如 MQTT,CoAP 等")
+    private String protoName;
+
+    // @ApiModelProperty("网关监听器的挂载点(主题前缀)")
+    private String mountPoint;
+
+    @ApiModelProperty("当前请求想要发布或订阅的消息 QoS")
+    private String qos;
+
+    @ApiModelProperty("当前请求想要发布的消息是否为保留消息")
+    private String retain;
+
+}

+ 17 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/model/ClientLoginDto.java

@@ -0,0 +1,17 @@
+package com.iwbnet.iot.model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("mqtt登录请求")
+@Data
+public class ClientLoginDto {
+     @ApiModelProperty("用户名")
+    private String username;
+
+      @ApiModelProperty("密码")
+    private String password;
+
+      @ApiModelProperty("客户端Id")
+    private String clientId;
+}

+ 16 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/model/TopicMsgDto.java

@@ -0,0 +1,16 @@
+package com.iwbnet.iot.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("mqtt订阅主题实体类")
+@Data
+public class TopicMsgDto {
+     @ApiModelProperty("主题")
+    private String topic;
+    @ApiModelProperty("消息信息")
+    private String payload;
+     @ApiModelProperty("QoS等级,0为至多一次,1为至少一次,2为确保只有一次")
+    private int qos;
+}

+ 32 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqCallback.java

@@ -0,0 +1,32 @@
+package com.iwbnet.iot.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+@Slf4j
+public class MqCallback implements MqttCallback{
+    /**
+     * MQTT 断开连接会执行此方法
+     */
+    @Override
+    public void connectionLost(Throwable throwable) {
+        log.info("断开了MQTT连接 :{}", throwable.getMessage());
+        log.error(throwable.getMessage(), throwable);
+    }
+    /**
+     * subscribe订阅后得到的消息会执行到这里
+     */
+    @Override
+    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
+        log.info("收到来自 " + topic + " 的消息:{}", new String(mqttMessage.getPayload()));
+    }
+    /**
+     * publish发布成功后会执行到这里
+     */
+    @Override
+    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
+        log.info("发布消息成功");
+    }
+}

+ 179 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqttConnect.java

@@ -0,0 +1,179 @@
+package com.iwbnet.iot.mqtt;
+
+import com.alibaba.fastjson2.JSON;
+import com.iwbnet.iot.config.MqttConfig;
+import com.iwbnet.iot.model.TopicMsgDto;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+
+
+@Slf4j
+@Component
+public class MqttConnect {
+
+    @Autowired
+    private MqttConfig mqttConfig;
+
+    private MqttClient mqttClient;
+
+
+    public boolean isConnect() {
+        return mqttClient.isConnected();
+    }
+        /**
+     * 客户端connect连接mqtt服务器
+     *
+     * @param userName     用户名
+     * @param passWord     密码
+     * @param mqttCallback 回调函数
+     **/
+    public void connect(String userName, String passWord, MqttCallback mqttCallback){
+        if(userName.equals("") || passWord.equals("")) {
+            userName = mqttConfig.getUsername();
+            passWord = mqttConfig.getPassword();
+        }
+
+        try {
+            MqttConnectOptions options = mqttConnectOptions(userName, passWord);
+            if (mqttCallback == null) {
+                mqttClient.setCallback(new MqCallback());
+            } else {
+                mqttClient.setCallback(mqttCallback);
+            }
+            mqttClient.connect(options);
+        } catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 订阅默认主题
+     */
+    public void subInitTopic(){
+        try {
+
+            mqttClient.subscribe(mqttConfig.getInitSub());
+        } catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+
+
+    /**
+     * MQTT连接参数设置
+     */
+    private MqttConnectOptions mqttConnectOptions(String userName, String passWord) throws MqttException {
+        String host = "tcp://127.0.0.1:1883";
+        String clientId = "vbdsm-hj212-iot";
+        if(mqttConfig != null && mqttConfig.getHost() != null && !"".equals(mqttConfig.getHost())) {
+            host = mqttConfig.getHost();
+            clientId = mqttConfig.getClientId();
+        }
+        mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
+        MqttConnectOptions options = new MqttConnectOptions();
+        options.setUserName(userName);
+        options.setPassword(passWord.toCharArray());
+        options.setConnectionTimeout(10);///默认:30
+        options.setAutomaticReconnect(true);//默认:false
+        options.setCleanSession(false);//默认:true
+        //options.setKeepAliveInterval(20);//默认:60
+        return options;
+    }
+
+     /**
+     * 关闭MQTT连接
+     */
+     @PreDestroy
+    public void close() throws MqttException {
+         log.info("关闭MQTT连接");
+        mqttClient.disconnect();
+        mqttClient.close();
+    }
+
+    /**
+     * 向某个主题发布消息 默认qos:1
+     *
+     * @param topic:发布的主题
+     * @param msg:发布的消息
+     */
+    public boolean pub(String topic, String msg)   {
+        return pub(topic, msg, 1);
+    }
+
+    public boolean pub(TopicMsgDto input)   {
+        String topic = input.getTopic();
+        String payLoad = input.getPayload();
+        if (payLoad == null) {
+            return false;
+        }
+        return pub(topic, payLoad, input.getQos());
+    }
+
+    /**
+     * 向某个主题发布消息
+     *
+     * @param topic: 发布的主题
+     * @param msg:   发布的消息
+     * @param qos:   消息质量    Qos:0、1、2
+     */
+    public boolean pub(String topic, String msg, int qos) {
+        MqttMessage mqttMessage = new MqttMessage();
+        mqttMessage.setQos(qos);
+        mqttMessage.setPayload(msg.getBytes());
+        MqttTopic mqttTopic = mqttClient.getTopic(topic);
+        try{
+            MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
+            token.waitForCompletion();
+            return true;
+        }catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+        return false;
+    }
+
+    /**
+     * 订阅某一个主题 ,此方法默认的的Qos等级为:1
+     *
+     * @param topic 主题
+     */
+    public boolean sub(String topic)   {
+        try{
+            mqttClient.subscribe(topic);
+            return true;
+        }catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+        return false;
+    }
+
+    /**
+     * 订阅某一个主题,可携带Qos
+     *
+     * @param topic 所要订阅的主题
+     * @param qos   消息质量:0、1、2
+     */
+    public boolean sub(String topic, int qos)   {
+        try{
+            mqttClient.subscribe(topic, qos);
+            return true;
+        }catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+        return false;
+    }
+
+
+//    public void destroy() {
+//        try {
+//            this.close();
+//        } catch (MqttException e) {
+//            log.error(e.getMessage(), e);
+//        }
+//    }
+}

+ 9 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/service/IPayloadService.java

@@ -0,0 +1,9 @@
+package com.iwbnet.iot.service;
+
+
+public interface IPayloadService {
+
+
+
+    public void send(String topic, String payload);
+}

+ 24 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/utils/Md5Util.java

@@ -0,0 +1,24 @@
+package com.iwbnet.iot.utils;
+
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class Md5Util {
+    public static String getMD5Str(String str) {
+        byte[] digest = null;
+        try {
+            MessageDigest md5 = MessageDigest.getInstance("md5");
+            digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        //16是表示转换为16进制数
+        String md5Str = null;
+        if (digest != null) {
+            md5Str = new BigInteger(1, digest).toString(16);
+        }
+        return md5Str;
+    }
+}

+ 29 - 0
iwb-iot-project/src/main/resources/application-dev.yml

@@ -0,0 +1,29 @@
+server:
+  port: 5080
+swagger:
+  enabled: true
+mybatis:
+  mapper-locations: classpath:mappers/*xml
+  type-aliases-package: com.iwbnet.iot.entity
+  configuration:
+    map-underscore-to-camel-case: true
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+# DataSource Config
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://47.112.30.247:43308/iot_com?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
+    username: root
+    password: 123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher
+
+mqtt:
+  host: tcp://127.0.0.1:1883
+  username: admin
+  password: 123456
+  clientId: vbdsm-hj212-iot
+  sub: vbdsm/device/+/+,system/+/+
+

+ 0 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/resources/application.yml → iwb-iot-project/src/main/resources/application.yml


+ 57 - 0
iwb-iot-project/src/main/resources/logback.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="rootLevel" value="INFO"/>
+    <property name="appName" value="vbdsm-hj212-IOT-server"/>
+    <contextName>${appName}</contextName>
+    <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>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>./logs/${appName}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>./logs/${appName}.%d{yyyy-MM-dd}.%i.error.log</FileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="ERROR"/>
+    </root>
+</configuration>

+ 0 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/main/resources/static/index.html → iwb-iot-project/src/main/resources/static/index.html


+ 2 - 2
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-iot/src/test/java/cn/vbdsm/iot/VbdsmHj212IotApplicationTests.java → iwb-iot-project/src/test/java/com/iwbnet/iot/IwbIotProjectApplicationTests.java

@@ -1,10 +1,10 @@
-package cn.vbdsm.iot;
+package com.iwbnet.iot;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
 @SpringBootTest
-class VbdsmHj212IotApplicationTests {
+class IwbIotProjectApplicationTests {
 
     @Test
     void contextLoads() {