CommonMessage.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using Edge.Core.Parser;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. namespace HengshanPaymentTerminal.MessageEntity
  4. {
  5. /// <summary>
  6. /// 与油机通讯的基础数据包对象
  7. /// </summary>
  8. public abstract class CommonMessage: MessageTemplateBase
  9. {
  10. public enum Command
  11. {
  12. /// <summary>
  13. /// 通用应答命令字
  14. /// </summary>
  15. COMMON = 0x55,
  16. /// <summary>
  17. /// 心跳命令字
  18. /// </summary>
  19. HEART_BRET = 0x10,
  20. /// <summary>
  21. /// 油枪信息命令字
  22. /// </summary>
  23. NOZZLE_INFO = 0x61,
  24. /// <summary>
  25. /// 油枪状态命令字
  26. /// </summary>
  27. NOZZLE_STATE = 0x62,
  28. /// <summary>
  29. /// 发送二维码给油机命令字
  30. /// </summary>
  31. SEND_QR_CODE = 0x63,
  32. /// <summary>
  33. /// 获取单价命令字
  34. /// </summary>
  35. GET_PRICE = 0x64,
  36. /// <summary>
  37. /// 授权命令字
  38. /// </summary>
  39. ACCREDIT = 0x65,
  40. /// <summary>
  41. /// 取消授权命令字
  42. /// </summary>
  43. CANCEL_ACCREDIT = 0x66,
  44. /// <summary>
  45. /// 接收油机订单命令字
  46. /// </summary>
  47. RECIEVE_TRANX = 0x18,
  48. /// <summary>
  49. /// 发送应付金额给油机命令字
  50. /// </summary>
  51. SEND_NEED_AMOUNT = 0x19
  52. }
  53. /// <summary>
  54. /// 包头 0xFA
  55. /// </summary>
  56. public Byte Head { get; set; }
  57. /// <summary>
  58. /// 目标地址
  59. /// </summary>
  60. public Byte DestinationAddr { get; set; }
  61. /// <summary>
  62. /// 源地址
  63. /// </summary>
  64. public Byte SourceAddr { get; set; }
  65. /// <summary>
  66. /// 帧号
  67. /// </summary>
  68. public int FrameNum { get; set; }
  69. /// <summary>
  70. /// 有效数据长度,标识油机数据包中,有效数据的长度
  71. /// </summary>
  72. public int DataLength { get; set; }
  73. /// <summary>
  74. /// 命令字,用来标识数据包传递的数据
  75. /// </summary>
  76. public Byte Handle { get; set; }
  77. /// <summary>
  78. /// crc 校验值
  79. /// </summary>
  80. public Byte[] CRC { get; set; }
  81. public CommonMessage getBaseData(byte[] data)
  82. {
  83. this.Handle = data[0];
  84. this.DestinationAddr = data[1];
  85. this.SourceAddr = data[2];
  86. this.FrameNum = data[3];
  87. this.DataLength = Bcd2Int(data[4], data[5]);
  88. this.Handle = data[6];
  89. this.CRC = new byte[]{ data[data.Length - 2],data[data.Length - 1] };
  90. return this;
  91. }
  92. /// <summary>
  93. /// 传入有效数据,拼接为要发送给油机包
  94. /// </summary>
  95. /// <param name="content"></param>
  96. /// <returns></returns>
  97. public byte[] content2data(byte[] content)
  98. {
  99. List<byte> list = new List<byte>();
  100. //目标地址,源地址,帧号
  101. byte[] head = new byte[] { this.SourceAddr, this.DestinationAddr, (byte)this.FrameNum };
  102. byte[] length = Int2BCD(content.Length);
  103. list.AddRange(head);
  104. list.AddRange(length);
  105. list.AddRange(content);
  106. byte[] crc = HengshanCRC16.ComputeChecksumToBytes(list.ToArray());
  107. list.AddRange(crc);
  108. List<byte> addFAList = addFA(list);
  109. addFAList.Insert(0,0xFA);
  110. return addFAList.ToArray();
  111. }
  112. public int Bcd2Int(byte byte1, byte byte2)
  113. {
  114. // 提取第一个字节的高四位和低四位
  115. int digit1 = (byte1 >> 4) & 0x0F; // 高四位
  116. int digit2 = byte1 & 0x0F; // 低四位
  117. // 提取第二个字节的高四位和低四位
  118. int digit3 = (byte2 >> 4) & 0x0F; // 高四位
  119. int digit4 = byte2 & 0x0F; // 低四位
  120. // 组合成一个整数
  121. int result = digit1 * 1000 + digit2 * 100 + digit3 * 10 + digit4;
  122. return result;
  123. }
  124. public byte[] Int2BCD(int number)
  125. {
  126. // 提取千位、百位、十位和个位
  127. int thousands = number / 1000;
  128. int hundreds = (number / 100) % 10;
  129. int tens = (number / 10) % 10;
  130. int units = number % 10;
  131. // 将千位和百位组合成一个字节(千位在高四位,百位在低四位)
  132. byte firstByte = (byte)((thousands * 16) + hundreds); // 乘以16相当于左移4位
  133. // 将十位和个位组合成一个字节(十位在高四位,个位在低四位)
  134. byte secondByte = (byte)((tens * 16) + units);
  135. // 返回结果数组
  136. return new byte[] { firstByte, secondByte };
  137. }
  138. public List<Byte> addFA(List<Byte> list)
  139. {
  140. List<byte> result = new List<byte>();
  141. foreach (byte b in list)
  142. {
  143. if (b == 0xFA)
  144. {
  145. result.Add(0xFA);
  146. result.Add(0xFA);
  147. }
  148. else
  149. {
  150. result.Add(b);
  151. }
  152. }
  153. return result;
  154. }
  155. }
  156. }