using FreeSql; using JiShe.CollectBus.Common.BuildSendDatas; using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.Common.Models; using System.Reflection; namespace JiShe.CollectBus.Protocol.SendData { /// /// 构建645-2007下发报文 /// public static class Telemetry645PacketBuilder { /// /// 构建报文的委托 /// /// /// public delegate Telemetry645PacketResponse T645Delegate(Telemetry645PacketRequest request); /// /// 编码与方法的映射表 /// public static readonly Dictionary T645ControlHandlers = new(); static Telemetry645PacketBuilder() { // 初始化时自动注册所有符合命名规则的方法 var methods = typeof(Telemetry645PacketBuilder).GetMethods(BindingFlags.Static | BindingFlags.Public); foreach (var method in methods) { if (method.Name.StartsWith("C") && method.Name.EndsWith("_Send")) { string code = method.Name; var delegateInstance = (T645Delegate)Delegate.CreateDelegate(typeof(T645Delegate), method); T645ControlHandlers[code] = delegateInstance; } } } #region 1CH 跳合闸、报警、保电 /// /// 1CH 跳合闸 /// /// /// public static Telemetry645PacketResponse C1C_01_Send(Telemetry645PacketRequest request) { var itemCodeArr = request.ItemCode.Split('_'); var c_data = itemCodeArr[0]; var n_data = itemCodeArr[1]; string password = request.Password; string pwdLevel = "02"; if (!string.IsNullOrWhiteSpace(password) && password.Contains("|")) { var sp = password.Split('|'); password = sp[0]; pwdLevel = sp[1]; } var strDate = DateTime.Now.AddYears(3).ToString("000012ddMMyy").StrAddSpan();//命令有效截止时间 var strP = password.StrAddSpan().StrReverseOrder(); var strSJY = " " + pwdLevel + " " + strP + " 01 00 00 00 " + n_data + " 00 " + strDate; var dataUnit = strSJY.Replace(" ", "").StringToPairs(); var dataList = Build645SendData.Build645SendCommand(request.MeterAddress, c_data, dataUnit); return new Telemetry645PacketResponse() { Data = dataList }; } /// /// 1CH 保电 /// /// /// public static Telemetry645PacketResponse C1C_03_Send(Telemetry645PacketRequest request) { var itemCodeArr = request.ItemCode.Split('_'); var c_data = itemCodeArr[0]; var n_data = itemCodeArr[1]; string password = request.Password; if (!string.IsNullOrWhiteSpace(password) && password.Contains("|")) { var sp = password.Split('|'); password = sp[0]; } var strDate = (n_data + DateTime.Now.AddDays(1).ToString("00000012ddMMyy")).StrAddSpan(); var strP = password.StrAddSpan().StrReverseOrder(); var strSJY = " 02 " + strP + " 01 00 00 00 " + strDate; var dataUnit = strSJY.Replace(" ", "").StringToPairs(); var dataList = Build645SendData.Build645SendCommand(request.MeterAddress, c_data, dataUnit); return new Telemetry645PacketResponse() { Data = dataList }; } #endregion } }