123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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<byte[]>
- {
- public byte[] Message { get; private set; }
- public event EventHandler OnMessageCut;
- public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
- private ILogger logger = NullLogger.Instance;
- private readonly List<byte> buffer = new List<byte>();
- ///
- /// Message format:
- /// 数据长度 + 模块地址 + 命令代码 + 返回操作状态 + 模块返回的数据 + 校验字(累加和取反)
- /// LEN 本身 1 字节+模块地址 1 字节 + 命令代码 1 字节 + 数据块参数 1 字节 + 密钥值参数 6 字节 + 校验码 1 字节
- /// </summary>
- public MessageCutter(IServiceProvider services)
- {
- var loggerFactory = services.GetRequiredService<ILoggerFactory>();
- 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;
- }
- }
- }
- }
|