using DotNetty.Buffers; using DotNetty.Codecs; using DotNetty.Transport.Channels; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; using JT808.Protocol; using JT808.DotNetty.Internal; using JT808.DotNetty.Interfaces; namespace JT808.DotNetty.Codecs { /// /// JT808解码 /// internal class JT808Decoder : ByteToMessageDecoder { private readonly ILogger logger; private readonly IJT808SourcePackageDispatcher jT808SourcePackageDispatcher; private readonly JT808AtomicCounterService jT808AtomicCounterService; public JT808Decoder( JT808AtomicCounterService jT808AtomicCounterService, IJT808SourcePackageDispatcher jT808SourcePackageDispatcher, ILoggerFactory loggerFactory) { this.jT808AtomicCounterService = jT808AtomicCounterService; this.logger = loggerFactory.CreateLogger(); this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher; } protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output) { byte[] buffer = new byte[input.Capacity + 2]; try { input.ReadBytes(buffer, 1, input.Capacity); buffer[0] = JT808Package.BeginFlag; buffer[input.Capacity + 1] = JT808Package.EndFlag; jT808SourcePackageDispatcher?.SendAsync(buffer); JT808Package jT808Package = JT808Serializer.Deserialize(buffer); output.Add(jT808Package); jT808AtomicCounterService.MsgSuccessIncrement(); if (logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); } } catch (JT808.Protocol.Exceptions.JT808Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + buffer); } } catch (Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + buffer); } } } } }