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