523096025 před 1 rokem
revize
132338482d
38 změnil soubory, kde provedl 4528 přidání a 0 odebrání
  1. 33 0
      .gitignore
  2. 190 0
      huimv-env-common/pom.xml
  3. 81 0
      huimv-env-common/src/main/java/com/huimv/env/common/config/WeChatMessage.java
  4. 129 0
      huimv-env-common/src/main/java/com/huimv/env/common/utils/Const.java
  5. 425 0
      huimv-env-common/src/main/java/com/huimv/env/common/utils/DateUtil.java
  6. 123 0
      huimv-env-common/src/main/java/com/huimv/env/common/utils/MathUtil.java
  7. 30 0
      huimv-env-common/src/main/java/com/huimv/env/common/utils/MathUtil2.java
  8. 31 0
      huimv-env-common/src/main/java/com/huimv/env/common/utils/RegexUtil.java
  9. 12 0
      huimv-env-common/src/main/java/com/huimv/env/common/utils/SMSManager.java
  10. 126 0
      huimv-env-common/src/test/java/com/huimv/env/common/CodeGenerator.java
  11. 106 0
      huimv-env-device/pom.xml
  12. 22 0
      huimv-env-device/src/main/java/com/huimv/env/device/HuimvDeviceApplication.java
  13. 45 0
      huimv-env-device/src/main/java/com/huimv/env/device/config/ConfigBean.java
  14. 130 0
      huimv-env-device/src/main/java/com/huimv/env/device/config/TopicRabbitMQConfig.java
  15. 87 0
      huimv-env-device/src/main/java/com/huimv/env/device/config/WeChatMessageHelperTest.java
  16. 175 0
      huimv-env-device/src/main/java/com/huimv/env/device/config/WebSocket.java
  17. 19 0
      huimv-env-device/src/main/java/com/huimv/env/device/config/WebSocketConfig.java
  18. 319 0
      huimv-env-device/src/main/java/com/huimv/env/device/listener/DeviceListener.java
  19. 52 0
      huimv-env-device/src/main/java/com/huimv/env/device/listener/SensorListener.java
  20. 45 0
      huimv-env-device/src/main/java/com/huimv/env/device/producer/Producer.java
  21. 104 0
      huimv-env-device/src/main/resources/application-dev.yml
  22. 115 0
      huimv-env-device/src/main/resources/application-prod.yml
  23. 34 0
      huimv-env-device/src/main/resources/application.properties
  24. 3 0
      huimv-env-device/src/main/resources/conf/config.properties
  25. 61 0
      huimv-env-device/src/test/java/com/huimv/env/device/service/DeviceTest.java
  26. 92 0
      huimv-env-input/pom.xml
  27. 22 0
      huimv-env-input/src/main/java/com/huimv/env/input/HuimvEnvInputApplication.java
  28. 329 0
      huimv-env-input/src/main/java/com/huimv/env/input/config/TopicRabbitMQConfig.java
  29. 195 0
      huimv-env-input/src/main/java/com/huimv/env/input/producer/Producer.java
  30. 74 0
      huimv-env-input/src/main/java/com/huimv/env/input/server/EnvInputServer.java
  31. 637 0
      huimv-env-input/src/main/java/com/huimv/env/input/server/EnvInputServerHandler.java
  32. 72 0
      huimv-env-input/src/main/java/com/huimv/env/input/utils/DSendSMS.java
  33. 187 0
      huimv-env-input/src/main/java/com/huimv/env/input/utils/DateUtil2.java
  34. 171 0
      huimv-env-input/src/main/java/com/huimv/env/input/utils/SendSMS.java
  35. 105 0
      huimv-env-input/src/main/resources/application-dev.yml
  36. 89 0
      huimv-env-input/src/main/resources/application-prod.yml
  37. 34 0
      huimv-env-input/src/main/resources/application.properties
  38. 24 0
      huimv-env-input/src/main/resources/assembly.xml

+ 33 - 0
.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/

+ 190 - 0
huimv-env-common/pom.xml

@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.1</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <packaging>jar</packaging>
+    <groupId>com.huimv</groupId>
+    <artifactId>huimv-env-common</artifactId>
+    <version>0.0.7-SNAPSHOT</version>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <maven.compile>1.8</maven.compile>
+        <druid.version>1.1.14</druid.version>
+        <mysql.version>6.0.6</mysql.version>
+        <junit.version>4.13.2</junit.version>
+        <hutool.version>5.8.1</hutool.version>
+        <velocity.version>2.0</velocity.version>
+        <lombok.version>1.16.18</lombok.version>
+        <netty.version>4.1.45.Final</netty.version>
+        <fastjson.version>1.2.28</fastjson.version>
+        <httpClient.version>4.5.5</httpClient.version>
+        <servletApi.version>3.1.0</servletApi.version>
+        <freemarker.version>2.3.31</freemarker.version>
+        <commonsLang3.version>3.7</commonsLang3.version>
+        <mybatisPlus.version>3.4.3.4</mybatisPlus.version>
+        <huimvCommon.version>0.0.6-SNAPSHOT</huimvCommon.version>
+        <huimvEnvCommon.version>0.0.1-SNAPSHOT</huimvEnvCommon.version>
+        <junitPlatformCommons.version>1.8.2</junitPlatformCommons.version>
+        <mybatisPlusGenerator.version>3.3.2</mybatisPlusGenerator.version>
+        <mybatisPlusExtension.version>3.5.2</mybatisPlusExtension.version>
+        <captcha.version>0.0.6</captcha.version>
+        <captcha.reids.version>0.0.6</captcha.reids.version>
+        <net.sf.json-lib.version>2.2.3</net.sf.json-lib.version>
+        <com.belerweb.version>2.5.1</com.belerweb.version>
+        <io.jsonwebtoken.version>0.9.1</io.jsonwebtoken.version>
+        <com.auth0.version>3.3.0</com.auth0.version>
+    </properties>
+        <dependencies>
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>${io.jsonwebtoken.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>${com.auth0.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.dustlight.captcha</groupId>
+                <artifactId>captcha-core</artifactId>
+                <version>${captcha.version}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>cn.dustlight.captcha</groupId>
+                <artifactId>redis-store</artifactId>
+                <version>${captcha.reids.version}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>com.belerweb</groupId>
+                <artifactId>pinyin4j</artifactId>
+                <version>${com.belerweb.version}</version>
+            </dependency>
+
+            <!-- fastjson -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <!-- mysql -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql.version}</version>
+            </dependency>
+            <!--hutool-->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpClient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <scope>test</scope>
+                <version>${junit.version}</version>
+            </dependency>
+            <!-- lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>compile</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commonsLang3.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>javax.servlet-api</artifactId>
+                <version>${servletApi.version}</version>
+            </dependency>
+            <!--Mybatis-Plus生成器依赖-->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-generator</artifactId>
+                <version>${mybatisPlusGenerator.version}</version>
+            </dependency>
+            <!--freemarker 模板引擎(没有用原生的模板引擎)-->
+            <dependency>
+                <groupId>org.freemarker</groupId>
+                <artifactId>freemarker</artifactId>
+                <version>${freemarker.version}</version>
+            </dependency>
+            <!--mybits-plus-->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatisPlus.version}</version>
+            </dependency>
+            <!-- mybatis-plus-extension -->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-extension</artifactId>
+                <version>${mybatisPlusExtension.version}</version>
+            </dependency>
+            <!-- 连接池 -->
+            <dependency>
+                <!--自动配置-->
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+            <!-- velocity -->
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity-engine-core</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+            <!-- freemarker -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-freemarker</artifactId>
+            </dependency>
+            <!-- netty -->
+            <dependency>
+                <groupId>io.netty</groupId>
+                <artifactId>netty-all</artifactId>
+                <version>${netty.version}</version>
+            </dependency>
+            <!-- junit -->
+            <dependency>
+                <groupId>org.junit.platform</groupId>
+                <artifactId>junit-platform-commons</artifactId>
+                <version>${junitPlatformCommons.version}</version>
+            </dependency>
+            <!-- 二方包统一版本管理 -->
+            <dependency>
+                <groupId>com.huimv</groupId>
+                <artifactId>huimv-common</artifactId>
+                <version>${huimvCommon.version}</version>
+            </dependency>
+            <!-- 一方包统一版本管理 -->
+            <dependency>
+                <groupId>com.huimv</groupId>
+                <artifactId>huimv-env-common</artifactId>
+                <version>${huimvEnvCommon.version}</version>
+            </dependency>
+        </dependencies>
+</project>

+ 81 - 0
huimv-env-common/src/main/java/com/huimv/env/common/config/WeChatMessage.java

@@ -0,0 +1,81 @@
+package com.huimv.env.common.config;
+
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
+
+@Component
+public class WeChatMessage {
+//    wx:
+//    appId: "wx707fcfd7d09e02eb"  #小程序appId
+//    secret: "w95K45G9-2xGocleqrtGoHwEGF6ocqSu8EbDBxCQSR0"   #小程序密钥
+//    templateId: "f932c54f1cbd427b10218a0d1cfb88bf"  #订阅消息模板
+//
+//    @Value("${wx.appId}")
+//    private String appId;
+//
+//    @Value("${wx.secret}")
+//    private String secret;
+//
+//    @Value("${wx.templateId}")
+//    private String templateId;
+    private static  final  String  appId= "wx707fcfd7d09e02eb";
+    private static  final  String  secret= "cf69d556bbc962fa60a59b0fece3fa95";
+    private static  final  String  templateId= "w95K45G9-2xGocleqrtGoHwEGF6ocqSu8EbDBxCQSR0";
+
+    public void sendMsg(String deviceName,String deviceCode,String warningContent, Date uploadDate,String location,String openId){
+        //1:获取token(接口调用凭证)
+        String token = queryToken();
+        //2:发送订阅消息
+        send(token,deviceName,warningContent,deviceCode,uploadDate,location,openId);
+    }
+
+    // 1: 获取 access_token  (2h过期)
+    public String queryToken(){
+        String tokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";
+        tokenUrl = tokenUrl + "&appid=" + appId + "&secret=" + secret;
+        String result = HttpUtil.get(tokenUrl);
+        System.out.println(result);
+        JSONObject jsonObject = JSONUtil.parseObj(result);
+        String token = jsonObject.get("access_token").toString();
+        return token;
+    }
+
+    public void send(String token,String deviceName,String warningContent,String deviceCode, Date uploadDate,String location,String openId){
+        String msgUrl="https://api.weixin.qq.com/cgi-bin/message/subscribe/send";
+        msgUrl = msgUrl + "?access_token=" + token;
+        // 设置模板参数
+        HashMap<String, Object> paramMap = new HashMap<>();
+        paramMap.put("touser", openId);                 // 接收方
+        paramMap.put("template_id", templateId);        // 模板id
+        paramMap.put("page","pages/index/index");         // 消息中要跳转的页面
+        // 设置data 模板内容
+        HashMap<String, Object> data = new HashMap<>();
+        //报警设备
+        data.put("thing1", formatParam(deviceName));
+        //报警类型
+        data.put("thing2", formatParam(warningContent));
+        //报警时间
+        data.put("time3", formatParam(uploadDate.toString()));
+        //报警地点
+        data.put("thing5", formatParam(location));
+        paramMap.put("data", data);
+        // 转json字符串
+        String jsonObject = JSONUtil.toJsonStr(paramMap);
+        String result= HttpUtil.post(msgUrl, jsonObject);
+        System.out.println(result);
+    }
+
+    public HashMap<String, Object> formatParam(String value){
+        HashMap<String, Object> data = new HashMap<>();
+        data.put("value", value);
+        return data;
+    }
+
+}

+ 129 - 0
huimv-env-common/src/main/java/com/huimv/env/common/utils/Const.java

@@ -0,0 +1,129 @@
+package com.huimv.env.common.utils;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+public class Const {
+
+    //温度
+    public final static String QUEUE_ENV_TEMP = "topic.env.temp.queue";
+    public final static String ROUTING_KEY_ENV_TEMP = "topic.env.temp.key";
+    public final static String EXCHANGE_ENV_TEMP = "topic.env.temp.exchange";
+
+    //目标温度
+    public final static String QUEUE_ENV_TARGET_TEMP = "topic.env.target.temp.queue";
+    public final static String ROUTING_KEY_ENV_TARGET_TEMP = "topic.env.target.temp.key";
+    public final static String EXCHANGE_ENV_TARGET_TEMP = "topic.env.target.temp.exchange";
+
+    //湿度
+    public final static String QUEUE_ENV_HUMI = "topic.env.humi.queue";
+    public final static String ROUTING_KEY_ENV_HUMI = "topic.env.humi.key";
+    public final static String EXCHANGE_ENV_HUMI = "topic.env.humi.exchange";
+
+    //日龄
+    public final static String QUEUE_ENV_DAYAGE = "topic.env.dayage.queue";
+    public final static String ROUTING_KEY_ENV_DAYAGE = "topic.env.dayage.key";
+    public final static String EXCHANGE_ENV_DAYAGE = "topic.env.dayage.exchange";
+
+    //通风
+    public final static String QUEUE_ENV_FENG = "topic.env.feng.queue";
+    public final static String ROUTING_KEY_ENV_FENG = "topic.env.feng.key";
+    public final static String EXCHANGE_ENV_FENG = "topic.env.feng.exchange";
+
+    //舍外
+    public final static String QUEUE_ENV_OUT_TEMP = "topic.env.out.temp.queue";
+    public final static String ROUTING_KEY_ENV_OUT_TEMP = "topic.env.out.temp.key";
+    public final static String EXCHANGE_ENV_OUT_TEMP = "topic.env.out.temp.exchange";
+
+    //舍内 平均温度
+    public final static String QUEUE_ENV_IN_TEMP = "topic.env.in.temp.queue";
+    public final static String ROUTING_KEY_ENV_IN_TEMP = "topic.env.in.temp.key";
+    public final static String EXCHANGE_ENV_IN_TEMP = "topic.env.in.temp.exchange";
+
+    //报警
+    public final static String QUEUE_ENV_WARNING = "topic.env.warning.queue";
+    public final static String ROUTING_KEY_ENV_WARNING = "topic.env.warning.key";
+    public final static String EXCHANGE_ENV_WARNING = "topic.env.warning.exchange";
+
+    //风机状态
+    public final static String QUEUE_ENV_FENG_STATUS = "topic.env.feng.status.queue";
+    public final static String ROUTING_KEY_ENV_FENG_STATUS = "topic.env.feng.status.key";
+    public final static String EXCHANGE_ENV_FENG_STATUS = "topic.env.feng.status.exchange";
+
+    //湿帘状态
+    public final static String QUEUE_ENV_SHILIAN_STATUS = "topic.env.shilian.status.queue";
+    public final static String ROUTING_KEY_ENV_SHILIAN_STATUS = "topic.env.shilian.status.key";
+    public final static String EXCHANGE_ENV_SHILIAN_STATUS = "topic.env.shilian.status.exchange";
+
+    //喷雾状态
+    public final static String QUEUE_ENV_PENWU_STATUS = "topic.env.penwu.status.queue";
+    public final static String ROUTING_KEY_ENV_PENWU_STATUS = "topic.env.penwu.status.key";
+    public final static String EXCHANGE_ENV_PENWU_STATUS = "topic.env.penwu.status.exchange";
+
+    //日龄温度配置上传
+    public final static String QUEUE_ENV_DAYAGE_PEIZHI = "topic.env.dayage.peizhi.queue";
+    public final static String ROUTING_KEY_ENV_DAYAGE_PEIZHI = "topic.env.dayage.peizhi.key";
+    public final static String EXCHANGE_ENV_DAYAGE_PEIZHI = "topic.env.dayage.peizhi.exchange";
+
+    //风机配置
+    public final static String QUEUE_ENV_FENG_PEIZHI = "topic.env.feng.peizhi.queue";
+    public final static String ROUTING_KEY_ENV_FENG_PEIZHI = "topic.env.feng.peizhi.key";
+    public final static String EXCHANGE_ENV_FENG_PEIZHI = "topic.env.feng.peizhi.exchange";
+
+    //co2
+    public final static String QUEUE_ENV_CO2_DATA = "topic.env.co2.data.queue";
+    public final static String ROUTING_KEY_ENV_CO2_DATA = "topic.env.co2.data.key";
+    public final static String EXCHANGE_ENV_CO2_DATA = "topic.env.co2.data.exchange";
+
+    //压力
+    public final static String QUEUE_ENV_YALI_DATA = "topic.env.yali.data.queue";
+    public final static String ROUTING_KEY_ENV_YALI_DATA = "topic.env.yali.data.key";
+    public final static String EXCHANGE_ENV_YALI_DATA = "topic.env.yali.data.exchange";
+
+    //水暖
+    public final static String QUEUE_ENV_SHUINUAN_DATA = "topic.env.shuinuan.data.queue";
+    public final static String ROUTING_KEY_ENV_SHUINUAN_DATA = "topic.env.shuinuan.data.key";
+    public final static String EXCHANGE_ENV_SHUINUAN_DATA = "topic.env.shuinuan.data.exchange";
+
+    //位置
+    public final static String QUEUE_ENV_WEIZHI_DATA = "topic.env.weizhi.data.queue";
+    public final static String ROUTING_KEY_ENV_WEIZHI_DATA = "topic.env.weizhi.data.key";
+    public final static String EXCHANGE_ENV_WEIZHI_DATA = "topic.env.weizhi.data.exchange";
+
+    //水表
+    public final static String QUEUE_ENV_SHUIBIAO_DATA = "topic.env.SHUIBIAO.data.queue";
+    public final static String ROUTING_KEY_ENV_SHUIBIAO_DATA = "topic.env.SHUIBIAO.data.key";
+    public final static String EXCHANGE_ENV_SHUIBIAO_DATA = "topic.env.SHUIBIAO.data.exchange";
+
+    //电表
+    public final static String QUEUE_ENV_DIANBIAO_DATA = "topic.env.dianbiao.data.queue";
+    public final static String ROUTING_KEY_ENV_DIANBIAO_DATA = "topic.env.dianbiao.data.key";
+    public final static String EXCHANGE_ENV_DIANBIAO_DATA = "topic.env.dianbiao.data.exchange";
+
+    //加热器
+    public final static String QUEUE_ENV_JIARE_STATUS = "topic.env.jiare.status.queue";
+    public final static String ROUTING_KEY_ENV_JIARE_STATUS = "topic.env.jiare.status.key";
+    public final static String EXCHANGE_ENV_JIARE_STATUS = "topic.env.jiare.status.exchange";
+
+    //小窗
+    public final static String QUEUE_ENV_XIAOCHUANG_STATUS = "topic.env.xiaochuang.status.queue";
+    public final static String ROUTING_KEY_ENV_XIAOCHUANG_STATUS = "topic.env.xiaochuang.status.key";
+    public final static String EXCHANGE_ENV_XIAOCHUANG_STATUS = "topic.env.xiaochuang.status.exchange";
+
+    //导流板
+    public final static String QUEUE_ENV_DAOLIU_STATUS = "topic.env.daoliu.status.queue";
+    public final static String ROUTING_KEY_ENV_DAOLIU_STATUS = "topic.env.daoliu.status.key";
+    public final static String EXCHANGE_ENV_DAOLIU_STATUS = "topic.env.daoliu.status.exchange";
+
+    //照明
+    public final static String QUEUE_ENV_ZHAOMING_STATUS = "topic.env.zhaoming.status.queue";
+    public final static String ROUTING_KEY_ENV_ZHAOMING_STATUS = "topic.env.zhaoming.status.key";
+    public final static String EXCHANGE_ENV_ZHAOMING_STATUS = "topic.env.zhaoming.status.exchange";
+
+
+}

+ 425 - 0
huimv-env-common/src/main/java/com/huimv/env/common/utils/DateUtil.java

@@ -0,0 +1,425 @@
+package com.huimv.env.common.utils;
+
+import cn.hutool.core.date.DateTime;
+import org.springframework.stereotype.Component;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+//@Slf4j
+public class DateUtil {
+
+    //格式化本月
+    public String getLastMonthAndYear(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.MONTH, -1);
+        int month = cal.get(Calendar.MONTH) + 1;
+        int year = cal.get(Calendar.YEAR);
+        return year+"-"+month;
+    }
+
+    //格式化上月
+    public String getBeforeMonthAndYear(int beforeMonths){
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.MONTH, -beforeMonths);
+        int month = cal.get(Calendar.MONTH) + 1;
+        int year = cal.get(Calendar.YEAR);
+        return year+"-"+month;
+    }
+
+    //格式化上月
+    public String getLastMonthAndYear(){
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.MONTH, -1);
+        int month = cal.get(Calendar.MONTH) + 1;
+        int year = cal.get(Calendar.YEAR);
+        return year+"-"+month;
+    }
+
+    public String getThisMonthAndYear(){
+        Calendar cal = Calendar.getInstance();
+//        cal.add(Calendar.MONTH, -1);
+        int month = cal.get(Calendar.MONTH) + 1;
+        int year = cal.get(Calendar.YEAR);
+        return year+"-"+month;
+    }
+
+
+    //读取之前hours小时的时间
+    public String getBeforeHoursDatetime(String newTime,int hours) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date newDate = sdf.parse(newTime);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(newDate);
+        cal.add(Calendar.HOUR_OF_DAY, -hours+1);
+        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+        String dateText = sdf2.format(cal.getTime());
+        int hour = cal.get(Calendar.HOUR_OF_DAY);
+        String hourText = String.valueOf(hour);
+        if(hour<10){
+            hourText = "0"+String.valueOf(hour);
+        }
+        return dateText + " "+hourText + ":00:00";
+    }
+
+    //读取之后hours小时的时间
+    public String getAfterHoursDatetime(String newTime,int hours) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date newDate = sdf.parse(newTime);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(newDate);
+        cal.add(Calendar.HOUR_OF_DAY, +hours);
+        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+        String dateText = sdf2.format(cal.getTime());
+        int hour = cal.get(Calendar.HOUR_OF_DAY);
+        String hourText = String.valueOf(hour);
+        if(hour<10){
+            hourText = "0"+String.valueOf(hour);
+        }
+        return dateText + " "+hourText + ":00:00";
+    }
+
+    public int setCalendarNewTime(String newTime) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(sdf.parse(newTime));
+        return cal.get(Calendar.HOUR_OF_DAY);
+    }
+    //
+    public String handleAskTime(String askTime) {
+        String newAskTime = askTime.substring(0, 4) + "-" + askTime.substring(4, 6) + "-" + askTime.substring(6, 8) + " " + askTime.substring(8, 10) + ":" + askTime.substring(10, 12) + ":" + askTime.substring(12, 14);
+        return newAskTime;
+    }
+
+    public int getNowHour(){
+        Calendar cal = Calendar.getInstance();
+        return cal.get(Calendar.HOUR_OF_DAY);
+    }
+
+    //格式化日期(Long --> Date)
+    public String formatLongToDate(Long longDate){
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date= new Date(longDate);
+        return df.format(date);
+    }
+
+    //格式化本年
+    public String getThisYear(){
+        Calendar cal = Calendar.getInstance();
+        int year = cal.get(Calendar.YEAR);
+        return String.valueOf(year);
+    }
+
+    //格式化本月
+    public String getThisMonth(){
+        Calendar cal = Calendar.getInstance();
+        int month = cal.get(Calendar.MONTH) + 1;
+        if(String.valueOf(month).length()==1)
+        {
+            return "0"+String.valueOf(month);
+        }else{
+            return String.valueOf(month);
+        }
+    }
+
+    //格式化日期时间
+    public String formatDateTime(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = sdf.parse(dateText);
+        return sdf.format(date);
+    }
+
+    //格式化日期时间
+    public String formatDateText(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = sdf.parse(dateText);
+        return sdf.format(date);
+    }
+//    public String formatDateText(Date date) throws ParseException {
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+//        return sdf.format(date);
+//    }
+
+    public Date parseDateTime(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.parse(dateText);
+    }
+
+    public Date parseDate(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.parse(dateText);
+    }
+
+    public Long parseDateTimeTextToLong(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = sdf.parse(dateText);
+        return date.getTime();
+    }
+
+    public Long parseDateTextToLong(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = sdf.parse(dateText);
+        return date.getTime();
+    }
+
+    //
+    public Date getTodayDate() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.parse(sdf.format(new Date()));
+    }
+
+    public Date getTodayDatetime() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.parse(sdf.format(new Date()));
+    }
+
+    public String getTodayDateText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(new Date());
+    }
+
+    public java.sql.Date getTodayMySQLDate(){
+        java.sql.Date todayDate = new java.sql.Date(new Date().getTime());
+        return todayDate;
+    }
+
+    public Timestamp getTimestamp(){
+        Timestamp nowTimestamp = new Timestamp(new Date().getTime());
+        return nowTimestamp;
+    }
+
+    public String getTodayText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.format(new Date());
+    }
+
+    public String formatDateText(Date date) throws ParseException {
+        if(date == null){
+            return "";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(date);
+    }
+
+    public String formatDatetimeText(Date date) throws ParseException {
+        if(date == null || date.toString().length()==0){
+            return "";
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.format(date);
+    }
+
+    public String getNowText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        return sdf.format(new Date());
+    }
+
+    public String getTodayMissionText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+        return sdf.format(new Date());
+    }
+
+    public String getStartDateInThisMonth(){
+        DateTime date = cn.hutool.core.date.DateUtil.date();
+        return (cn.hutool.core.date.DateUtil.beginOfMonth(date) + "").substring(0, 10);
+    }
+
+    public String getEndDateInThisMonth(){
+        DateTime date = cn.hutool.core.date.DateUtil.date();
+        return (date + "").substring(0, 10);
+    }
+
+    /**
+     * 获取过去或者未来 任意天内的日期数组
+     * @param intervals      intervals天内
+     * @return              日期数组
+     */
+    public ArrayList<String> test(int intervals ) {
+        ArrayList<String> pastDaysList = new ArrayList<>();
+        ArrayList<String> fetureDaysList = new ArrayList<>();
+        for (int i = 0; i <intervals; i++) {
+            pastDaysList.add(getPastDate(i));
+            fetureDaysList.add(getFetureDate(i));
+        }
+        return pastDaysList;
+    }
+
+    /**
+     * @Method      : getPastIntervals
+     * @Description : 返回过去N天日期(倒排序)
+     * @Params      : [intervals]
+     * @Return      : java.util.ArrayList<java.lang.String>
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/7       
+     * @Time        : 15:27
+     */
+    public ArrayList<String> getPastIntervals(int intervals ) {
+        ArrayList<String> pastDaysList = new ArrayList<>();
+        for (int i = 0; i <intervals; i++) {
+            pastDaysList.add(getPastDate(i));
+        }
+        return pastDaysList;
+    }
+
+    /**
+     * @Method      : getPastIntervalsASC
+     * @Description : 正排序
+     * @Params      : [intervals]
+     * @Return      : java.util.ArrayList<java.lang.String>
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/7       
+     * @Time        : 16:33
+     */
+    public ArrayList<String> getPastIntervalsASC(int intervals ) {
+        ArrayList<String> pastDaysList = new ArrayList<>();
+        for (int i = intervals-1; i >=0; i--) {
+            pastDaysList.add(getPastDate(i));
+        }
+        return pastDaysList;
+    }
+
+    /**
+     * @Method      : getFetureIntervals
+     * @Description : 获取未来N天日期
+     * @Params      : [intervals]
+     * @Return      : java.util.ArrayList<java.lang.String>
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/3/7       
+     * @Time        : 15:28
+     */
+    public ArrayList<String> getFetureIntervals(int intervals ) {
+        ArrayList<String> fetureDaysList = new ArrayList<>();
+        for (int i = 0; i <intervals; i++) {
+            fetureDaysList.add(getFetureDate(i));
+        }
+        return fetureDaysList;
+    }
+
+
+    /**
+     * 获取过去第几天的日期
+     *
+     * @param past
+     * @return
+     */
+    public String getPastDate(int past) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
+        Date today = calendar.getTime();
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String result = format.format(today);
+        return result;
+    }
+
+    /**
+     * 获取未来 第 past 天的日期
+     * @param past
+     * @return
+     */
+    public String getFetureDate(int past) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + past);
+        Date today = calendar.getTime();
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String result = format.format(today);
+        return result;
+    }
+
+    //重新构建日期
+    public String rebuildDateTime(String text){
+        return text.substring(0,4)+"-"+text.substring(4,6)+"-"+text.substring(6,8)+" "+text.substring(8,10)+":"+text.substring(10,12)+":"+text.substring(12,14);
+    }
+
+    public static void main(String[] args){
+        DateUtil du = new DateUtil();
+        //
+//        du.test1();
+        List<String> pastList = du.getPastIntervalsASC(5);
+        for(String pastDate:pastList){
+            System.out.println("pastDate>>"+pastDate);
+        }
+
+        List<String> fetureList = du.getFetureIntervals(5);
+        for(String fetureDate:fetureList){
+            System.out.println("fetureDate>>"+fetureDate);
+        }
+
+    }
+
+    private void test1() {
+        String text = "20211201104300";
+//        String text = "1234567890abcd";
+        String date = text.substring(0,4)+"-"+text.substring(4,6)+"-"+text.substring(6,8)+" "+text.substring(8,10)+":"+text.substring(10,12)+":"+text.substring(12,14);
+        System.out.println("date="+date);
+    }
+
+    //获取long时间
+    public Long getNowLong(){
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)-1,0,0,0);
+        return calendar.getTime().getTime();
+    }
+
+    public String formatTime1(Date datetime) {
+        SimpleDateFormat format = new SimpleDateFormat("MM-dd:HH");
+        String newDatetimeText = format.format(datetime);
+        return newDatetimeText;
+    }
+
+    public Date getFirstDayInThisMonth() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        //获取当前月第一天:
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, 0);
+        c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
+        String first = format.format(c.getTime());
+        System.out.println("===============first:"+first);
+        return c.getTime();
+    }
+
+    public Date getEndDayInThisMonth() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        //获取当前月最后一天
+        Calendar ca = Calendar.getInstance();
+        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
+        String last = format.format(ca.getTime());
+        System.out.println("===============last:"+last);
+        return ca.getTime();
+    }
+}

+ 123 - 0
huimv-env-common/src/main/java/com/huimv/env/common/utils/MathUtil.java

@@ -0,0 +1,123 @@
+package com.huimv.env.common.utils;
+
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+public class MathUtil {
+
+    public static double A = 0.00335396319311466;
+    public static double B = 0.000256376549039663;
+    public static double C = 0.00000248933580817244;
+    public static double D = 0.0000000753805242068686;
+    public static double E = -0.0000000204758173596178;
+
+    public static BigDecimal formatScale(String val1,String val2,Integer scale){
+        if(scale == null){
+            scale = 2;
+        }
+        BigDecimal deviceRateBd= new BigDecimal(val1).divide(new BigDecimal(val2),scale,BigDecimal.ROUND_HALF_UP);
+        return deviceRateBd;
+    }
+
+    public static BigDecimal countEnvtemp(String val1,Integer scale){
+        if(scale == null){
+            scale = 2;
+        }
+        BigDecimal deviceRateBd= new BigDecimal(val1).divide(new BigDecimal(100),scale,BigDecimal.ROUND_HALF_UP);
+        return deviceRateBd;
+    }
+
+    public static BigDecimal countEnvtemp2(String val1,Integer scale){
+        if(scale == null){
+            scale = 2;
+        }
+        BigDecimal deviceRateBd= new BigDecimal(val1).divide(new BigDecimal(10),scale,BigDecimal.ROUND_HALF_UP);
+        return deviceRateBd;
+    }
+
+    public static BigDecimal countRate(String val1,Integer scale){
+        if(scale == null){
+            scale = 2;
+        }
+        BigDecimal deviceRateBd= new BigDecimal(val1).divide(new BigDecimal(100),scale,BigDecimal.ROUND_HALF_UP);
+        return deviceRateBd;
+    }
+
+    //保留一位小数
+    public static  double changeDouble(Double dou) {
+        NumberFormat nf = new DecimalFormat("0.0 ");
+        dou = Double.parseDouble(nf.format(dou));
+        return dou;
+    }
+
+    public static double ln(int rv) {
+        int R_REF = 10000;
+        double ln = Math.log((double) rv / R_REF);
+//        System.out.println("$$$$$$$$$ ln>>"+ln);
+        //保留一位小数
+        return changeDouble(1 / (A + B * ln + C * Math.pow(ln, 2) + D * Math.pow(ln, 3) + E * Math.pow(ln, 4)) - 273.15) + 0.001;
+    }
+
+    public String formatBit(float num, int bit) {
+        // 创建一个数值格式化对象
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(bit);
+        return numberFormat.format(num);
+    }
+
+    public String formatBit(float num) {
+        return String.valueOf(num);
+    }
+
+    //计算比率
+    public String countRate(float num, int bit) {
+        // 创建一个数值格式化对象
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(bit);
+        return numberFormat.format(num * 100);//所占百分比
+    }
+
+    //计算占比
+    public String countRate(float num, float total,int bit) {
+        // 创建一个数值格式化对象
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(bit);
+        //所占百分比
+        return numberFormat.format((float)  num/ (float)total* 100);
+    }
+
+    //格式化
+    public String format(float num, int bit) {
+        // 创建一个数值格式化对象
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(bit);
+        return numberFormat.format(num * 100);//所占百分比
+    }
+
+    //格式化
+    public String format(float num, float total,int bit) {
+        // 创建一个数值格式化对象
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(bit);
+        //所占百分比
+        return numberFormat.format((float)  num/ (float)total* 100);
+    }
+
+}

+ 30 - 0
huimv-env-common/src/main/java/com/huimv/env/common/utils/MathUtil2.java

@@ -0,0 +1,30 @@
+package com.huimv.env.common.utils;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+public class MathUtil2 {
+    //计算温度
+    public double countTemp(int temp){
+        return temp * 0.1;
+    }
+
+    //计算湿度
+    public double countHumi(int temp){
+        return temp * 0.1;
+    }
+
+    //计算温度
+    public double countMeter(int temp){
+        return temp * 0.01;
+    }
+
+}

+ 31 - 0
huimv-env-common/src/main/java/com/huimv/env/common/utils/RegexUtil.java

@@ -0,0 +1,31 @@
+package com.huimv.env.common.utils;
+
+import org.springframework.stereotype.Component;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+public class RegexUtil {
+
+    //计算+出现的次数
+    public int countPlus(String str) {//创建countSpace方法用于统计文本的空格个数
+        int count = 0;//创建一个返回值count
+//        Pattern p = Pattern.compile("\\s");//将给定的正则表达式编译并赋予给Pattern类
+        Pattern p = Pattern.compile("\\+");//将给定的正则表达式编译并赋予给Pattern类
+        Matcher m = p.matcher(str);//生成一个给定命名的Matcher对象
+        while(m.find()){//查找类似于Matcher对象的字符
+            count++;//count自加作为标记
+        }
+        return count;//返回count值
+    }
+
+}

+ 12 - 0
huimv-env-common/src/main/java/com/huimv/env/common/utils/SMSManager.java

@@ -0,0 +1,12 @@
+package com.huimv.env.common.utils;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+public class SMSManager {
+}

+ 126 - 0
huimv-env-common/src/test/java/com/huimv/env/common/CodeGenerator.java

@@ -0,0 +1,126 @@
+package com.huimv.env.common;
+
+/**
+ * @Project :
+ * @Package :
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create :
+ **/
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import org.junit.platform.commons.util.StringUtils;
+
+import java.util.Scanner;
+
+public class CodeGenerator {
+    // user defined
+    private static String childProjectPath = "/huimv-env-common";
+    private static String rootPackage = "com.huimv.env.common";
+    private static String dbIp = "192.168.1.7";
+    private static String dbPort = "3306";
+    private static String dbName = "huimv-env-platform";
+    private static String driverName = "com.mysql.cj.jdbc.Driver";
+    private static String username = "root";
+    private static String password = "hm123456";
+
+    public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        StringBuilder help = new StringBuilder();
+        help.append("请输入" + tip + ":");
+        System.out.println(help.toString());
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+            if (StringUtils.isNotBlank(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("请输入正确的" + tip + "!");
+    }
+
+    public static void main(String[] args) {
+        // 代码生成器
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String rootPath = System.getProperty("user.dir");
+        System.out.println("rootPath + childProjectPath="+rootPath + childProjectPath);
+        gc.setOutputDir(rootPath + childProjectPath + "/src/main/java");//设置代码生成路径
+        gc.setFileOverride(true);//是否覆盖以前文件
+        gc.setOpen(false);//是否打开生成目录
+        gc.setAuthor("zn");//设置项目作者名称
+        gc.setIdType(IdType.AUTO);//设置主键策略
+        gc.setBaseResultMap(true);//生成基本ResultMap
+        gc.setBaseColumnList(true);//生成基本ColumnList
+        gc.setServiceName("%sService");//去掉服务默认前缀
+        gc.setDateType(DateType.ONLY_DATE);//设置时间类型
+        mpg.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        //dsc.setUrl("jdbc:mysql://122.112.224.199:3306/huimv_registration_center?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai");
+        String url = "jdbc:mysql://"+dbIp+":"+dbPort+"/"+dbName+"?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai";
+        System.out.println("url="+url);
+        System.out.println("driverName="+driverName);
+        System.out.println("username="+username);
+        System.out.println("password="+password);
+        dsc.setUrl(url);
+        dsc.setDriverName(driverName);
+        dsc.setUsername(username);
+        dsc.setPassword(password);
+        mpg.setDataSource(dsc);
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent(rootPackage);
+        pc.setMapper("mapper");
+        pc.setXml("mapper.xml");
+//        pc.setEntity("pojo");
+        pc.setEntity("entity");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+        pc.setController("controller");
+        mpg.setPackageInfo(pc);
+
+        // 策略配置
+        StrategyConfig sc = new StrategyConfig();
+        sc.setNaming(NamingStrategy.underline_to_camel);
+        sc.setColumnNaming(NamingStrategy.underline_to_camel);
+        sc.setEntityLombokModel(true);//自动lombok
+        sc.setRestControllerStyle(true);
+        sc.setControllerMappingHyphenStyle(true);
+
+        sc.setLogicDeleteFieldName("deleted");//设置逻辑删除
+
+        //设置自动填充配置
+//        TableFill gmt_create = new TableFill("create_time", FieldFill.INSERT);
+//        TableFill gmt_modified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
+//        ArrayList<TableFill> tableFills=new ArrayList<>();
+//        tableFills.add(gmt_create);
+//        tableFills.add(gmt_modified);
+//        sc.setTableFillList(tableFills);
+
+        //乐观锁
+        sc.setVersionFieldName("version");
+        sc.setRestControllerStyle(true);//驼峰命名
+
+
+
+        //  sc.setTablePrefix("tbl_"); 设置表名前缀
+        sc.setInclude(scanner("表名,多个英文逗号分割").split(","));
+        mpg.setStrategy(sc);
+
+        // 生成代码
+        mpg.execute();
+    }
+
+}

+ 106 - 0
huimv-env-device/pom.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.1</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+<!--    <groupId>com.huimv</groupId>-->
+    <artifactId>huimv-env-device</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <dependencies>
+        <!-- 排除Tomcat容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <!-- 移除掉默认支持的 Tomcat -->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- 添加 Undertow 容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+            <version>2.6.2</version>
+        </dependency>
+<!--        微信推送-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+        <!-- mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!--rabbitmq-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <!-- redis -->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-data-redis</artifactId>-->
+<!--        </dependency>-->
+        <!-- actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- 一方包统一版本管理 -->
+        <dependency>
+            <groupId>com.huimv</groupId>
+            <artifactId>huimv-env-common</artifactId>
+            <version>0.0.7-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 22 - 0
huimv-env-device/src/main/java/com/huimv/env/device/HuimvDeviceApplication.java

@@ -0,0 +1,22 @@
+package com.huimv.env.device;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScans;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@ComponentScans({@ComponentScan("com.huimv.env.common.utils"), @ComponentScan("com.huimv.env.common.service"),@ComponentScan("com.huimv.env.common.config")})
+@EntityScan(value = "com.huimv.env.common.entity")
+@MapperScan("com.huimv.env.common.mapper")
+//@EnableJpaRepositories(basePackages = "com.huimv.env.common.dao.repo")
+@EnableConfigurationProperties
+@SpringBootApplication
+public class HuimvDeviceApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(HuimvDeviceApplication.class, args);
+    }
+}

+ 45 - 0
huimv-env-device/src/main/java/com/huimv/env/device/config/ConfigBean.java

@@ -0,0 +1,45 @@
+package com.huimv.env.device.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@ConfigurationProperties(prefix = "config")
+@PropertySource("classpath:conf/config.properties")
+@Component
+public class ConfigBean {
+    private String fault;
+    private String act;
+
+    public String getFault() {
+        return fault;
+    }
+
+    public void setFault(String fault) {
+        this.fault = fault;
+    }
+
+    public String getAct() {
+        return act;
+    }
+
+    public void setAct(String act) {
+        this.act = act;
+    }
+
+    @Override
+    public String toString() {
+        return "ConfigBean{" +
+                "fault='" + fault + '\'' +
+                ", act='" + act + '\'' +
+                '}';
+    }
+}

+ 130 - 0
huimv-env-device/src/main/java/com/huimv/env/device/config/TopicRabbitMQConfig.java

@@ -0,0 +1,130 @@
+package com.huimv.env.device.config;
+
+import com.huimv.env.common.utils.Const;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Configuration
+public class TopicRabbitMQConfig {
+    //温度
+    @Bean
+    public Queue tempQueue() {
+        return new Queue(Const.QUEUE_ENV_TEMP);
+    }
+    @Bean
+    TopicExchange tempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_TEMP);
+    }
+    @Bean
+    Binding bindingTempExchangeMessage() {
+        return BindingBuilder.bind(tempQueue()).to(tempExchange()).with(Const.ROUTING_KEY_ENV_TEMP);
+    }
+    //湿度
+    @Bean
+    public Queue humiQueue() {
+        return new Queue(Const.QUEUE_ENV_HUMI);
+    }
+    @Bean
+    TopicExchange humiExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_HUMI);
+    }
+    @Bean
+    Binding bindingTumiExchangeMessage() {
+        return BindingBuilder.bind(humiQueue()).to(humiExchange()).with(Const.ROUTING_KEY_ENV_HUMI);
+    }
+    //目标温度
+    @Bean
+    public Queue targetTempQueue() {
+        return new Queue(Const.QUEUE_ENV_TARGET_TEMP);
+    }
+    @Bean
+    TopicExchange targetTempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_TARGET_TEMP);
+    }
+    @Bean
+    Binding bindingTargetTempExchangeMessage() {
+        return BindingBuilder.bind(targetTempQueue()).to(targetTempExchange()).with(Const.ROUTING_KEY_ENV_TARGET_TEMP);
+    }
+
+    //日龄
+    @Bean
+    public Queue dayAgeQueue() {
+        return new Queue(Const.QUEUE_ENV_DAYAGE);
+    }
+    @Bean
+    TopicExchange dayAgeExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_DAYAGE);
+    }
+    @Bean
+    Binding bindingDayAgeExchangeMessage() {
+        return BindingBuilder.bind(dayAgeQueue()).to(dayAgeExchange()).with(Const.ROUTING_KEY_ENV_DAYAGE);
+    }
+
+    //通风
+    @Bean
+    public Queue fengQueue() {
+        return new Queue(Const.QUEUE_ENV_FENG);
+    }
+    @Bean
+    TopicExchange fengExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_FENG);
+    }
+    @Bean
+    Binding bindingFengExchangeMessage() {
+        return BindingBuilder.bind(fengQueue()).to(fengExchange()).with(Const.ROUTING_KEY_ENV_FENG);
+    }
+
+    //舍外
+    @Bean
+    public Queue outTempQueue() {
+        return new Queue(Const.QUEUE_ENV_OUT_TEMP);
+    }
+    @Bean
+    TopicExchange outTempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_OUT_TEMP);
+    }
+    @Bean
+    Binding bindingOutTempExchangeMessage() {
+        return BindingBuilder.bind(outTempQueue()).to(outTempExchange()).with(Const.ROUTING_KEY_ENV_OUT_TEMP);
+    }
+
+    //舍内 平均温度
+    @Bean
+    public Queue inTempQueue() {
+        return new Queue(Const.QUEUE_ENV_IN_TEMP);
+    }
+    @Bean
+    TopicExchange inTempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_IN_TEMP);
+    }
+    @Bean
+    Binding bindingInTempExchangeMessage() {
+        return BindingBuilder.bind(inTempQueue()).to(inTempExchange()).with(Const.ROUTING_KEY_ENV_IN_TEMP);
+    }
+
+    //报警
+    @Bean
+    public Queue warningQueue() {
+        return new Queue(Const.QUEUE_ENV_WARNING);
+    }
+    @Bean
+    TopicExchange warningExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_WARNING);
+    }
+    @Bean
+    Binding bindingWarningExchangeMessage() {
+        return BindingBuilder.bind(warningQueue()).to(warningExchange()).with(Const.ROUTING_KEY_ENV_WARNING);
+    }
+}

+ 87 - 0
huimv-env-device/src/main/java/com/huimv/env/device/config/WeChatMessageHelperTest.java

@@ -0,0 +1,87 @@
+package com.huimv.env.device.config;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import org.springframework.stereotype.Component;
+ 
+import java.util.ArrayList;
+import java.util.logging.Logger;
+
+@Component
+public class WeChatMessageHelperTest {
+ 
+    private static WxMaService wxMaService = new WxMaServiceImpl();
+ 
+    /**
+     * 发送小程序订阅消息
+     * @param appletsSubType 小程序类型(developer为开发版、trial为体验版、formal为正式版)
+     * @param appSubTempId 订阅消息模板id
+     * @param appSubPagePath 跳转小程序地址
+     * @param appletsAppid 小程序appId
+     * @param appletsSecret 小程序secret
+     * @param appletsSubToken 小程序token
+     * @param appletsSubAesKey 小程序EncodingAESKey
+     * @param appletsSubDataFormat 数据格式
+     * @param wxMaSubMsgList 消息列表
+     * @param userIds 接收用户id
+     * @return void
+     * @version V1.0
+     * modify history
+     */
+    public static void sendWechatAppSubMessage(String appletsSubType, String appSubTempId, String appSubPagePath, String appletsAppid, String appletsSecret, String appletsSubToken, String appletsSubAesKey, String appletsSubDataFormat, ArrayList<WxMaSubscribeMessage.MsgData> wxMaSubMsgList, String... userIds) throws Exception {
+ 
+        /*
+        // wxMaSubMsgList组装示例,在业务里组装好,再调用系统消息发送工具,系统消息判断是否需要发送小程序订阅消息进行分发,此处不做展示
+        ArrayList<WxMaSubscribeMessage.MsgData> wxMaSubscribeData = new ArrayList<>();
+        WxMaSubscribeMessage.MsgData characterString1 = new WxMaSubscribeMessage.MsgData();
+        characterString1.setName("character_string1");
+        characterString1.setValue("DR15325419846198615651");
+        wxMaSubscribeData.add(characterString1);
+        WxMaSubscribeMessage.MsgData thing3 = new WxMaSubscribeMessage.MsgData();
+        thing3.setName("thing3");
+        thing3.setValue("请XXXXXXXX");
+        wxMaSubscribeData.add(thing3);
+        WxMaSubscribeMessage.MsgData time5 = new WxMaSubscribeMessage.MsgData();
+        time5.setName("time5");
+        time5.setValue(DateUtil.format(new Date(),DateUtil.DATE_TIME_FORMAT));
+        wxMaSubscribeData.add(time5);
+        */
+ 
+        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+        // 小程序appId
+        config.setAppid(appletsAppid);
+        // 小程序secret
+        config.setSecret(appletsSecret);
+        // 小程序token
+        config.setToken(appletsSubToken);
+        // 小程序EncodingAESKey
+        config.setAesKey(appletsSubAesKey);
+        // 数据格式
+        config.setMsgDataFormat(appletsSubDataFormat);
+        wxMaService.setWxMaConfig(config);
+ 
+        for (String userId : userIds) {
+            // TODO:根据用户id获取OpenId,测试时写死
+            WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage();
+            // 要推送的用户openid
+            subscribeMessage.setToUser("openId");
+            // 小程序类型(developer为开发版、trial为体验版、formal为正式版),默认为formal(正式版)
+            subscribeMessage.setMiniprogramState(appletsSubType);
+            // 订阅消息模板id
+            subscribeMessage.setTemplateId(appSubTempId);
+            // 跳转小程序地址
+            subscribeMessage.setPage(appSubPagePath);
+            // 消息列表(组装示例请看方法开始注释部分)
+            subscribeMessage.setData(wxMaSubMsgList);
+ 
+            try {
+                // 发送订阅消息
+                wxMaService.getMsgService().sendSubscribeMsg(subscribeMessage);
+            } catch (Exception e) {
+                System.out.println("微信小程序订阅消息推送失败,接收userId: " + userId+"      "+ e);
+            }
+        }
+    }
+}

+ 175 - 0
huimv-env-device/src/main/java/com/huimv/env/device/config/WebSocket.java

@@ -0,0 +1,175 @@
+package com.huimv.env.device.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.ConcurrentHashMap;
+
+//注册成组件
+@Component
+//定义websocket服务器端,它的功能主要是将目前的类定义成一个websocket服务器端。注解的值将被用于监听用户连接的终端访问URL地址
+@Slf4j
+@ServerEndpoint("/websocket/{farmCode}")
+public class WebSocket {
+    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static int onlineCount = 0;
+    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
+    private static ConcurrentHashMap<String, WebSocket> webSocketSet = new ConcurrentHashMap<String, WebSocket>();
+    //与某个客户端的连接会话,需要通过它来给客户端发送数据
+    private Session WebSocketsession;
+    //当前发消息的人员编号
+    private String farmCode = "";
+
+
+
+    @OnOpen
+    public void onOpen(@PathParam(value = "farmCode") String param, Session WebSocketsession, EndpointConfig config) {
+        System.out.println(param);
+        farmCode = param;//接收到发送消息的人员编号
+        this.WebSocketsession = WebSocketsession;
+        webSocketSet.put(param, this);//加入map中
+        addOnlineCount();           //在线数加1
+        System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
+    }
+
+
+    /**
+     * 连接关闭调用的方法
+     */
+    @OnClose
+    public void onClose() {
+        if (!farmCode.equals("")) {
+            webSocketSet.remove(farmCode);  //从set中删除
+            subOnlineCount();           //在线数减1
+            System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
+        }
+    }
+
+
+    /**
+     * 收到客户端消息后调用的方法
+     *
+     * @param message 客户端发送过来的消息
+     * @param session 可选的参数
+     */
+    @SuppressWarnings("unused")
+//	@OnMessage
+    public void onMessage(String message, Session session) {
+        System.out.println("来自客户端的消息:" + message);
+//        session.get
+        //群发消息
+        if (1 < 2) {
+            sendAll(message);
+        } else {
+            //给指定的人发消息
+            sendToUser(message);
+        }
+    }
+
+
+    /**
+     * 给指定的人发送消息
+     * @param message
+     */
+    @OnMessage
+    public void sendToUser(String message) {
+        String sendfarmCode = message.split(",")[1];
+        String sendMessage = message.split(",")[0];
+        String now = getNowTime();
+        try {
+            if (webSocketSet.get(sendfarmCode) != null) {
+                webSocketSet.get(sendfarmCode).sendMessage(now + "用户" + farmCode + "发来消息:" + " <br/> " + sendMessage);
+            } else {
+                System.out.println("当前用户不在线");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 给所有人发消息
+     * @param message
+     */
+    private void sendAll(String message) {
+        String now = getNowTime();
+        String sendMessage = message.split("[|]")[0];
+        //遍历HashMap
+        for (String key : webSocketSet.keySet()) {
+            try {
+                //判断接收用户是否是当前发消息的用户
+                if (!farmCode.equals(key)) {
+                    webSocketSet.get(key).sendMessage(now + "用户" + farmCode + "发来消息:" + " <br/> " + sendMessage);
+                    System.out.println("key = " + key);
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+
+
+    /**
+     * 获取当前时间
+     *
+     * @return
+     */
+    private String getNowTime() {
+        Date date = new Date();
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String time = format.format(date);
+        return time;
+    }
+    /**
+     * 发生错误时调用
+     *
+     * @param session
+     * @param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        System.out.println("发生错误");
+        error.printStackTrace();
+    }
+
+
+    /**
+     * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
+     *
+     * @param message
+     * @throws IOException
+     */
+    public void sendMessage(String message) throws IOException {
+        this.WebSocketsession.getBasicRemote().sendText(message);
+        //this.session.getAsyncRemote().sendText(message);
+    }
+
+
+    public static synchronized int getOnlineCount() {
+        return onlineCount;
+    }
+
+
+    public static synchronized void addOnlineCount() {
+        WebSocket.onlineCount++;
+    }
+
+
+    public static synchronized void subOnlineCount() {
+        WebSocket.onlineCount--;
+    }
+
+
+
+
+}

+ 19 - 0
huimv-env-device/src/main/java/com/huimv/env/device/config/WebSocketConfig.java

@@ -0,0 +1,19 @@
+package com.huimv.env.device.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * websocket
+ * 的配置信息
+ */
+@Configuration
+public class WebSocketConfig {
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+
+        return new ServerEndpointExporter();
+    }
+}

+ 319 - 0
huimv-env-device/src/main/java/com/huimv/env/device/listener/DeviceListener.java

@@ -0,0 +1,319 @@
+//package com.huimv.env.device.listener;
+//
+//import com.huimv.env.common.utils.Const;
+//import com.huimv.env.common.utils.MathUtil2;
+//import com.huimv.env.device.service.IDeviceService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+//import org.springframework.amqp.rabbit.annotation.RabbitListener;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.Map;
+//
+//@Component
+//@Slf4j
+//public class DeviceListener {
+//    @Autowired
+//    private IDeviceService deviceService;
+//
+//    @Autowired
+//    private MathUtil2 mathUtil;
+//
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_CO2_DATA)
+//    @RabbitHandler
+//    public void processEnvCO2(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 11 接收CO2数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveCO2(dataArray);
+//        }catch (Exception e){
+//            System.out.println("co2异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_YALI_DATA)
+//    @RabbitHandler
+//    public void processEnvYali(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 11 接收压力数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveYaLI(dataArray);
+//        }catch (Exception e){
+//            System.out.println("压力异常"+e);
+//        }
+//    }
+//
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_TEMP)
+//    @RabbitHandler
+//    public void processEnvTemp(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 11 接收温度数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveTemp(dataArray);
+//        }catch (Exception e){
+//            System.out.println("温度异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_TARGET_TEMP)
+//    @RabbitHandler
+//    public void processEnvTargetTemp(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 17 接收目标温度数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveTargetTemp(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_HUMI)
+//    @RabbitHandler
+//    public void processEnvHumi(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 12 接收湿度数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveHumi(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_DAYAGE)
+//    @RabbitHandler
+//    public void processEnvDayAge(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 13 接收日龄数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveDayAge(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_FENG)
+//    @RabbitHandler
+//    public void processEnvFeng(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 14 接收风机数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveFeng(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_OUT_TEMP)
+//    @RabbitHandler
+//    public void processOutTemp(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 15 接收舍外温度数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveOutTemp(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_IN_TEMP)
+//    @RabbitHandler
+//    public void processInTemp(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 16 接收舍内温度数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveInTemp(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_WARNING)
+//    @RabbitHandler
+//    public void processWning(Map RawMap)   {
+//        System.out.println(">>>>>>>>>>>>>> 17 接收报警数据 RawMap>>" + RawMap.toString());
+//        try {
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveWarning(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_FENG_STATUS)
+//    @RabbitHandler
+//    public void processFengStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 17 接收风机状态数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveFengStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("湿度异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_SHILIAN_STATUS)
+//    @RabbitHandler
+//    public void processShiLianStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 18 接收湿帘状态数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveShiLianStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收湿帘异常"+e);
+//        }
+//
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_PENWU_STATUS)
+//    @RabbitHandler
+//    public void processPenWuStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 19 接收喷雾状态数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.savePenWuStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收喷雾状态异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_DAYAGE_PEIZHI)
+//    @RabbitHandler
+//    public void processDayAgePeiZhi(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 19 接收日龄配置数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveDayAgePeiZhi(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收日龄配置异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_FENG_PEIZHI)
+//    @RabbitHandler
+//    public void processFengPeiZhi(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 19 接收风机配置数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveFengPeiZhi(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收风机配置异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_SHUINUAN_DATA)
+//    @RabbitHandler
+//    public void processShuiNuanData(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 8 接收水暖配置数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveShuiNuan(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收水暖配置数据异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_WEIZHI_DATA)
+//    @RabbitHandler
+//    public void processWeiZhiData(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 9 接收位置数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveWeiZhi(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收水暖配置数据异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_SHUIBIAO_DATA)
+//    @RabbitHandler
+//    public void processShuiBiaoData(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 31 接收水表数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveShuiBiao(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收水表数据数据异常"+e);
+//        }
+//    }
+//
+//    @RabbitListener(queues = Const.QUEUE_ENV_DIANBIAO_DATA)
+//    @RabbitHandler
+//    public void processDianBiaoData(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 32 接收电表数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveDianBiao(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收电表数据数据异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_JIARE_STATUS)
+//    @RabbitHandler
+//    public void processJiaReStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 64 接收加热器状态数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveJiaReStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收加热器状态异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_XIAOCHUANG_STATUS)
+//    @RabbitHandler
+//    public void processXiaoChuangStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 65 接收小窗状态数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveXiaoChuangStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收小窗状态异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_DAOLIU_STATUS)
+//    @RabbitHandler
+//    public void processDaoLiuStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 66 接收导流板状态 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveDaoLiuStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收导流板状态异常"+e);
+//        }
+//    }
+//    @RabbitListener(queues = Const.QUEUE_ENV_ZHAOMING_STATUS)
+//    @RabbitHandler
+//    public void processZhaoMingStatus(Map RawMap)   {
+//        try {
+//            System.out.println(">>>>>>>>>>>>>> 67 接收照明数据 RawMap>>" + RawMap.toString());
+//            String askText = RawMap.get("askText").toString();
+//            String[] dataArray = askText.split("\\+");
+//            deviceService.saveZhaoMingStatus(dataArray);
+//        }catch (Exception e){
+//            System.out.println("接收照明数据异常"+e);
+//        }
+//    }
+//
+//
+//}

+ 52 - 0
huimv-env-device/src/main/java/com/huimv/env/device/listener/SensorListener.java

@@ -0,0 +1,52 @@
+//package com.huimv.env.device.listener;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.huimv.env.common.service.ISensorRegisterService;
+//import com.huimv.env.common.utils.Const;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+//import org.springframework.amqp.rabbit.annotation.RabbitListener;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import java.sql.Timestamp;
+//import java.text.ParseException;
+//import java.util.Date;
+//import java.util.Map;
+//
+///**
+// * @Project : huimv.shiwan
+// * @Package : com.huimv.biosafety.uface.controller
+// * @Description : TODO
+// * @Version : 1.0
+// * @Author : ZhuoNing
+// * @Create : 2020-12-25
+// **/
+//@Component
+//@Slf4j
+//public class SensorListener {
+//    @Autowired
+//    private ISensorRegisterService sensorRegisterService;
+//
+//    @RabbitListener(queues = Const.QUEUE_SENSOR)
+//    @RabbitHandler
+//    public void processTemp(Map RawMap) throws ParseException {
+//        System.out.println(">>>>>>接收传感器数据 RawMap>>" + RawMap.toString());
+//        JSONObject sensorJo = JSON.parseObject(RawMap.get("sensor").toString());
+//        String deviceCode = sensorJo.getString("deviceCode");
+//        int sensorSn = sensorJo.getInteger("sensorSn");
+//        int sensorSort = sensorJo.getInteger("sensorSort");
+//        String farmCode = sensorJo.getString("farmCode");
+//        Timestamp nowTimestamp = sensorJo.getTimestamp("timestamp");
+//        java.sql.Date todayDate = new java.sql.Date(sensorJo.getDate("todayDate").getTime());
+//        String value = sensorJo.getString("value");
+//        if (sensorRegisterService.isExistSensorRegister(deviceCode, sensorSn, farmCode,sensorSort)) {
+//            //{更新传感器注册信息}
+//            sensorRegisterService.updateSensorRegister(deviceCode, sensorSn, nowTimestamp, todayDate, value, farmCode,sensorSort);
+//        } else {
+//            //{保存传感器注册信息}
+//            sensorRegisterService.saveSensorRegister(deviceCode, sensorSn, nowTimestamp, todayDate, value, farmCode,sensorSort);
+//        }
+//    }
+//}

+ 45 - 0
huimv-env-device/src/main/java/com/huimv/env/device/producer/Producer.java

@@ -0,0 +1,45 @@
+package com.huimv.env.device.producer;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.env.common.utils.Const;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+@Slf4j
+public class Producer {
+    @Autowired
+    RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法
+
+    /**
+     * @Method      : sendTempAskToMQ
+     * @Description : 
+     * @Params      : [askText]
+     * @Return      : java.lang.String
+     * 
+     * @Author      : ZhuoNing
+     * @Date        : 2022/8/17       
+     * @Time        : 19:29
+     */
+//    public String sendSensorAskToMQ(JSONObject sensorJo){
+//        Map map = new HashMap();
+//        map.put("sensor",sensorJo);
+//        rabbitTemplate.convertAndSend(Const.EXCHANGE_SENSOR, Const.ROUTING_KEY_SENSOR, map);
+//        return "ok";
+//    }
+
+
+}

+ 104 - 0
huimv-env-device/src/main/resources/application-dev.yml

@@ -0,0 +1,104 @@
+server:
+  port: 8092
+
+spring:
+  application:
+    name: huimv-env-device
+
+  datasource:
+    url: jdbc:mysql://115.238.57.190:3306/huimv-farm-env?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: true
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+  rabbitmq:
+    host: 119.3.84.55
+    port: 5672
+    username: huimv
+    password: hm123456
+    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /dev
+
+    #确认消息已发送到交换机(Exchange)
+#    publisher-confirms: true #(过时、弃用)
+    publisher-confirm-type: correlated
+    #确认消息已发送到队列(Queue)
+    publisher-returns: true
+
+  #redis
+#  redis:
+#    database: 0
+#    host: 192.168.1.68
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+#    lettuce:
+#      pool:
+#        max-active: 3
+#        min-idle: 2
+#        max-idle: 3
+#        max-wait: 1
+#      shutdown-timeout: 100
+
+  data:
+    redis:
+      repositories:
+        enabled: false
+
+  #是否缓存空值
+  cache:
+    redis:
+      cache-null-values: false
+
+
+
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://192.168.1.7:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: true
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"   # * 在yaml 文件属于关键字,所以需要加引号
+

+ 115 - 0
huimv-env-device/src/main/resources/application-prod.yml

@@ -0,0 +1,115 @@
+server:
+  port: 8098
+
+spring:
+  application:
+    name: huimv-env-device
+
+  datasource:
+    url: jdbc:mysql://121.36.134.218/huimv-farm-env?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: hylintech
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: true
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+  rabbitmq:
+    host: 121.36.134.218
+    port: 5672
+    username: admin
+    password: admin
+    #虚拟host 可以不设置,使用server默认host
+    virtual-host: /env
+    listener:
+      simple:
+        acknowledge-mode: none  #消费端不需要确认
+    #确认消息已发送到交换机(Exchange)
+    publisher-confirm-type: correlated
+    #确认消息已发送到队列(Queue)
+    publisher-returns: true
+
+  #redis
+#  redis:
+#    database: 0
+#    host: 192.168.1.68
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+#    lettuce:
+#      pool:
+#        max-active: 3
+#        min-idle: 2
+#        max-idle: 3
+#        max-wait: 1
+#      shutdown-timeout: 100
+
+#  data:
+#    redis:
+#      repositories:
+#        enabled: false
+
+  #是否缓存空值
+#  cache:
+#    redis:
+#      cache-null-values: false
+
+
+
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://192.168.1.7:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: true
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"   # * 在yaml 文件属于关键字,所以需要加引号
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  # mapper.xml文件所存放的位置
+  mapper-locations: classpath*:com/huimv/env/common/mapper/xml/*.xml  # 不加这一行出错:“org.apache.ibatis.binding.BindingException:  Invalid bound statement (not found)”
+
+wx:
+  appId: "wx707fcfd7d09e02eb"  #小程序appId
+  secret: "w95K45G9-2xGocleqrtGoHwEGF6ocqSu8EbDBxCQSR0"   #小程序密钥
+  templateId: "f932c54f1cbd427b10218a0d1cfb88bf"  #订阅消息模板

+ 34 - 0
huimv-env-device/src/main/resources/application.properties

@@ -0,0 +1,34 @@
+spring.profiles.active=prod
+#spring.profiles.active=dev
+
+#\u5F00\u542F\u5065\u5EB7\u76D1\u63A7
+management.endpoints.web.exposure.include=*
+
+#########################################################
+###             \u914D\u7F6Eundertow\u53D6\u4EE3tomcat                ###
+#########################################################
+# \u662F\u5426\u6253\u5F00 undertow \u65E5\u5FD7\uFF0C\u9ED8\u8BA4\u4E3A false
+server.undertow.accesslog.enabled=false
+# \u8BBE\u7F6E\u8BBF\u95EE\u65E5\u5FD7\u6240\u5728\u76EE\u5F55
+server.undertow.accesslog.dir=logs
+# \u6307\u5B9A\u5DE5\u4F5C\u8005\u7EBF\u7A0B\u7684 I/0 \u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A 2 \u6216\u8005 CPU \u7684\u4E2A\u6570
+server.undertow.io-threads=
+# \u6307\u5B9A\u5DE5\u4F5C\u8005\u7EBF\u7A0B\u4E2A\u6570\uFF0C\u9ED8\u8BA4\u4E3A I/O \u7EBF\u7A0B\u4E2A\u6570\u7684 8 \u500D
+server.undertow.worker-threads=
+# \u8BBE\u7F6E HTTP POST \u5185\u5BB9\u7684\u6700\u5927\u957F\u5EA6\uFF0C\u9ED8\u8BA4\u4E0D\u505A\u9650\u5236
+server.undertow.max-http-post-size=0
+
+#########################################################
+###   Actuator Monitor  --   Actuator configuration   ###
+#########################################################
+management.security.enabled=false
+
+# \u6570\u636E\u5904\u7406\u6D41\u7A0B
+data.input.flow=2
+
+# \u662F\u5426\u5199\u5165\u6D4B\u8BD5\u6570\u636E(1:\u5199\u5165 0:\u4E0D\u5199\u5165)
+data.test.input=0
+
+# PinYin
+#push.message.fault.list=0:\u521D\u59CB\u5316,1:\u65AD\u7535,2:\u9AD8\u6E29,3:\u4F4E\u6E29,4:\u4F20\u611F\u5668\u6545\u969C
+#push.message.act.list=1:\u62A5\u8B66,2:\u6062\u590D

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 3 - 0
huimv-env-device/src/main/resources/conf/config.properties


+ 61 - 0
huimv-env-device/src/test/java/com/huimv/env/device/service/DeviceTest.java

@@ -0,0 +1,61 @@
+package com.huimv.env.device.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.env.device.config.ConfigBean;
+//import com.huimv.env.device.listener.DeviceListener;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.security.RunAs;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class DeviceTest {
+//    @Autowired
+//    private Show show;
+    @Autowired
+    private ConfigBean configBean;
+
+//    @Test
+//    public void test1(){
+//        show.show1();
+//
+//        JSONArray testJa = new JSONArray();
+//        JSONObject testJo = new JSONObject();
+//        testJa.add(testJo);
+//        testJo.put("id",0);
+//        testJo.put("fault","初始化");
+//        JSONObject testJo2 = new JSONObject();
+//        testJa.add(testJo2);
+//        testJo2.put("id",0);
+//        testJo2.put("fault","初始化");
+//        System.out.println("testJa="+testJa.toJSONString());
+//    }
+
+//    @Test
+//    public void test2() {
+//        show.show2();
+//    }
+
+    @Test
+    public void test3(){
+        String act = configBean.getAct();
+        String fault = configBean.getFault();
+        System.out.println("act="+act);
+        System.out.println("fault="+fault);
+    }
+}

+ 92 - 0
huimv-env-input/pom.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.1</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>huimv-env-input</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+
+    <dependencies>
+        <!-- 排除Tomcat容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <!-- 移除掉默认支持的 Tomcat -->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- 添加 Undertow 容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <!-- mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!--rabbitmq-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <!-- redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <!-- actuator -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.huimv</groupId>
+            <artifactId>huimv-env-common</artifactId>
+            <version>0.0.7-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 22 - 0
huimv-env-input/src/main/java/com/huimv/env/input/HuimvEnvInputApplication.java

@@ -0,0 +1,22 @@
+package com.huimv.env.input;
+
+//import com.huimv.env.input.server.EnvInputServer;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScans;
+
+@ComponentScans({@ComponentScan("com.huimv.env.common.utils"), @ComponentScan("com.huimv.env.common.service"),@ComponentScan("com.huimv.env.common.config")})
+@EntityScan(value = "com.huimv.env.common.entity")
+@MapperScan("com.huimv.env.common.mapper")
+@SpringBootApplication
+public class HuimvEnvInputApplication {
+    public static void main(String[] args) throws InterruptedException {
+        ApplicationContext applicationContext = SpringApplication.run(HuimvEnvInputApplication.class, args);
+        // EnvInputServer
+//        applicationContext.getBean(EnvInputServer.class).run();
+    }
+}

+ 329 - 0
huimv-env-input/src/main/java/com/huimv/env/input/config/TopicRabbitMQConfig.java

@@ -0,0 +1,329 @@
+package com.huimv.env.input.config;
+
+import com.huimv.env.common.utils.Const;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Configuration
+public class TopicRabbitMQConfig {
+    //温度
+    @Bean
+    public Queue tempQueue() {
+        return new Queue(Const.QUEUE_ENV_TEMP);
+    }
+    @Bean
+    TopicExchange tempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_TEMP);
+    }
+    @Bean
+    Binding bindingTempExchangeMessage() {
+        return BindingBuilder.bind(tempQueue()).to(tempExchange()).with(Const.ROUTING_KEY_ENV_TEMP);
+    }
+
+    //目标温度
+    @Bean
+    public Queue targetTempQueue() {
+        return new Queue(Const.QUEUE_ENV_TARGET_TEMP);
+    }
+    @Bean
+    TopicExchange targetTempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_TARGET_TEMP);
+    }
+    @Bean
+    Binding bindingTargetTempExchangeMessage() {
+        return BindingBuilder.bind(targetTempQueue()).to(targetTempExchange()).with(Const.ROUTING_KEY_ENV_TARGET_TEMP);
+    }
+    //湿度
+    @Bean
+    public Queue humiQueue() {
+        return new Queue(Const.QUEUE_ENV_HUMI);
+    }
+    @Bean
+    TopicExchange humiExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_HUMI);
+    }
+    @Bean
+    Binding bindingTumiExchangeMessage() {
+        return BindingBuilder.bind(humiQueue()).to(humiExchange()).with(Const.ROUTING_KEY_ENV_HUMI);
+    }
+
+    //日龄
+    @Bean
+    public Queue dayAgeQueue() {
+        return new Queue(Const.QUEUE_ENV_DAYAGE);
+    }
+    @Bean
+    TopicExchange dayAgeExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_DAYAGE);
+    }
+    @Bean
+    Binding bindingDayAgeExchangeMessage() {
+        return BindingBuilder.bind(dayAgeQueue()).to(dayAgeExchange()).with(Const.ROUTING_KEY_ENV_DAYAGE);
+    }
+
+    //通风
+    @Bean
+    public Queue fengQueue() {
+        return new Queue(Const.QUEUE_ENV_FENG);
+    }
+    @Bean
+    TopicExchange fengExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_FENG);
+    }
+    @Bean
+    Binding bindingFengExchangeMessage() {
+        return BindingBuilder.bind(fengQueue()).to(fengExchange()).with(Const.ROUTING_KEY_ENV_FENG);
+    }
+
+    //舍外
+    @Bean
+    public Queue outTempQueue() {
+        return new Queue(Const.QUEUE_ENV_OUT_TEMP);
+    }
+    @Bean
+    TopicExchange outTempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_OUT_TEMP);
+    }
+    @Bean
+    Binding bindingOutTempExchangeMessage() {
+        return BindingBuilder.bind(outTempQueue()).to(outTempExchange()).with(Const.ROUTING_KEY_ENV_OUT_TEMP);
+    }
+
+    //舍内 平均温度
+    @Bean
+    public Queue inTempQueue() {
+        return new Queue(Const.QUEUE_ENV_IN_TEMP);
+    }
+    @Bean
+    TopicExchange inTempExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_IN_TEMP);
+    }
+    @Bean
+    Binding bindingInTempExchangeMessage() {
+        return BindingBuilder.bind(inTempQueue()).to(inTempExchange()).with(Const.ROUTING_KEY_ENV_IN_TEMP);
+    }
+
+    //报警
+    @Bean
+    public Queue warningQueue() {
+        return new Queue(Const.QUEUE_ENV_WARNING);
+    }
+    @Bean
+    TopicExchange warningExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_WARNING);
+    }
+    @Bean
+    Binding bindingWarningExchangeMessage() {
+        return BindingBuilder.bind(warningQueue()).to(warningExchange()).with(Const.ROUTING_KEY_ENV_WARNING);
+    }
+
+    //湿帘状态
+    @Bean
+    public Queue shilianStatusQueue() {
+        return new Queue(Const.QUEUE_ENV_SHILIAN_STATUS);
+    }
+    @Bean
+    TopicExchange shilianStatusExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_SHILIAN_STATUS);
+    }
+    @Bean
+    Binding bindingshilianStatusExchangeMessage() {
+        return BindingBuilder.bind(shilianStatusQueue()).to(shilianStatusExchange()).with(Const.ROUTING_KEY_ENV_SHILIAN_STATUS);
+    }
+
+    //喷雾状态
+    @Bean
+    public Queue penwuStatusQueue() {
+        return new Queue(Const.QUEUE_ENV_PENWU_STATUS);
+    }
+    @Bean
+    TopicExchange penwuStatusExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_PENWU_STATUS);
+    }
+    @Bean
+    Binding bindingpenwuStatusExchangeMessage() {
+        return BindingBuilder.bind(penwuStatusQueue()).to(penwuStatusExchange()).with(Const.ROUTING_KEY_ENV_PENWU_STATUS);
+    }
+
+    //日龄温度曲线配置
+    @Bean
+    public Queue dayagePeizhiQueue() {
+        return new Queue(Const.QUEUE_ENV_DAYAGE_PEIZHI);
+    }
+    @Bean
+    TopicExchange dayagePeizhiExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_DAYAGE_PEIZHI);
+    }
+    @Bean
+    Binding bindingdayagePeizhiExchangeMessage() {
+        return BindingBuilder.bind(dayagePeizhiQueue()).to(dayagePeizhiExchange()).with(Const.ROUTING_KEY_ENV_DAYAGE_PEIZHI);
+    }
+
+    //风机状态
+    @Bean
+    public Queue fengPeizhiQueue() {
+        return new Queue(Const.QUEUE_ENV_FENG_PEIZHI);
+    }
+    @Bean
+    TopicExchange fengPeizhiExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_FENG_PEIZHI);
+    }
+    @Bean
+    Binding bindingfengPeizhiExchangeMessage() {
+        return BindingBuilder.bind(fengPeizhiQueue()).to(fengPeizhiExchange()).with(Const.ROUTING_KEY_ENV_FENG_PEIZHI);
+    }
+
+
+    //CO2
+    @Bean
+    public Queue co2DataQueue() {
+        return new Queue(Const.QUEUE_ENV_CO2_DATA);
+    }
+    @Bean
+    TopicExchange co2DatExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_CO2_DATA);
+    }
+    @Bean
+    Binding bindingCo2DatExchangeMessage() {
+        return BindingBuilder.bind(co2DataQueue()).to(co2DatExchange()).with(Const.ROUTING_KEY_ENV_CO2_DATA);
+    }
+
+    //CO2
+    @Bean
+    public Queue yaliDataQueue() {
+        return new Queue(Const.QUEUE_ENV_YALI_DATA);
+    }
+    @Bean
+    TopicExchange yaliDatExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_YALI_DATA);
+    }
+    @Bean
+    Binding bindingYaliDatExchangeMessage() {
+        return BindingBuilder.bind(yaliDataQueue()).to(yaliDatExchange()).with(Const.ROUTING_KEY_ENV_YALI_DATA);
+    }
+
+
+    //水暖
+    @Bean
+    public Queue shuinuanDataQueue() {
+        return new Queue(Const.QUEUE_ENV_SHUINUAN_DATA);
+    }
+    @Bean
+    TopicExchange shuinuanDatExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_SHUINUAN_DATA);
+    }
+    @Bean
+    Binding bindingshuinuanDatExchangeMessage() {
+        return BindingBuilder.bind(shuinuanDataQueue()).to(shuinuanDatExchange()).with(Const.ROUTING_KEY_ENV_SHUINUAN_DATA);
+    }
+
+    //位置
+    @Bean
+    public Queue weizhiDataQueue() {
+        return new Queue(Const.QUEUE_ENV_WEIZHI_DATA);
+    }
+    @Bean
+    TopicExchange weizhiDatExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_WEIZHI_DATA);
+    }
+    @Bean
+    Binding bindingweizhiDatExchangeMessage() {
+        return BindingBuilder.bind(weizhiDataQueue()).to(weizhiDatExchange()).with(Const.ROUTING_KEY_ENV_WEIZHI_DATA);
+    }
+
+    // 水表
+    @Bean
+    public Queue shuibiaoDataQueue() {
+        return new Queue(Const.QUEUE_ENV_SHUIBIAO_DATA);
+    }
+    @Bean
+    TopicExchange shuibiaoDatExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_SHUIBIAO_DATA);
+    }
+    @Bean
+    Binding bindingshuibiaoDatExchangeMessage() {
+        return BindingBuilder.bind(shuibiaoDataQueue()).to(shuibiaoDatExchange()).with(Const.ROUTING_KEY_ENV_SHUIBIAO_DATA);
+    }
+
+    //电表
+    @Bean
+    public Queue dianbiaoDataQueue() {
+        return new Queue(Const.QUEUE_ENV_DIANBIAO_DATA);
+    }
+    @Bean
+    TopicExchange dianbiaoDatExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_DIANBIAO_DATA);
+    }
+    @Bean
+    Binding bindingdianbiaoDatExchangeMessage() {
+        return BindingBuilder.bind(dianbiaoDataQueue()).to(dianbiaoDatExchange()).with(Const.ROUTING_KEY_ENV_DIANBIAO_DATA);
+    }
+
+    //加热器
+    @Bean
+    public Queue jiareStatusQueue() {
+        return new Queue(Const.QUEUE_ENV_JIARE_STATUS);
+    }
+    @Bean
+    TopicExchange jiareStatusExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_JIARE_STATUS);
+    }
+    @Bean
+    Binding bindingjiareStatusExchangeMessage() {
+        return BindingBuilder.bind(jiareStatusQueue()).to(jiareStatusExchange()).with(Const.ROUTING_KEY_ENV_JIARE_STATUS);
+    }
+
+    //小窗
+    @Bean
+    public Queue xiaochuangStatusQueue() {
+        return new Queue(Const.QUEUE_ENV_XIAOCHUANG_STATUS);
+    }
+    @Bean
+    TopicExchange xiaochuangStatusExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_XIAOCHUANG_STATUS);
+    }
+    @Bean
+    Binding bindingxiaochuangStatusExchangeMessage() {
+        return BindingBuilder.bind(xiaochuangStatusQueue()).to(xiaochuangStatusExchange()).with(Const.ROUTING_KEY_ENV_XIAOCHUANG_STATUS);
+    }
+
+    //导流板
+    @Bean
+    public Queue daoliuStatusQueue() {
+        return new Queue(Const.QUEUE_ENV_DAOLIU_STATUS);
+    }
+    @Bean
+    TopicExchange daoliuStatusExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_DAOLIU_STATUS);
+    }
+    @Bean
+    Binding bindingdaoliuStatusExchangeMessage() {
+        return BindingBuilder.bind(daoliuStatusQueue()).to(daoliuStatusExchange()).with(Const.ROUTING_KEY_ENV_DAOLIU_STATUS);
+    }
+
+    //照明
+    @Bean
+    public Queue zhaomingStatusQueue() {
+        return new Queue(Const.QUEUE_ENV_ZHAOMING_STATUS);
+    }
+    @Bean
+    TopicExchange zhaomingStatusExchange() {
+        return new TopicExchange(Const.EXCHANGE_ENV_ZHAOMING_STATUS);
+    }
+    @Bean
+    Binding bindingzhaomingStatusExchangeMessage() {
+        return BindingBuilder.bind(zhaomingStatusQueue()).to(zhaomingStatusExchange()).with(Const.ROUTING_KEY_ENV_ZHAOMING_STATUS);
+    }
+}

+ 195 - 0
huimv-env-input/src/main/java/com/huimv/env/input/producer/Producer.java

@@ -0,0 +1,195 @@
+package com.huimv.env.input.producer;
+
+import com.huimv.env.common.utils.Const;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+@Slf4j
+public class Producer {
+    @Autowired
+    RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法
+
+
+    public String sendTempAskToMQ(String askText){
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_TEMP, Const.ROUTING_KEY_ENV_TEMP, map);
+        return "ok";
+    }
+
+    public String sendDayAge(String askText){
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_DAYAGE, Const.ROUTING_KEY_ENV_DAYAGE, map);
+        return "ok";
+    }
+
+    public String sendFeng(String askText){
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_FENG, Const.ROUTING_KEY_ENV_FENG, map);
+        return "ok";
+    }
+
+    public String sendOutTemp(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_OUT_TEMP, Const.ROUTING_KEY_ENV_OUT_TEMP, map);
+        return "ok";
+    }
+
+    public String sendInTemp(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_IN_TEMP, Const.ROUTING_KEY_ENV_IN_TEMP, map);
+        return "ok";
+    }
+
+    public String sendTemp(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_TEMP, Const.ROUTING_KEY_ENV_TEMP, map);
+        return "ok";
+    }
+
+    public String sendHumi(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_HUMI, Const.ROUTING_KEY_ENV_HUMI, map);
+        return "ok";
+    }
+
+    public String sendWarning(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_WARNING, Const.ROUTING_KEY_ENV_WARNING, map);
+        return "ok";
+    }
+
+    public String uploadFengStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_FENG_STATUS, Const.ROUTING_KEY_ENV_FENG_STATUS, map);
+        return "ok";
+    }
+
+    public String  senTargetnTemp(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_TARGET_TEMP, Const.ROUTING_KEY_ENV_TARGET_TEMP, map);
+        return "ok";
+
+    }
+
+    public String sendShiLianStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_SHILIAN_STATUS, Const.ROUTING_KEY_ENV_SHILIAN_STATUS, map);
+        return "ok";
+    }
+
+    public String sendPengWuStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_PENWU_STATUS, Const.ROUTING_KEY_ENV_PENWU_STATUS, map);
+        return "ok";
+    }
+    public String sendDayAgePeiZhi(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_DAYAGE_PEIZHI, Const.ROUTING_KEY_ENV_DAYAGE_PEIZHI, map);
+        return "ok";
+    }
+    public String sendTongFengPeiZhi(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_FENG_PEIZHI, Const.ROUTING_KEY_ENV_FENG_PEIZHI, map);
+        return "ok";
+    }
+
+
+    public String sendCo2(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_CO2_DATA, Const.ROUTING_KEY_ENV_CO2_DATA, map);
+        return "ok";
+    }
+
+    public String sendYaLi(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_YALI_DATA, Const.ROUTING_KEY_ENV_YALI_DATA, map);
+        return "ok";
+    }
+
+    public String  sendShuiNuan(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_SHUINUAN_DATA, Const.ROUTING_KEY_ENV_SHUINUAN_DATA, map);
+        return "ok";
+    }
+
+    public String  sendWeiZhi(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_WEIZHI_DATA, Const.ROUTING_KEY_ENV_WEIZHI_DATA, map);
+        return "ok";
+
+    }
+
+    public String sendShuiBiaoData(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_SHUIBIAO_DATA, Const.ROUTING_KEY_ENV_SHUIBIAO_DATA, map);
+        return "ok";
+    }
+
+    public String sendDianBiaoData(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_DIANBIAO_DATA, Const.ROUTING_KEY_ENV_DIANBIAO_DATA, map);
+        return "ok";
+    }
+
+    public String sendJiaReStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_JIARE_STATUS, Const.ROUTING_KEY_ENV_JIARE_STATUS, map);
+        return "ok";
+    }
+
+    public String sendXiaoChuangStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_XIAOCHUANG_STATUS, Const.ROUTING_KEY_ENV_XIAOCHUANG_STATUS, map);
+        return "ok";
+    }
+
+    public String sendDaoLiuStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_DAOLIU_STATUS, Const.ROUTING_KEY_ENV_DAOLIU_STATUS, map);
+        return "ok";
+    }
+
+    public String sendZhaoMingStatus(String askText) {
+        Map map = new HashMap();
+        map.put("askText",askText);
+        rabbitTemplate.convertAndSend(Const.EXCHANGE_ENV_ZHAOMING_STATUS, Const.ROUTING_KEY_ENV_ZHAOMING_STATUS, map);
+        return "ok";
+    }
+}

+ 74 - 0
huimv-env-input/src/main/java/com/huimv/env/input/server/EnvInputServer.java

@@ -0,0 +1,74 @@
+//package com.huimv.env.input.server;
+//
+//import io.netty.bootstrap.ServerBootstrap;
+//import io.netty.channel.ChannelFuture;
+//import io.netty.channel.ChannelInitializer;
+//import io.netty.channel.EventLoopGroup;
+//import io.netty.channel.nio.NioEventLoopGroup;
+//import io.netty.channel.socket.SocketChannel;
+//import io.netty.channel.socket.nio.NioServerSocketChannel;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+///**
+// * @Project : huimv.shiwan
+// * @Package : com.huimv.biosafety.uface.controller
+// * @Description : TODO
+// * @Version : 1.0
+// * @Author : ZhuoNing
+// * @Create : 2020-12-25
+// **/
+//@Component
+//public class EnvInputServer {
+//    @Autowired
+//    private EnvInputServerHandler serverHandler;
+//    //监听端口
+//    private int port = 3726;
+//    //创建构造方法
+//    public EnvInputServer(){
+//    }
+//
+//    public static void main(String[] args) throws InterruptedException {
+//        new EnvInputServer().run();
+//    }
+///**
+// *
+// * 功能描述: 启动方法前台多个服务  处理多个线程
+// *
+// * @param:
+// * @return:
+// * @auther: LiGang
+// * @date: 2019/3/26 11:31
+// */
+//    /**
+//     * 启动流程
+//     */
+//    public void run() throws InterruptedException {
+//        //配置服务端线程组
+//        EventLoopGroup bossGroup=new NioEventLoopGroup();
+//        EventLoopGroup workGroup=new NioEventLoopGroup();
+//
+//        try{
+//            //引导整个server的启动
+//            ServerBootstrap serverBootstrap = new ServerBootstrap();
+//            serverBootstrap.group(bossGroup,workGroup)
+//                    .channel(NioServerSocketChannel.class)    //指定处理的连接类型
+//                    .childHandler(new ChannelInitializer<SocketChannel>() {
+//                        @Override
+//                        protected void initChannel(SocketChannel socketChannel) throws Exception {
+//                            socketChannel.pipeline().addLast(serverHandler);
+//                        }
+//                    });
+//            System.out.println("# 耳标及采集器设备数据接收服务器已经启动,监听端口(Port):"+port);
+//            System.out.println("# 准备接收数据:");
+//            //绑定端口,同步等待成功
+//            ChannelFuture cf = serverBootstrap.bind(port).sync();
+//            // 等待服务端监听端口关闭
+//            cf.channel().closeFuture().sync();
+//        }finally {
+//            //优雅的退出
+//            bossGroup.shutdownGracefully();
+//            workGroup.shutdownGracefully();
+//        }
+//    }
+//}

+ 637 - 0
huimv-env-input/src/main/java/com/huimv/env/input/server/EnvInputServerHandler.java

@@ -0,0 +1,637 @@
+//package com.huimv.env.input.server;
+//
+//import cn.hutool.core.util.ObjectUtil;
+//import com.alibaba.fastjson.JSONArray;
+//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+////import com.huimv.env.common.service.IRawDataService;
+//import com.huimv.env.common.utils.RegexUtil;
+//import com.huimv.env.input.producer.Producer;
+////import com.huimv.env.input.service.ICommandProcessorService;
+//import com.huimv.env.input.utils.DateUtil2;
+//import io.netty.buffer.ByteBuf;
+//import io.netty.buffer.Unpooled;
+//
+//import io.netty.channel.ChannelHandler;
+//import io.netty.channel.ChannelHandlerContext;
+//import io.netty.channel.ChannelInboundHandlerAdapter;
+//import io.netty.util.CharsetUtil;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import java.io.IOException;
+//import java.text.ParseException;
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.regex.Matcher;
+//import java.util.regex.Pattern;
+//
+///**
+// * @Project : huimv.shiwan
+// * @Package : com.huimv.biosafety.uface.controller
+// * @Description : TODO
+// * @Version : 1.0
+// * @Author : ZhuoNing
+// * @Create : 2020-12-25
+// **/
+//@ChannelHandler.Sharable
+//@Component
+//@Slf4j
+//public class EnvInputServerHandler extends ChannelInboundHandlerAdapter {
+//    @Autowired
+//    private RegexUtil regexUtil;
+////    @Autowired
+////    private ICommandProcessorService cmdProService;
+//    @Autowired
+//    private DateUtil2 dateUtil;
+////    @Autowired
+////    private IRawDataService rawDataService;
+//    @Autowired
+//    private Producer producer;
+//    private StringBuilder askTextSb = null;
+//
+//    //
+//    public void appendClientAsk(String text) {
+//        if (this.askTextSb == null) {
+//            askTextSb = new StringBuilder();
+//        }
+//        askTextSb.append(text);
+//    }
+//
+//    @Override
+//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+//        ByteBuf data = (ByteBuf) msg;
+//        String clientAskText = data.toString(CharsetUtil.UTF_8);
+//        //保存实例内的客户端请求
+//        appendClientAsk(clientAskText);
+//        //临时写入耳标数据到文件
+////        writeTxt(clientAskText,"all");
+//    }
+//
+//    @Override
+//    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
+//        if (askTextSb.toString().indexOf("end") != -1) {
+//            // {处理客户端消息}
+//            handleClientAskCmd(askTextSb.toString(), ctx);
+//            //清空重置;
+//            askTextSb.delete(0, askTextSb.length());
+//        }
+//    }
+//
+//    @Override
+//    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+//        if (cause.getMessage().indexOf("Connection reset") != -1) {
+//            log.info("相关采集器设备正在重启:" + cause.toString());
+//        }
+////        cause.printStackTrace();
+//        ctx.close();
+//    }
+//
+//    /**
+//     * @Method : handleClientAskCmd
+//     * @Description : 处理请求小心
+//     * @Params : [clientAskText, ctx]
+//     * @Return : void
+//     * @Author : ZhuoNing
+//     * @Date : 2022/3/28
+//     * @Time : 17:36
+//     */
+//    private void handleClientAskCmd(String clientAskText, ChannelHandlerContext ctx) throws ParseException, IOException {
+//        clientAskText = clientAskText.replaceAll("\r", "").replaceAll("\n", "");
+//        //{处理非正常命令}
+////        int countPlus = regexUtil.countPlus(clientAskText);
+////        if (countPlus < 4) {
+////            System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
+////        } else {
+//        //--处理客户端请求数据
+//        //{拆分粘包数据}
+////        JSONArray askJa = parseAskCmdPackage(clientAskText);
+////        for (int a = 0; a < askJa.size(); a++) {
+////            String askText = askJa.getString(a);
+////            //{处理请求命令}
+////            askCmdActuator(askText, ctx);
+////        }
+////        }
+//    }
+//
+//    /**
+//     * @Method : askCmdActuator
+//     * @Description :
+//     * @Params : [askText, ctx]
+//     * @Return : void
+//     * @Author : ZhuoNing
+//     * @Date : 2022/3/23
+//     * @Time : 18:08
+//     */
+//    private void askCmdActuator(String askText, ChannelHandlerContext ctx) throws ParseException, IOException {
+//        System.out.println("======>接收设备请求:" + askText);
+//        String[] dataArray = askText.split("\\+");
+//        String cmdHeader = dataArray[0];
+//        if (!cmdHeader.trim().equalsIgnoreCase("hm")) {
+//            log.info("当前命令是非hm命令[" + askText + "]");
+//            return;
+//        }
+//        //芯片id/设备编码
+//        String idCode = dataArray[1];
+//        String cmd = dataArray[2];
+//        Map map = new HashMap();
+//        map.put("askText", askText);
+////        rawDataService.insert(idCode,askText);
+//        switch (cmd) {
+////            case "1":
+////                //获取远程设备编码
+////                getDeviceCode(askText, idCode, ctx);
+////                break;
+////            case "2":
+////                //同步时间
+////                getServerTime(askText, idCode, ctx);
+////                break;
+////            case "3":
+////                //日龄上传
+////                uploadDayAge(askText, idCode, ctx);
+////                break;
+////            case "4":
+////                //通风等级
+////                uploadFeng(askText, idCode, ctx);
+////                break;
+////            case "5":
+////                //室外温度
+////                uploadOutTemp(askText, idCode, ctx);
+////                break;
+////            case "6":
+////                //室内温度 平均温度
+////                uploadInTemp(askText, idCode, ctx);
+////                break;
+////            case "7":
+////                //目标温度
+////                uploadTargetnTemp(askText, idCode, ctx);
+////                break;
+////            case "8":
+////                //水暖温度
+////                uploadShuiNuanTemp(askText, idCode, ctx);
+////                break;
+////            case "9":
+////                //水暖温度
+////                uploadWeiZhiTemp(askText, idCode, ctx);
+////                break;
+////            case "21":
+////                //温度
+////                uploadTemp(askText, idCode, ctx);
+////                break;
+////            case "22":
+////                //湿度
+////                uploadHumi(askText, idCode, ctx);
+////                break;
+////            case "23":
+////                //co2
+////                uploadCo2(dataArray,askText, idCode, ctx);
+////                break;
+////            case "24":
+////                //压力
+////                uploadYaLi(dataArray,askText, idCode, ctx);
+////                break;
+////            case "31":
+////                //水表
+////                uploadShuiBiao(dataArray,askText, idCode, ctx);
+////                break;
+////            case "32":
+////                //电表
+////                uploadDianBiao(dataArray,askText, idCode, ctx);
+////                break;
+////            case "41":
+////                //报警
+////                uploadWarning(askText, idCode, ctx);
+////                break;
+////            case "42":
+////                //报警
+////                uploadStatusWaraning(askText, idCode, ctx);
+////                break;
+////            case "61":
+////                //风机状态
+////                uploadFengStatus(askText, idCode, ctx);
+////                break;
+////            case "62":
+////                //湿帘状态
+////                uploadShiLianStatus(askText, idCode, ctx);
+////                break;
+////            case "63":
+////                //喷雾状态
+////                uploadPengWuStatus(askText, idCode, ctx);
+////                break;
+////            case "64":
+////                //加热器状态
+////                uploadJiaReQiStatus(askText, idCode, ctx);
+////                break;
+////            case "65":
+////                //小窗状态
+////                uploadXiaoChuangStatus(askText, idCode, ctx);
+////                break;
+////            case "66":
+////                //导流板状态
+////                uploadDaoLiuBanStatus(askText, idCode, ctx);
+////                break;
+////            case "67":
+////                //照明状态
+////                uploadZhaoMingStatus(askText, idCode, ctx);
+////                break;
+////            case "81":
+////                //日龄配置
+////                uploadDayAgePeizhiuStatus(askText, idCode, ctx);
+////                break;
+////            case "82":
+////                //通风级别配置
+////                uploadTongFengPeizhiuStatus(askText, idCode, ctx);
+////                break;
+////            case "91":
+////                //通获取日龄配置
+////                uploadGainDayAgePeizhiuStatus(dataArray,askText, idCode, ctx);
+////                break;
+////            case "92":
+////                //通风级别配置
+////                uploadGainTongFengPeizhiuStatus(dataArray,askText, idCode, ctx);
+////                break;
+////            default:
+////                System.out.println("==>未知命令");
+////                log.error(">>当前数据为非法数据-未知命令>>" + askText);
+//        }
+//    }
+////
+////    private void uploadZhaoMingStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("#照明状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+67+0+4+end";
+////        log.info(">>照明状态上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        producer.sendZhaoMingStatus(askText);
+////    }
+////
+////    private void uploadDaoLiuBanStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("#导流板状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+66+0+4+end";
+////        log.info(">>导流板状态上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        producer.sendDaoLiuStatus(askText);
+////    }
+////
+////    private void uploadXiaoChuangStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("#小窗状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+65+0+4+end";
+////        log.info(">>小窗状态上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendXiaoChuangStatus(askText);
+////    }
+////
+////    private void uploadJiaReQiStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("#加热状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+64+0+4+end";
+////        log.info(">>加热温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendJiaReStatus(askText);
+////    }
+////
+////    private void uploadDianBiao(String[] dataArray, String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("#电表上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+32+0+4+end";
+////        log.info(">>电表上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendDianBiaoData(askText);
+////    }
+////
+////    private void uploadShuiBiao(String[] dataArray, String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("#水表上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+31+0+4+end";
+////        log.info(">>水表温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendShuiBiaoData(askText);
+////    }
+////    private void uploadWeiZhiTemp(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##位置温度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+9+0+4+end";
+////        log.info(">>位置温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendWeiZhi(askText);
+////    }
+////
+////    private void uploadShuiNuanTemp(String askText, String idCode, ChannelHandlerContext ctx) {
+////
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##水暖上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+8+0+4+end";
+////        log.info(">>水暖上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendShuiNuan(askText);
+////    }
+////
+////    private void uploadStatusWaraning(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##状态报警上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+42+0+2+end";
+////        log.info(">>状态报警上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendWarning(askText);
+////    }
+////
+////    private void uploadYaLi(String[] dataArray, String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##压力 上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+24+0+8+end";
+////        log.info(">>压力  等级上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendYaLi(askText);
+////    }
+////
+////    private void uploadCo2(String[] dataArray, String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##CO2 上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        //TODO
+////        String answerText = "hm+23+0+8+end";
+////        log.info(">>CO2 等级上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendCo2(askText);
+////    }
+////
+////    private void uploadGainDayAgePeizhiuStatus(String[] dataArray,String askText, String idCode, ChannelHandlerContext ctx) {
+////        try {
+////            String originalValue =cmdProService.getDayAgePeiZhi(dataArray,idCode);
+////            String answerText ="hm+91+1+"+originalValue+"+0+end";
+////            if (StringUtils.isNotBlank(originalValue)){
+////                answerText = "hm+91+0+"+originalValue+"+0+end";
+////                log.info(">>获取日龄配置上传请求-应答数据>>" + answerText);
+////            }else {
+////                log.info("该设备没有设置日龄配置>>" );
+////            }
+////            answerCmd(answerText, ctx);
+////        }catch (Exception e){
+////            System.out.println(e);
+////        }
+////    }
+////
+////    private void uploadGainTongFengPeizhiuStatus(String[] dataArray,String askText, String idCode, ChannelHandlerContext ctx) {
+////        try {
+////            String originalValue = cmdProService.getFengPeiZhi(dataArray);
+////            String answerText ="hm+92+1"+originalValue+"+0+end";
+////            if (StringUtils.isNotBlank(originalValue)) {
+////                answerText = "hm+92+0+" + originalValue + "+0+end";
+////                log.info(">>获取通风等级配置上传请求-应答数据>>" + answerText);
+////            } else {
+////                log.info("该设备没有设置获取通风等级配置>>");
+////            }
+////            answerCmd(answerText, ctx);
+////        }catch (Exception e){
+////            System.out.println(e);
+////        }
+////    }
+////
+////
+////    //风机配置
+////    private void uploadTongFengPeizhiuStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        String answerText = "hm+82+0+2+end";
+////        answerCmd(answerText, ctx);
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##通风配置上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        log.info(">>通风配置上传请求-应答数据>>" + answerText);
+////        producer.sendTongFengPeiZhi(askText);
+////    }
+////    //日龄温度配置上传
+////    private void uploadDayAgePeizhiuStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        String answerText = "hm+81+0+2+end";
+////        answerCmd(answerText, ctx);
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##日龄温度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        log.info(">>日龄温度上传请求-应答数据>>" + answerText);
+////        producer.sendDayAgePeiZhi(askText);
+////    }
+////
+////    //喷雾
+////    private void uploadPengWuStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##喷雾状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+63+0+2+end";
+////        log.info(">>喷雾状态上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        producer.sendPengWuStatus(askText);
+////    }
+////
+////    //湿帘
+////    private void uploadShiLianStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##湿帘状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+62+0+2+end";
+////        log.info(">>湿帘状态上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //湿帘状态请求到消息队列
+////        producer.sendShiLianStatus(askText);
+////    }
+////
+////    //获取远程设备编码
+////    private void getDeviceCode(String askText, String idCode, ChannelHandlerContext ctx) {
+////        System.out.println("==>获取远程设备编码请求:" + askText.trim());
+////        //{读取设备编码}
+////        String deviceCode = cmdProService.getDeviceCodeByChipId(idCode);
+////        log.info("获取远程设备编码请求,芯片id>>" + idCode + " ,deviceCode>>" + deviceCode);
+////        if (deviceCode == null) {
+////            log.error("该设备未注册,已舍弃请求.");
+////            return;
+////        }
+////        String answerText = "hm+1+0+" + deviceCode + "+0+end";
+////        log.info("<<获取远程设备编码请求-应答数据:" + answerText);
+//////        //{应答指令}
+////        answerCmd(answerText, ctx);
+////        cmdProService.updateStatus(idCode);
+////    }
+////    //时间同步请求
+////    private void getServerTime(String askText, String deviceCode, ChannelHandlerContext ctx) throws ParseException {
+////        System.out.println("==>时间同步请求:" + askText);
+////        String answerText = "hm+2+" + dateUtil.getNowText() + "+4+end";
+////        log.info(">>时间同步请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////    }
+////
+////    //日龄
+////    private void uploadDayAge(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##日龄上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+3+0+4+end";
+////        log.info(">>日龄上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendDayAge(askText);
+////    }
+////
+////    private void uploadFeng(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##通风等级上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+4+0+4+end";
+////        log.info(">>通风等级上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendFeng(askText);
+////    }
+////
+////    private void uploadOutTemp(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##舍外温度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+5+0+4+end";
+////        log.info(">>舍外温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendOutTemp(askText);
+////    }
+////
+////    private void uploadInTemp(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##舍内温度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+6+0+4+end";
+////        log.info(">>舍内温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendInTemp(askText);
+////    }
+////    private void uploadTargetnTemp(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##目标温度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+7+0+4+end";
+////        log.info(">>目标温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.senTargetnTemp(askText);
+////    }
+////
+////    private void uploadTemp(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##温度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+21+0+7+end";
+////        log.info(">>温度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendTemp(askText);
+////    }
+////
+////    private void uploadHumi(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##湿度度上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+22+0+8+end";
+////        log.info(">>湿度上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendHumi(askText);
+////    }
+////
+////    private void uploadWarning(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##预警上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+41+0+2+end";
+////        log.info(">>预警上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送湿度请求到消息队列
+////        producer.sendWarning(askText);
+////    }
+////    private void uploadFengStatus(String askText, String idCode, ChannelHandlerContext ctx) {
+////        if (!cmdProService.isEffectiveDevice(idCode)) {
+////            System.out.println("##风机状态上传请求-未注册设备 idCode=" + idCode);
+////            return;
+////        }
+////        String answerText = "hm+61+0+2+end";
+////        log.info(">>风机状态上传请求-应答数据>>" + answerText);
+////        answerCmd(answerText, ctx);
+////        //发送风机状态请求到消息队列
+////        producer.uploadFengStatus(askText);
+////    }
+////
+////    //应答
+////    public void answerCmd(String answerText, ChannelHandlerContext ctx) {
+////        ctx.writeAndFlush(Unpooled.copiedBuffer(answerText.getBytes()));
+////    }
+////
+////    //检查无效耳标
+////    public boolean checkValidEarmark(String earmark) {
+////        if (earmark.trim().equalsIgnoreCase("ffffffffffffffff") || earmark.trim().equalsIgnoreCase("0000000000000000")) {
+////            return true;
+////        } else {
+////            return false;
+////        }
+////    }
+////
+////    //拆分粘包数据
+////    public JSONArray parseAskCmdPackage(String text) {
+////        String key = "end";
+////        Pattern pattern = Pattern.compile(key);
+////        Matcher matcher = pattern.matcher(text);
+////        int count = 0;
+////        while (matcher.find()) {
+////            count++;
+////        }
+////        JSONArray dataJa = new JSONArray();
+////        if (count == 1) {
+////            dataJa.add(text);
+////        } else {
+////            for (int a = 0; a < count; a++) {
+////                int p1 = text.indexOf("end");
+////                dataJa.add(text.substring(0, p1 + 3));
+////                text = text.substring(p1 + 3, text.length());
+////            }
+////        }
+////        return dataJa;
+////    }
+//}

+ 72 - 0
huimv-env-input/src/main/java/com/huimv/env/input/utils/DSendSMS.java

@@ -0,0 +1,72 @@
+package com.huimv.env.input.utils;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+
+public class DSendSMS {
+	static String httpUrl = "http://imlaixin.cn/Api/send/data/json";
+	
+	//短信内容不能出现空格,换行,百分号等特殊字符.相同两条短信之间内容不能相同
+	public static void main(String[] args) {
+		/**
+		 *发送给报警器
+		 *//*
+		String content = "003C0043004C0045004100520030003000310039003E";
+		String mobile = "18767100452";//多个用英文逗号隔开 如18767100452,1388888888
+		content = UnicodeTool.decodeUnicode(UnicodeTool.addUnicodeU(content.toString()));*/
+		
+		/**
+		 * 发送给用户 
+		 */
+//		String mobile = "13750862931";
+//		String mobile = "13140429955";
+		String mobile = "13376830277";
+//		String content = "%3CCLOSE00000000%3e+52通知【慧牧科技】";
+		String content = "0,2306101111520790<CLOSE99999999>";
+//		String content = "%3CCLOSE00000158%3e";
+//		String content = "0,2306061142510170%3C13140429955;13140429955;13140429955;03保育11断电报警%3e";
+		String httpArg = "accesskey=5493&secretkey=7e6f0b6e9d12d2c750cbf1932a4b9cc53e36509b&mobile=" + mobile + "&content=" + content;
+		String jsonResult = request(httpUrl, httpArg);
+		System.out.println(jsonResult);//返回码
+	}
+	
+	public static void sendSMS(String[] mobiles, String content) {
+		for (String mobile : mobiles) {
+			String httpArg = "accesskey=5493&secretkey=7e6f0b6e9d12d2c750cbf1932a4b9cc53e36509b&mobile=" + mobile + "&content=" + content + "通知【慧牧科技】";
+			System.out.println(httpArg);
+			String jsonResult = request(httpUrl, httpArg);
+			System.out.println(jsonResult);//返回码
+		}
+	}
+	
+
+	public static String request(String httpUrl, String httpArg) {
+	    BufferedReader reader = null;
+	    String result = null;
+	    StringBuffer sbf = new StringBuffer();
+	    httpUrl = httpUrl + "?" + httpArg;
+	    try {
+	        URL url = new URL(httpUrl);
+	        HttpURLConnection connection = (HttpURLConnection) url
+	                .openConnection();
+	        connection.setRequestMethod("GET");       
+	        connection.connect();
+	        InputStream is = connection.getInputStream();
+	        reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+	        String strRead = null;
+	        while ((strRead = reader.readLine()) != null) {
+	            sbf.append(strRead);
+	            sbf.append("\r\n");
+	        }
+	        reader.close();
+	        result = sbf.toString();
+	    } catch (Exception e) {
+	        e.printStackTrace();
+	    }
+	    return result;
+	}
+}

+ 187 - 0
huimv-env-input/src/main/java/com/huimv/env/input/utils/DateUtil2.java

@@ -0,0 +1,187 @@
+package com.huimv.env.input.utils;
+
+import cn.hutool.core.date.DateTime;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Component
+@Slf4j
+public class DateUtil2 {
+
+    //格式化日期(Long --> Date)
+    public String formatLongToDate(Long longDate){
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date= new Date(longDate);
+        return df.format(date);
+    }
+
+    //格式化本年
+    public String getThisYear(){
+        Calendar cal = Calendar.getInstance();
+        int year = cal.get(Calendar.YEAR);
+        return String.valueOf(year);
+    }
+
+    //格式化本月
+    public String getThisMonth(){
+        Calendar cal = Calendar.getInstance();
+        int month = cal.get(Calendar.MONTH) + 1;
+        if(String.valueOf(month).length()==1)
+        {
+            return "0"+String.valueOf(month);
+        }else{
+            return String.valueOf(month);
+        }
+    }
+
+    //格式化日期时间
+    public String formatDateTime(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = sdf.parse(dateText);
+        return sdf.format(date);
+    }
+
+    public Date parseDateTime(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.parse(dateText);
+    }
+
+    public Long parseDateTimeLong(String dateText) throws ParseException {
+        if(dateText.indexOf("T") != -1){
+            dateText = dateText.replace("T"," ");
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = sdf.parse(dateText);
+        return date.getTime();
+    }
+
+    //
+    public Date getTodayDate() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.parse(sdf.format(new Date()));
+    }
+
+    public Date getTodayDatetime() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.parse(sdf.format(new Date()));
+    }
+
+    public String getTodayDateText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(new Date());
+    }
+
+    public String getTodayText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.format(new Date());
+    }
+
+    public String getNowText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        return sdf.format(new Date());
+    }
+
+    public String getTodayMissionText() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+        return sdf.format(new Date());
+    }
+
+    public String getStartDateInThisMonth(){
+        DateTime date = cn.hutool.core.date.DateUtil.date();
+        return (cn.hutool.core.date.DateUtil.beginOfMonth(date) + "").substring(0, 10);
+    }
+
+    public String getEndDateInThisMonth(){
+        DateTime date = cn.hutool.core.date.DateUtil.date();
+        return (date + "").substring(0, 10);
+    }
+
+    /**
+     * 获取过去或者未来 任意天内的日期数组
+     * @param intervals      intervals天内
+     * @return              日期数组
+     */
+    public ArrayList<String> test(int intervals ) {
+        ArrayList<String> pastDaysList = new ArrayList<>();
+        ArrayList<String> fetureDaysList = new ArrayList<>();
+        for (int i = 0; i <intervals; i++) {
+            pastDaysList.add(getPastDate(i));
+            fetureDaysList.add(getFetureDate(i));
+        }
+        return pastDaysList;
+    }
+
+    /**
+     * 获取过去第几天的日期
+     *
+     * @param past
+     * @return
+     */
+    public String getPastDate(int past) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
+        Date today = calendar.getTime();
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String result = format.format(today);
+        return result;
+    }
+
+    /**
+     * 获取未来 第 past 天的日期
+     * @param past
+     * @return
+     */
+    public String getFetureDate(int past) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + past);
+        Date today = calendar.getTime();
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        String result = format.format(today);
+        return result;
+    }
+
+    //重新构建日期
+    public String rebuildDateTime(String text){
+        return text.substring(0,4)+"-"+text.substring(4,6)+"-"+text.substring(6,8)+" "+text.substring(8,10)+":"+text.substring(10,12)+":"+text.substring(12,14);
+    }
+
+    public static void main(String[] args){
+        DateUtil2 du = new DateUtil2();
+        //
+        du.test1();
+    }
+
+    private void test1() {
+        String text = "20211201104300";
+//        String text = "1234567890abcd";
+        String date = text.substring(0,4)+"-"+text.substring(4,6)+"-"+text.substring(6,8)+" "+text.substring(8,10)+":"+text.substring(10,12)+":"+text.substring(12,14);
+        System.out.println("date="+date);
+    }
+
+    //获取long时间
+    public Long getNowLong(){
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)-1,0,0,0);
+        return calendar.getTime().getTime();
+    }
+}

+ 171 - 0
huimv-env-input/src/main/java/com/huimv/env/input/utils/SendSMS.java

@@ -0,0 +1,171 @@
+//package com.huimv.env.input.utils;
+//
+//import com.huimv.busi.xt.utils.MD5;
+//import org.apache.commons.httpclient.HttpClient;
+//import org.apache.commons.httpclient.HttpException;
+//import org.apache.commons.httpclient.HttpStatus;
+//import org.apache.commons.httpclient.NameValuePair;
+//import org.apache.commons.httpclient.methods.PostMethod;
+//import org.apache.commons.httpclient.params.HttpMethodParams;
+//import org.springframework.util.StringUtils;
+//
+//import java.io.BufferedReader;
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.io.InputStreamReader;
+//
+//public class SendSMS {
+//
+//	private static String username = "6085";
+//
+//	private static String password = "huimu@6085";
+//	/**
+//	 * @param args
+//	 */
+//	public static void main(String[] args) {
+//		String [] mobiles = {"18257101194"};
+//		String result = getYe();
+//		sendSMS(mobiles, result);
+//	}
+//
+//	public static String sendSMS(String[] mobiles,String content) {
+//		String result = "";
+//		try {
+//			HttpClient client = new HttpClient();
+//			client.getParams().setParameter(
+//					HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
+//
+////			PostMethod method = new PostMethod(
+////			"http://202.91.244.252/qd/SMSSendYD"); // 测试环境
+//			PostMethod method = new PostMethod(
+//					"http://116.62.244.37/qdplat/SMSSendYD"); // 接口变更
+//
+//			method.addRequestHeader("Connection", "close");
+//			method.setRequestHeader("Content-Type",
+//					"application/x-www-form-urlencoded;charset=GBK");
+//
+//			String usr = username;
+//			String pwd = password;
+//			String sms = content;
+//			String extdsrcid = "";
+//
+//			StringBuilder mobileSb = new StringBuilder();
+//			for (int i = 0; i < mobiles.length; i++) {
+//				if (StringUtils.hasText(mobiles[i])) {
+//					if (!mobiles[i].equals("13676826533") && !mobiles[i].equals("13967014091")) {
+//						mobileSb.append(mobiles[i]).append(",");
+//					}
+//				}
+//			}
+//
+//			if (!StringUtils.hasText(mobileSb.toString())) {
+//				return "号码已经禁用";
+//			}
+//
+//			 NameValuePair[] param = { new NameValuePair("usr", usr),
+//			 new NameValuePair("pwd", pwd),
+//			 new NameValuePair("mobile", mobileSb.toString()),
+//			 new NameValuePair("sms", sms),
+//			 new NameValuePair("extdsrcid", extdsrcid)};
+//
+//			// 将表单的值放入postMethod中
+//			method.setRequestBody(param);
+//
+//			// 执行postMethod
+//			int statusCode = 0;
+//			try {
+//				statusCode = client.executeMethod(method);
+//			} catch (HttpException e) {
+//				e.printStackTrace();
+//			} catch (IOException e) {
+//				e.printStackTrace();
+//			}
+//			// HttpClient对于要求接受后继服务的请求,像POST和PUT等不能自动处理转发
+//			if (statusCode != HttpStatus.SC_OK) {
+//				System.out.println("Tianjin,Method failed:" + method.getStatusLine());
+//			}
+//
+//			// 读取内容
+//			InputStream resInputStream = null;
+//			try {
+//				resInputStream = method.getResponseBodyAsStream();
+//			} catch (IOException e) {
+//				e.printStackTrace();
+//			}
+//			// 处理内容
+//			BufferedReader reader = new BufferedReader(new InputStreamReader(
+//					resInputStream));
+//			String tempBf = null;
+//			StringBuffer html = new StringBuffer();
+//			while ((tempBf = reader.readLine()) != null) {
+//				html.append(tempBf);
+//			}
+//			result = html.toString() + content;
+//			System.out.println("result:" + result);
+//		} catch (Exception e) {
+//		}
+//		return result;
+//	}
+//
+//	//获取余额
+//	public static String getYe() {
+//		String result = "";
+//		try {
+//			HttpClient client = new HttpClient();
+//			client.getParams().setParameter(
+//					HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
+//
+////			PostMethod method = new PostMethod(
+////			"http://202.91.244.252/puxun/GetBalance"); // 测试环境
+//			PostMethod method = new PostMethod(
+//					"http://116.62.244.37/yqx/GetBalance"); // 测试环境
+//
+//			method.addRequestHeader("Connection", "close");
+//			method.setRequestHeader("Content-Type",
+//					"application/x-www-form-urlencoded;charset=GBK");
+//
+//			String user = username;
+//			String pwd = MD5.md5UpperCase(password);
+//
+//			NameValuePair[] param = { new NameValuePair("user_id", user),
+//					new NameValuePair("pwd", pwd)};
+//
+//			// 将表单的值放入postMethod中
+//			method.setRequestBody(param);
+//
+//			// 执行postMethod
+//			int statusCode = 0;
+//			try {
+//				statusCode = client.executeMethod(method);
+//			} catch (HttpException e) {
+//				e.printStackTrace();
+//			} catch (IOException e) {
+//				e.printStackTrace();
+//			}
+//			// HttpClient对于要求接受后继服务的请求,像POST和PUT等不能自动处理转发
+//			if (statusCode != HttpStatus.SC_OK) {
+//				System.out.println("Tianjin,Method failed:" + method.getStatusLine());
+//			}
+//
+//			// 读取内容
+//			InputStream resInputStream = null;
+//			try {
+//				resInputStream = method.getResponseBodyAsStream();
+//			} catch (IOException e) {
+//				e.printStackTrace();
+//			}
+//			// 处理内容
+//			BufferedReader reader = new BufferedReader(new InputStreamReader(
+//					resInputStream, "GBK"));
+//			String tempBf = null;
+//			StringBuffer html = new StringBuffer();
+//			while ((tempBf = reader.readLine()) != null) {
+//				html.append(tempBf);
+//			}
+//			result = html.toString();
+//			//System.out.println("result:" + result);
+//		} catch (Exception e) {
+//		}
+//		return result;
+//	}
+//}

+ 105 - 0
huimv-env-input/src/main/resources/application-dev.yml

@@ -0,0 +1,105 @@
+server:
+  port: 8093
+
+spring:
+  application:
+    name: huimv-env-input
+
+  datasource:
+    url: jdbc:mysql://115.238.57.190:3306/huimv-farm-env?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: true
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+  rabbitmq:
+#    host: 192.168.1.82
+    host: 119.3.84.55
+    port: 5672
+    username: huimv
+    password: hm123456
+    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /dev
+
+    #确认消息已发送到交换机(Exchange)
+#    publisher-confirms: true #(过时、弃用)
+    publisher-confirm-type: correlated
+    #确认消息已发送到队列(Queue)
+    publisher-returns: true
+
+  #redis
+#  redis:
+#    database: 0
+#    host: 192.168.1.68
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+#    lettuce:
+#      pool:
+#        max-active: 3
+#        min-idle: 2
+#        max-idle: 3
+#        max-wait: 1
+#      shutdown-timeout: 100
+
+#  data:
+#    redis:
+#      repositories:
+#        enabled: false
+
+  #是否缓存空值
+#  cache:
+#    redis:
+#      cache-null-values: false
+
+
+
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://192.168.1.7:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: true
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"   # * 在yaml 文件属于关键字,所以需要加引号
+

+ 89 - 0
huimv-env-input/src/main/resources/application-prod.yml

@@ -0,0 +1,89 @@
+server:
+  port: 8085
+
+spring:
+  application:
+    name: huimv-env-input
+
+  datasource:
+    url: jdbc:mysql://121.36.134.218/huimv-farm-env?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: hylintech
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: true
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+  rabbitmq:
+    host: 121.36.134.218
+    port: 5672
+    username: admin
+    password: admin
+    #虚拟host 可以不设置,使用server默认host
+    virtual-host: /env
+
+    #确认消息已发送到交换机(Exchange)
+#    publisher-confirms: true #(过时、弃用)
+    publisher-confirm-type: correlated
+    #确认消息已发送到队列(Queue)
+    publisher-returns: true
+
+  #redis
+  redis:
+    host: 122.112.224.199
+    port: 6379
+    password: hm123456
+
+  data:
+    redis:
+      repositories:
+        enabled: false
+
+  #是否缓存空值
+  cache:
+    redis:
+      cache-null-values: false
+
+
+
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://192.168.1.7:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: true
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"   # * 在yaml 文件属于关键字,所以需要加引号
+

+ 34 - 0
huimv-env-input/src/main/resources/application.properties

@@ -0,0 +1,34 @@
+#spring.profiles.active=prod
+#spring.profiles.active=dev
+spring.profiles.active=prod
+
+#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
+management.endpoints.web.exposure.include=*
+
+#########################################################
+###             \uFFFD\uFFFD\uFFFD\uFFFDundertow\u0221\uFFFD\uFFFDtomcat                ###
+
+#########################################################
+# \uFFFD\u01F7\uFFFD\uFFFD undertow \uFFFD\uFFFD\u05BE\uFFFD\uFFFD\u012C\uFFFD\uFFFD\u03AA false
+server.undertow.accesslog.enabled=false
+# \uFFFD\uFFFD\uFFFD\u00F7\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u05BE\uFFFD\uFFFD\uFFFD\uFFFD\u013F\u00BC
+server.undertow.accesslog.dir=logs
+# \u05B8\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u07F3\u0335\uFFFD I/0 \uFFFD\u07F3\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u012C\uFFFD\uFFFD\u03AA 2 \uFFFD\uFFFD\uFFFD\uFFFD CPU \uFFFD\u0138\uFFFD\uFFFD\uFFFD
+server.undertow.io-threads=
+# \u05B8\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u07F3\u0338\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u012C\uFFFD\uFFFD\u03AA I/O \uFFFD\u07F3\u0338\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD 8 \uFFFD\uFFFD
+server.undertow.worker-threads=
+# \uFFFD\uFFFD\uFFFD\uFFFD HTTP POST \uFFFD\uFFFD\uFFFD\u0775\uFFFD\uFFFD\uFFFD\uDB8E\uDD36\u0223\uFFFD\u012C\uFFFD\u03F2\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
+server.undertow.max-http-post-size=0
+
+#########################################################
+###   Actuator Monitor  --   Actuator configuration   ###
+#########################################################
+management.security.enabled=false
+
+# \uFFFD\uFFFD\uFFFD\u0774\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
+data.input.flow=2
+
+# \uFFFD\u01F7\uFFFD\u0434\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD(1:\u0434\uFFFD\uFFFD 0:\uFFFD\uFFFD\u0434\uFFFD\uFFFD)
+data.test.input=0
+
+

+ 24 - 0
huimv-env-input/src/main/resources/assembly.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly>
+    <id>jar-with-dependencies</id>
+    <formats>
+        <format>jar</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <dependencySets>
+        <!-- 默认的配置 -->
+        <dependencySet>
+            <outputDirectory>/</outputDirectory>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>true</unpack>
+            <scope>runtime</scope>
+        </dependencySet>
+        <!-- 增加scope类型为system的配置 -->
+        <dependencySet>
+            <outputDirectory>/</outputDirectory>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>true</unpack>
+            <scope>system</scope>
+        </dependencySet>
+    </dependencySets>
+</assembly>