From 61b40ca50044c8b20b6ea21028398e068ca103a0 Mon Sep 17 00:00:00 2001
From: jiazx0107@163.com <jiazx0107@163.com>
Date: 星期六, 12 八月 2023 16:16:14 +0800
Subject: [PATCH] 调整DEVICE的字段和缓存,增加支持根据ID直接获取设备信息,优化MODBUS-TCP协议 实现
---
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java | 78 ++++++++
igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java | 10 +
igds-core/src/main/java/com/ld/igds/view/Device.view.xml | 12 +
igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java | 3
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java | 35 +++
igds-core/src/main/java/com/ld/igds/constant/RedisConst.java | 6
igds-core/src/main/java/com/ld/igds/models/Device.java | 4
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java | 186 ++++++++++++++++++++
igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java | 85 ++++++---
igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java | 3
igds-core/src/main/resources/mapper/DeviceMapper.xml | 1
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java | 69 +++++++
igds-core/src/main/java/models/igds.model.xml | 22 ++
13 files changed, 480 insertions(+), 34 deletions(-)
diff --git a/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java b/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
index 199f4c7..216fd35 100644
--- a/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
+++ b/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java
@@ -39,6 +39,16 @@
*/
List<Device> getCacheDeviceBySerId(String companyId, String serId);
+
+ /**
+ * 鏍规嵁鍒嗘満淇℃伅鑾峰彇璁惧
+ *
+ * @param companyId
+ * @param id
+ * @return
+ */
+ Device getCacheDeviceById(String companyId, String id);
+
/**
* 鍒锋柊缂撳瓨
*
diff --git a/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java b/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
index f96082f..ac4ab1b 100644
--- a/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
+++ b/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java
@@ -1,15 +1,14 @@
package com.ld.igds.common.impl;
import java.util.*;
-import java.util.stream.Collectors;
import com.ld.igds.common.CoreDeviceService;
import com.ld.igds.common.dto.DepotSerData;
import com.ld.igds.common.mapper.DeviceMapper;
import com.ld.igds.constant.Constant;
import com.ld.igds.constant.DeviceStatus;
-
import com.ld.igds.constant.DeviceType;
+
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -32,37 +31,63 @@
private DeviceMapper deviceMapper;
- @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
public void setCacheAllDevice(List<Device> listAll, String companyId) {
- // 棣栧厛鎸夌収鍒嗘満鍒嗙粍锛岀劧鍚庡瓨鏇存柊缂撳瓨銆�
- Map<String, List<Device>> map = listAll.stream().collect(Collectors.groupingBy(Device::getSerId));
- if (null == map || map.isEmpty()) {
- log.error("瀛楀吀淇℃伅锛氭墍鏈夎澶囨寜鐓у垎鏈哄垎缁勪繚瀛樼紦瀛樺け璐ワ紝娌℃湁鍒嗙粍鎴愬姛=={}", companyId);
- return;
- }
+ if (null == listAll || listAll.isEmpty()) return;
- for (String serId : map.keySet()) {
- updateCacheDeviceBySerId(map.get(serId), companyId, serId);
- }
+ //鎸夌収鍒嗘満鍒嗙被
+ Map<String, List<Device>> mapSer = new HashMap<>();
- this.setCacheDepotDeviceSer(listAll, companyId);
- }
+ //浠撳簱-璁惧-鍒嗘満瀵硅薄鍒嗙被
+ Map<String, DepotSerData> mapDepot = new HashMap<>();
- @SuppressWarnings({"unchecked", "rawtypes"})
- private void setCacheDepotDeviceSer(List<Device> listAll, String companyId) {
- // 澶勭悊浠撳簱涓庡垎鏈虹殑鍏崇郴缂撳瓨
- Map<String, DepotSerData> tempMap = new HashMap<>();
- String key;
- for (Device item : listAll) {
- key = companyId + "-" + item.getDepotId() + "-" + item.getSerId();
- if (tempMap.get(key) == null) {
- tempMap.put(key, new DepotSerData(companyId, item.getDepotId(), item.getSerId()));
+
+ //鎶婅澶囨寜鐓у垎鏈鸿繘琛屽垎缁勶紝鍚屼簨鍚ц澶囨坊鍔犲埌缂撳瓨鍒楄〃涓�
+ String deviceKey, depotDataKey;
+ for (Device device : listAll) {
+
+ //灏佽浠撳簱-璁惧-鍒嗘満瀵硅薄鍏崇郴
+ depotDataKey = companyId + "-" + device.getDepotId() + "-" + device.getSerId();
+ if (mapDepot.get(depotDataKey) == null) {
+ mapDepot.put(depotDataKey, new DepotSerData(companyId, device.getDepotId(), device.getSerId()));
}
+
+
+ //鍗曚釜璁惧杩涜缂撳瓨
+ deviceKey = RedisConst.buildKey(companyId, RedisConst.KEY_DEVICE, device.getId());
+ redisUtil.set(deviceKey, device);
+
+ //鎸夌収鍒嗘満鍒嗙被
+ if (null == mapSer.get(device.getSerId())) mapSer.put(device.getSerId(), new ArrayList<Device>());
+ mapSer.get(device.getSerId()).add(device);
+
}
- redisUtil.set(RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT_SER_LIST), new ArrayList(tempMap.values()));
+ //浠ュ垎鏈轰负鍗曚綅缂撳瓨璁惧
+ for (String serId : mapSer.keySet()) {
+ updateCacheDeviceBySerId(mapSer.get(serId), companyId, serId);
+ }
+
+
+ redisUtil.set(RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT_SER_LIST), new ArrayList(mapDepot.values()));
}
+
+
+// private void setCacheDepotDeviceSer(List<Device> listAll, String companyId) {
+// // 澶勭悊浠撳簱涓庡垎鏈虹殑鍏崇郴缂撳瓨
+// Map<String, DepotSerData> tempMap = new HashMap<>();
+// String key;
+// for (Device item : listAll) {
+// key = companyId + "-" + item.getDepotId() + "-" + item.getSerId();
+// if (tempMap.get(key) == null) {
+// tempMap.put(key, new DepotSerData(companyId, item.getDepotId(), item.getSerId()));
+// }
+// }
+//
+// redisUtil.set(RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT_SER_LIST), new ArrayList(tempMap.values()));
+// }
@Override
public void updateCacheDeviceBySerId(List<Device> listBySer, String companyId, String serId) {
@@ -85,6 +110,12 @@
return null;
}
return list;
+ }
+
+ @Override
+ public Device getCacheDeviceById(String companyId, String id) {
+ String key = RedisConst.buildDeviceKey(companyId, RedisConst.KEY_DEVICE, id);
+ return (Device) redisUtil.get(key);
}
@Override
@@ -173,7 +204,7 @@
}
log.debug("瑙f瀽璁惧鐘舵��--涓婚�氶亾={}---鍏宠仈閫氶亾={}--瑙f瀽鍚庣姸鎬�={}", curDevice.getPassCode(), curDevice.getLink(), curDevice.getStatus());
}
-
+
// 鏇存柊缂撳瓨
this.updateCacheDeviceBySerId(listCache, companyId, serId);
}
@@ -279,7 +310,7 @@
}
@Override
- public List<Device> getDeviceByTimId(String companyId,String timId){
- return deviceMapper.queryByTimId(companyId,timId);
+ public List<Device> getDeviceByTimId(String companyId, String timId) {
+ return deviceMapper.queryByTimId(companyId, timId);
}
}
diff --git a/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java b/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java
index d8431e3..60760c8 100644
--- a/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java
+++ b/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java
@@ -88,6 +88,12 @@
* 璁惧鍒楄〃
*/
public static final String KEY_DEVICE_LIST = "DEVICE_LIST";
+
+ /**
+ * 鍗曚釜鑹插彿鍚�
+ */
+ public static final String KEY_DEVICE = "DEVICE";
+
/**
* 璁惧鍒楄〃
*/
diff --git a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java
index 92b8ef0..d951865 100644
--- a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java
+++ b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java
@@ -32,7 +32,8 @@
TCP_BHZH_VERB_V2("TCP_BHZH_VERB_V2", "閭︽捣鎺у埗鏌滄櫤鑳芥湁绾跨増V2"),
TCP_BHZH_INOUT_V1("TCP_BHZH_INOUT_V1", "閭︽捣鏅鸿兘鍑哄叆搴撴帶鍒跺櫒鍗忚"),
TCP_BEIBO_GRAIN_V1("TCP_BEIBO_GRAIN_V1", "璐濆崥绮儏鍒嗘満鏈嶅姟绔崗璁�"),
- FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "椋庢鑷磋繙API-HTTP鍗忚");
+ FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "椋庢鑷磋繙API-HTTP鍗忚"),
+ MODBUS_TCP("MODBUS_TCP", "Modbus-TCP鍗忚");
private String code;
diff --git a/igds-core/src/main/java/com/ld/igds/models/Device.java b/igds-core/src/main/java/com/ld/igds/models/Device.java
index c4c265e..f8ae9b6 100644
--- a/igds-core/src/main/java/com/ld/igds/models/Device.java
+++ b/igds-core/src/main/java/com/ld/igds/models/Device.java
@@ -66,6 +66,10 @@
@PropertyDef(label = "璁惧鍔熺巼", description = "璁惧鍔熺巼锛屾病鏈夊彲涓嶅~鍐�:KW/H")
private Double power;
+ @Column(name = "MODBUS_",length = 100)
+ @PropertyDef(label = "Modbus閰嶇疆")
+ private String modbus;
+
@Column(name = "REMARK_", length = 250)
@PropertyDef(label = "澶囨敞", description = "澶囨敞淇℃伅")
private String remark;
diff --git a/igds-core/src/main/java/com/ld/igds/view/Device.view.xml b/igds-core/src/main/java/com/ld/igds/view/Device.view.xml
index 069c935..85ea20e 100644
--- a/igds-core/src/main/java/com/ld/igds/view/Device.view.xml
+++ b/igds-core/src/main/java/com/ld/igds/view/Device.view.xml
@@ -228,6 +228,18 @@
<Editor/>
</AutoFormElement>
<AutoFormElement layoutConstraint="colSpan:2">
+ <Property name="name">modbus</Property>
+ <Property name="property">modbus</Property>
+ <Editor/>
+ </AutoFormElement>
+ <Label layoutConstraint="colSpan:2">
+ <Property name="text">modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛</Property>
+ <Property name="style">
+ <Property name="padding-left">100px</Property>
+ <Property name="color">blue</Property>
+ </Property>
+ </Label>
+ <AutoFormElement layoutConstraint="colSpan:2">
<Property name="name">remark</Property>
<Property name="property">remark</Property>
<Property name="editorType">TextArea</Property>
diff --git a/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java b/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java
index dbfdeec..c289ec8 100644
--- a/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java
+++ b/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java
@@ -84,11 +84,8 @@
}
public void pageList(Page<DicArea> page, String key) throws Exception {
-
String hql = " from " + DicArea.class.getName();
-
Map<String, Object> args = new HashMap<>();
- List<DicArea> list;
String countHql;
if (StringUtils.isNotEmpty(key)) {
hql += " where (name like :key1 or simple like:key2)";
diff --git a/igds-core/src/main/java/models/igds.model.xml b/igds-core/src/main/java/models/igds.model.xml
index 28b1f92..3ac10d3 100644
--- a/igds-core/src/main/java/models/igds.model.xml
+++ b/igds-core/src/main/java/models/igds.model.xml
@@ -155,7 +155,7 @@
</Property>
</PropertyDef>
<PropertyDef name="ggm">
- <Property/>
+ <Property></Property>
<Property name="label">鍥借鐮�</Property>
</PropertyDef>
</DataType>
@@ -567,6 +567,26 @@
<Property></Property>
<Property name="label">浣嶇疆</Property>
</PropertyDef>
+ <PropertyDef name="modbus">
+ <Property/>
+ <Property name="label">Modbus閰嶇疆</Property>
+ </PropertyDef>
+ <PropertyDef name="ext1">
+ <Property/>
+ <Property name="label">鎵╁睍瀛楁1</Property>
+ </PropertyDef>
+ <PropertyDef name="ext2">
+ <Property/>
+ <Property name="label">鎵╁睍瀛楁2</Property>
+ </PropertyDef>
+ <PropertyDef name="ext3">
+ <Property/>
+ <Property name="label">鎵╁睍瀛楁3</Property>
+ </PropertyDef>
+ <PropertyDef name="statusName">
+ <Property/>
+ <Property name="label">褰撳墠鐘舵��</Property>
+ </PropertyDef>
</DataType>
<DataType name="dtDeviceSer">
<Property name="creationType">com.ld.igds.models.DeviceSer</Property>
diff --git a/igds-core/src/main/resources/mapper/DeviceMapper.xml b/igds-core/src/main/resources/mapper/DeviceMapper.xml
index 8b1a57a..056e15d 100644
--- a/igds-core/src/main/resources/mapper/DeviceMapper.xml
+++ b/igds-core/src/main/resources/mapper/DeviceMapper.xml
@@ -17,6 +17,7 @@
g.LOCATION_ AS location,
g.STATUS_ AS status,
g.POWER_ AS power,
+ g.MODBUS_ AS modbus,
g.LINK_ AS link,
g.EXT1_ AS ext1,
g.EXT2_ AS ext2,
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java
new file mode 100644
index 0000000..9d57d94
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java
@@ -0,0 +1,69 @@
+package com.ld.igds.protocol.modbus;
+
+import com.serotonin.modbus4j.ModbusFactory;
+import com.serotonin.modbus4j.ModbusMaster;
+import com.serotonin.modbus4j.exception.ModbusInitException;
+import com.serotonin.modbus4j.ip.IpParameters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import java.util.HashMap;
+
+@Configuration
+@Import(com.serotonin.modbus4j.ModbusFactory.class)
+public class ModbusConfig {
+
+
+ @Bean
+ public HashMap<String, ModbusMaster> contextModbusMap() {
+ return new HashMap<>();
+ }
+
+ @Autowired
+ private ModbusFactory modbusFactory;
+
+ @Autowired
+ @Qualifier("contextModbusMap")
+ private HashMap<String, ModbusMaster> masterMap;
+
+ /**
+ * @Description: 閫氳繃ip鑾峰彇瀵瑰簲鐨刴odbus杩炴帴鍣�
+ */
+ public ModbusMaster getMaster(String ip, int port) {
+ ModbusMaster modbusMaster = masterMap.get(ip);
+ if (modbusMaster == null || !modbusMaster.isConnected()) {
+ setMaster(ip, port);
+ modbusMaster = masterMap.get(ip);
+ }
+ return modbusMaster;
+
+
+ }
+
+ /**
+ * @Description: 璁剧疆ip瀵瑰簲鐨刴odbus杩炴帴鍣�
+ */
+ private void setMaster(String ip, Integer port) {
+ ModbusMaster master;
+ IpParameters params = new IpParameters();
+ params.setHost(ip);
+ params.setPort(port);
+ //璁剧疆涓簍rue锛屼細瀵艰嚧TimeoutException: request=com.serotonin.modbus4j.ip.encap.EncapMessageRequest@774dfba5",
+ //params.setEncapsulated(true);
+ master = modbusFactory.createTcpMaster(params, true);// TCP 鍗忚
+ try {
+ //璁剧疆瓒呮椂鏃堕棿
+ master.setTimeout(3 * 1000);
+ //璁剧疆閲嶈繛娆℃暟
+ master.setRetries(3);
+ //鍒濆鍖�
+ master.init();
+ } catch (ModbusInitException e) {
+ e.printStackTrace();
+ }
+ masterMap.put(ip, master);
+ }
+}
\ No newline at end of file
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java
new file mode 100644
index 0000000..ae245da
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java
@@ -0,0 +1,186 @@
+package com.ld.igds.protocol.modbus;
+
+import com.serotonin.modbus4j.ModbusMaster;
+import com.serotonin.modbus4j.exception.ModbusInitException;
+import com.serotonin.modbus4j.exception.ModbusTransportException;
+import com.serotonin.modbus4j.msg.ReadCoilsRequest;
+import com.serotonin.modbus4j.msg.ReadCoilsResponse;
+import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
+import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
+import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
+import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
+import com.serotonin.modbus4j.msg.ReadInputRegistersRequest;
+import com.serotonin.modbus4j.msg.ReadInputRegistersResponse;
+import com.serotonin.modbus4j.msg.WriteCoilRequest;
+import com.serotonin.modbus4j.msg.WriteCoilResponse;
+import com.serotonin.modbus4j.msg.WriteCoilsRequest;
+import com.serotonin.modbus4j.msg.WriteCoilsResponse;
+import com.serotonin.modbus4j.msg.WriteRegisterRequest;
+import com.serotonin.modbus4j.msg.WriteRegisterResponse;
+import com.serotonin.modbus4j.msg.WriteRegistersRequest;
+import com.serotonin.modbus4j.msg.WriteRegistersResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Desc: 宸ュ叿绫�
+ * @author: Andy
+ * @update-time: 2023/8/11
+ */
+@Component
+public class ModbusUtil {
+
+ //浠庢満榛樿鍊�
+ private Integer slaveId = 1;
+
+ @Autowired
+ private ModbusConfig modbusConfig;
+
+
+ public boolean[] readCoilStatus(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
+
+ ModbusMaster master = modbusConfig.getMaster(ip, port);
+ ReadCoilsRequest request = new ReadCoilsRequest(slaveId, offset, numberOfRegister);
+ ReadCoilsResponse response = (ReadCoilsResponse) master.send(request);
+ boolean[] booleans = response.getBooleanData();
+
+ return valueRegroup(numberOfRegister, booleans);
+ }
+
+ /**
+ * @Description: 璇诲彇澶栧洿璁惧杈撳叆鐨勫紑鍏抽噺锛岀浉褰撲簬鍔熻兘鐮侊細02H-璇荤鏁h緭鍏ョ姸鎬�
+ * @Param: [ip, offset, numberOfRegister]
+ * @return: boolean[]
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public boolean[] readInputStatus(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
+
+ ModbusMaster master = modbusConfig.getMaster(ip, port);
+ ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, offset, numberOfRegister);
+ ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
+ boolean[] booleans = response.getBooleanData();
+
+ return valueRegroup(numberOfRegister, booleans);
+ }
+
+ /**
+ * @Description: 璇诲彇淇濇寔瀵勫瓨鍣ㄦ暟鎹紝鐩稿綋浜庡姛鑳界爜锛�03H-璇讳繚鎸佸瘎瀛樺櫒
+ * @Param: [ip, offset, numberOfRegister]
+ * @return: short[]
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public short[] readHoldingRegister(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
+
+ ModbusMaster master = modbusConfig.getMaster(ip, port);
+ ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, offset, numberOfRegister);
+ ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);
+ return response.getShortData();
+ }
+
+ /**
+ * @Description: 璇诲彇澶栧洿璁惧杈撳叆鐨勬暟鎹紝鐩稿綋浜庡姛鑳界爜锛�04H-璇昏緭鍏ュ瘎瀛樺櫒
+ * @Param: [ip, offset, numberOfRegister]
+ * @return: short[]
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public short[] readInputRegisters(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
+
+ ModbusMaster master = modbusConfig.getMaster(ip, port);
+ ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, offset, numberOfRegister);
+ ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);
+ return response.getShortData();
+ }
+
+ /**
+ * @Description: 鍐欏崟涓紙绾垮湀锛夊紑鍏抽噺鏁版嵁锛岀浉褰撲簬鍔熻兘鐮侊細05H-鍐欏崟涓嚎鍦�
+ * @Param: [ip, writeOffset, writeValue]
+ * @return: boolean
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public boolean writeCoil(String ip, int port, int writeOffset, boolean writeValue) throws ModbusTransportException {
+
+ ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
+ WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
+ WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);
+ return !response.isException();
+ }
+
+ /**
+ * @Description: 鍐欏涓紑鍏抽噺鏁版嵁锛堢嚎鍦堬級锛岀浉褰撲簬鍔熻兘鐮侊細0FH-鍐欏涓嚎鍦�
+ * @Param: [ip, startOffset, data]
+ * @return: boolean
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public boolean writeCoils(String ip, int port, int startOffset, boolean[] data) throws ModbusTransportException {
+
+ ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
+ WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, data);
+ WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);
+ return !response.isException();
+
+ }
+
+ /**
+ * @Description: 鍐欏崟涓繚鎸佸瘎瀛樺櫒锛岀浉褰撲簬鍔熻兘鐮侊細06H-鍐欏崟涓繚鎸佸瘎瀛樺櫒
+ * @Param: [ip, writeOffset, writeValue]
+ * @return: boolean
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public boolean writeHoldingRegister(String ip, int port,int writeOffset, short writeValue) throws ModbusTransportException, ModbusInitException {
+
+ ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
+ WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
+ WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);
+ return !response.isException();
+
+ }
+
+ /**
+ * @Description: 鍐欏涓繚鎸佸瘎瀛樺櫒锛岀浉褰撲簬鍔熻兘鐮侊細10H-鍐欏涓繚鎸佸瘎瀛樺櫒
+ * @Param: [ip, startOffset, data]
+ * @return: boolean
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ public boolean writeHoldingRegisters(String ip,int port, int startOffset, short[] data) throws ModbusTransportException, ModbusInitException {
+
+ ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
+ WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, data);
+ WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request);
+ return !response.isException();
+ }
+
+ /**
+ * @Description: 杞崲宸ュ叿锛屽皢Boolean杞崲鎴�0锛�1
+ * @Param: [numberOfBits, values]
+ * @return: boolean[]
+ * @throws:
+ * @Author: Ricardo.Liu
+ * @Date: 2020/5/8
+ */
+ private boolean[] valueRegroup(int numberOfBits, boolean[] values) {
+ boolean[] bs = new boolean[numberOfBits];
+ int temp = 1;
+ for (boolean b : values) {
+ bs[temp - 1] = b;
+ temp++;
+ if (temp > numberOfBits) {
+ break;
+ }
+ }
+ return bs;
+ }
+}
\ No newline at end of file
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
index c00c5cc..601e72a 100644
--- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java
@@ -1,12 +1,23 @@
package com.ld.igds.protocol.modbus.command;
+import com.ld.igds.common.CoreDeviceService;
+import com.ld.igds.constant.Constant;
import com.ld.igds.io.RemoteControlService;
+import com.ld.igds.io.constant.OrderRespEnum;
+import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.io.request.DeviceAutoControlRequest;
import com.ld.igds.io.request.DeviceControlRequest;
+import com.ld.igds.io.request.ExeDevice;
import com.ld.igds.io.request.TempControlRequest;
import com.ld.igds.io.response.DeviceControlResponse;
+import com.ld.igds.models.Device;
+import com.ld.igds.protocol.modbus.ModbusUtil;
+import com.ld.igds.protocol.modbus.data.ModbusTcp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
/**
* 褰撳墠鍗忚閽堝鏍囧噯Modbus-TCP鍗忚
@@ -21,15 +32,75 @@
public static final String BEAN_ID = "modbus.remoteControlService";
+ @Resource
+ private CoreDeviceService deviceService;
+ @Resource
+ private ModbusUtil modbusUtil;
+
@Override
public String getProtocol() {
- return null;
+ return ProtocolEnum.MODBUS_TCP.getCode();
}
@Override
public DeviceControlResponse deviceControl(DeviceControlRequest request) {
- return null;
+ List<ExeDevice> deviceList = request.getDeviceList();
+
+ if (null == deviceList || deviceList.isEmpty()) {
+ return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "娌℃湁闇�瑕佹墽琛岀殑璁惧");
+ }
+
+
+ try {
+
+
+ Device device;
+ ModbusTcp modbusTcp;
+ String[] addr;
+ String temp;
+ for (ExeDevice exeDevice : deviceList) {
+ device = deviceService.getCacheDeviceById(exeDevice.getCompanyId(), exeDevice.getId());
+
+ if (null == device) continue;
+
+ if (null == device.getModbus()) continue;
+
+ modbusTcp = new ModbusTcp();
+ modbusTcp.setIp(request.getIp());
+ modbusTcp.setPort(request.getPort());
+ modbusTcp.setDeviceId(device.getId());
+ modbusTcp.setSerId(request.getSerId());
+
+ //modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛
+ addr = device.getModbus().split("-");
+ temp = addr[0];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpen(Integer.valueOf(temp));
+ temp = addr[1];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrClose(Integer.valueOf(temp));
+ temp = addr[2];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrStop(Integer.valueOf(temp));
+ temp = addr[3];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpenEnd(Integer.valueOf(temp));
+ temp = addr[4];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrCloseEnd(Integer.valueOf(temp));
+ temp = addr[5];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpenError(Integer.valueOf(temp));
+ temp = addr[6];
+ if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrCloseError(Integer.valueOf(temp));
+
+
+ //鏍规嵁璁惧鐩爣鐘舵�侊紝璋冪敤MODBUS鎵ц
+ modbusUtil.writeCoil(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrOpen(), true);
+
+
+ }
+ } catch (Exception e) {
+
+ }
+
+ return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS);
}
+
@Override
public DeviceControlResponse closeAll(DeviceControlRequest request) {
@@ -48,11 +119,14 @@
@Override
public DeviceControlResponse airAutoControl(DeviceAutoControlRequest request) {
+
+
return null;
}
@Override
public DeviceControlResponse n2AutoControl(DeviceAutoControlRequest request) {
+
return null;
}
}
diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java
new file mode 100644
index 0000000..6b1ddb0
--- /dev/null
+++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java
@@ -0,0 +1,35 @@
+package com.ld.igds.protocol.modbus.data;
+
+import lombok.Data;
+
+/**
+ * @Desc: 鐢ㄤ簬灏佽ModBUsTCP鐨勪俊鎭�
+ * @author: andy.jia
+ * @update-time: 2023/8/12 15:29
+ */
+@Data
+public class ModbusTcp {
+
+ private String deviceId;
+
+ private String serId;
+
+ private String ip;
+
+ private int port;
+
+ private int addrOpen;
+
+ private int addrClose;
+
+ private int addrStop;
+
+ private int addrOpenEnd;
+
+ private int addrCloseEnd;
+
+ private int addrOpenError;
+
+ private int addrCloseError;
+
+}
--
Gitblit v1.9.3