update 电单车协议

This commit is contained in:
Guoqs
2024-08-03 16:02:50 +08:00
parent 397353c7e5
commit b535eba509
5 changed files with 53 additions and 45 deletions

View File

@@ -45,7 +45,7 @@ public class StartAndLengthFieldFrameDecoder extends ByteToMessageDecoder {
byte[] headerBytes = new byte[HEADER_LENGTH_DNY];
buffer.getBytes(beginReader, headerBytes, 0, HEADER_LENGTH_DNY);
String header = new String(headerBytes, StandardCharsets.UTF_8);
// log.info("检查包头是否是DNY, header:{}", header);
if ("DNY".equals(header)) {
// 处理 DNY 协议
decodeDnyMessage(buffer, out, beginReader);
@@ -117,6 +117,7 @@ public class StartAndLengthFieldFrameDecoder extends ByteToMessageDecoder {
// 获取消息长度
int length = buffer.getUnsignedByte(beginReader + HEADER_LENGTH_DNY);
// log.info("获取消息长度, length:{}", length);
// 检查剩余数据是否足够
if (buffer.readableBytes() < HEADER_LENGTH_DNY + 1 + length) {
buffer.readerIndex(beginReader);
@@ -124,8 +125,8 @@ public class StartAndLengthFieldFrameDecoder extends ByteToMessageDecoder {
}
// 读取 data 数据
ByteBuf frame = buffer.retainedSlice(beginReader, HEADER_LENGTH_DNY + 1 + length);
buffer.readerIndex(beginReader + HEADER_LENGTH_DNY + 1 + length);
ByteBuf frame = buffer.retainedSlice(beginReader, HEADER_LENGTH_DNY + length + 2);
buffer.readerIndex(beginReader + HEADER_LENGTH_DNY + length + 2);
out.add(frame);
}

View File

@@ -8,7 +8,7 @@ import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Deprecated
@Slf4j
public class StartAndLengthFieldFrameDecoder2 extends ByteToMessageDecoder {
private static final int HEADER_LENGTH_DNY = 3; // "DNY" 包头的长度

View File

@@ -1,5 +1,6 @@
package com.jsowell.netty.server.electricbicycles;
import com.jsowell.common.util.BytesUtil;
import com.jsowell.netty.domain.ChargingPileMessage;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
@@ -8,10 +9,12 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.swing.*;
import java.net.InetSocketAddress;
import java.time.Instant;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@ChannelHandler.Sharable
@@ -47,48 +50,48 @@ public class ChargingPileHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
log.info("加载客户端报文=== channelId:{}, mag:{}", ctx.channel().id(), msg.toString());
log.info("加载客户端报文=== channelId:{}, mag:{}", ctx.channel().id(), BytesUtil.binary((byte[]) msg, 16));
// if (!(msg instanceof ChargingPileMessage)) {
// return;
// }
ChargingPileMessage message = (ChargingPileMessage) msg;
byte command = message.getCommand();
switch (command) {
case 0x11:
handleHeartbeat(ctx, message);
break;
case 0x12:
handleTimeRequest(ctx, message);
break;
case 0x15:
handleFirmwareUpgradeRequest(ctx, message);
break;
case (byte) 0xFA:
handleFirmwareUpgradeResponse(ctx, message);
break;
case 0x31:
handleReboot(ctx, message);
break;
case 0x32:
handleCommunicationModuleReboot(ctx, message);
break;
case 0x33:
handleClearUpgradeData(ctx, message);
break;
case 0x34:
handleChangeIPAddress(ctx, message);
break;
case 0x35:
handleSubdeviceVersionUpload(ctx, message);
break;
case 0x3B:
handleFSKParameterRequest(ctx, message);
break;
default:
log.info("Unknown command: " + String.format("0x%02X", command));
}
// ChargingPileMessage message = (ChargingPileMessage) msg;
// byte command = message.getCommand();
//
// switch (command) {
// case 0x11:
// handleHeartbeat(ctx, message);
// break;
// case 0x12:
// handleTimeRequest(ctx, message);
// break;
// case 0x15:
// handleFirmwareUpgradeRequest(ctx, message);
// break;
// case (byte) 0xFA:
// handleFirmwareUpgradeResponse(ctx, message);
// break;
// case 0x31:
// handleReboot(ctx, message);
// break;
// case 0x32:
// handleCommunicationModuleReboot(ctx, message);
// break;
// case 0x33:
// handleClearUpgradeData(ctx, message);
// break;
// case 0x34:
// handleChangeIPAddress(ctx, message);
// break;
// case 0x35:
// handleSubdeviceVersionUpload(ctx, message);
// break;
// case 0x3B:
// handleFSKParameterRequest(ctx, message);
// break;
// default:
// log.info("Unknown command: " + String.format("0x%02X", command));
// }
}
private void handleHeartbeat(ChannelHandlerContext ctx, ChargingPileMessage message) {

View File

@@ -1,9 +1,7 @@
package com.jsowell.netty.server.electricbicycles;
import com.jsowell.netty.decoder.ChargingPileDecoder;
import com.jsowell.netty.decoder.ProtocolDnyDecoder;
import com.jsowell.netty.decoder.StartAndLengthFieldFrameDecoder;
import com.jsowell.netty.decoder.StartAndLengthFieldFrameDecoder2;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
@@ -26,7 +24,7 @@ public class ElectricBicyclesServerChannelInitializer extends ChannelInitializer
@Override
protected void initChannel(SocketChannel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast("frameDecoder", new ChargingPileDecoder());
pipeline.addLast("frameDecoder", new StartAndLengthFieldFrameDecoder());
pipeline.addLast("decoder", new ByteArrayDecoder());
pipeline.addLast("encoder", new ByteArrayDecoder());
//读超时时间设置为10s0表示不监控