From 54a8c79222bba0644b02fe1dbc5d75e26ea50b5d Mon Sep 17 00:00:00 2001 From: mac <user@users-MacBook-Pro.local> Date: 星期二, 14 十一月 2023 18:17:58 +0800 Subject: [PATCH] 2023年11月14日18:17:48 --- app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 225 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 1057676..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,9 +1,19 @@ 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; /** * 瀹㈡埛绔搷浣滈�昏緫 @@ -57,4 +67,219 @@ 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