diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RadarStatusController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RadarStatusController.java index a9da797..b10d98f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RadarStatusController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/RadarStatusController.java @@ -9,6 +9,8 @@ import com.ruoyi.common.core.domain.entity.SysRadar; import com.ruoyi.common.core.page.PageDomain; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.SocketModel; +import com.ruoyi.common.utils.SocketUtil; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.bean.ModbusResponse; @@ -20,6 +22,8 @@ import com.ruoyi.system.service.PrimaryRadarDataService; import com.ruoyi.system.service.impl.IdentifierStatusServiceImpl; import com.ruoyi.web.core.config.RadarStatusWebSocket; import com.serotonin.modbus4j.ModbusMaster; +import lombok.Data; +import org.apache.commons.compress.utils.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,8 +31,10 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; -import javax.xml.crypto.Data; +import java.io.IOException; import java.net.Inet4Address; +import java.net.Socket; +import java.net.UnknownHostException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; @@ -66,34 +72,37 @@ public class RadarStatusController { return prefix + "/radarstatus"; } + + @PostMapping("/list") @ResponseBody public TableDataInfo list(@RequestBody SysRadar sysRadar) { TableDataInfo rspData = new TableDataInfo(); List radarList = service.selectRadarList(sysRadar); - // 异步连接硬件 - CompletableFuture> listCompletableFuture = CompletableFuture.supplyAsync(() -> { - List responses = new ArrayList<>(); - final ConnectionStatus connectionStatus = new ConnectionStatus(); - Timer timer = new Timer(); - boolean connected = false; + + List socketModels = Lists.newArrayList(); + for (SysRadar radar : radarList) { + try { + Socket socket = new Socket(radar.getRadarIp(), 23); + SocketModel socketModel = new SocketModel(); + socketModel.setRadarLocation(radar.getRadarLocation()); + socketModel.setSocket(socket); + socketModel.setRadarIp(radar.getRadarIp()); + socketModels.add(socketModel); + } catch (Exception e) { + e.printStackTrace(); + } + } + + Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { - - for (SysRadar radar : radarList) { - System.out.println("=======radar====="); - try { -// ModbusResponse modbusResponse = new ModbusResponse(); - ModbusMaster master = ModbusUtils.getSlave(radar.getRadarIp(), 23); - DataResponse dataResponse = new DataResponse(); - dataResponse.setRadarIp(radar.getRadarIp()); - System.out.println(radar.getRadarIp()); - ModbusResponse modbusResponse = ModbusUtils.holdingRegister(); - if (modbusResponse == null){ - dataResponse.setStatus(0); - } - System.out.println(modbusResponse); + socketModels.forEach(socketModel -> { + try { + DataResponse data = SocketUtil.getData(socketModel); + System.out.println(socketModel.getRadarIp() +": "+ data); + ModbusResponse modbusResponse = getModbusResponse(data); String tag = modbusResponse.getTagId(); PrimaryRadarData primaryRadarData = new PrimaryRadarData(); SysIdentifier sysIdentifier = new SysIdentifier(); @@ -101,41 +110,93 @@ public class RadarStatusController { if (!"0".equals(modbusResponse.getTagId())) { sysIdentifier = identifierService.selectIdentifierByTag(tag); primaryRadarData.setLadleNumber(sysIdentifier.getLadleNumber()); - primaryRadarData.setRadarLocation(radar.getRadarLocation()); - primaryRadarData.setRadarIp(radar.getRadarIp()); + primaryRadarData.setRadarLocation(socketModel.getRadarLocation()); + primaryRadarData.setRadarIp(socketModel.getRadarIp()); } else { primaryRadarData.setLadleNumber(null); primaryRadarData.setRadarLocation(null); - primaryRadarData.setRadarIp(radar.getRadarIp()); + primaryRadarData.setRadarIp(socketModel.getRadarIp()); } - dataResponse.setRadarLocation(primaryRadarData.getRadarLocation()); String ip = Inet4Address.getLocalHost().getHostAddress(); if (modbusResponse.getValue4() != null && !"0".equals(modbusResponse.getValue4())) { primaryRadarDataService.insertPrimaryRadarData(primaryRadarData); - dataResponse.setStatus(1); - dataResponse.setRadarLocation(primaryRadarData.getRadarLocation()); } else { - dataResponse.setStatus(0); + } - RadarStatusWebSocket.sendToAll(JSON.toJSONString(dataResponse)); - }catch (Exception e) { - if (e.equals("java.net.SocketTimeoutException: connect timed out")) { - System.err.println("从串口读取失败:" + "连接超时"); - } - DataResponse dataResponse = new DataResponse(); - dataResponse.setRadarIp(radar.getRadarIp()); - dataResponse.setRadarLocation(radar.getRadarLocation()); - dataResponse.setStatus(0); - RadarStatusWebSocket.sendToAll(JSON.toJSONString(dataResponse)); - e.printStackTrace(); - } - } + RadarStatusWebSocket.sendToAll(JSON.toJSONString(data)); + } catch (Exception e) { +// if (e.equals("java.net.SocketTimeoutException: connect timed out")) { +// System.err.println("从串口读取失败:" + "连接超时"); +// } +// DataResponse dataResponse = new DataResponse(); +// dataResponse.setRadarIp(radar.getRadarIp()); +// dataResponse.setRadarLocation(radar.getRadarLocation()); +// dataResponse.setStatus(0); +// RadarStatusWebSocket.sendToAll(JSON.toJSONString(dataResponse)); +// e.printStackTrace(); + } + }); } }; timer.scheduleAtFixedRate(task, 1, 1000); - return responses; - }); + + + // 异步连接硬件 +// CompletableFuture> listCompletableFuture = CompletableFuture.supplyAsync(() -> { +// List responses = new ArrayList<>(); +// final ConnectionStatus connectionStatus = new ConnectionStatus(); +// Timer timer = new Timer(); +// boolean connected = false; +// TimerTask task = new TimerTask() { +// @Override +// public void run() { +// +// for (SysRadar radar : radarList) { +// System.out.println("=======radar=====" + radar.getRadarIp()); +// try { +// DataResponse data = SocketUtil.getData(radar.getRadarIp(), 23, radar.getRadarLocation()); +// System.out.println(radar.getRadarIp() +": "+ data); +// ModbusResponse modbusResponse = getModbusResponse(data); +// String tag = modbusResponse.getTagId(); +// PrimaryRadarData primaryRadarData = new PrimaryRadarData(); +// SysIdentifier sysIdentifier = new SysIdentifier(); +// BeanUtils.copyProperties(modbusResponse, primaryRadarData); +// if (!"0".equals(modbusResponse.getTagId())) { +// sysIdentifier = identifierService.selectIdentifierByTag(tag); +// primaryRadarData.setLadleNumber(sysIdentifier.getLadleNumber()); +// primaryRadarData.setRadarLocation(radar.getRadarLocation()); +// primaryRadarData.setRadarIp(radar.getRadarIp()); +// } else { +// primaryRadarData.setLadleNumber(null); +// primaryRadarData.setRadarLocation(null); +// primaryRadarData.setRadarIp(radar.getRadarIp()); +// } +// String ip = Inet4Address.getLocalHost().getHostAddress(); +// if (modbusResponse.getValue4() != null && !"0".equals(modbusResponse.getValue4())) { +// primaryRadarDataService.insertPrimaryRadarData(primaryRadarData); +// } else { +// +// } +// RadarStatusWebSocket.sendToAll(JSON.toJSONString(data)); +// } catch (Exception e) { +//// if (e.equals("java.net.SocketTimeoutException: connect timed out")) { +//// System.err.println("从串口读取失败:" + "连接超时"); +//// } +//// DataResponse dataResponse = new DataResponse(); +//// dataResponse.setRadarIp(radar.getRadarIp()); +//// dataResponse.setRadarLocation(radar.getRadarLocation()); +//// dataResponse.setStatus(0); +//// RadarStatusWebSocket.sendToAll(JSON.toJSONString(dataResponse)); +//// e.printStackTrace(); +// } +// } +// } +// }; +// timer.scheduleAtFixedRate(task, 1, 10000); +// +// return responses; +// }); PageDomain pageDomain = TableSupport.buildPageRequest(); if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize()) { rspData.setRows(radarList); @@ -154,6 +215,21 @@ public class RadarStatusController { return rspData; } + private static ModbusResponse getModbusResponse(DataResponse data) { + ModbusResponse modbusResponse = new ModbusResponse(); + modbusResponse.setRadarNum(data.getData().get(0).toString()); + modbusResponse.setTagId(data.getData().get(3).toString()); + modbusResponse.setValue1(data.getData().get(4)); + modbusResponse.setValue2(data.getData().get(5)); + modbusResponse.setValue3(data.getData().get(6)); + modbusResponse.setValue4(data.getData().get(7)); + modbusResponse.setValue5(data.getData().get(8)); + modbusResponse.setBaseLine(data.getData().get(9)); + modbusResponse.setQueryFre(data.getData().get(10)); + modbusResponse.setNumber(data.getData().get(11)); + return modbusResponse; + } + class ConnectionStatus { boolean connected = false; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DataResponse.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DataResponse.java index 9d40924..e5072d2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DataResponse.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DataResponse.java @@ -3,6 +3,7 @@ package com.ruoyi.common.core.domain.entity; import lombok.Data; import java.io.Serializable; +import java.util.List; @Data public class DataResponse implements Serializable { @@ -23,13 +24,6 @@ public class DataResponse implements Serializable { */ private Integer status = 0 ; + private List data; - @Override - public String toString() { - return "DataResponse{" + - "radarIp='" + radarIp + '\'' + - ", radarLocation='" + radarLocation + '\'' + - ", status='" + status + '\'' + - '}'; - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BitUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BitUtils.java new file mode 100644 index 0000000..83d8513 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BitUtils.java @@ -0,0 +1,57 @@ +package com.ruoyi.common.utils; + +import com.serotonin.modbus4j.BatchResults; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BitUtils { + + public static List convertToArray(String string) { + int[] groupLengths = {2, 2, 2, 8, 4, 4, 4, 4, 4, 4, 4,4,4}; + int startIndex = 0; + List array = new ArrayList<>(); + + for (int length : groupLengths) { + int endIndex = startIndex + length; + String substring = string.substring(startIndex, endIndex); + array.add(substring); + startIndex = endIndex; + } + + return array; + } + + public static int covert(String content) { + int number = 0; + String[] HighLetter = {"a", "b", "c", "d", "e", "f"}; + Map map = new HashMap<>(); + for (int i = 0; i <= 9; i++) { + map.put(i + "", i); + } + for (int j = 10; j < HighLetter.length + 10; j++) { + map.put(HighLetter[j - 10], j); + } + String[] str = new String[content.length()]; + for (int i = 0; i < str.length; i++) { + str[i] = content.substring(i, i + 1); + } + for (int i = 0; i < str.length; i++) { + number += map.get(str[i]) * Math.pow(16, str.length - 1 - i); + } + return number; + } + + public static int covertInt(BatchResults integerBatchResults){ + Object value1 = integerBatchResults.getValue(0); + Object value2 = integerBatchResults.getValue(1); + String hex1String = Integer.toHexString(Integer.parseInt(value1.toString())); + String hex2String = Integer.toHexString(Integer.parseInt(value2.toString())); + String hex = hex1String + hex2String; + + return (covert(hex)); + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SocketModel.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SocketModel.java new file mode 100644 index 0000000..f03d89d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SocketModel.java @@ -0,0 +1,14 @@ +package com.ruoyi.common.utils; + +import lombok.Data; + +import java.net.Socket; + +@Data +public class SocketModel { + private String radarIp; + + private String radarLocation; + + private Socket socket; +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SocketUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SocketUtil.java new file mode 100644 index 0000000..0aaaafe --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SocketUtil.java @@ -0,0 +1,60 @@ +package com.ruoyi.common.utils; + +import com.ruoyi.common.core.domain.entity.DataResponse; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.math.BigInteger; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +public class SocketUtil { + + public static DataResponse getData(SocketModel socketModel) { + DataResponse dataResponse = new DataResponse(); + Socket socket = socketModel.getSocket(); + String radarLocation = socketModel.getRadarLocation(); + String radarIp = socketModel.getRadarIp(); + try { + boolean connected = socket.isConnected(); + + if (!connected) { + System.out.println(radarLocation+": "+connected); + dataResponse.setRadarIp(radarIp); + dataResponse.setRadarLocation(radarLocation); + dataResponse.setStatus(1); + dataResponse.setData(null); + return dataResponse; + } + + InputStream inputStream = socket.getInputStream(); // 获取输入流 + int available = inputStream.available(); + byte[] buffer = new byte[available]; + inputStream.read(buffer, 0, available); + String hex = new BigInteger(1, buffer).toString(16); + if (!"0".equals(hex)) { + hex = "0" + hex; + List decimal = new ArrayList<>(); + List strings = BitUtils.convertToArray(hex); + for (String string : strings) { + int s = BitUtils.covert(string); + decimal.add(s); + } + dataResponse.setData(decimal); + dataResponse.setRadarIp(radarIp); + dataResponse.setStatus(1); + dataResponse.setRadarLocation(radarLocation); + return dataResponse; + } + } catch (Exception e) { + System.out.println("读取数据异常:"+radarIp); + } + dataResponse.setRadarIp(radarIp); + dataResponse.setRadarLocation(radarLocation); + dataResponse.setStatus(0); + dataResponse.setData(null); + return dataResponse; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/ModbusResponse.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/ModbusResponse.java index bea5ae4..ced571a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/ModbusResponse.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/ModbusResponse.java @@ -5,6 +5,11 @@ import lombok.Data; @Data public class ModbusResponse { + + /** + * 雷达id + */ + private String radarNum; /** * 标签id号 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/modbus/ModbusUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/modbus/ModbusUtils.java index 5519862..8ecd79b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/modbus/ModbusUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/modbus/ModbusUtils.java @@ -37,7 +37,7 @@ public class ModbusUtils { // 发送请求之前获取写锁 lock.readLock().lock(); BatchResults integerBatchResults = master.send(batch); - +// log.error("读取的内容:{}",integerBatchResults); // 当接收到响应时释放写锁 lock.readLock().unlock();