diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java b/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java index bfa054737..db8d87647 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/BytesUtil.java @@ -2,6 +2,7 @@ package com.jsowell.common.util; import com.google.common.primitives.Bytes; import com.jsowell.common.constant.Constants; +import lombok.extern.slf4j.Slf4j; import javax.xml.bind.DatatypeConverter; import java.io.UnsupportedEncodingException; @@ -11,6 +12,7 @@ import java.time.LocalDateTime; import java.util.Date; import java.util.Stack; +@Slf4j public class BytesUtil { static final long fx = 0xffl; @@ -234,6 +236,35 @@ public class BytesUtil { return new String(temp); } + /** + * 将byte数组转换为物理ID + * @param bytes 输入的byte数组 + * @return 物理ID对象,包含设备识别码和二维码下方的编号 + */ + public static int convertToPhysicalId(byte[] bytes) { + // 检查输入是否合法 + if (bytes == null || bytes.length != 4) { + throw new IllegalArgumentException("Input byte array must be of length 4."); + } + + // 小端模式转大端模式 + byte[] bigEndianBytes = new byte[4]; + bigEndianBytes[0] = bytes[3]; + bigEndianBytes[1] = bytes[2]; + bigEndianBytes[2] = bytes[1]; + bigEndianBytes[3] = bytes[0]; + + // 提取设备识别码 + byte deviceId = bigEndianBytes[0]; + + // 剩余的三个字节转换为十进制 + int deviceNumber = ((bigEndianBytes[1] & 0xFF) << 16) | + ((bigEndianBytes[2] & 0xFF) << 8) | + (bigEndianBytes[3] & 0xFF); + log.info("设备识别码:{}, 桩编号:{}", deviceId, deviceNumber); + return deviceNumber; + } + /** * @函数功能: BCD码转为10进制串(阿拉伯数据) 小端模式 * @输入参数: BCD码 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/AbsEBikeMessage.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/AbsEBikeMessage.java index ef12e063b..547290c4c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/AbsEBikeMessage.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/AbsEBikeMessage.java @@ -73,7 +73,7 @@ public abstract class AbsEBikeMessage { // 读取物理ID byte[] physicalIdBytes = Arrays.copyOfRange(messageBytes, 5, 9); - int physicalId = BytesUtil.bytesToIntLittle(physicalIdBytes); + int physicalId = BytesUtil.convertToPhysicalId(physicalIdBytes); // 读取消息ID byte[] messageIdBytes = Arrays.copyOfRange(messageBytes, 9, 11); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd21.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd21.java index 029ba14e7..07f763c9f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd21.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd21.java @@ -84,8 +84,13 @@ public class EBikeMessageCmd21 extends AbsEBikeMessage { statusList.add(PortStatusEnum.getDescriptionByValue(status)); } this.portStatus = statusList; - this.rssi = BytesUtil.bcd2StrLittle(Arrays.copyOfRange(dataBytes, dataBytes.length - 2, dataBytes.length - 1)); - this.temperature = BytesUtil.bcd2StrLittle(Arrays.copyOfRange(dataBytes, dataBytes.length - 1, dataBytes.length)); + this.rssi = BytesUtil.bytesToIntLittle(Arrays.copyOfRange(dataBytes, dataBytes.length - 2, dataBytes.length - 1)) + ""; + // + int i = BytesUtil.bytesToIntLittle(Arrays.copyOfRange(dataBytes, dataBytes.length - 1, dataBytes.length)); + if (i > 65) { + i = i - 65; + } + this.temperature = i + ""; } }