AciService.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package com.ruoyi.ams.agv.ndc;
  2. import cn.hutool.core.date.DateUnit;
  3. import cn.hutool.core.date.DateUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.ruoyi.ams.agv.ndc.common.Aci;
  6. import com.ruoyi.ams.agv.ndc.common.ByteUtil;
  7. import com.ruoyi.ams.agv.ndc.domain.AmsHexdefineDetail;
  8. import com.ruoyi.ams.agv.ndc.domain.AmsTask;
  9. import com.ruoyi.ams.agv.ndc.entity.Order;
  10. import com.ruoyi.ams.agv.ndc.service.IAmsHexdefineDetailService;
  11. import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
  12. import com.ruoyi.ams.agv.ndc.service.SocketBufferService;
  13. import com.ruoyi.base.constant.Constant;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import java.io.IOException;
  18. import java.net.InetSocketAddress;
  19. import java.net.SocketAddress;
  20. import java.nio.ByteBuffer;
  21. import java.nio.channels.SocketChannel;
  22. import java.util.Date;
  23. import java.util.List;
  24. /**
  25. * Created by IntelliJ IDEA.
  26. * User: andy.qu
  27. * Date: 2022/8/5
  28. */
  29. @Slf4j
  30. @Service
  31. public class AciService {
  32. private static final int TIMEOUT = 3000;
  33. private static final int BUFF_SIZE = 2048;
  34. private static final String IP = "127.0.0.1";
  35. private static final int PORT = 30002;
  36. @Autowired
  37. private SocketBufferService socketBufferService;
  38. @Autowired
  39. private IAmsTaskService amsTaskService;
  40. @Autowired
  41. private IAmsHexdefineDetailService amsHexdefineDetailService;
  42. @SuppressWarnings("InfiniteLoopStatement")
  43. public void start() throws IOException {
  44. SocketChannel socketChannel = SocketChannel.open();
  45. socketChannel.configureBlocking(false); // 解决了IO阻塞
  46. while (true) {
  47. try {
  48. //链接服务端Socket
  49. if (!socketChannel.isConnected()) {
  50. if (!socketChannel.isOpen()) {
  51. socketChannel = SocketChannel.open();
  52. socketChannel.configureBlocking(false); // 解决了IO阻塞
  53. }
  54. // 非阻塞模式下 这段代码并不是等到连接建立之后再往下执行
  55. SocketAddress socketAddress = new InetSocketAddress(IP, PORT);
  56. socketChannel.connect(socketAddress);
  57. Thread.sleep(2000);
  58. if (socketChannel.isConnectionPending()) {
  59. socketChannel.finishConnect();
  60. }
  61. }
  62. ByteBuffer buffer = ByteBuffer.allocate(BUFF_SIZE);
  63. buffer.clear();
  64. //删除指令
  65. AmsTask taskBean = new AmsTask();
  66. taskBean.setIsDelete(1);
  67. taskBean.setAciAccept(0);
  68. taskBean = amsTaskService.selectAmsTaskByModel(taskBean);
  69. String s = "87CD000800060001006E0002%04X";
  70. if (taskBean != null) {
  71. if (taskBean.getAciIndex() == null) {
  72. //还没有提交给aci系统
  73. taskBean.setAciAccept(1);
  74. amsTaskService.updateAmsTask(taskBean);
  75. } else {
  76. //已经提交给aci系统
  77. s = String.format(s, taskBean.getAciIndex());
  78. buffer.put(ByteUtil.hexString2ByteArray(s));
  79. buffer.flip();
  80. socketChannel.write(buffer);
  81. buffer.clear();
  82. log.info("cancelOrder: " + s);
  83. }
  84. if (DateUtil.between(taskBean.getAddtime(), new Date(), DateUnit.MINUTE) > 1) {
  85. taskBean.setAciAccept(2);
  86. taskBean.setRemark("下发超时1分钟未接收自动取消");
  87. amsTaskService.updateAmsTask(taskBean);
  88. }
  89. }
  90. //充电指令
  91. taskBean = new AmsTask();
  92. taskBean.setIsDelete(0);
  93. taskBean.setAciAccept(0);
  94. taskBean.setBusinessType(Constant.TASK_BUSINESS_TYPE.TASK_POWER.getValue());
  95. taskBean = amsTaskService.selectAmsTaskByModel(taskBean);
  96. s = "87CD0008000C000100710008658100010001%04X";
  97. if (taskBean != null) {
  98. s = String.format(s, Integer.parseInt(taskBean.getDeviceName()));
  99. buffer.put(ByteUtil.hexString2ByteArray(s));
  100. buffer.flip();
  101. socketChannel.write(buffer);
  102. buffer.clear();
  103. log.info("AGV-Power: " + s);
  104. taskBean.setServerAck(0);
  105. taskBean.setAciAccept(1);
  106. taskBean.setIsDelete(null);
  107. amsTaskService.updateAmsTask(taskBean);
  108. }
  109. //添加指令
  110. List<AmsTask> taskBeans = amsTaskService.selectTaskNotIssued();
  111. if (taskBeans != null && taskBeans.size() > 0) {
  112. for (AmsTask t : taskBeans) {
  113. t.init();
  114. List<AmsHexdefineDetail> basTask = amsHexdefineDetailService.selectAmsHexdefineDetailByBusinessType(t.getBusinessType());
  115. if (basTask == null || basTask.size() == 0) {
  116. t.setIsDelete(1);
  117. t.setRemark("该任务类型未定义");
  118. log.info("任务类型未定义------" + JSON.toJSONString(t));
  119. continue;
  120. }
  121. // try {
  122. String order = amsHexdefineDetailService.concatOrder(t, basTask);
  123. log.info("writeOrder:" + order);
  124. if (t.getBusinessType().equals("m") ||
  125. t.getBusinessType().equals("01")
  126. ) {
  127. buffer.put(ByteUtil.hexString2ByteArray(order));
  128. buffer.flip();
  129. socketChannel.write(buffer);
  130. buffer.clear();
  131. if (DateUtil.between(t.getAddtime(), new Date(), DateUnit.MINUTE) > 2) {
  132. t.setAciAccept(2);
  133. t.setRoadway("下发超时2分钟未接收自动取消");
  134. amsTaskService.updateAmsTask(t);
  135. }
  136. } else {
  137. buffer.put(ByteUtil.hexString2ByteArray(order));
  138. buffer.flip();
  139. socketChannel.write(buffer);
  140. buffer.clear();
  141. // 修改已发送
  142. t.setAciAccept(1);
  143. t.setRoadway("TS请求反馈任务发送成功!");
  144. amsTaskService.updateAmsTask(t);
  145. }
  146. // } catch (Exception e) {
  147. // e.printStackTrace();
  148. // t.setServerAck(0);
  149. // t.setAciAccept(1);
  150. // t.setRoadway("程序异常自动ack");
  151. // t.setIsDelete(null);
  152. // amsTaskService.updateAmsTask(t);
  153. // }
  154. }
  155. }
  156. //从服务端读取
  157. buffer.clear();
  158. //因为设置了异步 这边不会阻塞 测试了一下 服务器断开这边会抛出异常 但是写的时候不会抛出异常 可能是设置了异步的原因
  159. int readLenth = socketChannel.read(buffer);
  160. if (readLenth == -1) {
  161. // throw new IOException();
  162. }
  163. if (readLenth > 0) {
  164. buffer.flip();
  165. byte[] bytes = new byte[readLenth];
  166. buffer.get(bytes);
  167. List<Order> bufferSeparators = socketBufferService.bufferSeparator(bytes);
  168. for (Order order : bufferSeparators) {
  169. // log.info("消息类型:" + order.getMessageType() + ",消息参数:" + ByteUtil.byteArray2HexString(order.getParameters()));
  170. switch (order.getMessageType()) {
  171. case Aci.MSG_ORDER_STATUS://车体状态信息、位置信息
  172. socketBufferService.handleMsgOrderStatus(order.getParameters());
  173. break;
  174. case Aci.MSG_EVENT://任务反馈、自定义消息
  175. socketBufferService.handleMsgEvent(order.getParameters());
  176. break;
  177. case Aci.MSG_STOP://交通管制暂停
  178. socketBufferService.handleMsgStopStart(order.getParameters(), true);
  179. break;
  180. case Aci.MSG_START://启动信息
  181. socketBufferService.handleMsgStopStart(order.getParameters(), false);
  182. break;
  183. case Aci.MSG_ORDER_ACK://信息接收反馈
  184. socketBufferService.handleMsgOrderAck(order.getParameters());
  185. break;
  186. }
  187. }
  188. }
  189. buffer.clear();
  190. try {
  191. Thread.sleep(500);
  192. } catch (InterruptedException e) {
  193. e.printStackTrace();
  194. }
  195. }catch (IOException i) {
  196. log.error("NDC通讯异常!" ,i);
  197. try {
  198. socketChannel.close();
  199. } catch (Exception exception) {
  200. i.printStackTrace();
  201. }
  202. }catch (Exception e) {
  203. e.printStackTrace();
  204. try {
  205. socketChannel.close();
  206. } catch (Exception exception) {
  207. e.printStackTrace();
  208. }
  209. }
  210. }
  211. }
  212. }