107 lines
3.8 KiB
C#
107 lines
3.8 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 构建645-2007下发报文
|
|
/// </summary>
|
|
public static class Telemetry645PacketBuilder
|
|
{
|
|
/// <summary>
|
|
/// 构建报文的委托
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <returns></returns>
|
|
public delegate Telemetry645PacketResponse T645Delegate(Telemetry645PacketRequest request);
|
|
|
|
/// <summary>
|
|
/// 编码与方法的映射表
|
|
/// </summary>
|
|
public static readonly Dictionary<string, T645Delegate> 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 跳合闸、报警、保电
|
|
|
|
/// <summary>
|
|
/// 1CH 跳合闸
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <returns></returns>
|
|
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 };
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 1CH 保电
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <returns></returns>
|
|
public static Telemetry645PacketResponse C1C_02_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
|
|
}
|
|
}
|