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