diff --git a/lab-service/lab-iot/pom.xml b/lab-service/lab-iot/pom.xml
index b68b1e0..0e02c2e 100644
--- a/lab-service/lab-iot/pom.xml
+++ b/lab-service/lab-iot/pom.xml
@@ -38,6 +38,20 @@
lab-iot-api
${bladex.project.version}
+
+
+ com.infiniteautomation
+ modbus4j
+ 3.0.3
+
+
+
+ org.springblade
+ lab-system-api
+ 2.8.1.RELEASE
+ compile
+
+
diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java
index 99acbd9..779773f 100644
--- a/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java
+++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java
@@ -1,35 +1,117 @@
package org.springblade.iot.config;
+import com.alibaba.fastjson.JSONObject;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
+import lombok.AllArgsConstructor;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.iot.entry.Sensor;
+import org.springblade.iot.entry.SensorAlert;
+import org.springblade.iot.entry.SensorHistory;
+import org.springblade.iot.service.ISensorAlertService;
+import org.springblade.iot.service.ISensorHistoryService;
+import org.springblade.iot.service.ISensorService;
import org.springblade.iot.utils.ReadModBusUtil;
+import org.springblade.system.feign.ISysClient;
+import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
-import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static org.springblade.core.cache.constant.CacheConstant.BIZ_CACHE;
@Component
-public class ModbusReader {
+@AllArgsConstructor
+public class ModbusReader implements CommandLineRunner {
+
+ private final ISensorService sensorService;
+
+ private final ISensorHistoryService historyService;
+
+ private final ISysClient sysClient;
+
+ private final ISensorAlertService sensorAlertService;
/**
* 项目启动读取传感器数据 相关逻辑
*/
- @PostConstruct
- private void readModBusSensor() throws Exception {
- // 1.获取tcp协议的主机(上位机)
- ModbusMaster master = ReadModBusUtil.getTcpMaster("192.168.1.217", 502, 1);
- // 2.初始化
- try {
- master.init();
- while (0 == 0) {
- // 3.读取保持寄存器数据
- ReadModBusUtil.readHoldingRegistersTest(master, 1, 0, 10);
- Thread.sleep(1000L);
+ @Override
+ public void run(String... args) throws Exception {
+ // 获取所有设备
+ List list = sensorService.list();
+ int count = 1;
+ // 系统启动先清空下Redis
+ for (Sensor sensor : list) {
+ CacheUtil.evict(BIZ_CACHE, "sensor:id", sensor.getId());
+ }
+ // TODO 端口和从机id后期加到数据库
+ while (true) {
+ List tempList = new ArrayList<>();
+ List alerts = new ArrayList<>();
+ for (Sensor sensor : list) {
+ // 1.获取tcp协议的主机(上位机)
+ ModbusMaster master = ReadModBusUtil.getTcpMaster(sensor.getIp(), 502, 1);
+ // 2.初始化
+ try {
+ master.init();
+ // 3.读取保持寄存器数据
+ List floats = ReadModBusUtil.readHoldingRegistersTest(master, 1, sensor.getStartIndex(), sensor.getDataLength());
+ if (floats.get(0) != null) {
+ sensor.setCurrData(String.valueOf(floats.get(0)));
+ }
+// System.out.println(sensor.getIp() + ":" + sensor.getSignalName() + ":" + floats);
+ // 加入缓存
+ String tempStr = CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId(), () -> JSONObject.toJSONString(sensor));
+ System.out.println("tempStr" + tempStr);
+ Sensor result = JSONObject.parseObject(tempStr, Sensor.class);
+ System.out.println("result" + result);
+
+ String str = (String) CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId());
+ System.out.println("str" + str);
+ Sensor result1 = JSONObject.parseObject(str, Sensor.class);
+ System.out.println("result" + result1);
+
+ SensorHistory resultHistory = new SensorHistory();
+ BeanUtil.copy(result, resultHistory);
+ resultHistory.setId(null);
+ resultHistory.setCreateTime(new Date());
+ tempList.add(resultHistory);
+// System.out.println("resultHistory:" + resultHistory);
+ // 报警信息
+ if (sensor.getWarningValue() != null &&
+ !"".equals(sensor.getWarningValue()) &&
+ floats.get(0) > Float.parseFloat(sensor.getWarningValue())) {
+ SensorAlert sensorAlert = new SensorAlert();
+ BeanUtil.copy(sensor, sensorAlert);
+ sensorAlert.setId(null);
+ sensorAlert.setCreateTime(new Date());
+ sensorAlert.setType("1");
+ alerts.add(sensorAlert);
+ }
+ } catch (ModbusInitException e) {
+ e.printStackTrace();
+ } finally {
+ // TODO 挪到外边
+ // 销毁连接
+ master.destroy();
+ }
+ }
+ String data = sysClient.getParamValue("storagef_requency").getData();
+// System.out.println("count" + count);
+ if (count >= Integer.parseInt(data)) {
+// System.out.println("tempList:" + tempList);
+ historyService.saveBatch(tempList);
+ sensorAlertService.saveBatch(alerts);
+ tempList.clear();
+ alerts.clear();
+ count = 0;
+ } else {
+ count++;
}
- } catch (ModbusInitException e) {
- e.printStackTrace();
- } finally {
- // 销毁连接
- master.destroy();
+ Thread.sleep(1000L);
}
}
}
diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java
new file mode 100644
index 0000000..456fc00
--- /dev/null
+++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java
@@ -0,0 +1,36 @@
+
+package org.springblade.iot.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.api.R;
+import org.springblade.iot.entry.SensorAlert;
+import org.springblade.iot.service.ISensorAlertService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author swj
+ * @since 2022年8月17日16:35:34
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sensorAlert")
+@Api(value = "", tags = "")
+public class SensorAlertController extends BladeController {
+
+ private final ISensorAlertService sensorAlertService;
+
+ /**
+ * 仪器设备异常报警
+ */
+ @GetMapping("/abnormal")
+ public R> abnormal() {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(SensorAlert::getIsRead, 0);
+ return R.data(sensorAlertService.list(wrapper));
+ }
+}
diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java
index 89f0af5..fa1aca6 100644
--- a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java
+++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java
@@ -1,6 +1,7 @@
package org.springblade.iot.controller;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -9,20 +10,26 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.iot.entry.Sensor;
+import org.springblade.iot.entry.SensorHistory;
+import org.springblade.iot.service.ISensorHistoryService;
import org.springblade.iot.service.ISensorService;
import org.springframework.web.bind.annotation.*;
-import java.util.Date;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import static org.springblade.core.cache.constant.CacheConstant.BIZ_CACHE;
/**
- * 物品申领表 控制器
- *
* @author swj
* @since 2022年8月17日16:35:34
*/
@@ -34,6 +41,8 @@ public class SensorController extends BladeController {
private final ISensorService service;
+ private final ISensorHistoryService sensorHistoryService;
+
/**
* 分页
*/
@@ -80,9 +89,500 @@ public class SensorController extends BladeController {
/**
* 根据id获取对应的Sensor
*/
- @GetMapping("/getSensor")
+ @GetMapping("/getDetail")
public Sensor getReagent(String id) {
- Sensor sensor = service.getById(id);
- return sensor;
+ return service.getById(id);
+ }
+
+ /**
+ * 今日实验室温度变化趋势
+ */
+ @GetMapping("/temperature")
+ public R