using DotNetty.Buffers; using DotNetty.Codecs; using DotNetty.Transport.Channels; using HybirdFrameworkCore.Utils; using log4net; using Newtonsoft.Json; using Service.WaterCool.Msg; using Service.WaterCool.Msg.WaterCool; namespace Service.WaterCool.Codec; public class Decoder : ByteToMessageDecoder { private static readonly ILog Log = LogManager.GetLogger(typeof(Decoder)); private readonly int _fixedLength = 13; protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output) { if (_fixedLength <= input.ReadableBytes) { byte[] bytes = new byte[_fixedLength - 1]; input.SkipBytes(1); input.ReadBytes(bytes); Log.Info($"receive {BitUtls.BytesToHexStr(bytes)}"); int id = BitConverter.ToInt32(new byte[] { bytes[3], bytes[2], bytes[1], bytes[0] }, 0); BaseMsg baseMsg = id switch { 0x18FFC13A => ModelConvert.Decode(bytes), _ => throw new InvalidOperationException("This should never be reached"), }; Log.Info($"receive={BitUtls.BytesToHexStr(bytes)}, msg={JsonConvert.SerializeObject(baseMsg)}"); output.Add(baseMsg); } } }