From 6ec45c8853d3cb6a592ecbe1d062094a77653b0f Mon Sep 17 00:00:00 2001
From: mac <user@users-MacBook-Pro.local>
Date: 星期一, 01 四月 2024 13:10:51 +0800
Subject: [PATCH] 2024年04月01日13:10:42

---
 app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java |  158 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 111 insertions(+), 47 deletions(-)

diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java b/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
index 3abca1c..979fbdc 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
@@ -1,19 +1,14 @@
 package com.hdl.photovoltaic.internet;
 
-
 import android.text.TextUtils;
-import android.util.Log;
 
-import com.hdl.log.utils.PointUtil;
-import com.hdl.photovoltaic.other.HdlAccountLogic;
-import com.hdl.sdk.link.common.exception.HDLLinkException;
 import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
 import com.hdl.sdk.link.core.callback.ModbusCallBack;
 import com.hdl.sdk.link.core.connect.HDLModBusConnect;
 import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
 
-import java.lang.reflect.Type;
-import java.util.Arrays;
+import java.nio.ByteBuffer;
+
 
 /**
  * 瀹㈡埛绔搷浣滈�昏緫
@@ -48,8 +43,7 @@
      * @param jObject   璐熻浇鏁版嵁<娌℃湁濉玭ull></>
      * @param sendPath  鍙戦�佽矾寰�<绫诲悕+鏂规硶鍚�>class->methodName</>
      */
-    public void sendDataToLinkGateway(String mac, boolean isEncrypt,
-                                      String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
+    public void sendDataToLinkGateway(String mac, boolean isEncrypt, String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
         HDLLinkLocalGateway.getInstance().sendDataToLinkGateway(mac, isEncrypt, topic, jObject, sendPath, callBack);
 
     }
@@ -62,8 +56,7 @@
      * @param jObject  璐熻浇鏁版嵁<娌℃湁濉玭ull></>
      * @param sendPath 鍙戦�佽矾寰�<绫诲悕+鏂规硶鍚�>class->methodName</>
      */
-    public void sendDataToLinkGateway(String mac,
-                                      String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
+    public void sendDataToLinkGateway(String mac, String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
         HDLLinkLocalGateway.getInstance().sendDataToLinkGateway(mac, topic, jObject, sendPath, callBack);
 
     }
@@ -73,28 +66,28 @@
      * 涓嬪彂涓婚搴曞眰榛樿
      *
      * @param mac             缃戝叧mac
-     * @param oidAddresses    oid閲岄潰Addresses鍦板潃
-     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
-     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
-     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛夈�愭敞鎰忥細鍔熻兘鐮�=3鏃�,濉暟鍊硷紱瀹為檯璇诲灏慴yte灏卞~澶氬皯锛屼緥濡傚~"20"銆�
+     * @param oidAddresses    oid鐗╃悊淇℃伅閲岄潰Addresses鍦板潃
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒),6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�(鏍规嵁鏂囨。涓婂~鍗佽繘鍒跺��)
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛夈�愭敞鎰忥細鍔熻兘鐮�=3鏃�,鏍规嵁鏂囨。涓婂~鏁版嵁瀛楄妭鏁帮紝渚嬪璇诲彇璁惧澶囨敞锛屽~20Byte銆�
      */
-    public void SendModBusDataToLinkGateway(String mac, String oidAddresses, int functionCode, int registerAddress, String contentData, ModbusCallBack modbusCallBack) {
-        String s = "";
+    public void sendModBusDataToLinkGateway(String mac, String oidAddresses, FunctionCode functionCode, int registerAddress, String contentData, ModbusCallBack modbusCallBack) {
+        String data = "";
         switch (functionCode) {
-            case 3: {
-                s = getReadModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            case ReadMultipleRegisters: {
+                data = readModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
             }
             break;
-            case 6: {
-                s = getWriteSingleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            case WriteSingleRegister: {
+                data = writeSingleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
             }
             break;
-            case 16: {
-                s = getWriteMultipleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            case WriteMultipleRegisters: {
+                data = writeMultipleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
             }
             break;
         }
-        HDLModBusConnect.getInstance().Send(mac, s.getBytes(), modbusCallBack);
+        HDLModBusConnect.getInstance().Send(mac, getDataByteArray(data), modbusCallBack);
     }
 
     /**
@@ -103,27 +96,27 @@
      * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
      * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
      * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
-     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(鏁版嵁瀛楄妭鏁�->N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
      * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
-     * 渚嬪瓙:new byte[]{00,01,00,00,00,0x09,00,00,00,01,03,00,00,00,01};
+     * 渚嬪瓙:new byte[]{1,54,0,0,0,9,0,0,200,26,3,1,54,0,1};
      *
-     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param oidAddresses    oid鐗╃悊淇℃伅閲岄潰Addresses鍦板潃
      * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
-     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�(鏍规嵁鏂囨。涓婂崄杩涘埗鍊煎~)
      * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
      */
-    public String getReadModbusPassData(String oidAddresses, int functionCode, int registerAddress, String contentData) {
+    private String readModbusPassData(String oidAddresses, int registerAddress, FunctionCode functionCode, String contentData) {
         String data = "";
         try {
             String eventID = to2ByteHexString(registerAddress);//浜嬩欢ID(2byte)
             String agreement = "0000";//鍗忚锛�2byte锛�
             String dataByteLength = "";//闀垮害锛圢 byte锛�
             String oidAddresses_1 = oidAddresses;//鏍囪瘑绗︼紙4byte锛�
-            String functionCode_1 = to1ByteHexString(functionCode);//鍔熻兘鐮侊紙=1byte锛�
+            String functionCode_1 = to1ByteHexString(functionCode.value());//鍔熻兘鐮侊紙1byte锛�
             String registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
-            String registerLength_1 = to2ByteHexString(Integer.getInteger(contentData) / 2);//瀵勫瓨鍣ㄩ暱搴︼紙2byte锛�
+            String registerLength_1 = to2ByteHexString(Integer.parseInt(contentData) / 2);//瀵勫瓨鍣ㄩ暱搴︼紙2byte锛�
             byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1).getBytes();
-            dataByteLength = to1ByteHexString(bytes.length / 2);
+            dataByteLength = to2ByteHexString(bytes.length / 2);
             data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1;
             return data;
         } catch (Exception ignored) {
@@ -138,27 +131,27 @@
      * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
      * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
      * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
-     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(鏁版嵁瀛楄妭鏁�->N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
      * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
-     * 渚嬪瓙:new byte[]{[0, 11, 0, 0, 0, 30, 0, 0, 0, 26, 6, 0, 11, 49, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32]};
+     * 渚嬪瓙:new byte[]{199, 112, 0, 0, 0, 9, 0, 0, 0, 26, 6, 199, 112, 0, 110};
      *
-     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param oidAddresses    oid鐗╃悊淇℃伅閲岄潰Addresses鍦板潃
      * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
-     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�(鏍规嵁鏂囨。涓婂崄杩涘埗鍊煎~)
      * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
      */
-    public String getWriteSingleModbusPassData(String oidAddresses, int functionCode, int registerAddress, String contentData) {
+    private String writeSingleModbusPassData(String oidAddresses, int registerAddress, FunctionCode functionCode, String contentData) {
         String data = "";
         try {
             String eventID = to2ByteHexString(registerAddress);//浜嬩欢ID(2byte)
             String agreement = "0000";//鍗忚锛�2byte锛�
             String dataByteLength = "";//闀垮害锛圢 byte锛�
             String oidAddresses_1 = oidAddresses;//鏍囪瘑绗︼紙4byte锛�
-            String functionCode_1 = to1ByteHexString(functionCode);//鍔熻兘鐮侊紙=1byte锛�
+            String functionCode_1 = to1ByteHexString(functionCode.value());//鍔熻兘鐮侊紙1byte锛�
             String registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
             String contentData_1 = contentData;//鍐呭鏁版嵁锛圢 byte锛�
             byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + contentData_1).getBytes();
-            dataByteLength = to1ByteHexString(bytes.length / 2);
+            dataByteLength = to2ByteHexString(bytes.length / 2);
             data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + contentData_1;
             return data;
         } catch (Exception ignored) {
@@ -172,16 +165,16 @@
      * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
      * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
      * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
-     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(鏁版嵁瀛楄妭鏁�->N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
      * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
      * 渚嬪瓙:new byte[]{[0, 11, 0, 0, 0, 30, 0, 0, 0, 26, 16, 0, 11, 0, 10, 20, 49, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32]};
      *
      * @param oidAddresses    oid閲岄潰Addresses鐨勫��
      * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
-     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�(鏍规嵁鏂囨。涓婂崄杩涘埗鍊煎~)
      * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
      */
-    public String getWriteMultipleModbusPassData(String oidAddresses, int functionCode, int registerAddress, String contentData) {
+    private String writeMultipleModbusPassData(String oidAddresses, int registerAddress, FunctionCode functionCode, String contentData) {
 
         String data = "";
         try {
@@ -189,13 +182,13 @@
             String agreement = "0000";//鍗忚锛�2byte锛�
             String dataByteLength = "";//闀垮害锛圢 byte锛�
             String oidAddresses_1 = oidAddresses;//鏍囪瘑绗︼紙4byte锛�
-            String functionCode_1 = to1ByteHexString(functionCode);//鍔熻兘鐮侊紙=1byte锛�
+            String functionCode_1 = to1ByteHexString(functionCode.value());//鍔熻兘鐮侊紙1byte锛�
             String registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
             String registerLength_1 = to2ByteHexString(contentData.length() / 2);//瀵勫瓨鍣ㄩ暱搴︼紙2byte锛�
             String contentLength_1 = to1ByteHexString(contentData.length());//鍐呭闀垮害锛�1byte锛�
             String contentData_1 = contentData;//鍐呭鏁版嵁锛圢 byte锛�
             byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1 + contentLength_1 + contentData_1).getBytes();
-            dataByteLength = to1ByteHexString(bytes.length / 2);
+            dataByteLength = to2ByteHexString(bytes.length / 2);
             data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1 + contentLength_1 + contentData_1;
             return data;
         } catch (Exception ignored) {
@@ -203,6 +196,36 @@
         }
     }
 
+    /**
+     * 閫愪釜瑙f瀽涓や釜瀛楃锛屽皢鍏惰浆鎹负瀛楄妭
+     *
+     * @param hexString 16杩涘埗鐨勫瓧绗︿覆
+     * @return 杩斿洖鏁扮粍
+     */
+    private byte[] getDataByteArray(String hexString) {
+        try {
+            if (TextUtils.isEmpty(hexString)) {
+                return new byte[]{};
+            }
+            //鍘婚櫎瀛楃涓插墠鍚庣殑绌烘牸
+            hexString = hexString.trim();
+            // 纭繚瀛楃涓茬殑闀垮害鏄伓鏁�
+            if (hexString.length() % 2 != 0) {
+                //鏃犳晥鐨勫崄鍏繘鍒跺瓧绗︿覆
+                return new byte[]{};
+            }
+            // 璁$畻瀛楄妭鏁扮粍鐨勯暱搴�
+            int byteArrayLength = hexString.length() / 2;
+            byte[] byteArray = new byte[byteArrayLength];
+            //閫愪釜瑙f瀽涓や釜瀛楃锛屽皢鍏惰浆鎹负瀛楄妭
+            for (int i = 0; i < byteArrayLength; i++) {
+                byteArray[i] = (byte) Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16);
+            }
+            return byteArray;
+        } catch (Exception ignored) {
+            return new byte[]{};
+        }
+    }
 
     /**
      * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
@@ -210,7 +233,7 @@
      * @param value 瀵勫瓨鍣ㄥ湴鍧�(鍗佽繘鍒�)
      * @return (2byte)鍗佸叚杩涘埗瀛楃涓�
      */
-    public String to2ByteHexString(int value) {
+    private String to2ByteHexString(int value) {
         String high = "";
         String low = "";
         if (value > 255) {
@@ -230,7 +253,7 @@
      * @param value 鍗佽繘鍒�
      * @return (1byte)鍗佸叚杩涘埗瀛楃涓�
      */
-    public String to1ByteHexString(int value) {
+    private String to1ByteHexString(int value) {
         try {
             String hexString = Integer.toHexString(value);
             if (hexString.length() == 1) {
@@ -249,7 +272,7 @@
      * @param dataBytes 鏁扮粍
      * @return -(n byte)鍗佸叚杩涘埗瀛楃涓�
      */
-    public String toNByteHexString(byte[] dataBytes) {
+    private String toNByteHexString(byte[] dataBytes) {
         StringBuilder stringBuilder = new StringBuilder();
         for (byte dataByte : dataBytes) {
             String dataB = Integer.toHexString(dataByte & 0xFF);
@@ -281,5 +304,46 @@
         return high + low;
     }
 
+    /**
+     * bytes鏁扮粍杞琁nt鍊�
+     *
+     * @param bytes 鏁版嵁
+     */
+    public int toByteArrayInt(byte[] bytes) {
+        int ans = 0;
+        for (byte b : bytes) {
+            ans <<= 8;
+            ans |= (b & 0xff);
+        }
+        return ans;
+    }
 
+
+    /**
+     * 鍔熻兘鐮�
+     */
+    public enum FunctionCode {
+
+        /**
+         * 璇诲彇鍗曚釜鎴栬�呭涓瘎瀛樺櫒
+         */
+        ReadMultipleRegisters(3),
+        /**
+         * 鍐欏叆鍗曚釜瀵勫瓨鍣�
+         */
+        WriteSingleRegister(6),
+        /**
+         * 鍐欏叆澶氫釜瀵勫瓨鍣�
+         */
+        WriteMultipleRegisters(16);
+        private int mValue;
+
+        FunctionCode(int value) {
+            this.mValue = value;
+        }
+
+        public int value() {
+            return this.mValue;
+        }
+    }
 }

--
Gitblit v1.8.0