Selaa lähdekoodia

socket 接收称重数据

523096025 1 vuosi sitten
vanhempi
commit
faa6eaf73a
47 muutettua tiedostoa jossa 1888 lisäystä ja 0 poistoa
  1. 33 0
      input/.gitignore
  2. 94 0
      input/pom.xml
  3. 18 0
      input/src/main/java/com/huimv/input/InputApplication.java
  4. 20 0
      input/src/main/java/com/huimv/input/controller/BaseBuildingController.java
  5. 20 0
      input/src/main/java/com/huimv/input/controller/BaseDuckInfoController.java
  6. 20 0
      input/src/main/java/com/huimv/input/controller/EnvDeviceController.java
  7. 20 0
      input/src/main/java/com/huimv/input/controller/EnvRegularCallEggController.java
  8. 20 0
      input/src/main/java/com/huimv/input/controller/EnvRegularCallFeedingController.java
  9. 20 0
      input/src/main/java/com/huimv/input/controller/RawDataController.java
  10. 69 0
      input/src/main/java/com/huimv/input/entity/BaseBuilding.java
  11. 132 0
      input/src/main/java/com/huimv/input/entity/BaseDuckInfo.java
  12. 73 0
      input/src/main/java/com/huimv/input/entity/EnvDevice.java
  13. 92 0
      input/src/main/java/com/huimv/input/entity/EnvRegularCallEgg.java
  14. 82 0
      input/src/main/java/com/huimv/input/entity/EnvRegularCallFeeding.java
  15. 43 0
      input/src/main/java/com/huimv/input/entity/RawData.java
  16. 16 0
      input/src/main/java/com/huimv/input/mapper/BaseBuildingMapper.java
  17. 16 0
      input/src/main/java/com/huimv/input/mapper/BaseDuckInfoMapper.java
  18. 16 0
      input/src/main/java/com/huimv/input/mapper/EnvDeviceMapper.java
  19. 16 0
      input/src/main/java/com/huimv/input/mapper/EnvRegularCallEggMapper.java
  20. 16 0
      input/src/main/java/com/huimv/input/mapper/EnvRegularCallFeedingMapper.java
  21. 16 0
      input/src/main/java/com/huimv/input/mapper/RawDataMapper.java
  22. 49 0
      input/src/main/java/com/huimv/input/server/DtuServer.java
  23. 115 0
      input/src/main/java/com/huimv/input/server/DtuServiceHandler.java
  24. 67 0
      input/src/main/java/com/huimv/input/server/EnvInputServer.java
  25. 365 0
      input/src/main/java/com/huimv/input/server/EnvInputServerHandler.java
  26. 16 0
      input/src/main/java/com/huimv/input/service/IBaseBuildingService.java
  27. 16 0
      input/src/main/java/com/huimv/input/service/IBaseDuckInfoService.java
  28. 16 0
      input/src/main/java/com/huimv/input/service/IEnvDeviceService.java
  29. 16 0
      input/src/main/java/com/huimv/input/service/IEnvRegularCallEggService.java
  30. 16 0
      input/src/main/java/com/huimv/input/service/IEnvRegularCallFeedingService.java
  31. 16 0
      input/src/main/java/com/huimv/input/service/IRawDataService.java
  32. 20 0
      input/src/main/java/com/huimv/input/service/impl/BaseBuildingServiceImpl.java
  33. 20 0
      input/src/main/java/com/huimv/input/service/impl/BaseDuckInfoServiceImpl.java
  34. 20 0
      input/src/main/java/com/huimv/input/service/impl/EnvDeviceServiceImpl.java
  35. 20 0
      input/src/main/java/com/huimv/input/service/impl/EnvRegularCallEggServiceImpl.java
  36. 20 0
      input/src/main/java/com/huimv/input/service/impl/EnvRegularCallFeedingServiceImpl.java
  37. 20 0
      input/src/main/java/com/huimv/input/service/impl/RawDataServiceImpl.java
  38. 51 0
      input/src/main/java/com/huimv/input/utils/ModBusUtils.java
  39. 27 0
      input/src/main/resources/application-prod.yml
  40. 7 0
      input/src/main/resources/application.properties
  41. 20 0
      input/src/main/resources/com/huimv/input/mapper/BaseBuildingMapper.xml
  42. 31 0
      input/src/main/resources/com/huimv/input/mapper/BaseDuckInfoMapper.xml
  43. 19 0
      input/src/main/resources/com/huimv/input/mapper/EnvDeviceMapper.xml
  44. 22 0
      input/src/main/resources/com/huimv/input/mapper/EnvRegularCallEggMapper.xml
  45. 21 0
      input/src/main/resources/com/huimv/input/mapper/EnvRegularCallFeedingMapper.xml
  46. 13 0
      input/src/main/resources/com/huimv/input/mapper/RawDataMapper.xml
  47. 13 0
      input/src/test/java/com/huimv/input/InputApplicationTests.java

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

+ 94 - 0
input/pom.xml

@@ -0,0 +1,94 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.1</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.huimv</groupId>
+    <artifactId>guowei-input</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>input</name>
+    <description>Demo project for Spring Boot</description>
+    <properties>
+        <java.version>8</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+            <version>3.4.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.73</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.32</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.4.3</version>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 18 - 0
input/src/main/java/com/huimv/input/InputApplication.java

@@ -0,0 +1,18 @@
+package com.huimv.input;
+
+import com.huimv.input.server.EnvInputServer;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+
+@SpringBootApplication
+@MapperScan("com.huimv.input.mapper")
+public class InputApplication {
+
+    public static void main(String[] args) throws InterruptedException {
+        ApplicationContext applicationContext = SpringApplication.run(InputApplication.class, args);
+        applicationContext.getBean(EnvInputServer.class).run();
+    }
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/controller/BaseBuildingController.java

@@ -0,0 +1,20 @@
+package com.huimv.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@RestController
+@RequestMapping("/base-building")
+public class BaseBuildingController {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/controller/BaseDuckInfoController.java

@@ -0,0 +1,20 @@
+package com.huimv.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@RestController
+@RequestMapping("/base-duck-info")
+public class BaseDuckInfoController {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/controller/EnvDeviceController.java

@@ -0,0 +1,20 @@
+package com.huimv.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@RestController
+@RequestMapping("/env-device")
+public class EnvDeviceController {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/controller/EnvRegularCallEggController.java

@@ -0,0 +1,20 @@
+package com.huimv.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 固定电子秤 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@RestController
+@RequestMapping("/env-regular-call-egg")
+public class EnvRegularCallEggController {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/controller/EnvRegularCallFeedingController.java

@@ -0,0 +1,20 @@
+package com.huimv.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 固定电子秤 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@RestController
+@RequestMapping("/env-regular-call-feeding")
+public class EnvRegularCallFeedingController {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/controller/RawDataController.java

@@ -0,0 +1,20 @@
+package com.huimv.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@RestController
+@RequestMapping("/raw-data")
+public class RawDataController {
+
+}

+ 69 - 0
input/src/main/java/com/huimv/input/entity/BaseBuilding.java

@@ -0,0 +1,69 @@
+package com.huimv.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_building")
+public class BaseBuilding implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 栋舍名字
+     */
+    private String buildName;
+
+    /**
+     * 父级
+     */
+    private Integer parentId;
+
+    /**
+     * 1舍 2笼
+     */
+    private Integer fType;
+
+    /**
+     * 笼子数量
+     */
+    private Integer cageNum;
+
+    /**
+     * 阶段
+     */
+    private Integer stageCode;
+
+    private Integer farmId;
+
+    private Integer sort;
+
+    /**
+     * 笼子名字
+     */
+    private String cageName;
+
+    private String other2;
+
+    private String other3;
+
+
+}

+ 132 - 0
input/src/main/java/com/huimv/input/entity/BaseDuckInfo.java

@@ -0,0 +1,132 @@
+package com.huimv.input.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_duck_info")
+public class BaseDuckInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String duckNum;
+
+    /**
+     * 1北京鸭、2连城白鸭、3山麻鸭、4攸县麻鸭、5白改鸭、6缙云麻鸭、7绍兴鸭(带圈白翼梢)、8绍兴鸭(红毛绿翼梢)、9绍兴鸭(白羽绍鸭)
+     */
+    private Integer duckBreed;
+
+    /**
+     * 0雄性,1雌性
+     */
+    private Integer duckSex;
+
+    /**
+     * 出生地
+     */
+    private String duckBirthplace;
+
+    /**
+     * 出生日期
+     */
+    private LocalDateTime duckBirthday;
+
+    /**
+     * 基因型
+     */
+    private String genotype;
+
+    /**
+     * 当前体重
+     */
+    private BigDecimal nowWeight;
+
+    /**
+     * 位置 id
+     */
+    private Integer unitId;
+
+    /**
+     * 位置
+     */
+    private String unitName;
+
+    /**
+     * 饲养环境
+     */
+    private String breedingEnv;
+
+    /**
+     * 出壳率
+     */
+    private BigDecimal hatchRate;
+
+    /**
+     * 日龄
+     */
+    private Integer dayAge;
+
+    /**
+     * 母系信息
+     */
+    private String motherNum;
+
+    /**
+     * 母亲基因型
+     */
+    private String motherGenotype;
+
+    /**
+     * 父系信息
+     */
+    private String fatherNum;
+
+    /**
+     * 父亲基因型
+     */
+    private String fatherGenotype;
+
+    /**
+     * 鸭子图片
+     */
+    private String duckImgUrl;
+
+    /**
+     * 特殊需求
+     */
+    private String specialNeeds;
+
+    /**
+     * 0未出笼 1已出笼
+     */
+    private Integer isCage;
+
+    private Integer farmId;
+
+    /**
+     * 上下级位置id
+     */
+    private String unitList;
+
+
+}

+ 73 - 0
input/src/main/java/com/huimv/input/entity/EnvDevice.java

@@ -0,0 +1,73 @@
+package com.huimv.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("env_device")
+public class EnvDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备编码
+     */
+    private String deviceCode;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 1环控、2移动电子秤、3固定电子秤
+     */
+    private Integer deviceType;
+
+    /**
+     * 位置
+     */
+    private String buildLocation;
+
+    /**
+     * 单元名字
+     */
+    private String unitName;
+
+    /**
+     * 单元id
+     */
+    private Integer unitId;
+
+    /**
+     * 品牌
+     */
+    private String deviceBrand;
+
+    /**
+     * 0不在线  1在线
+     */
+    private Integer deviceStatus;
+
+    private Integer farmId;
+
+
+}

+ 92 - 0
input/src/main/java/com/huimv/input/entity/EnvRegularCallEgg.java

@@ -0,0 +1,92 @@
+package com.huimv.input.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 固定电子秤
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("env_regular_call_egg")
+public class EnvRegularCallEgg implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备名称
+     */
+    private String callName;
+
+    /**
+     * 设备编码
+     */
+    private String callCode;
+
+    /**
+     * 鸭只编号
+     */
+    private String duckNum;
+
+    /**
+     * 鸡蛋重量 克
+     */
+    private BigDecimal duckWeight;
+
+    /**
+     * 原始数据
+     */
+    private BigDecimal duckFeedingOriginal;
+
+    /**
+     * 蛋个数
+     */
+    private Integer eggNum;
+
+    /**
+     * 称重日期
+     */
+    private Date callDate;
+
+    private Integer farmId;
+
+    /**
+     * 鸭只id
+     */
+    private Integer duckId;
+
+    /**
+     * 电量
+     */
+    private String battery;
+
+    /**
+     * 位置id
+     */
+    private Integer unitId;
+
+    /**
+     * 位置名称
+     */
+    private String unitName;
+
+
+}

+ 82 - 0
input/src/main/java/com/huimv/input/entity/EnvRegularCallFeeding.java

@@ -0,0 +1,82 @@
+package com.huimv.input.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 固定电子秤
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("env_regular_call_feeding")
+public class EnvRegularCallFeeding implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备名称
+     */
+    private String callName;
+
+    /**
+     * 设备编码
+     */
+    private String callCode;
+
+    /**
+     * 鸭只编号
+     */
+    private String duckNum;
+
+    /**
+     * 采食重量 克
+     */
+    private BigDecimal duckWeight;
+
+    /**
+     * 原始数据
+     */
+    private BigDecimal duckFeedingOriginal;
+
+    /**
+     * 称重日期
+     */
+    private Date callDate;
+
+    private Integer farmId;
+
+    /**
+     * 鸭只id
+     */
+    private Integer duckId;
+
+    /**
+     * 电量
+     */
+    private String battery;
+
+    private Integer unitId;
+
+    private String unitName;
+    private Integer eventType;
+
+
+}

+ 43 - 0
input/src/main/java/com/huimv/input/entity/RawData.java

@@ -0,0 +1,43 @@
+package com.huimv.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("raw_data")
+public class RawData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String deviceCode;
+
+    private String data;
+
+    private Date createTime;
+    private BigDecimal lastWeight;
+
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/mapper/BaseBuildingMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.input.mapper;
+
+import com.huimv.input.entity.BaseBuilding;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface BaseBuildingMapper extends BaseMapper<BaseBuilding> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/mapper/BaseDuckInfoMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.input.mapper;
+
+import com.huimv.input.entity.BaseDuckInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface BaseDuckInfoMapper extends BaseMapper<BaseDuckInfo> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/mapper/EnvDeviceMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.input.mapper;
+
+import com.huimv.input.entity.EnvDevice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface EnvDeviceMapper extends BaseMapper<EnvDevice> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/mapper/EnvRegularCallEggMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.input.mapper;
+
+import com.huimv.input.entity.EnvRegularCallEgg;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 固定电子秤 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface EnvRegularCallEggMapper extends BaseMapper<EnvRegularCallEgg> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/mapper/EnvRegularCallFeedingMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.input.mapper;
+
+import com.huimv.input.entity.EnvRegularCallFeeding;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 固定电子秤 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface EnvRegularCallFeedingMapper extends BaseMapper<EnvRegularCallFeeding> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/mapper/RawDataMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.input.mapper;
+
+import com.huimv.input.entity.RawData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface RawDataMapper extends BaseMapper<RawData> {
+
+}

+ 49 - 0
input/src/main/java/com/huimv/input/server/DtuServer.java

@@ -0,0 +1,49 @@
+package com.huimv.input.server;//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 io.netty.handler.timeout.IdleStateHandler;
+//
+//import java.util.concurrent.TimeUnit;
+//
+///**
+// * TODO
+// *
+// * @author linfeng
+// * @date 2022/12/26 15:57
+// */
+//public class DtuServer implements Runnable {
+//
+//    public static void main(String[] args) {
+//        new Thread(new DtuServer()).start();
+//    }
+//
+//    @Override
+//    public void run() {
+//        EventLoopGroup bossGroup = new NioEventLoopGroup(2);
+//        EventLoopGroup workGroup = new NioEventLoopGroup(10);
+//        ServerBootstrap serverBootstrap = new ServerBootstrap();
+//        serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class)
+//                .childHandler(new ChannelInitializer<SocketChannel>() {
+//
+//                    @Override
+//                    protected void initChannel(SocketChannel ch) throws Exception {
+//                        ch.pipeline().addLast(new IdleStateHandler(15, 0, 0, TimeUnit.MINUTES));
+//                        ch.pipeline().addLast(new DtuServiceHandler());
+//                    }
+//
+//                });
+//        try {
+//            ChannelFuture channelFuture = serverBootstrap.bind(9005).sync();
+//            channelFuture.channel().closeFuture().sync();
+//        } catch (InterruptedException e) {
+//            e.printStackTrace();
+//        }
+//    }
+//}
+//

+ 115 - 0
input/src/main/java/com/huimv/input/server/DtuServiceHandler.java

@@ -0,0 +1,115 @@
+package com.huimv.input.server;//package com.huimv.env.input.server;
+//
+//import com.huimv.env.input.utils.ModBusUtils;
+//import io.netty.buffer.ByteBuf;
+//import io.netty.buffer.Unpooled;
+//import io.netty.channel.Channel;
+//import io.netty.channel.ChannelHandlerContext;
+//import io.netty.channel.ChannelId;
+//import io.netty.channel.ChannelInboundHandlerAdapter;
+//import io.netty.channel.group.ChannelGroup;
+//import io.netty.channel.group.DefaultChannelGroup;
+//import io.netty.util.concurrent.GlobalEventExecutor;
+//
+//import java.net.SocketAddress;
+//import java.util.Map;
+//import java.util.concurrent.ConcurrentHashMap;
+//
+///**
+// * TODO
+// *
+// * @author linfeng
+// * @date 2022/12/26 15:58
+// */
+//public class DtuServiceHandler extends ChannelInboundHandlerAdapter {
+//
+//	// 保存
+//    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+//
+//	// 保存客户端channelId与注册包信息
+//    private static Map<String,String> channelIdMap = new ConcurrentHashMap<>();
+//
+//    @Override
+//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+//        Channel channel = ctx.channel();
+//        ChannelId channelId = channel.id();
+//        ByteBuf byteBuf = (ByteBuf) msg;
+//        byte[] bytes = new byte[byteBuf.readableBytes()];
+//        byteBuf.readBytes(bytes);
+//        String str = ModBusUtils.bytes2HexString(bytes);
+//        for (String s : str.split(" ")) {
+//            System.out.println(s);
+//        }
+//        System.out.println(bytes.length);
+//        if(bytes.length == 16){
+//        	// 注册包长度为16(我这边用到4G DTU(ZHC4013)注册包长度为16,如果有变化需要修改)
+//        	// 注册包为设备编号,设备编号是唯一的。
+//            String registerPackage = "";
+//            for(int i=0;i<bytes.length;i++) {
+//                registerPackage=registerPackage+ModBusUtils.byteToASCLL(bytes[i]);
+//            }
+//            // channelId.asLongText()获取的是客户端全局唯一ID,根据channelId获取注册包信息,可以判断出数据是哪个节点上传的
+//            channelIdMap.put(channelId.asLongText(),registerPackage);
+//            System.out.println("注册包:"+registerPackage);
+//        }else {
+//        	// 从channelIdMap获取注册包(设备编号)
+//        	String registerPackage = channelIdMap.get(channelId.asLongText());
+//        	// 获取到客户端注册包,可以根据注册包(设备编号)查询数据库唯一的设备信息。
+//        	// 数据就不做解析了,数据解析相关代码在上面分享的博客地址中。
+//        	// 后面就是业务逻辑和数据解析了。
+//        	/** 如果要服务端向客户端发送信息,可以利用客户端心跳机制发送数据(也可以写发送数据的线程),其中具体业务逻辑就需要利用数据库了。
+//        		具体思想:首先数据库保存发送状态和发送数据,利用channelIdMap查询注册包,可以通过注册包在数据库中查询相关数据,
+//        		根据发送状态判断是否需要发送数据。
+//        		Netty发送数据需要转ByteBuf,具体代码:channel.writeAndFlush(Unpooled.copiedBuffer(new byte[]{1, 2, 3})),
+//			*/
+//
+//		}
+//
+//        System.out.println("收到的数据:"+str);
+//        System.out.println("链接数:"+channelGroup.size());
+//        System.out.println("注册包数:"+channelIdMap.size());
+////        channel.writeAndFlush("1F 03 00 2A 00 01 A6 7C");
+////        channel.writeAndFlush(Unpooled.copiedBuffer(hexStr2Bytes("1F 03 00 2A 00 01 A6 7C")));
+//        Thread.sleep(5*1000);
+//        super.channelRead(ctx, msg);
+//    }
+//
+//
+//    @Override
+//    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+//        SocketAddress socketAddress = ctx.channel().remoteAddress();
+//        System.out.println(socketAddress);
+//        super.channelActive(ctx);
+//    }
+//
+//    @Override
+//    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+//        Channel channel = ctx.channel();
+//        ChannelId channelId = channel.id();
+//        channelIdMap.remove(channelId.asLongText());
+//        System.out.println(channelId.asLongText()+" channelInactive客户端关闭连接");
+//        super.channelInactive(ctx);
+//    }
+//
+//    @Override
+//    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
+//        super.userEventTriggered(ctx, evt);
+//    }
+//
+//    @Override
+//    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
+//        // 连接建立
+//        Channel channel = ctx.channel();
+//        channelGroup.add(channel);
+//        super.handlerAdded(ctx);
+//    }
+//
+//    @Override
+//    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
+//        Channel channel = ctx.channel();
+//        ChannelId channelId = channel.id();
+//        channelIdMap.remove(channelId.asLongText());
+//        System.out.println(channelId.asLongText()+" ChannelHandlerContext客户端关闭连接");
+//        super.handlerRemoved(ctx);
+//    }
+//}

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

@@ -0,0 +1,67 @@
+package com.huimv.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;
+
+@Component
+public class EnvInputServer {
+    @Autowired
+    private EnvInputServerHandler serverHandler;
+    //监听端口
+    private int port = 3728;
+    //创建构造方法
+    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 {
+                            System.out.println("连接建立");
+                            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();
+        }
+    }
+}

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

@@ -0,0 +1,365 @@
+package com.huimv.input.server;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.input.entity.*;
+import com.huimv.input.mapper.*;
+import com.huimv.input.utils.ModBusUtils;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+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 {
+    private StringBuilder askTextSb = null;
+
+    @Autowired
+    private RawDataMapper rawDataMapper;
+
+    @Autowired
+    private EnvRegularCallEggMapper envRegularCallEggMapper;
+
+    @Autowired
+    private EnvRegularCallFeedingMapper envRegularCallFeedingMapper;
+
+    @Autowired
+    private EnvDeviceMapper envDeviceMapper;
+
+    @Autowired
+    private BaseDuckInfoMapper baseDuckInfoMapper;
+
+
+
+    //
+    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 byteBuf = (ByteBuf) msg;
+
+        byte[] bytes = new byte[byteBuf.readableBytes()];
+        byteBuf.readBytes(bytes);
+        String str = ModBusUtils.bytes2HexString(bytes);
+        ctx.writeAndFlush("10001");
+        System.out.println("收到的数据:"+str);
+        saveWeight(str,bytes);
+        System.out.println("保存成功");
+    }
+
+
+    public synchronized void saveWeight(String str, byte[] bytes) {
+        String[] s = str.split(" ");
+        String hexId = s[5] + s[4] + s[3] + s[2] ;
+        System.out.println("十六进制id"+hexId);
+        int decId = Integer.parseInt(hexId, 16);
+        System.out.println("十进制id"+decId);
+        long l = System.currentTimeMillis();
+
+        String bat = s[8] + s[7] ;
+
+        //获取上次一次数据
+        RawData lastRawData = rawDataMapper.selectOne(new QueryWrapper<RawData>().eq("device_code", decId).orderByDesc("id").last("limit 1"));
+        BigDecimal lastWeight =  new BigDecimal(0);
+        if (ObjectUtil.isNotEmpty(lastRawData)){
+            lastWeight = lastRawData.getLastWeight();
+        }
+        int sLength = s.length;
+        //保存原始数据
+        RawData rawData = new RawData();
+        rawData.setDeviceCode(decId+"");
+        rawData.setData(str);
+        rawData.setCreateTime(new Date(l));
+        rawData.setLastWeight(new BigDecimal(Integer.parseInt(s[sLength -2]+s[sLength-3], 16)));
+        rawDataMapper.insert(rawData);
+        //获取设备
+        EnvDevice envDevice = envDeviceMapper.selectOne(new QueryWrapper<EnvDevice>().eq("device_code", decId).eq("device_type", 3));
+        if (ObjectUtil.isEmpty(envDevice)){
+            System.out.println("固定电子称不存在,数据抛弃");
+            return;
+        }
+        //获取鸭子
+        Integer unitId = envDevice.getUnitId();
+        BaseDuckInfo baseDuckInfo = baseDuckInfoMapper.selectOne(new QueryWrapper<BaseDuckInfo>().eq("unit_id", unitId).eq("is_cage", 0));
+        if (ObjectUtil.isEmpty(baseDuckInfo)){
+            System.out.println("该位置不存在鸭子,数据抛弃");
+            return;
+        }
+
+        try {
+
+        //循环获取体重
+        for (int i = 0; i < 60; i++) {
+            //当时时间
+            Date thenTime = new Date(l - ((60-i)*10000));
+            //
+            String str1 = s[i * 2 + 11] + s[i * 2 + 10];
+            BigDecimal weight = new BigDecimal(Integer.parseInt(str1,16));
+            BigDecimal subtract = weight.subtract(lastWeight);
+            int compare = subtract.compareTo(new BigDecimal(1500));
+            System.out.println(subtract +"------>"+weight+"----------->"+lastWeight);
+            EnvRegularCallFeeding envRegularCallFeeding = new EnvRegularCallFeeding();
+            envRegularCallFeeding.setBattery(new BigDecimal(Integer.parseInt(bat, 16)).divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP).toString());
+            envRegularCallFeeding.setCallDate(thenTime);
+            envRegularCallFeeding.setCallCode(decId+"");
+            envRegularCallFeeding.setCallName(envDevice.getDeviceName());
+            envRegularCallFeeding.setDuckId(baseDuckInfo.getId());
+            envRegularCallFeeding.setDuckNum(baseDuckInfo.getDuckNum());
+            envRegularCallFeeding.setFarmId(baseDuckInfo.getFarmId());
+            envRegularCallFeeding.setUnitId(baseDuckInfo.getUnitId());
+            envRegularCallFeeding.setUnitName(baseDuckInfo.getUnitName());
+            if (weight.compareTo(new BigDecimal(0) )==0){
+                envRegularCallFeeding.setDuckFeedingOriginal((new BigDecimal(0)));
+            }else {
+                envRegularCallFeeding.setDuckFeedingOriginal(weight.divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP) );
+            }
+            if (subtract.compareTo(new BigDecimal(0) )==0){
+                envRegularCallFeeding.setDuckWeight((new BigDecimal(0)));
+            }else {
+                envRegularCallFeeding.setDuckWeight(subtract.divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP) );
+            }
+
+            //加料
+            if (compare>0){
+                envRegularCallFeeding.setEventType(1);
+                envRegularCallFeedingMapper.insert(envRegularCallFeeding);
+                lastWeight =weight;
+                continue;
+            }
+            int compare50 = subtract.compareTo(new BigDecimal(300));
+            //下蛋
+            if (compare50>0){
+                EnvRegularCallEgg envRegularCallEgg = new EnvRegularCallEgg();
+                envRegularCallEgg.setBattery(bat);
+                envRegularCallEgg.setCallDate(thenTime);
+                envRegularCallEgg.setCallCode(decId+"");
+                envRegularCallEgg.setCallName(envDevice.getDeviceName());
+                envRegularCallEgg.setDuckId(baseDuckInfo.getId());
+                envRegularCallEgg.setDuckNum(baseDuckInfo.getDuckNum());
+                envRegularCallEgg.setFarmId(baseDuckInfo.getFarmId());
+                envRegularCallEgg.setUnitId(baseDuckInfo.getUnitId());
+                envRegularCallEgg.setUnitName(baseDuckInfo.getUnitName());
+                envRegularCallEgg.setEggNum(1);
+                if (weight.compareTo(new BigDecimal(0) )==0){
+                    envRegularCallEgg.setDuckFeedingOriginal((new BigDecimal(0)));
+                }else {
+                    envRegularCallEgg.setDuckFeedingOriginal(weight.divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP) );
+                }
+                if (subtract.compareTo(new BigDecimal(0) )==0){
+                    envRegularCallEgg.setDuckWeight((new BigDecimal(0)));
+                }else {
+                    envRegularCallEgg.setDuckWeight(subtract.divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP) );
+                }
+                envRegularCallEggMapper.insert(envRegularCallEgg);
+                lastWeight =weight;
+                continue;
+            }
+
+            int compare0 = subtract.compareTo(new BigDecimal(0));
+            //吃料
+            if (compare0<=0){
+                if (subtract.compareTo(new BigDecimal(0) )==0){
+                    envRegularCallFeeding.setDuckWeight((new BigDecimal(0)));
+                }else {
+                    envRegularCallFeeding.setDuckWeight(subtract.subtract(subtract.multiply(new BigDecimal(2))).divide(new BigDecimal(10), 1, BigDecimal.ROUND_HALF_UP));
+                }
+                envRegularCallFeeding.setEventType(0);
+                envRegularCallFeedingMapper.insert(envRegularCallFeeding);
+                lastWeight =weight;
+                continue;
+            }
+            //其它
+            envRegularCallFeeding.setEventType(2);
+            envRegularCallFeedingMapper.insert(envRegularCallFeeding);
+        }
+        }catch (Exception e){
+            System.out.println(e);
+        }
+    }
+
+
+    @Override
+    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
+
+//        if (true){
+//            ctx.writeAndFlush(Unpooled.copiedBuffer(new byte[]{1, 2, 3}));
+//        }
+
+//        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);
+        switch (cmd) {
+            case "1":
+                //获取远程设备编码
+                getDeviceCode(askText, idCode, ctx);
+                break;
+            case "2":
+                //同步时间
+                getServerTime(askText, idCode, ctx);
+                break;
+            default:
+                System.out.println("==>未知命令");
+                log.error(">>当前数据为非法数据-未知命令>>" + askText);
+        }
+    }
+
+
+
+    //时间同步请求
+    private void getServerTime(String askText, String deviceCode, ChannelHandlerContext ctx) throws ParseException {
+        System.out.println("==>时间同步请求:" + askText);
+//        if (!cmdProService.isEffectiveDevice(deviceCode)) {
+//            System.out.println("##时间同步请求-未注册设备 idCode=" + deviceCode);
+//            return;
+//        }
+        String answerText = "hm+2+"  + "+0+4+end";
+//        log.info(">>时间同步请求-应答数据>>" + answerText);
+        answerCmd(answerText, ctx);
+    }
+
+    //获取远程设备编码
+    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 + "+123+8+end";
+//        log.info("<<获取远程设备编码请求-应答数据:" + answerText);
+        //{应答指令}
+//        answerCmd(answerText, ctx);
+    }
+
+    //应答
+    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;
+    }
+}

+ 16 - 0
input/src/main/java/com/huimv/input/service/IBaseBuildingService.java

@@ -0,0 +1,16 @@
+package com.huimv.input.service;
+
+import com.huimv.input.entity.BaseBuilding;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface IBaseBuildingService extends IService<BaseBuilding> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/service/IBaseDuckInfoService.java

@@ -0,0 +1,16 @@
+package com.huimv.input.service;
+
+import com.huimv.input.entity.BaseDuckInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface IBaseDuckInfoService extends IService<BaseDuckInfo> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/service/IEnvDeviceService.java

@@ -0,0 +1,16 @@
+package com.huimv.input.service;
+
+import com.huimv.input.entity.EnvDevice;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface IEnvDeviceService extends IService<EnvDevice> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/service/IEnvRegularCallEggService.java

@@ -0,0 +1,16 @@
+package com.huimv.input.service;
+
+import com.huimv.input.entity.EnvRegularCallEgg;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 固定电子秤 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface IEnvRegularCallEggService extends IService<EnvRegularCallEgg> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/service/IEnvRegularCallFeedingService.java

@@ -0,0 +1,16 @@
+package com.huimv.input.service;
+
+import com.huimv.input.entity.EnvRegularCallFeeding;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 固定电子秤 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface IEnvRegularCallFeedingService extends IService<EnvRegularCallFeeding> {
+
+}

+ 16 - 0
input/src/main/java/com/huimv/input/service/IRawDataService.java

@@ -0,0 +1,16 @@
+package com.huimv.input.service;
+
+import com.huimv.input.entity.RawData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+public interface IRawDataService extends IService<RawData> {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/service/impl/BaseBuildingServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.input.service.impl;
+
+import com.huimv.input.entity.BaseBuilding;
+import com.huimv.input.mapper.BaseBuildingMapper;
+import com.huimv.input.service.IBaseBuildingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Service
+public class BaseBuildingServiceImpl extends ServiceImpl<BaseBuildingMapper, BaseBuilding> implements IBaseBuildingService {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/service/impl/BaseDuckInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.input.service.impl;
+
+import com.huimv.input.entity.BaseDuckInfo;
+import com.huimv.input.mapper.BaseDuckInfoMapper;
+import com.huimv.input.service.IBaseDuckInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Service
+public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, BaseDuckInfo> implements IBaseDuckInfoService {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/service/impl/EnvDeviceServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.input.service.impl;
+
+import com.huimv.input.entity.EnvDevice;
+import com.huimv.input.mapper.EnvDeviceMapper;
+import com.huimv.input.service.IEnvDeviceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Service
+public class EnvDeviceServiceImpl extends ServiceImpl<EnvDeviceMapper, EnvDevice> implements IEnvDeviceService {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/service/impl/EnvRegularCallEggServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.input.service.impl;
+
+import com.huimv.input.entity.EnvRegularCallEgg;
+import com.huimv.input.mapper.EnvRegularCallEggMapper;
+import com.huimv.input.service.IEnvRegularCallEggService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 固定电子秤 服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Service
+public class EnvRegularCallEggServiceImpl extends ServiceImpl<EnvRegularCallEggMapper, EnvRegularCallEgg> implements IEnvRegularCallEggService {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/service/impl/EnvRegularCallFeedingServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.input.service.impl;
+
+import com.huimv.input.entity.EnvRegularCallFeeding;
+import com.huimv.input.mapper.EnvRegularCallFeedingMapper;
+import com.huimv.input.service.IEnvRegularCallFeedingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 固定电子秤 服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Service
+public class EnvRegularCallFeedingServiceImpl extends ServiceImpl<EnvRegularCallFeedingMapper, EnvRegularCallFeeding> implements IEnvRegularCallFeedingService {
+
+}

+ 20 - 0
input/src/main/java/com/huimv/input/service/impl/RawDataServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.input.service.impl;
+
+import com.huimv.input.entity.RawData;
+import com.huimv.input.mapper.RawDataMapper;
+import com.huimv.input.service.IRawDataService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-26
+ */
+@Service
+public class RawDataServiceImpl extends ServiceImpl<RawDataMapper, RawData> implements IRawDataService {
+
+}

+ 51 - 0
input/src/main/java/com/huimv/input/utils/ModBusUtils.java

@@ -0,0 +1,51 @@
+package com.huimv.input.utils;
+
+/**
+ * TODO
+ *
+ * @author linfeng
+ * @date 2022/12/8 16:04
+ */
+public class ModBusUtils {
+
+    public static char byteToASCLL(byte b) {
+        return (char) b;
+    }
+
+
+    /*
+     * 字节数组转16进制字符串
+     */
+    public static String bytes2HexString(byte[] b) {
+        String r = "";
+        for (int i = 0; i < b.length; i++) {
+            String hex = Integer.toHexString(b[i] & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            r += hex.toUpperCase() + " ";
+        }
+        return r;
+    }
+    public static byte[] hexStr2Bytes(String src) {
+        src = src.replaceAll(" ", "");
+        System.out.println(src);
+        int m = 0, n = 0;
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            m = i * 2 + 1;
+            n = m + 1;
+            String sss = "0x" + src.substring(i * 2, m) + src.substring(m, n);
+            try {
+                ret[i] = Byte.decode(sss);
+            } catch (Exception e) {
+                // TODO: handle exception
+                int s = Integer.decode(sss);
+                ret[i] = (byte)s;
+            }
+        }
+        return ret;
+    }
+}
+

+ 27 - 0
input/src/main/resources/application-prod.yml

@@ -0,0 +1,27 @@
+server:
+  port: 8031
+
+spring:
+  application:
+    name: huimv-guowei-admin
+
+  datasource:
+    url: jdbc:mysql://139.9.172.209:3309/huimv-guowei-center?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: eartag
+    password: eartag@2022
+    driver-class-name: com.mysql.cj.jdbc.Driver
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  # mapper.xml文件所存放的位置
+#  mapper-locations: classpath*:com/huimv/guowei/admin/mapper/xml/*.xml  # 不加这一行出错:“org.apache.ibatis.binding.BindingException:  Invalid bound statement (not found)”
+#  mapper-locations: classpath:com/huimv/center/mappers/**/*Mapper.xml
+
+img:
+  url: https://img.ifarmcloud.com/images/
+  basePath: /home/huimv/img/
+  ip: 139.9.167.178
+  user:  huimv
+  password: "!hm123@1"
+  port: 22

+ 7 - 0
input/src/main/resources/application.properties

@@ -0,0 +1,7 @@
+#开发
+#spring.profiles.active=dev
+#线上
+spring.profiles.active=prod
+#牧场信息化平台
+#spring.profiles.active=info-dev
+

+ 20 - 0
input/src/main/resources/com/huimv/input/mapper/BaseBuildingMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.input.mapper.BaseBuildingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.input.entity.BaseBuilding">
+        <id column="id" property="id" />
+        <result column="build_name" property="buildName" />
+        <result column="parent_id" property="parentId" />
+        <result column="f_type" property="fType" />
+        <result column="cage_num" property="cageNum" />
+        <result column="stage_code" property="stageCode" />
+        <result column="farm_id" property="farmId" />
+        <result column="sort" property="sort" />
+        <result column="cage_name" property="cageName" />
+        <result column="other2" property="other2" />
+        <result column="other3" property="other3" />
+    </resultMap>
+
+</mapper>

+ 31 - 0
input/src/main/resources/com/huimv/input/mapper/BaseDuckInfoMapper.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.input.mapper.BaseDuckInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.input.entity.BaseDuckInfo">
+        <id column="id" property="id" />
+        <result column="duck_num" property="duckNum" />
+        <result column="duck_breed" property="duckBreed" />
+        <result column="duck_sex" property="duckSex" />
+        <result column="duck_birthplace" property="duckBirthplace" />
+        <result column="duck_birthday" property="duckBirthday" />
+        <result column="genotype" property="genotype" />
+        <result column="now_weight" property="nowWeight" />
+        <result column="unit_id" property="unitId" />
+        <result column="unit_name" property="unitName" />
+        <result column="breeding_env" property="breedingEnv" />
+        <result column="hatch_rate" property="hatchRate" />
+        <result column="day_age" property="dayAge" />
+        <result column="mother_num" property="motherNum" />
+        <result column="mother_genotype" property="motherGenotype" />
+        <result column="father_num" property="fatherNum" />
+        <result column="father_genotype" property="fatherGenotype" />
+        <result column="duck_img_url" property="duckImgUrl" />
+        <result column="special_needs" property="specialNeeds" />
+        <result column="is_cage" property="isCage" />
+        <result column="farm_id" property="farmId" />
+        <result column="unit_list" property="unitList" />
+    </resultMap>
+
+</mapper>

+ 19 - 0
input/src/main/resources/com/huimv/input/mapper/EnvDeviceMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.input.mapper.EnvDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.input.entity.EnvDevice">
+        <id column="id" property="id" />
+        <result column="device_code" property="deviceCode" />
+        <result column="device_name" property="deviceName" />
+        <result column="device_type" property="deviceType" />
+        <result column="build_location" property="buildLocation" />
+        <result column="unit_name" property="unitName" />
+        <result column="unit_id" property="unitId" />
+        <result column="device_brand" property="deviceBrand" />
+        <result column="device_status" property="deviceStatus" />
+        <result column="farm_id" property="farmId" />
+    </resultMap>
+
+</mapper>

+ 22 - 0
input/src/main/resources/com/huimv/input/mapper/EnvRegularCallEggMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.input.mapper.EnvRegularCallEggMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.input.entity.EnvRegularCallEgg">
+        <id column="id" property="id" />
+        <result column="call_name" property="callName" />
+        <result column="call_code" property="callCode" />
+        <result column="duck_num" property="duckNum" />
+        <result column="duck_weight" property="duckWeight" />
+        <result column="duck_feeding_original" property="duckFeedingOriginal" />
+        <result column="egg_num" property="eggNum" />
+        <result column="call_date" property="callDate" />
+        <result column="farm_id" property="farmId" />
+        <result column="duck_id" property="duckId" />
+        <result column="battery" property="battery" />
+        <result column="unit_id" property="unitId" />
+        <result column="unit_name" property="unitName" />
+    </resultMap>
+
+</mapper>

+ 21 - 0
input/src/main/resources/com/huimv/input/mapper/EnvRegularCallFeedingMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.input.mapper.EnvRegularCallFeedingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.input.entity.EnvRegularCallFeeding">
+        <id column="id" property="id" />
+        <result column="call_name" property="callName" />
+        <result column="call_code" property="callCode" />
+        <result column="duck_num" property="duckNum" />
+        <result column="duck_weight" property="duckWeight" />
+        <result column="duck_feeding_original" property="duckFeedingOriginal" />
+        <result column="call_date" property="callDate" />
+        <result column="farm_id" property="farmId" />
+        <result column="duck_id" property="duckId" />
+        <result column="battery" property="battery" />
+        <result column="unit_id" property="unitId" />
+        <result column="unit_name" property="unitName" />
+    </resultMap>
+
+</mapper>

+ 13 - 0
input/src/main/resources/com/huimv/input/mapper/RawDataMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.input.mapper.RawDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.input.entity.RawData">
+        <id column="id" property="id" />
+        <result column="device_code" property="deviceCode" />
+        <result column="data" property="data" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 13 - 0
input/src/test/java/com/huimv/input/InputApplicationTests.java

@@ -0,0 +1,13 @@
+package com.huimv.input;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class InputApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}