From 2a6c0d9a93923f852a90f9f53f5e75985ad5bf73 Mon Sep 17 00:00:00 2001
From: mac <user@users-MacBook-Pro.local>
Date: 星期四, 14 十二月 2023 09:52:10 +0800
Subject: [PATCH] 2023年12月14日09:51:57

---
 app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java |  281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 281 insertions(+), 0 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 9afc648..3abca1c 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
@@ -1,4 +1,285 @@
 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;
+
+/**
+ * 瀹㈡埛绔搷浣滈�昏緫
+ */
 public class TcpClient {
+
+    private static volatile TcpClient sTcpClient;
+
+    /**
+     * 鑾峰彇褰撳墠瀵硅薄
+     *
+     * @return HdlAccountLogic
+     */
+    public static synchronized TcpClient getInstance() {
+        if (sTcpClient == null) {
+            synchronized (TcpClient.class) {
+                if (sTcpClient == null) {
+                    sTcpClient = new TcpClient();
+                }
+            }
+
+        }
+        return sTcpClient;
+    }
+
+    /**
+     * 鍙戦�佹暟鎹埌Link缃戝叧
+     *
+     * @param mac       缃戝叧mac
+     * @param isEncrypt 鏄惁鍔犲瘑
+     * @param topic     璇锋眰涓婚
+     * @param jObject   璐熻浇鏁版嵁<娌℃湁濉玭ull></>
+     * @param sendPath  鍙戦�佽矾寰�<绫诲悕+鏂规硶鍚�>class->methodName</>
+     */
+    public void sendDataToLinkGateway(String mac, boolean isEncrypt,
+                                      String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
+        HDLLinkLocalGateway.getInstance().sendDataToLinkGateway(mac, isEncrypt, topic, jObject, sendPath, callBack);
+
+    }
+
+    /**
+     * 鍙戦�佹暟鎹埌Link缃戝叧
+     *
+     * @param mac      缃戝叧mac
+     * @param topic    璇锋眰涓婚
+     * @param jObject  璐熻浇鏁版嵁<娌℃湁濉玭ull></>
+     * @param sendPath 鍙戦�佽矾寰�<绫诲悕+鏂规硶鍚�>class->methodName</>
+     */
+    public void sendDataToLinkGateway(String mac,
+                                      String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
+        HDLLinkLocalGateway.getInstance().sendDataToLinkGateway(mac, topic, jObject, sendPath, callBack);
+
+    }
+
+    /**
+     * 鍙戦�丮odBus鏁版嵁鍒扮綉鍏�
+     * 涓嬪彂涓婚搴曞眰榛樿
+     *
+     * @param mac             缃戝叧mac
+     * @param oidAddresses    oid閲岄潰Addresses鍦板潃
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛夈�愭敞鎰忥細鍔熻兘鐮�=3鏃�,濉暟鍊硷紱瀹為檯璇诲灏慴yte灏卞~澶氬皯锛屼緥濡傚~"20"銆�
+     */
+    public void SendModBusDataToLinkGateway(String mac, String oidAddresses, int functionCode, int registerAddress, String contentData, ModbusCallBack modbusCallBack) {
+        String s = "";
+        switch (functionCode) {
+            case 3: {
+                s = getReadModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            }
+            break;
+            case 6: {
+                s = getWriteSingleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            }
+            break;
+            case 16: {
+                s = getWriteMultipleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            }
+            break;
+        }
+        HDLModBusConnect.getInstance().Send(mac, s.getBytes(), modbusCallBack);
+    }
+
+    /**
+     * 鑾峰彇璇诲彇銆恗odbus鍗忚銆戞嫾鎺ラ�忎紶鏁版嵁鐨勫瓧绗︿覆
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/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);
+     * 渚嬪瓙:new byte[]{00,01,00,00,00,0x09,00,00,00,01,03,00,00,00,01};
+     *
+     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
+     */
+    public String getReadModbusPassData(String oidAddresses, int functionCode, int registerAddress, 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 registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
+            String registerLength_1 = to2ByteHexString(Integer.getInteger(contentData) / 2);//瀵勫瓨鍣ㄩ暱搴︼紙2byte锛�
+            byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1).getBytes();
+            dataByteLength = to1ByteHexString(bytes.length / 2);
+            data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1;
+            return data;
+        } catch (Exception ignored) {
+            return data;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍐欏叆鍗曚釜銆恗odbus鍗忚銆戞嫾鎺ラ�忎紶鏁版嵁鐨勫瓧绗︿覆
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/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);
+     * 渚嬪瓙: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]};
+     *
+     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
+     */
+    public String getWriteSingleModbusPassData(String oidAddresses, int functionCode, int registerAddress, 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 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);
+            data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + contentData_1;
+            return data;
+        } catch (Exception ignored) {
+            return data;
+        }
+    }
+
+    /**
+     * 鑾峰彇鍐欏叆澶氫釜銆恗odbus鍗忚銆戞嫾鎺ラ�忎紶鏁版嵁鐨勫瓧绗︿覆
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/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);
+     * 渚嬪瓙: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 contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
+     */
+    public String getWriteMultipleModbusPassData(String oidAddresses, int functionCode, int registerAddress, 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 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);
+            data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1 + contentLength_1 + contentData_1;
+            return data;
+        } catch (Exception ignored) {
+            return data;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param value 瀵勫瓨鍣ㄥ湴鍧�(鍗佽繘鍒�)
+     * @return (2byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    public String to2ByteHexString(int value) {
+        String high = "";
+        String low = "";
+        if (value > 255) {
+            high = to1ByteHexString(value / 256);
+
+            low = to1ByteHexString(value % 256);
+        } else {
+            high = "00";
+            low = to1ByteHexString(value);
+        }
+        return high + low;
+    }
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param value 鍗佽繘鍒�
+     * @return (1byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    public String to1ByteHexString(int value) {
+        try {
+            String hexString = Integer.toHexString(value);
+            if (hexString.length() == 1) {
+                return "0" + hexString;
+            }
+            return hexString;
+        } catch (Exception e) {
+            return "00";
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param dataBytes 鏁扮粍
+     * @return -(n byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    public String toNByteHexString(byte[] dataBytes) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (byte dataByte : dataBytes) {
+            String dataB = Integer.toHexString(dataByte & 0xFF);
+            if (dataB.length() == 1) {
+                dataB = "0" + dataB;
+            }
+            stringBuilder.append(dataB);
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param value 瀵勫瓨鍣ㄥ湴鍧�(鍗佽繘鍒�)
+     * @return (2byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    private String getByteHexString(int value) {
+        String high = "";
+        String low = "";
+        if (value > 255) {
+            high = to1ByteHexString(value / 256);
+
+            low = to1ByteHexString(value % 256);
+        } else {
+            high = "00";
+            low = to1ByteHexString(value);
+        }
+        return high + low;
+    }
+
+
 }

--
Gitblit v1.8.0