From 5bdad72f5d5077ca875dd03cfdaafb3d7aba93da Mon Sep 17 00:00:00 2001 From: whycq <913841844@qq.com> Date: 星期五, 16 八月 2024 14:36:58 +0800 Subject: [PATCH] # --- app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java | 106 ++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 84 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java b/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java index 8c1bc95..f27d329 100644 --- a/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java +++ b/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java @@ -1,29 +1,34 @@ package com.example.agvcontroller.socket; -import java.nio.charset.StandardCharsets; + import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; import android.util.Log; import com.example.agvcontroller.Item; +import com.example.agvcontroller.MainActivity; +import com.example.agvcontroller.action.AGV_11_UP; +import com.example.agvcontroller.action.AckMsgBuilder; +import com.example.agvcontroller.met.AbstractInboundHandler; +import com.example.agvcontroller.protocol.AGV_A1_DOWN; +import com.example.agvcontroller.protocol.AgvAction; +import com.example.agvcontroller.protocol.AgvPackage; +import com.example.agvcontroller.protocol.ProtocolType; import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; -import java.util.Arrays; import java.util.concurrent.ConcurrentHashMap; -public class NettyServerHandler extends ChannelInboundHandlerAdapter { +public class NettyServerHandler extends AbstractInboundHandler<AgvPackage> { private static final String TAG = "NettyServerHandler"; private static ConcurrentHashMap<String, Channel> channelMap = new ConcurrentHashMap<>(); + @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { @@ -41,22 +46,53 @@ Log.d(TAG, "Client disconnected: " + clientId); } +// @Override +// public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// // 澶勭悊鎺ユ敹鍒扮殑娑堟伅 +// ByteBuf byteBuf = (ByteBuf) msg; +// try { +// while (byteBuf.isReadable()) { +// byte[] bytes = new byte[byteBuf.readableBytes()]; +// byteBuf.readBytes(bytes); +// String hexString = bytesToHex(bytes); +// // 鑾峰彇agv淇℃伅 娣诲姞鍒發ist涓� +// Log.d(TAG, "ctx: " + ctx.channel().remoteAddress().toString() ); +// Log.d(TAG, "Received: " + hexString); +// } +// } finally { +// byteBuf.release(); +// } +// } + @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - // 澶勭悊鎺ユ敹鍒扮殑娑堟伅 - ByteBuf byteBuf = (ByteBuf) msg; - try { - while (byteBuf.isReadable()) { - byte[] bytes = new byte[byteBuf.readableBytes()]; - byteBuf.readBytes(bytes); - String hexString = bytesToHex(bytes); - // 鑾峰彇agv淇℃伅 娣诲姞鍒發ist涓� - Log.d(TAG, "ctx: " + ctx.channel().remoteAddress().toString() ); - Log.d(TAG, "Received: " + hexString); - } - } finally { - byteBuf.release(); + protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) throws Exception { + + String serialNum = pac.getHeader().getSerialNum(); + // ack + ProtocolType ackType = isNeedAck(pac); + final String uniqueNo = pac.getHeader().getUniqueNo(); + label : switch (pac.getHeader().getProtocolType()){ + case ACTION_COMPLETE: // 鍔ㄤ綔瀹屾垚鏁版嵁鍖� + + + AGV_11_UP agv_11_up = (AGV_11_UP) pac.getBody().getMessageBody(); +// redis.push(RedisConstant.AGV_COMPLETE_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_11_up)); + + // 鍔ㄤ綔瀹屾垚搴旂瓟 + if (null != ackType) { + AgvPackage ackPac = AckMsgBuilder.ofSuccess(pac, ackType); + + AGV_A1_DOWN agv_a1_down = (AGV_A1_DOWN) ackPac.getBody().getMessageBody(); + agv_a1_down.setAckSign((byte) agv_11_up.getCompleteCode()); + + ctx.writeAndFlush(ackPac); + } + + MainActivity.map.put(serialNum, Boolean.TRUE); + + break label; } + return false; } private String bytesToHex(byte[] bytes) { @@ -77,9 +113,8 @@ return data; } - public static void sendMessageToClient(String clientId, Object message) { + public static void sendMessageToClient(String clientId, byte[] message) { Channel channel = channelMap.get(clientId); - if (channel != null && channel.isActive()) { ByteBuf buf = Unpooled.wrappedBuffer(message); String upperCase = ByteBufUtil.hexDump(buf).toUpperCase(); @@ -90,10 +125,37 @@ } } + public static void sendMessageToClient(String clientId, AgvAction<?> action) { + + + + Channel channel = channelMap.get(clientId); + if (channel != null && channel.isActive()) { + + channel.writeAndFlush(action); + } else { + Log.d(TAG, "Client " + clientId + " is not connected"); + } + } + @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } + /** + * 鏈嶅姟鍣ㄦ槸鍚﹂渶瑕佸簲绛� + */ + public static ProtocolType isNeedAck(AgvPackage pac) { + switch (pac.getHeader().getProtocolType()) { + case ACTION_COMPLETE: + return ProtocolType.ACTION_SUCCESS_ACK; + case LOGIN_REPORT: + return ProtocolType.LOGIN_ACK; + default: + return null; + } + } + } -- Gitblit v1.9.1