TestController.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /**
  2. * Copyright 2019 DH
  3. * All right reserved.
  4. * 项目名称: 大恒泰山系统
  5. * 创建日期:2022/10/27
  6. */
  7. package org.ts.ddcs.controller;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import org.ts.ddcs.common.util.BytesUtil;
  11. import java.net.DatagramPacket;
  12. import java.net.DatagramSocket;
  13. import java.net.InetAddress;
  14. /***
  15. * Date:2022/10/27
  16. * Title:文件所属模块(必须填写)
  17. * Description:对本文件的详细描述,原则上不能少于30字
  18. * @author dylan
  19. * @version 1.0
  20. * Remark:认为有必要的其他信息
  21. */
  22. @RestController
  23. public class TestController {
  24. public static byte[] hexStr2Bytes(String hexString) {
  25. hexString = hexString.toLowerCase();
  26. int remainder = hexString.length() % 2;
  27. if (remainder > 0) {
  28. hexString = "0" + hexString;
  29. }
  30. final byte[] byteArray = new byte[hexString.length() / 2];
  31. int k = 0;
  32. for (int i = 0; i < byteArray.length; i++) {
  33. //因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
  34. //将hex 转换成byte "&" 操作为了防止负数的自动扩展
  35. // hex转换成byte 其实只占用了4位,然后把高位进行右移四位
  36. // 然后“|”操作 低四位 就能得到 两个 16进制数转换成一个byte.
  37. //
  38. byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
  39. byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
  40. byteArray[i] = (byte) (high << 4 | low);
  41. k += 2;
  42. }
  43. return byteArray;
  44. }
  45. public static byte[] subBytes(byte[] src, int begin, int count) {
  46. byte[] bs = new byte[count];
  47. for (int i = begin; i < begin + count; i++) {
  48. bs[i - begin] = src[i];
  49. }
  50. return bs;
  51. }
  52. public static int bytes2Int(byte[] bytes, int off, int len) {
  53. int v = 0;
  54. int pos = off + len - 1;
  55. if (pos >= 0) {
  56. v |= (bytes[pos] & 0xFF);
  57. }
  58. pos--;
  59. if (pos >= 0) {
  60. v |= ((bytes[pos] << 8) & 0xFF00);
  61. }
  62. pos--;
  63. if (pos >= 0) {
  64. v |= ((bytes[pos] << 16) & 0xFF0000);
  65. }
  66. pos--;
  67. if (pos >= 0) {
  68. v |= ((bytes[pos] << 24) & 0xFF000000);
  69. }
  70. return v;
  71. }
  72. public static String leftFill(String src, int len, char fillChar) {
  73. String result = src;
  74. for (int i = src.length(); i < len; i++) {
  75. result = String.valueOf(fillChar) + result;
  76. }
  77. return result;
  78. }
  79. public static String byte2HexMpCdStr(byte[] b) {
  80. String stmp = "";
  81. StringBuilder sb = new StringBuilder("");
  82. for (int n = 0; n < 3; n++) {
  83. stmp = Integer.toHexString(b[n] & 0xFF);
  84. sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
  85. }
  86. int mpcd = bytes2Int(subBytes(b, 3, 2), 0, 2) % 10000;
  87. sb.append(leftFill(mpcd + "", 4, '0'));
  88. return sb.toString().toUpperCase().trim();
  89. }
  90. @GetMapping("collect/test/fun")
  91. public String getFun() {
  92. byte[] buff = hexStr2Bytes("1522005A02");
  93. String str = byte2HexMpCdStr(buff);
  94. return str;
  95. }
  96. @GetMapping("collect/test/fun1")
  97. public String getFun1() {
  98. String rtuCode = "1522005A02";
  99. String rtutail = rtuCode.substring(rtuCode.length() - 4, rtuCode.length());
  100. byte[] rtubuff = BytesUtil.hexStr2Bytes(rtutail);
  101. int rtuvalue = BytesUtil.bytes2short(rtubuff);
  102. if (rtuvalue >= 0 && rtuvalue <= 9999) {
  103. rtutail = String.format("%04d", rtuvalue);
  104. rtuCode = rtuCode.substring(0, 6) + rtutail;
  105. }
  106. return rtuCode;
  107. }
  108. @GetMapping(value = "collect/test")
  109. public String toTest() {
  110. try {
  111. // 1.定义服务器的地址、端口号、数据
  112. InetAddress address = InetAddress.getByName("localhost");
  113. // 2.定义服务器端口
  114. int port = 8002;
  115. // 3.创建发送端对象:发送端自带默认端口号
  116. DatagramSocket socket = new DatagramSocket(2222);
  117. // 4.客户端启动成功,输出提示信息
  118. System.out.println("****客户端启动成功****");
  119. String msg ="7E7E01005128290300002F20080230522230271439160396987E7E01005128290300002F0008023052221027144016034F497E7E01005128290300002F0008023052221027144116038F187E7E01005128290300002F0008023052221027144216038FE87E7E01005128290300002F0008023052221027144316034FB97E7E01005128290300002F0008023052221027144416038E087E7E01005128290300002F0008023052221027144516034E597E7E01005128290300002F0008023052221027144616034EA97E7E01005128290300002F0008023052221027144716038EF8";
  120. byte[] buffer= BytesUtil.hexStr2Bytes(msg);
  121. DatagramPacket packets = new DatagramPacket(buffer, buffer.length, address, port);
  122. // 5.4 发送数据出去
  123. socket.send(packets);
  124. while (true) {
  125. byte[] buf = new byte[1024 * 64];
  126. DatagramPacket packet = new DatagramPacket(buf, buf.length);
  127. // 6.2 接收服务器响应的数据
  128. socket.receive(packet);
  129. // 6.3 取出数据
  130. int len = packet.getLength();
  131. if (len >0) {
  132. String rs = new String(buf, 0, len);
  133. System.out.println("收到了ip为:" + packet.getAddress() + " 端口号为:" + packet.getPort() + "的消息:" + rs);
  134. break;
  135. }
  136. }
  137. socket.close();
  138. }catch (Exception e){
  139. e.printStackTrace();
  140. }
  141. return "ok";
  142. }
  143. }