石墨消解仪后端服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.0 KiB

  1. package com.iflytop.gd.system.models;
  2. import com.iflytop.gd.system.utils.ByteArray;
  3. import java.nio.ByteBuffer;
  4. import java.nio.ByteOrder;
  5. public class DataPacket {
  6. public static final int PACKET_TYPE_OFFSET = 0;
  7. public static final int CMDID_OFFSET = 1;
  8. public static final int MODULE_ID_OFFSET = 3;
  9. public static final int INDEX_OFFSET = 4;
  10. public static final int DATA_LEN_OFFSET = 6;
  11. public static final int DATA_OFFSET = 7;
  12. public static final int PACKET_MIN_LEN = 8;//
  13. public static final int CMD_OVERTIME = 1500;
  14. public static final int PACKET_TYPE_CMD = 0xA0;
  15. public static final int PACKET_TYPE_ACK = 0xA1;
  16. public static final int PACKET_TYPE_ERROR_ACK = 0xA2;
  17. public static final int PACKET_TYPE_EVENT = 0xA3;
  18. byte[] raw;
  19. public DataPacket(byte[] cmd) {
  20. raw = new byte[cmd.length];
  21. System.arraycopy(cmd, 0, raw, 0, cmd.length);
  22. }
  23. public String toByteString() {
  24. return ByteArray.toByteString(raw);
  25. }
  26. static public DataPacket createPacket(Integer moduleId, int packetType, Integer cmdId, Integer[] params) {
  27. int bufferSize = DataPacket.PACKET_MIN_LEN + 4 * params.length;
  28. ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
  29. buffer.order(ByteOrder.LITTLE_ENDIAN);
  30. buffer.put((byte) (packetType & 0xff)); // packetType
  31. buffer.putShort((short) (cmdId & 0xffff)); // cmdid
  32. buffer.put((byte) (moduleId & 0xFF)); // moduleId
  33. buffer.put((byte) 0x4C); // index
  34. buffer.put((byte) 0x00); // index
  35. buffer.put((byte) (params.length * 4)); // datalen
  36. for (int value : params) {
  37. buffer.putInt(value);
  38. }
  39. // int8_t checksum;
  40. int checksum = 0;
  41. for (int i = 0; i < bufferSize - 1; i++) {
  42. checksum += buffer.get(i);
  43. }
  44. buffer.put((byte) checksum);
  45. return new DataPacket(buffer.array());
  46. }
  47. public static DataPacket createCommandDataPacket(Integer moduleId, Integer cmdId, Integer... params) {
  48. return createPacket(moduleId, PACKET_TYPE_CMD, cmdId, params);
  49. }
  50. public int getPacketIndex() {
  51. return ByteArray.readU16bit(raw, INDEX_OFFSET);
  52. }
  53. public void setPacketIndex(int packetIndex) {
  54. ByteArray.setU16bit(raw, INDEX_OFFSET, packetIndex);
  55. int checkSum = computeCheckSum();
  56. ByteArray.setU8(raw, raw.length - 1, checkSum);
  57. }
  58. public int computeCheckSum() {
  59. int checkcode = 0;
  60. for (int i = 0; i < raw.length - 1; i++) {
  61. checkcode += raw[i];
  62. }
  63. return checkcode & 0xFF;
  64. }
  65. public int getCmdId() {
  66. return ByteArray.readU16bit(raw, CMDID_OFFSET);
  67. }
  68. public int getPacketType() {
  69. return ByteArray.readU8bit(raw, PACKET_TYPE_OFFSET);
  70. }
  71. public int getModuleId() {
  72. return ByteArray.readU8bit(raw, MODULE_ID_OFFSET);
  73. }
  74. public int getDataLen() {
  75. return ByteArray.readU8bit(raw, DATA_LEN_OFFSET);
  76. }
  77. }