From 20245e35da8a9d809b2de91f4ec29dd39127f9d5 Mon Sep 17 00:00:00 2001 From: whycq <913841844@qq.com> Date: 星期六, 17 八月 2024 10:07:07 +0800 Subject: [PATCH] # --- app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java | 4 app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java | 3 app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java | 10 + app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java | 4 app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java | 4 app/src/main/java/com/example/agvcontroller/protocol/AGV_02_UP.java | 115 ++++++++++++++++ app/src/main/java/com/example/agvcontroller/utils/DialogUtil.java | 27 +++ app/src/main/java/com/example/agvcontroller/MainActivity.java | 66 ++++++--- app/src/main/java/com/example/agvcontroller/StartActivity.java | 2 app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java | 5 app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java | 6 app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java | 4 app/src/main/java/com/example/agvcontroller/protocol/MessageBodyHandler.java | 115 ++++++++++++++++ app/src/main/java/com/example/agvcontroller/socket/NettyServer.java | 6 app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java | 2 15 files changed, 348 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/example/agvcontroller/MainActivity.java b/app/src/main/java/com/example/agvcontroller/MainActivity.java index b08e87c..1de3e8a 100644 --- a/app/src/main/java/com/example/agvcontroller/MainActivity.java +++ b/app/src/main/java/com/example/agvcontroller/MainActivity.java @@ -20,14 +20,13 @@ import com.example.agvcontroller.action.HandOutAction; import com.example.agvcontroller.socket.NettyServerHandler; import com.example.agvcontroller.socket.SocketManager; +import com.example.agvcontroller.utils.DialogUtil; import com.example.agvcontroller.utils.SnowflakeIdWorker; import java.net.Socket; -import java.sql.Time; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeoutException; public class MainActivity extends AppCompatActivity { @@ -44,6 +43,7 @@ private Button rotatopnLeftBtn; // 宸︽棆杞� private Button goForwardBtn; // 鍓嶈繘 private Button goBackwardBtn; // 鍚庨�� + private Button modelSwitchBtn; // 杩涘叆銆侀��鍑� 鎵嬪姩 private Socket socket; SocketManager socketManager; @@ -68,25 +68,7 @@ nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔� handler.sendEmptyMessageDelayed(0, 100); - boolean result = false; - long timestamp = System.currentTimeMillis(); - while (System.currentTimeMillis() - timestamp < 5000) { - - Object o = map.get(substring); - - if (null != o) { - result = true; - map.remove(o); - break; - } - } - - if (result) { - // alert ok - } else { - throw new TimeoutException("瓒呮椂"); - } } if (isOpen) { @@ -117,12 +99,13 @@ forceSwitchBtn = findViewById(R.id.btn_force_switch); goForwardBtn = findViewById(R.id.btn_go_forward); goBackwardBtn = findViewById(R.id.btn_go_backward); + modelSwitchBtn = findViewById(R.id.btn_model_switch); Intent intent = getIntent(); clientId = intent.getStringExtra("message"); Log.i("message1",clientId); - // 杩涘嚭鎵嬪姩妯″紡 + // 寮哄埗妯″紡寮�鍏� forceSwitchBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -138,6 +121,47 @@ nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔� } }); + + // 寮哄埗妯″紡寮�鍏� + modelSwitchBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (vibrator != null && vibrator.hasVibrator()) { + vibrator.vibrate(500); + } + String substring = String.valueOf(new SnowflakeIdWorker().nextId()).substring(0,16); + AgvAction agvAction = new AgvAction<>(HandOutAction.class) + .setAgvNo("12") + .setSerialNo(substring) + .setVal(1) + .bodySync((action) -> action.setPwd((short) 21)); + nettyServerHandler.sendMessageToClient(clientId, agvAction); // 鍙戦�佹秷鎭埌瀹㈡埛绔� + + + boolean result = false; + long timestamp = System.currentTimeMillis(); + + Log.i("substring",substring); + while (System.currentTimeMillis() - timestamp < 20000) { + + Object o = map.get(substring); + + if (null != o) { + result = true; + map.remove(o); + break; + } + } + + if (result) { + // alert ok 淇敼鎸夐挳鏍峰紡 鍚嶇О + modelSwitchBtn.setText("鑷姩妯″紡"); + } else { +// throw new TimeoutException("瓒呮椂"); + DialogUtil.showAlertDialog(MainActivity.this, "鎻愮ず", "璇锋眰搴旂瓟瓒呮椂锛�"); + } + } + }); stopBtn.setOnTouchListener(new CarTouchButton()); goForwardBtn.setOnTouchListener(new CarTouchButton()); goBackwardBtn.setOnTouchListener(new CarTouchButton()); diff --git a/app/src/main/java/com/example/agvcontroller/StartActivity.java b/app/src/main/java/com/example/agvcontroller/StartActivity.java index f38311e..727f99b 100644 --- a/app/src/main/java/com/example/agvcontroller/StartActivity.java +++ b/app/src/main/java/com/example/agvcontroller/StartActivity.java @@ -52,7 +52,7 @@ } }); socketManager = new SocketManager(); - socketManager.startServer(8080); + socketManager.startServer(8081); } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java index 058cd45..b02e5bd 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_01_DOWN.java @@ -38,6 +38,9 @@ } + public String getSerialNo() { + return serialNo; + } // 娴佹按鍙� - 16 private String serialNo; diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java index a9a1292..e8346e1 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_DOWN.java @@ -1,6 +1,10 @@ package com.example.agvcontroller.protocol; +import com.example.agvcontroller.action.AgvCompleteType; +import com.example.agvcontroller.action.CommonConstant; +import com.example.agvcontroller.socket.RadixTools; + import java.io.Serializable; /** @@ -27,7 +31,13 @@ @Override public void readFromBytes(byte[] messageBodyBytes) { + try { + this.serialNo = new String(Utils.sliceWithReverse(messageBodyBytes, 0, 16)); + this.cmdCode = Utils.slice(messageBodyBytes, 16, 1)[0]; + } catch (Exception e) { + + } } // 娴佹按鍙� - 16 diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_UP.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_UP.java new file mode 100644 index 0000000..f6990d3 --- /dev/null +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_02_UP.java @@ -0,0 +1,115 @@ +package com.example.agvcontroller.protocol; + +import com.example.agvcontroller.action.AgvCompleteType; +import com.example.agvcontroller.action.CommonConstant; +import com.example.agvcontroller.socket.RadixTools; + +import java.io.Serializable; + +/** + * 鍔ㄤ綔瀹屾垚鏁版嵁鍖� + * + * Created by vincent on 2023/3/21 + */ +public class AGV_02_UP implements IMessageBody, Serializable { + + private static final long serialVersionUID = 8403019742104020004L; + + @Override + public byte[] writeToBytes() { + return new byte[0]; + } + + @Override + public void readFromBytes(byte[] bytes) { +// try { + this.serialNo = new String(Utils.sliceWithReverse(bytes, 0, 16)); +// } catch (UnsupportedEncodingException e) { +// e.printStackTrace(); +// } + this.completeCode = Utils.slice(bytes, 16, 1)[0]; + this.completeType = AgvCompleteType.query(this.completeCode); + this.qrCode = Utils.zeroFill(String.valueOf(RadixTools.bytesToInt(Utils.sliceWithReverse(bytes, 17, 4))), CommonConstant.QR_CODE_LEN); + this.direction = RadixTools.byteToShort(Utils.sliceWithReverse(bytes, 21,2)); +// this.locCode = new String(Utils.sliceWithReverse(bytes, 23, 16)).replaceAll("\\u0000", ""); +// this.boxCode = new String(Utils.sliceWithReverse(bytes, 39, 16)).replaceAll("\\u0000", ""); + this.locCode = Utils.zeroFill(String.valueOf(RadixTools.bytesToInt(Utils.sliceWithReverse(bytes, 23, 4))), CommonConstant.QR_CODE_LEN); + this.boxCode = Utils.zeroFill(String.valueOf(RadixTools.bytesToInt(Utils.sliceWithReverse(bytes, 39, 4))), CommonConstant.QR_CODE_LEN); + } + + private String serialNo; + + // 瀹屾垚鍔ㄤ綔鐮� + private int completeCode; + + private AgvCompleteType completeType; + + // 鍦伴潰鐮� - 8浣� + private String qrCode; + + // 杞﹀ご鏈濆悜 + private short direction; + + // 璐т綅浜岀淮鐮� + private String locCode; + + public String getSerialNo() { + return serialNo; + } + + public void setSerialNo(String serialNo) { + this.serialNo = serialNo; + } + + public int getCompleteCode() { + return completeCode; + } + + public void setCompleteCode(int completeCode) { + this.completeCode = completeCode; + } + + public AgvCompleteType getCompleteType() { + return completeType; + } + + public void setCompleteType(AgvCompleteType completeType) { + this.completeType = completeType; + } + + public String getQrCode() { + return qrCode; + } + + public void setQrCode(String qrCode) { + this.qrCode = qrCode; + } + + public short getDirection() { + return direction; + } + + public void setDirection(short direction) { + this.direction = direction; + } + + public String getLocCode() { + return locCode; + } + + public void setLocCode(String locCode) { + this.locCode = locCode; + } + + public String getBoxCode() { + return boxCode; + } + + public void setBoxCode(String boxCode) { + this.boxCode = boxCode; + } + + // 鏂欑浜岀淮鐮� + private String boxCode; + +} diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java index 882e607..173e3e8 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_03_DOWN.java @@ -20,4 +20,8 @@ } + public String getSerialNo() { + return ""; + } + } diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java index e59a7ff..5d5b18a 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_80_DOWN.java @@ -21,4 +21,8 @@ } + public String getSerialNo() { + return ""; + } + } diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java index b51952f..0715f0b 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_A1_DOWN.java @@ -41,4 +41,8 @@ private byte[] temp = new byte[4]; + public String getSerialNo() { + return ""; + } + } diff --git a/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java b/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java index d3fff92..b1b2438 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/AGV_F0_DOWN.java @@ -28,5 +28,9 @@ private byte[] temp = new byte[4]; + public String getSerialNo() { + return ""; + } + } diff --git a/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java b/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java index 35efd0c..b2b1ef5 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/IMessageBody.java @@ -8,4 +8,6 @@ void readFromBytes(byte[] messageBodyBytes); + String getSerialNo(); + } diff --git a/app/src/main/java/com/example/agvcontroller/protocol/MessageBodyHandler.java b/app/src/main/java/com/example/agvcontroller/protocol/MessageBodyHandler.java new file mode 100644 index 0000000..90f3681 --- /dev/null +++ b/app/src/main/java/com/example/agvcontroller/protocol/MessageBodyHandler.java @@ -0,0 +1,115 @@ +package com.example.agvcontroller.protocol; + +import com.example.agvcontroller.met.AbstractInboundHandler; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; + +/** + * 鎶ユ枃涓讳綋handler + * Created by vincent on 2023-03-15 + */ +//@Component("messageBodyHandler") +@ChannelHandler.Sharable +public class MessageBodyHandler extends AbstractInboundHandler<AgvPackage> { + + private static final Logger log = LoggerFactory.getLogger(MessageBodyHandler.class); + + @Override + @SuppressWarnings("all") + protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) { + + String namespace = IMessageBody.class.getPackage().getName(); + + ProtocolType protocolType = pac.getHeader().getProtocolType(); + + + if (null == protocolType) { + + // 鏈煡鍖� + return Boolean.FALSE; + } + + String className = namespace + ".AGV_" + Utils.zeroFill(Integer.toHexString(protocolType.getCode()).toUpperCase(), 2) + +"_" + + + pac.getHeader().getProtocolType().getDirection().toString().toUpperCase(); + + Class<?> cls = null; + try { + + + cls = Class.forName(className);; + + } catch (ClassNotFoundException e) { + + log.error("MessageBodyHandler ClassNotFoundException", e);log.error("鎵句笉鍒版寚瀹氱被锛歿}", className); + + return Boolean.FALSE; + } + + Object obj = null; + + if (null != cls) { + + + try { + obj = cls.newInstance(); + + } catch (ReflectiveOperationException reflectiveOperationException) { + log.error("MessageBodyHandler ReflectiveOperationException", reflectiveOperationException); + + log.error("java鍙嶅皠鍒涘缓瀹炰緥澶辫触锛歿}", className); + + // 銆傘�傘�� + return Boolean.FALSE; + } + + + } + + ByteBuf contentBuf = pac.getBody().getContent(); contentBuf.markReaderIndex(); // sign + // body.buf 灞炰簬鍒囩墖鑾峰彇锛� slice 涓� channel涓殑缂撳啿鍖� 涓哄悓涓� refenec + + + + contentBuf.resetReaderIndex(); + + int len= contentBuf.readableBytes(); + + byte[] bytes = new byte[len]; + + + + pac.getBody().getContent().readBytes(bytes); + + + + // 璇诲彇瀛楄妭鏁扮粍 ===>> 瀹為檯鎶ユ枃绫诲瀷 + IMessageBody iMessageBody = null; + + if (null != obj) { + + if ( obj instanceof IMessageBody) { + + iMessageBody = (IMessageBody) obj; + + + iMessageBody.readFromBytes(bytes); + } + + } + + + + pac.getBody().setMessageBody(iMessageBody); contentBuf.resetReaderIndex(); + + return true; + } + + +} diff --git a/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java b/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java index 679690b..d92aecf 100644 --- a/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java +++ b/app/src/main/java/com/example/agvcontroller/protocol/PackagePart.java @@ -36,6 +36,11 @@ COMMAND_MARK(11, 1, "鍛戒护鏍囪瘑"), /** + * 娴佹按鍙� + */ + SERIAL_NUM(13, 16, "娴佹按鍙�"), + + /** * 鏁版嵁鍗曞厓 */ CONTENT(12, -1, "鏁版嵁鍗曞厓"), diff --git a/app/src/main/java/com/example/agvcontroller/socket/NettyServer.java b/app/src/main/java/com/example/agvcontroller/socket/NettyServer.java index 278bac0..1871469 100644 --- a/app/src/main/java/com/example/agvcontroller/socket/NettyServer.java +++ b/app/src/main/java/com/example/agvcontroller/socket/NettyServer.java @@ -1,5 +1,6 @@ package com.example.agvcontroller.socket; +import com.example.agvcontroller.protocol.MessageBodyHandler; import com.example.agvcontroller.protocol.ProtocolDecoder; import com.example.agvcontroller.protocol.ProtocolEncoder; @@ -35,7 +36,10 @@ .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { - ch.pipeline().addLast(new ProtocolEncoder()).addLast(new ProtocolDecoder(4096)).addLast(new NettyServerHandler()); + ch.pipeline().addLast(new ProtocolEncoder()) + .addLast(new ProtocolDecoder(4096)) + .addLast(new MessageBodyHandler()) + .addLast(new NettyServerHandler()); } }) // .addLast(new NettyServerHandler()) 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 f27d329..a33faad 100644 --- a/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java +++ b/app/src/main/java/com/example/agvcontroller/socket/NettyServerHandler.java @@ -67,7 +67,9 @@ @Override protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) throws Exception { - String serialNum = pac.getHeader().getSerialNum(); + String serialNum = pac.getBody().getMessageBody().getSerialNo(); + Log.i("substring",serialNum); + MainActivity.map.put(serialNum, Boolean.TRUE); // ack ProtocolType ackType = isNeedAck(pac); final String uniqueNo = pac.getHeader().getUniqueNo(); @@ -88,7 +90,7 @@ ctx.writeAndFlush(ackPac); } - MainActivity.map.put(serialNum, Boolean.TRUE); + break label; } diff --git a/app/src/main/java/com/example/agvcontroller/utils/DialogUtil.java b/app/src/main/java/com/example/agvcontroller/utils/DialogUtil.java new file mode 100644 index 0000000..cb5f2cc --- /dev/null +++ b/app/src/main/java/com/example/agvcontroller/utils/DialogUtil.java @@ -0,0 +1,27 @@ +package com.example.agvcontroller.utils; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; + +public class DialogUtil { + + public static void showAlertDialog(Context context, String title, String message) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(title) + .setMessage(message) + .setPositiveButton("纭畾", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }) + .setNegativeButton("鍙栨秷", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }) + .show(); + } +} -- Gitblit v1.9.1