using JiShe.CollectBus.Common.Consts;
using JiShe.CollectBus.Common.Enums;
using JiShe.CollectBus.Common.Extensions;
using JiShe.CollectBus.Common.Models;
using JiShe.CollectBus.IotSystems.Protocols;
using JiShe.CollectBus.Protocol.Models;
using JiShe.CollectBus.Protocol.T37612012;
using JiShe.CollectBus.Protocol.T37612012.SendData;
using JiShe.CollectBus.Protocol.T6452007.SendData;
using Mapster;
using Microsoft.Extensions.Logging;
using TouchSocket.Sockets;
namespace JiShe.CollectBus.Protocol.T6452007
{
///
/// T6452007协议插件
///
public class T6452007ProtocolPlugin : T37612012ProtocolPlugin
{
private readonly ILogger _logger;
public readonly Dictionary T645ControlHandlers;
///
/// Initializes a new instance of the class.
///
/// The service provider.
public T6452007ProtocolPlugin(IServiceProvider serviceProvider, ILogger logger, ITcpService tcpService) : base(serviceProvider, logger, tcpService)
{
_logger = logger;
T645ControlHandlers = Telemetry6452007PacketBuilder.T645ControlHandlers;
}
public sealed override ProtocolInfo Info => new(nameof(T6452007ProtocolPlugin), "376.1/645-2007", "TCP", "376.1/645-2007协议", "DTS1980");
public override async Task AnalyzeAsync(ITcpSessionClient client, string messageReceived, Action? sendAction = null)
{
return null;
}
///
/// 组装报文
///
/// 报文构建参数
///
public override async Task BuildAsync(ProtocolBuildRequest request)
{
if (request == null)
{
_logger.LogError($"{nameof(ProtocolBuildResponse)} 报文构建失败,参数为空");
return new ProtocolBuildResponse();
}
var itemCodeArr = request.ItemCode.Split('_');
var aFNStr = itemCodeArr[0];
var aFN = (AFN)aFNStr.HexToDec();
var fn = int.Parse(itemCodeArr[1]);
Telemetry3761PacketResponse builderResponse = null;
List dataUnit = new List();
//数据转发场景 10H_F1
if (request.ItemCode == T37612012PacketItemCodeConst.AFN10HFN01H && request.SubProtocolRequest != null && string.IsNullOrWhiteSpace(request.SubProtocolRequest.ItemCode) == false)
{
var subItemCodeArr = request.SubProtocolRequest.ItemCode.Split("_");
var t645PacketHandlerName = $"C{subItemCodeArr[0]}_{subItemCodeArr[1]}_Send";//C1C_01_Send
Telemetry6452007PacketResponse t645PacketResponse = null;
if (T645ControlHandlers != null && T645ControlHandlers.TryGetValue(t645PacketHandlerName
, out var t645PacketHandler))
{
t645PacketResponse = t645PacketHandler(new Telemetry6452007PacketRequest()
{
MeterAddress = request.SubProtocolRequest.MeterAddress,
Password = request.SubProtocolRequest.Password,
ItemCode = request.SubProtocolRequest.ItemCode,
});
}
if (t645PacketResponse != null)
{
dataUnit = t645PacketResponse.Data;
}
}
if (aFNStr == "0D")//二类数据
{
dataUnit = Generate_DataUnit(request.DataTimeMark);
}
string afnMethonCode = $"AFN{aFNStr}_Fn_Send";
if (base.T3761AFNHandlers != null && base.T3761AFNHandlers.TryGetValue(afnMethonCode
, out var handler))
{
builderResponse = handler(new Telemetry3761PacketRequest()
{
FocusAddress = request.FocusAddress,
Fn = fn,
Pn = request.Pn,
SubRequest = request.SubProtocolRequest,
DataUnit = dataUnit,
});
}
if (builderResponse == null)
{
return new ProtocolBuildResponse();
}
var result = builderResponse.Adapt();
result.IsSuccess = true;
return await Task.FromResult(result);
}
}
}