Browse Source

1、修复计算主机参数位数;

dev
mh 6 months ago
parent
commit
c82fb236af
  1. 9
      user-service/src/main/java/com/mh/user/strategy/ModbusProtocolStrategy.java
  2. 302
      user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java
  3. 38
      user-service/src/test/java/com/mh/user/device/CRC16Test.java

9
user-service/src/main/java/com/mh/user/strategy/ModbusProtocolStrategy.java

@ -62,7 +62,7 @@ public class ModbusProtocolStrategy implements ProtocolStrategy {
// 地址(1) + 功能码(1) + 寄存器地址(2) + 数据域(2) + crc校验 // 地址(1) + 功能码(1) + 寄存器地址(2) + 数据域(2) + crc校验
str = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(meterManageEntity.getMtCode()), 2) // 设备地址 str = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(meterManageEntity.getMtCode()), 2) // 设备地址
+ ExchangeStringUtil.addZeroForNum(meterManageEntity.getFuncCode(), 2) // 功能码 + ExchangeStringUtil.addZeroForNum(meterManageEntity.getFuncCode(), 2) // 功能码
+ ExchangeStringUtil.addZeroForNum(meterManageEntity.getRegisterAddr(), 4) // 寄存器地址 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(meterManageEntity.getRegisterAddr()), 4) // 寄存器地址
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(meterManageEntity.getRegisterSize())), 4); // 读取寄存器个数 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(meterManageEntity.getRegisterSize())), 4); // 读取寄存器个数
// 循环冗余校验 // 循环冗余校验
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
@ -111,9 +111,12 @@ public class ModbusProtocolStrategy implements ProtocolStrategy {
sValue = ExchangeStringUtil.hexToDec(data); sValue = ExchangeStringUtil.hexToDec(data);
if (deviceCodeParamEntity.getDigit() == 0) { if (deviceCodeParamEntity.getDigit() == 0) {
sValue = String.valueOf(Long.parseLong(sValue)); sValue = String.valueOf(Long.parseLong(sValue));
} else { } else if (deviceCodeParamEntity.getDigit() < 0) {
sValue = String.valueOf(Long.parseLong(sValue)) + ExchangeStringUtil.addZeroForNum("0", -deviceCodeParamEntity.getDigit());
}
else {
// 保留位数 // 保留位数
sValue = (new BigDecimal(sValue)).divide(new BigDecimal(String.valueOf(deviceCodeParamEntity.getDigit() * 10)), 2, RoundingMode.HALF_UP).toString(); sValue = (new BigDecimal(sValue)).divide(new BigDecimal(ExchangeStringUtil.rightAddZeroForNum("1", deviceCodeParamEntity.getDigit()+1)), 2, RoundingMode.HALF_UP).toString();
} }
break; break;
case 2: case 2:

302
user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java

@ -30,7 +30,7 @@ import java.util.regex.Pattern;
*/ */
public class ExchangeStringUtil { public class ExchangeStringUtil {
public static void main(String args[]){ public static void main(String args[]) {
// int ieee754Int = Integer.parseInt(str, 16); // int ieee754Int = Integer.parseInt(str, 16);
// float realValue = Float.intBitsToFloat(ieee754Int); // float realValue = Float.intBitsToFloat(ieee754Int);
@ -63,6 +63,7 @@ public class ExchangeStringUtil {
/** /**
* 获取到对应的buffer * 获取到对应的buffer
*
* @param ctx * @param ctx
* @param sendStr * @param sendStr
* @return * @return
@ -80,23 +81,25 @@ public class ExchangeStringUtil {
/** /**
* double转换为String 当为整数时只显示整数当小数时直接显示小数 * double转换为String 当为整数时只显示整数当小数时直接显示小数
*
* @param num * @param num
* @return * @return
*/ */
public static String doubleTrans1(double num){ public static String doubleTrans1(double num) {
if(num % 1.0 == 0){ if (num % 1.0 == 0) {
return String.valueOf((long)num); return String.valueOf((long) num);
} }
return String.valueOf(num); return String.valueOf(num);
} }
/** /**
* 获取String中的数值 * 获取String中的数值
*
* @param result * @param result
* @return * @return
*/ */
public static String getNumFromString(String result) { public static String getNumFromString(String result) {
String regEx="[^0-9]"; String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx); Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(result); Matcher m = p.matcher(result);
return m.replaceAll("").trim(); return m.replaceAll("").trim();
@ -104,6 +107,7 @@ public class ExchangeStringUtil {
/** /**
* 获取检验位值update by ljf on 2020-06-02 * 获取检验位值update by ljf on 2020-06-02
*
* @param result * @param result
* @return * @return
*/ */
@ -112,8 +116,8 @@ public class ExchangeStringUtil {
byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result);
int checkNum = CRC16.CRC16_MODBUS(strOrder); int checkNum = CRC16.CRC16_MODBUS(strOrder);
String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum));
checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4);
checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2);
result = result + checkWord; result = result + checkWord;
return result; return result;
} }
@ -123,8 +127,8 @@ public class ExchangeStringUtil {
byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(result);
int checkNum = CRC16.CRC16_MODBUS(strOrder); int checkNum = CRC16.CRC16_MODBUS(strOrder);
String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum));
checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4);
checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2);
return checkWord; return checkWord;
} }
@ -141,6 +145,7 @@ public class ExchangeStringUtil {
/** /**
* 字符串不足补0 * 字符串不足补0
*
* @param str * @param str
* @param strLength * @param strLength
* @return * @return
@ -159,8 +164,30 @@ public class ExchangeStringUtil {
return str; return str;
} }
/**
* 字符串不足右边补0
*
* @param str
* @param strLength
* @return
*/
public static String rightAddZeroForNum(String str, int strLength) {
int strLen = str.length();
if (strLen < strLength) {
while (strLen < strLength) {
StringBuffer sb = new StringBuffer();
// sb.append("0").append(str);// 左补0
sb.append(str).append("0");//右补0
str = sb.toString();
strLen = str.length();
}
}
return str;
}
/** /**
* ip地址转换成16进制long * ip地址转换成16进制long
*
* @param ipString * @param ipString
* @return * @return
*/ */
@ -175,19 +202,20 @@ public class ExchangeStringUtil {
/** /**
* ip地址转换成16进制long * ip地址转换成16进制long
*
* @param ipString * @param ipString
* @return * @return
*/ */
public static Long ipToLong(String ipString) { public static Long ipToLong(String ipString) {
Long[] ip = new Long[4]; Long[] ip = new Long[4];
int pos1= ipString.indexOf("."); int pos1 = ipString.indexOf(".");
int pos2= ipString.indexOf(".",pos1+1); int pos2 = ipString.indexOf(".", pos1 + 1);
int pos3= ipString.indexOf(".",pos2+1); int pos3 = ipString.indexOf(".", pos2 + 1);
ip[0] = Long.parseLong(ipString.substring(0 , pos1)); ip[0] = Long.parseLong(ipString.substring(0, pos1));
ip[1] = Long.parseLong(ipString.substring(pos1+1 , pos2)); ip[1] = Long.parseLong(ipString.substring(pos1 + 1, pos2));
ip[2] = Long.parseLong(ipString.substring(pos2+1 , pos3)); ip[2] = Long.parseLong(ipString.substring(pos2 + 1, pos3));
ip[3] = Long.parseLong(ipString.substring(pos3+1)); ip[3] = Long.parseLong(ipString.substring(pos3 + 1));
return (ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3]; return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
} }
public static String splitData(String str, String strStart, String strEnd) { public static String splitData(String str, String strStart, String strEnd) {
@ -198,8 +226,8 @@ public class ExchangeStringUtil {
public static String endData(String str, String strStart) { public static String endData(String str, String strStart) {
String tempStr; String tempStr;
String str1=str.substring(0, str.indexOf(strStart)); String str1 = str.substring(0, str.indexOf(strStart));
tempStr=str.substring(str1.length()+1); tempStr = str.substring(str1.length() + 1);
return tempStr; return tempStr;
} }
@ -213,11 +241,11 @@ public class ExchangeStringUtil {
} }
// 加33 // 加33
public static String addThree(String data){ public static String addThree(String data) {
String result = ""; String result = "";
for (int i = 0; i < data.length() / 2; i++) { for (int i = 0; i < data.length() / 2; i++) {
BigInteger a = new BigInteger(data.substring(2*i,2*(i+1)),16); BigInteger a = new BigInteger(data.substring(2 * i, 2 * (i + 1)), 16);
BigInteger b = new BigInteger("33",16); BigInteger b = new BigInteger("33", 16);
BigInteger c = a.add(b); BigInteger c = a.add(b);
result = result + ExchangeStringUtil.decToHex(c.toString(10)); result = result + ExchangeStringUtil.decToHex(c.toString(10));
} }
@ -226,11 +254,11 @@ public class ExchangeStringUtil {
} }
// 减33 // 减33
public static String cutThree(String data){ public static String cutThree(String data) {
String result = ""; String result = "";
for (int i = 0; i < data.length() / 2; i++) { for (int i = 0; i < data.length() / 2; i++) {
BigInteger a = new BigInteger(data.substring(2*i,2*(i+1)),16); BigInteger a = new BigInteger(data.substring(2 * i, 2 * (i + 1)), 16);
BigInteger b = new BigInteger("33",16); BigInteger b = new BigInteger("33", 16);
BigInteger c = a.subtract(b); BigInteger c = a.subtract(b);
result = result + ExchangeStringUtil.decToHex(c.toString(10)); result = result + ExchangeStringUtil.decToHex(c.toString(10));
} }
@ -270,16 +298,17 @@ public class ExchangeStringUtil {
* @return * @return
*/ */
public static String decToHex(String dec) { public static String decToHex(String dec) {
BigInteger data = new BigInteger(dec,10); BigInteger data = new BigInteger(dec, 10);
String result = data.toString(16); String result = data.toString(16);
if (result.length() < 2) { if (result.length() < 2) {
result = "0" + result; result = "0" + result;
} }
if ((result.length() % 2)!=0) { if ((result.length() % 2) != 0) {
result = "0" + result; result = "0" + result;
} }
return result.toUpperCase(); return result.toUpperCase();
} }
/** /**
* 十六进制数据转换为十进制字符串数 * 十六进制数据转换为十进制字符串数
* *
@ -287,32 +316,32 @@ public class ExchangeStringUtil {
* @return * @return
*/ */
public static String hexToDec(String hex) { public static String hexToDec(String hex) {
BigInteger data = new BigInteger(hex,16); BigInteger data = new BigInteger(hex, 16);
return data.toString(10); return data.toString(10);
} }
public static String IntToHex(int n){ public static String IntToHex(int n) {
char[] ch = new char[20]; char[] ch = new char[20];
int nIndex = 0; int nIndex = 0;
while ( true ){ while (true) {
int m = n/16; int m = n / 16;
int k = n%16; int k = n % 16;
if ( k == 15 ) if (k == 15)
ch[nIndex] = 'F'; ch[nIndex] = 'F';
else if ( k == 14 ) else if (k == 14)
ch[nIndex] = 'E'; ch[nIndex] = 'E';
else if ( k == 13 ) else if (k == 13)
ch[nIndex] = 'D'; ch[nIndex] = 'D';
else if ( k == 12 ) else if (k == 12)
ch[nIndex] = 'C'; ch[nIndex] = 'C';
else if ( k == 11 ) else if (k == 11)
ch[nIndex] = 'B'; ch[nIndex] = 'B';
else if ( k == 10 ) else if (k == 10)
ch[nIndex] = 'A'; ch[nIndex] = 'A';
else else
ch[nIndex] = (char)('0' + k); ch[nIndex] = (char) ('0' + k);
nIndex++; nIndex++;
if ( m == 0 ) if (m == 0)
break; break;
n = m; n = m;
} }
@ -338,7 +367,7 @@ public class ExchangeStringUtil {
return sbf.toString().trim(); return sbf.toString().trim();
} }
public static String bytesToHexString(byte[] src){ public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder(""); StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) { if (src == null || src.length <= 0) {
return null; return null;
@ -356,6 +385,7 @@ public class ExchangeStringUtil {
/** /**
* 字符串转化成为16进制字符串 * 字符串转化成为16进制字符串
*
* @param s * @param s
* @return * @return
*/ */
@ -371,6 +401,7 @@ public class ExchangeStringUtil {
/** /**
* 字符串转换成为16进制(无需Unicode编码) * 字符串转换成为16进制(无需Unicode编码)
*
* @param str * @param str
* @return * @return
*/ */
@ -391,6 +422,7 @@ public class ExchangeStringUtil {
/** /**
* 16进制转换成为string类型字符串 * 16进制转换成为string类型字符串
*
* @param s * @param s
* @return * @return
*/ */
@ -417,15 +449,15 @@ public class ExchangeStringUtil {
} }
/** /**
* 字节转十六进制 * 字节转十六进制
*
* @param b 需要进行转换的byte字节 * @param b 需要进行转换的byte字节
* @return 转换后的Hex字符串 * @return 转换后的Hex字符串
*/ */
public static String byteToHex(byte b){ public static String byteToHex(byte b) {
String hex = Integer.toHexString(b & 0xFF); String hex = Integer.toHexString(b & 0xFF);
if(hex.length() < 2){ if (hex.length() < 2) {
hex = "0" + hex; hex = "0" + hex;
} }
return hex; return hex;
@ -433,24 +465,25 @@ public class ExchangeStringUtil {
/** /**
* hex字符串转byte数组 * hex字符串转byte数组
*
* @param inHex 待转换的Hex字符串 * @param inHex 待转换的Hex字符串
* @return 转换后的byte数组结果 * @return 转换后的byte数组结果
*/ */
public static byte[] hexToByteArray(String inHex){ public static byte[] hexToByteArray(String inHex) {
int hexlen = inHex.length(); int hexlen = inHex.length();
byte[] result; byte[] result;
if (hexlen % 2 == 1){ if (hexlen % 2 == 1) {
//奇数 //奇数
hexlen++; hexlen++;
result = new byte[(hexlen/2)]; result = new byte[(hexlen / 2)];
inHex="0"+inHex; inHex = "0" + inHex;
}else { } else {
//偶数 //偶数
result = new byte[(hexlen/2)]; result = new byte[(hexlen / 2)];
} }
int j=0; int j = 0;
for (int i = 0; i < hexlen; i+=2){ for (int i = 0; i < hexlen; i += 2) {
result[j]=(byte)Integer.parseInt(inHex.substring(i,i+2),16); result[j] = (byte) Integer.parseInt(inHex.substring(i, i + 2), 16);
j++; j++;
} }
return result; return result;
@ -476,7 +509,7 @@ public class ExchangeStringUtil {
String sub = hexString.substring(index, index + 2); String sub = hexString.substring(index, index + 2);
bytes[index/2] = (byte) Integer.parseInt(sub,16); bytes[index / 2] = (byte) Integer.parseInt(sub, 16);
index += 2; index += 2;
} }
@ -496,7 +529,7 @@ public class ExchangeStringUtil {
/** /**
* 字符串是否为空 * 字符串是否为空
* * <p>
* 如果这个字符串为null或者trim后为空字符串则返回true否则返回false * 如果这个字符串为null或者trim后为空字符串则返回true否则返回false
* *
* @param str * @param str
@ -923,9 +956,9 @@ public class ExchangeStringUtil {
* @return byte * @return byte
*/ */
public static byte uniteBytes(byte src0, byte src1) { public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue(); byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
_b0 = (byte) (_b0 << 4); _b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue(); byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
byte ret = (byte) (_b0 ^ _b1); byte ret = (byte) (_b0 ^ _b1);
return ret; return ret;
} }
@ -973,11 +1006,11 @@ public class ExchangeStringUtil {
} }
//字符转二进制 //字符转二进制
public static String toBinary(String str){ public static String toBinary(String str) {
char[] strChar=str.toCharArray(); char[] strChar = str.toCharArray();
String result=""; String result = "";
for(int i=0;i<strChar.length;i++){ for (int i = 0; i < strChar.length; i++) {
result +=Integer.toBinaryString(strChar[i])+ " "; result += Integer.toBinaryString(strChar[i]) + " ";
} }
System.out.println(result); System.out.println(result);
return result; return result;
@ -1000,29 +1033,29 @@ public class ExchangeStringUtil {
} }
//将十六进制转换为二进制 //将十六进制转换为二进制
public static byte[] parseHexStr2Byte(String str){ public static byte[] parseHexStr2Byte(String str) {
if(str.length() < 1) if (str.length() < 1)
return null; return null;
byte[] result = new byte[str.length()/2]; byte[] result = new byte[str.length() / 2];
for (int i = 0;i< str.length()/2; i++) { for (int i = 0; i < str.length() / 2; i++) {
int high = Integer.parseInt(str.substring(i*2, i*2+1), 16); int high = Integer.parseInt(str.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(str.substring(i*2+1, i*2+2), 16); int low = Integer.parseInt(str.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low); result[i] = (byte) (high * 16 + low);
} }
return result; return result;
} }
//将二进制字符转换为十六进制 //将二进制字符转换为十六进制
public static String parseByte2HexStr(String str){ public static String parseByte2HexStr(String str) {
int i = Integer.parseInt(str,2); //将二进制转为十进制 int i = Integer.parseInt(str, 2); //将二进制转为十进制
String j = Integer.toHexString(i); //将十进制转为十六进制 String j = Integer.toHexString(i); //将十进制转为十六进制
return j; return j;
} }
//将二进字节数组制转换为十六进制 //将二进字节数组制转换为十六进制
public static String parseByte2HexStr(byte binary[]){ public static String parseByte2HexStr(byte binary[]) {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
for(int i = 0; i < binary.length; i++){ for (int i = 0; i < binary.length; i++) {
String hex = Integer.toHexString(binary[i] & 0xFF); String hex = Integer.toHexString(binary[i] & 0xFF);
if (hex.length() == 1) { if (hex.length() == 1) {
hex = '0' + hex; hex = '0' + hex;
@ -1052,30 +1085,30 @@ public class ExchangeStringUtil {
* @author: 若非 * @author: 若非
* @date: 2021/9/10 16:57 * @date: 2021/9/10 16:57
*/ */
public static float hexToSingle(String s ) { public static float hexToSingle(String s) {
BigInteger data = new BigInteger(s,16); BigInteger data = new BigInteger(s, 16);
return Float.intBitsToFloat(data.intValue()); return Float.intBitsToFloat(data.intValue());
} }
//Base64转十六进制字符串 //Base64转十六进制字符串
public static String base64ToHex(String s){ public static String base64ToHex(String s) {
try{ try {
//解码 //解码
byte[] x= Base64.getDecoder().decode(s); byte[] x = Base64.getDecoder().decode(s);
return Hex.encodeHexString(x); return Hex.encodeHexString(x);
}catch (Exception e){ } catch (Exception e) {
return ""; return "";
} }
} }
//十六进制转Base64 //十六进制转Base64
public static String hexToBase64(String s){ public static String hexToBase64(String s) {
try { try {
//编码 //编码
return encode(hexStringToByteArray(s)); return encode(hexStringToByteArray(s));
}catch (Exception e){ } catch (Exception e) {
return ""; return "";
} }
} }
//hex进制转byte[] //hex进制转byte[]
@ -1095,17 +1128,15 @@ public class ExchangeStringUtil {
/** /**
*
* 获取实时天气2<br> * 获取实时天气2<br>
* getTodayWeather <br> * getTodayWeather <br>
* *
* @param Cityid * @param Cityid 城市编码
* 城市编码
*/ */
public static Map<String, Object> getTodayWeather1(String Cityid) public static Map<String, Object> getTodayWeather1(String Cityid)
throws IOException, NullPointerException { throws IOException, NullPointerException {
// 连接中央气象台的API // 连接中央气象台的API
String url1= "https://free-api.heweather.net/s6/weather/now?location="+Cityid+"&key=3c3fa198cacc4152b94b20def11b2455"; String url1 = "https://free-api.heweather.net/s6/weather/now?location=" + Cityid + "&key=3c3fa198cacc4152b94b20def11b2455";
URL url = new URL(url1); URL url = new URL(url1);
URLConnection connectionData = url.openConnection(); URLConnection connectionData = url.openConnection();
@ -1120,29 +1151,29 @@ public class ExchangeStringUtil {
sb.append(line); sb.append(line);
String datas = sb.toString(); String datas = sb.toString();
//截取[]转化为json格式 //截取[]转化为json格式
datas = datas.replace(datas.substring(datas.indexOf(":")+1,datas.indexOf(":")+2),""); datas = datas.replace(datas.substring(datas.indexOf(":") + 1, datas.indexOf(":") + 2), "");
datas = datas.replace(datas.substring(datas.length()-2,datas.length()-1),""); datas = datas.replace(datas.substring(datas.length() - 2, datas.length() - 1), "");
JSONObject jsonData = JSONObject.parseObject(datas); JSONObject jsonData = JSONObject.parseObject(datas);
JSONObject info = jsonData.getJSONObject("HeWeather6"); JSONObject info = jsonData.getJSONObject("HeWeather6");
JSONObject jsonData1 = JSONObject.parseObject(info.getString("basic").toString()); JSONObject jsonData1 = JSONObject.parseObject(info.getString("basic").toString());
JSONObject jsonData2 = JSONObject.parseObject(info.getString("update").toString()); JSONObject jsonData2 = JSONObject.parseObject(info.getString("update").toString());
JSONObject jsonData3 = JSONObject.parseObject(info.getString("now").toString()); JSONObject jsonData3 = JSONObject.parseObject(info.getString("now").toString());
map.put("location",jsonData1.getString("location").toString()); map.put("location", jsonData1.getString("location").toString());
map.put("parent_city",jsonData1.getString("parent_city").toString()); map.put("parent_city", jsonData1.getString("parent_city").toString());
map.put("admin_area",jsonData1.getString("admin_area").toString()); map.put("admin_area", jsonData1.getString("admin_area").toString());
map.put("cnty",jsonData1.getString("cnty").toString()); map.put("cnty", jsonData1.getString("cnty").toString());
String time = jsonData2.getString("loc").toString(); String time = jsonData2.getString("loc").toString();
String week = strToDate(time); String week = strToDate(time);
map.put("week",week); map.put("week", week);
map.put("time",jsonData2.getString("loc").toString()); map.put("time", jsonData2.getString("loc").toString());
map.put("tmp",jsonData3.getString("tmp").toString()); map.put("tmp", jsonData3.getString("tmp").toString());
map.put("wind_dir",jsonData3.getString("wind_dir").toString()); map.put("wind_dir", jsonData3.getString("wind_dir").toString());
map.put("cond_txt",jsonData3.getString("cond_txt").toString()); map.put("cond_txt", jsonData3.getString("cond_txt").toString());
map.put("cond_code",jsonData3.getString("cond_code").toString()); map.put("cond_code", jsonData3.getString("cond_code").toString());
System.out.println(map); System.out.println(map);
} catch (SocketTimeoutException e) { } catch (SocketTimeoutException e) {
System.out.println("连接超时"); System.out.println("连接超时");
@ -1150,7 +1181,7 @@ public class ExchangeStringUtil {
System.out.println("加载文件出错"); System.out.println("加载文件出错");
} catch (ParseException e) { } catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();
}finally { } finally {
//关闭流 //关闭流
// try { // try {
// if(br!=null){ // if(br!=null){
@ -1166,6 +1197,7 @@ public class ExchangeStringUtil {
/** /**
* 时间获得星期 * 时间获得星期
*
* @param strDate * @param strDate
* @return * @return
* @throws ParseException * @throws ParseException
@ -1178,24 +1210,26 @@ public class ExchangeStringUtil {
String week = sdf.format(c.getTime()); String week = sdf.format(c.getTime());
return week; return week;
} }
/** /**
* 字符集转码 * 字符集转码
*
* @param url * @param url
* @return * @return
* @throws UnsupportedEncodingException * @throws UnsupportedEncodingException
*/ */
public static String urlEncode(String url) throws UnsupportedEncodingException { public static String urlEncode(String url) throws UnsupportedEncodingException {
if(url == null) { if (url == null) {
return null; return null;
} }
final String reserved_char = ";/?:@=&"; final String reserved_char = ";/?:@=&";
String ret = ""; String ret = "";
for(int i=0; i < url.length(); i++) { for (int i = 0; i < url.length(); i++) {
String cs = String.valueOf( url.charAt(i) ); String cs = String.valueOf(url.charAt(i));
if(reserved_char.contains(cs)){ if (reserved_char.contains(cs)) {
ret += cs; ret += cs;
}else{ } else {
ret += URLEncoder.encode(cs, "utf-8"); ret += URLEncoder.encode(cs, "utf-8");
} }
} }
@ -1206,12 +1240,9 @@ public class ExchangeStringUtil {
/** /**
* 判断时间是否在时间段内 * 判断时间是否在时间段内
* *
* @param date * @param date 当前时间 yyyy-MM-dd HH:mm:ss
* 当前时间 yyyy-MM-dd HH:mm:ss * @param strDateBegin 开始时间 00:00:00
* @param strDateBegin * @param strDateEnd 结束时间 00:05:00
* 开始时间 00:00:00
* @param strDateEnd
* 结束时间 00:05:00
* @return * @return
*/ */
public static boolean isInDate(Date date, String strDateBegin, public static boolean isInDate(Date date, String strDateBegin,
@ -1260,7 +1291,7 @@ public class ExchangeStringUtil {
// } // }
if (strDateS >= strDateBeginS && strDateS < strDateEndS) { if (strDateS >= strDateBeginS && strDateS < strDateEndS) {
return true; return true;
}else { } else {
return false; return false;
} }
@ -1268,43 +1299,44 @@ public class ExchangeStringUtil {
/** /**
* 当前时间向推几小时 * 当前时间向推几小时
*
* @param ihour 小时 * @param ihour 小时
* @return String * @return String
*/ */
public static String dateRoll(int ihour,String curDate) { public static String dateRoll(int ihour, String curDate) {
try{ try {
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前时间 //获取当前时间
LocalDateTime date = LocalDateTime.now(); LocalDateTime date = LocalDateTime.now();
if (curDate.length()>0){ if (curDate.length() > 0) {
date=dateConvertToLocalDateTime(df2.parse(curDate)); date = dateConvertToLocalDateTime(df2.parse(curDate));
} }
//获取当前时间的前几小时时间 //获取当前时间的前几小时时间
LocalDateTime localDateTime = date.minusHours(ihour); LocalDateTime localDateTime = date.minusHours(ihour);
return df1.format(localDateTime); return df1.format(localDateTime);
}catch (Exception e){ } catch (Exception e) {
return ""; return "";
} }
} }
//获取当前时间前几分钟 //获取当前时间前几分钟
public static String dateTime(int a,String curDate) { public static String dateTime(int a, String curDate) {
try{ try {
// 设置传入的时间格式 // 设置传入的时间格式
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime="";//当前时间 String currentTime = "";//当前时间
Calendar cal=Calendar.getInstance(); Calendar cal = Calendar.getInstance();
if (!curDate.isEmpty()){ if (!curDate.isEmpty()) {
Date date = df.parse(curDate); Date date = df.parse(curDate);
cal.setTime(date); cal.setTime(date);
} }
cal.add(Calendar.MINUTE,-a);// a分钟之前的时间 cal.add(Calendar.MINUTE, -a);// a分钟之前的时间
//格式化指定形式的时间 //格式化指定形式的时间
currentTime = df.format(cal.getTime());//获取到完整的时间 currentTime = df.format(cal.getTime());//获取到完整的时间
return currentTime; return currentTime;
}catch (Exception e){ } catch (Exception e) {
return ""; return "";
} }
} }

38
user-service/src/test/java/com/mh/user/device/CRC16Test.java

@ -3,6 +3,8 @@ package com.mh.user.device;
import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.ExchangeStringUtil;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
/** /**
* @Classname CRC16Test * @Classname CRC16Test
@ -67,11 +69,37 @@ public class CRC16Test {
//测试 //测试
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
// c0a8020a1f90ff04fb0000000100010200000300000400000500000600000700140800000901cb0a00000b00000c00000d00000e00000f0000100000110025120000130910 // c0a8020a1f90ff04fb0000000100010200000300000400000500000600000700140800000901cb0a00000b00000c00000d00000e00000f0000100000110025120000130910
byte[] buffer; // byte[] buffer;
String string = "c0a8020a1f90ff02fd0000000100000200000300000400000500000600000700000800010900000a00780b00010c8c310d00000e00000f0000100000110022120000132d1e140000150000160000170001182c381900001a01a61b00001c00001d00011e00011f25cd20000121b1332200002300002400002500002600712700002834202900002a00002b00002c00002d00402e00002f0363a6ff"; // String string = "c0a8020a1f90ff02fd0000000100000200000300000400000500000600000700000800010900000a00780b00010c8c310d00000e00000f0000100000110022120000132d1e140000150000160000170001182c381900001a01a61b00001c00001d00011e00011f25cd20000121b1332200002300002400002500002600712700002834202900002a00002b00002c00002d00402e00002f0363a6ff";
buffer = ExchangeStringUtil.HexString2Bytes(string); // buffer = ExchangeStringUtil.HexString2Bytes(string);
int crc16 = CRC16Test.calcCrc16(buffer,buffer.length); // int crc16 = CRC16Test.calcCrc16(buffer,buffer.length);
System.out.println(String.format("0x%04x", crc16));//0x7c09 // System.out.println(String.format("0x%04x", crc16));//0x7c09
// String str;
// str = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex("3"), 2) // 设备地址
// + ExchangeStringUtil.addZeroForNum("3", 2) // 功能码
// + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex("0010"), 4) // 寄存器地址
// + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf("1")), 4); // 读取寄存器个数
// // 循环冗余校验
// String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
// str = str + checkWord;
// System.out.println(str);
String receiveData = "04030202CDB4B1";
String dataLength = receiveData.substring(4, 6);
int dataLengthInt = Integer.parseInt(dataLength, 16);
// 截取数据域
String data = receiveData;
data = receiveData.substring(6, 6 + dataLengthInt * 2);
System.out.println(data);
String sValue = ExchangeStringUtil.hexToDec(data);
System.out.println(ExchangeStringUtil.hexToDec(data));
System.out.println(ExchangeStringUtil.rightAddZeroForNum("1", 2+1));
BigDecimal test1 = new BigDecimal(ExchangeStringUtil.rightAddZeroForNum("1", 2+1));
System.out.println(test1);
sValue = (new BigDecimal(sValue)).divide(test1, 2, RoundingMode.HALF_UP).toString();
System.out.println(sValue);
String test = String.valueOf(Math.abs(ExchangeStringUtil.hexToSingle(data)));
System.out.println(test);
} }
} }

Loading…
Cancel
Save