|
@@ -14,6 +14,7 @@ import com.ruoyi.ams.agv.ndc.service.SocketBufferService;
|
|
|
import com.ruoyi.base.constant.Constant;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.net.InetSocketAddress;
|
|
@@ -29,15 +30,16 @@ import java.util.List;
|
|
|
* Date: 2022/8/5
|
|
|
*/
|
|
|
@Slf4j
|
|
|
+@Service
|
|
|
public class AciService {
|
|
|
|
|
|
private static final int TIMEOUT = 3000;
|
|
|
|
|
|
private static final int BUFF_SIZE = 2048;
|
|
|
|
|
|
- private static final String IP_ADDR = "192.168.0.105";
|
|
|
+ private static final String IP_ADDR = "192.168.1.58";
|
|
|
|
|
|
- private static final int IP_PORT = 30001;
|
|
|
+ private static final int IP_PORT = 30002;
|
|
|
|
|
|
@Autowired
|
|
|
private SocketBufferService socketBufferService;
|
|
@@ -53,20 +55,23 @@ public class AciService {
|
|
|
int ip_port = IP_PORT; //redisUtils.getInt(RedisEnum.NDC_PORT.getMessage());
|
|
|
|
|
|
SocketChannel socketChannel = SocketChannel.open();
|
|
|
-
|
|
|
+ socketChannel.configureBlocking(false); // 解决了IO阻塞
|
|
|
while (true) {
|
|
|
|
|
|
try {
|
|
|
-
|
|
|
//链接服务端Socket
|
|
|
if (!socketChannel.isConnected()) {
|
|
|
-
|
|
|
if (!socketChannel.isOpen()) {
|
|
|
-
|
|
|
socketChannel = SocketChannel.open();
|
|
|
+ socketChannel.configureBlocking(false); // 解决了IO阻塞
|
|
|
}
|
|
|
+ // 非阻塞模式下 这段代码并不是等到连接建立之后再往下执行
|
|
|
SocketAddress socketAddress = new InetSocketAddress(ip_addr, ip_port);
|
|
|
socketChannel.connect(socketAddress);
|
|
|
+ Thread.sleep(2000);
|
|
|
+ if (socketChannel.isConnectionPending()) {
|
|
|
+ socketChannel.finishConnect();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
ByteBuffer buffer = ByteBuffer.allocate(BUFF_SIZE);
|
|
@@ -135,7 +140,7 @@ public class AciService {
|
|
|
log.info("任务类型未定义------" + JSON.toJSONString(t));
|
|
|
continue;
|
|
|
}
|
|
|
- try {
|
|
|
+// try {
|
|
|
String order = amsHexdefineDetailService.concatOrder(t, basTask);
|
|
|
log.info("writeOrder:" + order);
|
|
|
if (t.getBusinessType().equals("m") ||
|
|
@@ -158,43 +163,50 @@ public class AciService {
|
|
|
socketChannel.write(buffer);
|
|
|
buffer.clear();
|
|
|
}
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- t.setServerAck(0);
|
|
|
- t.setAciAccept(1);
|
|
|
- t.setRoadway("程序异常自动ack");
|
|
|
- t.setIsDelete(null);
|
|
|
- amsTaskService.updateAmsTask(t);
|
|
|
- }
|
|
|
+// } catch (Exception e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// t.setServerAck(0);
|
|
|
+// t.setAciAccept(1);
|
|
|
+// t.setRoadway("程序异常自动ack");
|
|
|
+// t.setIsDelete(null);
|
|
|
+// amsTaskService.updateAmsTask(t);
|
|
|
+// }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//从服务端读取
|
|
|
+ buffer.clear();
|
|
|
+ //因为设置了异步 这边不会阻塞 测试了一下 服务器断开这边会抛出异常 但是写的时候不会抛出异常 可能是设置了异步的原因
|
|
|
int readLenth = socketChannel.read(buffer);
|
|
|
- buffer.flip();
|
|
|
- byte[] bytes = new byte[readLenth];
|
|
|
- buffer.get(bytes);
|
|
|
- List<Order> bufferSeparators = socketBufferService.bufferSeparator(bytes);
|
|
|
- for (Order order : bufferSeparators) {
|
|
|
+ if (readLenth == -1) {
|
|
|
+ throw new IOException();
|
|
|
+ }
|
|
|
+ if (readLenth > 0) {
|
|
|
+ buffer.flip();
|
|
|
+ byte[] bytes = new byte[readLenth];
|
|
|
+ buffer.get(bytes);
|
|
|
+ List<Order> bufferSeparators = socketBufferService.bufferSeparator(bytes);
|
|
|
+ for (Order order : bufferSeparators) {
|
|
|
|
|
|
// log.info("消息类型:" + order.getMessageType() + ",消息参数:" + ByteUtil.byteArray2HexString(order.getParameters()));
|
|
|
- switch (order.getMessageType()) {
|
|
|
-
|
|
|
- case Aci.MSG_ORDER_STATUS://车体状态信息、位置信息
|
|
|
- socketBufferService.handleMsgOrderStatus(order.getParameters());
|
|
|
- break;
|
|
|
- case Aci.MSG_EVENT://任务反馈、自定义消息
|
|
|
- socketBufferService.handleMsgEvent(order.getParameters());
|
|
|
- break;
|
|
|
- case Aci.MSG_STOP://交通管制暂停
|
|
|
- socketBufferService.handleMsgStopStart(order.getParameters(), true);
|
|
|
- break;
|
|
|
- case Aci.MSG_START://启动信息
|
|
|
- socketBufferService.handleMsgStopStart(order.getParameters(), false);
|
|
|
- break;
|
|
|
- case Aci.MSG_ORDER_ACK://信息接收反馈
|
|
|
- socketBufferService.handleMsgOrderAck(order.getParameters());
|
|
|
- break;
|
|
|
+ switch (order.getMessageType()) {
|
|
|
+
|
|
|
+ case Aci.MSG_ORDER_STATUS://车体状态信息、位置信息
|
|
|
+ socketBufferService.handleMsgOrderStatus(order.getParameters());
|
|
|
+ break;
|
|
|
+ case Aci.MSG_EVENT://任务反馈、自定义消息
|
|
|
+ socketBufferService.handleMsgEvent(order.getParameters());
|
|
|
+ break;
|
|
|
+ case Aci.MSG_STOP://交通管制暂停
|
|
|
+ socketBufferService.handleMsgStopStart(order.getParameters(), true);
|
|
|
+ break;
|
|
|
+ case Aci.MSG_START://启动信息
|
|
|
+ socketBufferService.handleMsgStopStart(order.getParameters(), false);
|
|
|
+ break;
|
|
|
+ case Aci.MSG_ORDER_ACK://信息接收反馈
|
|
|
+ socketBufferService.handleMsgOrderAck(order.getParameters());
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
buffer.clear();
|
|
@@ -205,9 +217,19 @@ public class AciService {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
- } catch (Exception e) {
|
|
|
- if (!socketChannel.isOpen()) {
|
|
|
+ }catch (IOException i) {
|
|
|
+ log.error("NDC通讯异常!" ,i);
|
|
|
+ try {
|
|
|
socketChannel.close();
|
|
|
+ } catch (Exception exception) {
|
|
|
+ i.printStackTrace();
|
|
|
+ }
|
|
|
+ }catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ try {
|
|
|
+ socketChannel.close();
|
|
|
+ } catch (Exception exception) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
}
|