diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/GetServerTimeHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/DeviceGetServerTimeHandler.java similarity index 86% rename from jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/GetServerTimeHandler.java rename to jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/DeviceGetServerTimeHandler.java index f17dc30fa..2bfbbfa42 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/GetServerTimeHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/DeviceGetServerTimeHandler.java @@ -16,8 +16,8 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -public class GetServerTimeHandler extends AbstractEBikeHandler { - private final String type = EBikeCommandEnum.GET_SERVER_TIME.getCode(); +public class DeviceGetServerTimeHandler extends AbstractEBikeHandler { + private final String type = EBikeCommandEnum.DEVICE_GET_SERVER_TIME.getCode(); @Override public void afterPropertiesSet() throws Exception { @@ -35,7 +35,7 @@ public class GetServerTimeHandler extends AbstractEBikeHandler { public byte[] supplyProcess(EBikeDataProtocol dataProtocol, ChannelHandlerContext ctx) { // 解析字节数组 EBikeMessageCmd22 message = (EBikeMessageCmd22) AbsEBikeMessage.parseMessage(dataProtocol.getBytes()); - log.info("设备获取服务器时间:{}", JSON.toJSONString(message)); + log.info("设备 获取服务器时间:{}", JSON.toJSONString(message)); // 保存时间 saveLastTimeAndCheckChannel(message.getPhysicalId() + "", ctx); diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HeartbeatHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HeartbeatHandler.java index 84757fe1b..2f9e8e5fc 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HeartbeatHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HeartbeatHandler.java @@ -40,15 +40,6 @@ public class HeartbeatHandler extends AbstractEBikeHandler { // 保存时间 saveLastTimeAndCheckChannel(message.getPhysicalId() + "", ctx); - try { - byte[] serialize = SerializationUtil.serialize(message); - log.info("心跳包序列化:{}", BytesUtil.binary(serialize, 16)); - EBikeMessageCmd21 deserialize = SerializationUtil.deserialize(EBikeMessageCmd21.class, serialize); - log.info("心跳包反序列化:{}", JSON.toJSONString(deserialize)); - } catch (Exception e) { - log.info("error", e); - } - EBikeMessageCmd21.DeviceHeartbeat deviceHeartbeat = message.getDeviceHeartbeat(); log.info("设备心跳包:{}", JSON.toJSONString(message)); return getResult(dataProtocol, Constants.zeroByteArray); diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HostGetServerTimeHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HostGetServerTimeHandler.java new file mode 100644 index 000000000..53ed54e1b --- /dev/null +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/electricbicycles/HostGetServerTimeHandler.java @@ -0,0 +1,47 @@ +package com.jsowell.netty.handler.electricbicycles; + +import com.alibaba.fastjson2.JSON; +import com.jsowell.common.core.domain.ebike.EBikeDataProtocol; +import com.jsowell.common.util.BytesUtil; +import com.jsowell.netty.factory.EBikeOperateFactory; +import com.jsowell.pile.domain.ebike.AbsEBikeMessage; +import com.jsowell.pile.domain.ebike.EBikeCommandEnum; +import com.jsowell.pile.domain.ebike.deviceupload.EBikeMessageCmd12; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 设备获取服务器时间 + */ +@Slf4j +@Component +public class HostGetServerTimeHandler extends AbstractEBikeHandler { + private final String type = EBikeCommandEnum.HOST_GET_SERVER_TIME.getCode(); + + @Override + public void afterPropertiesSet() throws Exception { + EBikeOperateFactory.register(type, this); + } + + /** + * 执行逻辑 + * 有应答 + * + * @param dataProtocol + * @param ctx + */ + @Override + public byte[] supplyProcess(EBikeDataProtocol dataProtocol, ChannelHandlerContext ctx) { + // 解析字节数组 + EBikeMessageCmd12 message = (EBikeMessageCmd12) AbsEBikeMessage.parseMessage(dataProtocol.getBytes()); + log.info("主机 获取服务器时间:{}", JSON.toJSONString(message)); + // 保存时间 + saveLastTimeAndCheckChannel(message.getPhysicalId() + "", ctx); + + // 获取当前服务器10位时间戳 + byte[] timeBytes = BytesUtil.getIntBytes((int) (System.currentTimeMillis() / 1000)); + // System.out.println("data: " + BytesUtil.bytesToIntLittle(timeBytes)); + return getResult(dataProtocol, timeBytes); + } +} 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 ee93a441b..0546ba61d 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 @@ -42,6 +42,8 @@ public abstract class AbsEBikeMessage { return new EBikeMessageCmd04(header, length, physicalId, messageId, command, null, checksum, new EBikeMessageCmd04.ConfirmOrder(dataBytes)); case "06": return new EBikeMessageCmd06(header, length, physicalId, messageId, command, null, checksum, new EBikeMessageCmd06.PowerHeartbeat(dataBytes)); + case "12": + return new EBikeMessageCmd12(header, length, physicalId, messageId, command, null, checksum); case "20": return new EBikeMessageCmd20(header, length, physicalId, messageId, command, null, checksum, new EBikeMessageCmd20.DeviceRegister(dataBytes)); case "21": diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/EBikeCommandEnum.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/EBikeCommandEnum.java index 96ee33931..36196b3ef 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/EBikeCommandEnum.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/EBikeCommandEnum.java @@ -9,8 +9,9 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public enum EBikeCommandEnum { // HEARTBEAT("01", "设备心跳包"), + HOST_GET_SERVER_TIME("12", "主机获取服务器时间", EBikeMessageCmd12.class), REGISTRATION("20", "设备注册包", EBikeMessageCmd20.class), - GET_SERVER_TIME("22", "设备获取服务器时间", EBikeMessageCmd22.class), + DEVICE_GET_SERVER_TIME("22", "设备获取服务器时间", EBikeMessageCmd22.class), HEARTBEAT_2("21", "设备心跳包", EBikeMessageCmd21.class), CARD_OPERATION("02", "刷卡操作", EBikeMessageCmd02.class), SETTLEMENT_UPLOAD("03", "结算消费信息上传", EBikeMessageCmd03.class), diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd12.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd12.java new file mode 100644 index 000000000..8097f40a1 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ebike/deviceupload/EBikeMessageCmd12.java @@ -0,0 +1,34 @@ +package com.jsowell.pile.domain.ebike.deviceupload; + +import com.jsowell.common.util.bean.SerializationUtil; +import com.jsowell.pile.domain.ebike.AbsEBikeMessage; +import lombok.Getter; +import lombok.Setter; + +/** + * 主机获取服务器时间(0x12) + * 此命令主机每次上电后就会发送,直至服务器应答后就停止发送。如服务器无应答,则每隔3分钟发送一次请求 + * 每12小时从服务器获取一次时间,如服务器不应答则每隔3分钟发送一次请求 + * 不带RTC模块的主机不会发送此命令 + * DE 5C A9 5F,转小端模式,=0x5FA95CDE=1604934878=2020-11-09 23:14:38 + */ +@Getter +@Setter +public class EBikeMessageCmd12 extends AbsEBikeMessage { + + public EBikeMessageCmd12(String header, int length, int physicalId, int messageId, String command, Object payload, int checksum) { + super(header, length, physicalId, messageId, command, payload, checksum); + } + + @Override + public void parsePayload(byte[] dataBytes) { + + } + + @Override + public byte[] getMessageBytes() { + byte[] serialize = SerializationUtil.serialize(this); + return serialize; + } + +} \ No newline at end of file