MessageCutter.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Edge.Core.Processor;
  2. using Edge.Core.Parser.BinaryParser.Util;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using Edge.Core.Processor.Communicator;
  10. using Microsoft.Extensions.DependencyInjection;
  11. using Microsoft.Extensions.Logging;
  12. using Microsoft.Extensions.Logging.Abstractions;
  13. namespace ShengJu_CUT100_DES
  14. {
  15. public class MessageCutter : IMessageCutter<byte[]>
  16. {
  17. public byte[] Message { get; private set; }
  18. public event EventHandler OnMessageCut;
  19. public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
  20. private ILogger logger = NullLogger.Instance;
  21. private readonly List<byte> buffer = new List<byte>();
  22. ///
  23. /// Message format:
  24. /// 数据长度 + 模块地址 + 命令代码 + 返回操作状态 + 模块返回的数据 + 校验字(累加和取反)
  25. /// LEN 本身 1 字节+模块地址 1 字节 + 命令代码 1 字节 + 数据块参数 1 字节 + 密钥值参数 6 字节 + 校验码 1 字节
  26. /// </summary>
  27. public MessageCutter(IServiceProvider services)
  28. {
  29. var loggerFactory = services.GetRequiredService<ILoggerFactory>();
  30. this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_");
  31. }
  32. public void Feed(byte[] next)
  33. {
  34. try
  35. {
  36. //innerLogger.Debug(this.loggerAppendix + " " + next.ToHexLogString() + " is feed in Window in state: " + nextState);
  37. for (int i = 0; i < next.Length; i++)
  38. {
  39. this.buffer.Add(next[i]);
  40. //数据长度 range from 1-0x32
  41. if (this.buffer[0] > 0x32 || this.buffer[0] < 5)
  42. {
  43. this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
  44. {
  45. Message = "invalid byte[0]: 0x" + this.buffer[0].ToString("X2") + ", clear buf anyway"
  46. });
  47. this.buffer.Clear();
  48. }
  49. //模块地址 range from 0-256
  50. //if (this.buffer.Count >= 2 && this.buffer[1] == 0)
  51. //{
  52. // this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
  53. // {
  54. // Message = "invalid byte[1]: 0x" + this.buffer[1].ToString("X2") + ", clear buf(valid byte[0]: 0x" + this.buffer[0].ToString("X2") + ") anyway"
  55. // });
  56. // this.buffer.Clear();
  57. //}
  58. //命令代码 range from 0x11-0xFF
  59. if (this.buffer.Count >= 3
  60. && this.buffer[2] < 0x11)
  61. {
  62. this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
  63. {
  64. Message = "invalid byte[2]: 0x" + this.buffer[2].ToString("X2") + ", clear buf anyway"
  65. });
  66. this.buffer.Clear();
  67. }
  68. if (this.buffer.Count > 1 && this.buffer.Count == this.buffer[0])
  69. {
  70. this.Message = this.buffer.ToArray();
  71. var safe = this.OnMessageCut;
  72. safe?.Invoke(this, null);
  73. this.buffer.Clear();
  74. }
  75. }
  76. }
  77. catch (Exception exx)
  78. {
  79. this.logger.LogError($"ShengJu_CUT100_DES.MessageCutter, " +
  80. $"next: 0x{next?.ToHexLogString() ?? "null"}, " +
  81. $"this.buffer: 0x{this.buffer?.ToHexLogString() ?? "null"}" +
  82. $"{Environment.NewLine}exception detail: {exx}");
  83. throw;
  84. }
  85. }
  86. }
  87. }