using Edge.Core.Processor; using Edge.Core.Parser.BinaryParser.Util; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Edge.Core.Processor.Communicator; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; namespace ShengJu_CUT100_DES { public class MessageCutter : IMessageCutter { public byte[] Message { get; private set; } public event EventHandler OnMessageCut; public event EventHandler OnInvalidMessageRead; private ILogger logger = NullLogger.Instance; private readonly List buffer = new List(); /// /// Message format: /// 数据长度 + 模块地址 + 命令代码 + 返回操作状态 + 模块返回的数据 + 校验字(累加和取反) /// LEN 本身 1 字节+模块地址 1 字节 + 命令代码 1 字节 + 数据块参数 1 字节 + 密钥值参数 6 字节 + 校验码 1 字节 /// public MessageCutter(IServiceProvider services) { var loggerFactory = services.GetRequiredService(); this.logger = loggerFactory.CreateLogger("DynamicPrivate_Comm_"); } public void Feed(byte[] next) { try { //innerLogger.Debug(this.loggerAppendix + " " + next.ToHexLogString() + " is feed in Window in state: " + nextState); for (int i = 0; i < next.Length; i++) { this.buffer.Add(next[i]); //数据长度 range from 1-0x32 if (this.buffer[0] > 0x32 || this.buffer[0] < 5) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "invalid byte[0]: 0x" + this.buffer[0].ToString("X2") + ", clear buf anyway" }); this.buffer.Clear(); } //模块地址 range from 0-256 //if (this.buffer.Count >= 2 && this.buffer[1] == 0) //{ // this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() // { // Message = "invalid byte[1]: 0x" + this.buffer[1].ToString("X2") + ", clear buf(valid byte[0]: 0x" + this.buffer[0].ToString("X2") + ") anyway" // }); // this.buffer.Clear(); //} //命令代码 range from 0x11-0xFF if (this.buffer.Count >= 3 && this.buffer[2] < 0x11) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "invalid byte[2]: 0x" + this.buffer[2].ToString("X2") + ", clear buf anyway" }); this.buffer.Clear(); } if (this.buffer.Count > 1 && this.buffer.Count == this.buffer[0]) { this.Message = this.buffer.ToArray(); var safe = this.OnMessageCut; safe?.Invoke(this, null); this.buffer.Clear(); } } } catch (Exception exx) { this.logger.LogError($"ShengJu_CUT100_DES.MessageCutter, " + $"next: 0x{next?.ToHexLogString() ?? "null"}, " + $"this.buffer: 0x{this.buffer?.ToHexLogString() ?? "null"}" + $"{Environment.NewLine}exception detail: {exx}"); throw; } } } }