From f98212a550df69743626ed857a88ede32700fcb6 Mon Sep 17 00:00:00 2001
From: Dai Mr <1822802785@qq.com>
Date: Wed, 6 Nov 2024 16:48:44 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E8=A7=A3=E6=9E=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Enums/CommandChunkEnum.cs | 2 +
.../Extensions/HexStringExtensions.cs | 8 +-
.../Abstracts/BaseProtocolPlugin.cs | 145 ++++++++++++++++++
.../Models/ReqParameter.cs | 2 +-
.../StandardProtocolPlugin.cs | 2 +
5 files changed, 157 insertions(+), 2 deletions(-)
diff --git a/JiShe.CollectBus.Common/Enums/CommandChunkEnum.cs b/JiShe.CollectBus.Common/Enums/CommandChunkEnum.cs
index 55e02fa..2cf8d40 100644
--- a/JiShe.CollectBus.Common/Enums/CommandChunkEnum.cs
+++ b/JiShe.CollectBus.Common/Enums/CommandChunkEnum.cs
@@ -6,10 +6,12 @@ namespace JiShe.CollectBus.Common.Enums
{
public enum CommandChunkEnum
{
+ Len = 1,
C = 6,
A = 7,
AFN = 12,
SEQ = 13,
FN = 17,
+ Data = 18,
}
}
diff --git a/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs b/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs
index f223188..8e394a7 100644
--- a/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs
+++ b/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs
@@ -34,7 +34,7 @@ namespace JiShe.CollectBus.Common.Extensions
}
switch (chunk)
- {
+ {
case CommandChunkEnum.AFN:
var aFn = hexStringList[(int)CommandChunkEnum.AFN].HexToDec();//1字节
return aFn;
@@ -68,6 +68,12 @@ namespace JiShe.CollectBus.Common.Extensions
PRSEQ = prseqBin.BinToDec(),
TpV = tpV
};
+ case CommandChunkEnum.Data:
+ var lenIndex = (int)CommandChunkEnum.Len;
+ var lenBin = (hexStringList[lenIndex + 1]+hexStringList[lenIndex]).HexToBin();
+ var len = lenBin.Remove(lenBin.Length - 2).BinToDec();
+ var dataHexList = hexStringList.Skip(FixedLength).Take(len + hearderLen - FixedLength).ToList();
+ return dataHexList;
default:
throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null);
}
diff --git a/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs b/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs
index 7df62a8..aaa99ce 100644
--- a/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs
+++ b/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs
@@ -4,6 +4,7 @@ using JiShe.CollectBus.Common.Models;
using JiShe.CollectBus.Protocol.Contracts.Interfaces;
using JiShe.CollectBus.Protocol.Contracts.Models;
using Microsoft.Extensions.Logging;
+using System.Net.Sockets;
namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
{
@@ -103,7 +104,151 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
}
}
+ ///
+ /// 确认或否认
+ ///
+ ///
+ ///
+ public virtual async Task AnswerAsync(MessageReceivedHeartbeatEvent messageReceivedEvent, Action? sendAction = null)
+ {
+ var hexStringList = messageReceivedEvent.MessageHexString.StringToPairs();
+ var fn = hexStringList.GetAnalyzeValue(CommandChunkEnum.FN);
+ //1:全部确认
+ //2:全部否认
+ //3:按数据单元表示确认和否认
+ //4 硬件安全认证错误应答
+ }
+ ///
+ /// 电表档案解析
+ ///
+ ///
+ ///
+ ///
+ public virtual async Task AmmeterParameterAsync(MessageReceivedHeartbeatEvent messageReceivedEvent, Action? sendAction = null)
+ {
+ var hexStringList = messageReceivedEvent.MessageHexString.StringToPairs();
+ var hexDatas = (List)hexStringList.GetAnalyzeValue(CommandChunkEnum.Data);
+
+ var meterList = new List();
+ var count = (hexDatas[1] + hexDatas[0]).HexToDec();
+ //if (2 + count * 27 != hexDatas.Count - pWLen - tPLen - 2)
+ // return;
+ var index = 2;//数量
+ for (int i = 1; i <= count; i++)
+ {
+ var meterNumber = $"{hexDatas[index + 1]}{hexDatas[index]}".HexToDec();
+ index += 2;
+
+ var pn = $"{hexDatas[index + 1]}{hexDatas[index]}".HexToDec();
+ index += 2;
+
+ var baudRateAndPortBin = hexDatas[index].HexToBin().PadLeft(8, '0');
+ var baudRate = baudRateAndPortBin.Substring(0, 3).BinToDec();
+ var port = baudRateAndPortBin.Substring(3, 5).BinToDec();
+ index += 1;
+
+ var protocolType = (CommunicationProtocolType)hexDatas[index].HexToDec();
+ index += 1;
+
+ var addressHexList = hexDatas.Skip(index).Take(6).ToList();
+ addressHexList.Reverse();
+ var address = string.Join("", addressHexList);
+ index += 6;
+
+ var pwdHexList = hexDatas.Skip(index).Take(6).ToList();
+ pwdHexList.Reverse();
+ var password = string.Join("", pwdHexList.Take(3).ToList());
+ index += 6;
+
+ var rateNumberBin = hexDatas[index].HexToBin().PadLeft(8, '0');
+ var rateNumber = rateNumberBin.Substring(4).BinToDec();
+ index += 1;
+
+ var intBitAndDecBitNumberBin = hexDatas[index].HexToBin().PadLeft(8, '0');
+ var intBitNumber = intBitAndDecBitNumberBin.Substring(4, 2).BinToDec() + 4;
+ var decBitNumber = intBitAndDecBitNumberBin.Substring(6, 2).BinToDec() + 1;
+ index += 1;
+
+ // hexDatas.GetRange()
+ var collectorAddressHexList = hexDatas.Skip(index).Take(6).ToList();
+ collectorAddressHexList.Reverse();
+ var collectorAddress = string.Join("", collectorAddressHexList);
+ index += 6;
+
+ var userClassNumberBin = hexDatas[index].HexToBin().PadLeft(8, '0');
+ var userClass = userClassNumberBin.Substring(0, 4).BinToDec();
+ var userSubClass = userClassNumberBin.Substring(4, 4).BinToDec();
+ index += 1;
+
+ meterList.Add(new AmmeterParameter()
+ {
+ Pn = pn,
+ BaudRate = baudRate,
+ Port = port,
+ ProtocolType = protocolType,
+ Address = address,
+ Password = password,
+ RateNumber = rateNumber,
+ IntegerBitNumber = intBitNumber,
+ DecimalBitNumber = decBitNumber,
+ CollectorAddress = collectorAddress,
+ UserCategoryNumber = userClass,
+ UserSubclassNumber = userSubClass,
+ });
+ }
+
+ }
+
+ ///
+ /// 当前正向有功电能示值
+ ///
+ /// 报文
+ /// 发送委托
+ ///
+ public virtual async Task ActivePowerIndicationAsync(MessageReceivedHeartbeatEvent messageReceivedEvent, Action? sendAction = null)
+ {
+ var hexStringList = messageReceivedEvent.MessageHexString.StringToPairs();
+ var hexDatas = (List)hexStringList.GetAnalyzeValue(CommandChunkEnum.Data);
+
+ var minutes = Convert.ToInt32(hexDatas[0]); // 获取当前分钟数
+ var hours = Convert.ToInt32(hexDatas[1]); // 获取当前小时数
+ var day = Convert.ToInt32(hexDatas[2]); // 获取当前日期的日数
+ var month = Convert.ToInt32(hexDatas[3]); // 获取当前月份
+ var year = Convert.ToInt32(hexDatas[4]); // 获取当前日期的年份
+
+ var rateNumber = Convert.ToInt32(hexDatas[5]);
+ var kwhTotal = hexDatas.Skip(5).Take(5).ToList();
+ var kwhList = new List();
+ var index = 11;
+ for (int i = 0; i < rateNumber; i++)
+ {
+ var kwhHexList = hexDatas.Skip(11).Take(5).ToList();
+ kwhHexList.Reverse();
+ var integerStr = $"{kwhHexList.Take(0)}{kwhHexList.Take(1)}{kwhHexList.Take(2)}";
+ var decimalValStr = $"{kwhHexList[3]}{kwhHexList[4]}";
+ var val = decimal.Parse($"{integerStr}{decimalValStr}");
+ kwhList.Add(val);
+ index += 5;
+ }
+ }
+
+ ///
+ /// 日冻结正向有功电能示值
+ ///
+ ///
+ ///
+ ///
+ public virtual async Task DailyFrozenAsync(MessageReceivedHeartbeatEvent messageReceivedEvent, Action? sendAction = null)
+ {
+ var hexStringList = messageReceivedEvent.MessageHexString.StringToPairs();
+ var hexDatas = (List)hexStringList.GetAnalyzeValue(CommandChunkEnum.Data);
+
+
+ }
+ //TODO:F17 当前总加有功功率 附录A.2 kw 2字节
+ //F18 当前总加无功功率 附录A.2 kvar 2字节
+ //F25 161
#region 通用解析
public byte[] GetCommandBytes(ReqParameter reqParameter, List? dataUnit = null)
diff --git a/JiShe.CollectBus.Protocol.Contracts/Models/ReqParameter.cs b/JiShe.CollectBus.Protocol.Contracts/Models/ReqParameter.cs
index dfee33e..6e3b881 100644
--- a/JiShe.CollectBus.Protocol.Contracts/Models/ReqParameter.cs
+++ b/JiShe.CollectBus.Protocol.Contracts/Models/ReqParameter.cs
@@ -32,7 +32,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Models
public int Fn { get; set; }
}
- public class MeterParameter
+ public class AmmeterParameter
{
///
/// 测量点号 0~2040 为0被删除
diff --git a/JiShe.CollectBus.Protocol/StandardProtocolPlugin.cs b/JiShe.CollectBus.Protocol/StandardProtocolPlugin.cs
index a9c30b7..5ce30e4 100644
--- a/JiShe.CollectBus.Protocol/StandardProtocolPlugin.cs
+++ b/JiShe.CollectBus.Protocol/StandardProtocolPlugin.cs
@@ -48,6 +48,8 @@ namespace JiShe.CollectBus.Protocol
await base.HeartbeatAsync(messageReceivedEvent, SendAction);
}
+
+
#region 上行命令
//68