diff --git a/JiShe.CollectBus.Common/Enums/376Enums.cs b/JiShe.CollectBus.Common/Enums/376Enums.cs index dd8e4bd..593650c 100644 --- a/JiShe.CollectBus.Common/Enums/376Enums.cs +++ b/JiShe.CollectBus.Common/Enums/376Enums.cs @@ -153,6 +153,9 @@ /// Odd } + /// + /// 数据位 + /// public enum DataBit { D5 = 0, diff --git a/JiShe.CollectBus.Common/Enums/CommandChunkEnum188.cs b/JiShe.CollectBus.Common/Enums/CommandChunkEnum188.cs new file mode 100644 index 0000000..52f107b --- /dev/null +++ b/JiShe.CollectBus.Common/Enums/CommandChunkEnum188.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JiShe.CollectBus.Common.Enums +{ + public enum CommandChunkEnum188 + { + + A = 2, + C=9, + L=10, + DI=11, + Data=14 + } +} diff --git a/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs b/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs index 39696c0..2307a9e 100644 --- a/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs +++ b/JiShe.CollectBus.Common/Extensions/HexStringExtensions.cs @@ -138,15 +138,18 @@ namespace JiShe.CollectBus.Common.Extensions var bytes = BuildSendCommandBytes(reqParameter, dataUnit); } - + /// /// 构建透明转发-下发数据单元 /// /// 终端通信端口 1~31 /// 0~7 对应300,600,1200,2400,4800,7200,9600,19200 - /// - /// - /// + /// 停止位 + /// 校验方式 + /// 数据位 + /// 等待报文超时时间/s + /// 等待字节超时时间/ms + /// 转发内容 /// public static List BuildTransparentForwardingSendDataUnit(int port, BaudRate baudRate, StopBit stopBit, Parity parity, DataBit dataBit, int waitContentTimeout, int waitByteTimeout, List datas) @@ -492,25 +495,26 @@ namespace JiShe.CollectBus.Common.Extensions /// 构建电表阀控下发数据单元 /// /// 电表地址 - /// 特殊控制码 + /// 特殊控制码 /// 密码 /// 是否为开阀 + /// 型号码 /// - public static List BuildAmmeterValveControlSendDataUnit(string address, string specialnocode, string password, bool state, string modelCode = "") + public static List BuildAmmeterValveControlSendDataUnit(string address, string specialControlCode, string password, bool state, string modelCode = "") { var code = string.Empty; if (state) { - if (string.IsNullOrEmpty(specialnocode)) + if (string.IsNullOrEmpty(specialControlCode)) code = "1B"; else - code = specialnocode == "1B" || specialnocode == "1C" ? specialnocode : "1C"; + code = specialControlCode == "1B" || specialControlCode == "1C" ? specialControlCode : "1C"; } else code = "1A";//跳闸 - if (specialnocode == "1W") + if (specialControlCode == "1W") { if (state) code = "1A"; @@ -532,12 +536,12 @@ namespace JiShe.CollectBus.Common.Extensions } var strDate = DateTime.Now.AddYears(3).ToString("000012ddMMyy").StrAddSpan();//命令有效截止时间 - if (specialnocode == "1D" || modelCode == "SZBD_DDZY1225") + if (specialControlCode == "1D" || modelCode == "SZBD_DDZY1225") strDate = "FF FF FF FF FF FF"; var strP = password.StrAddSpan().StrReverseOrder(); var strSJY = " " + pwdLevel + " " + strP + " 01 00 00 00 " + code + " 00 " + strDate; var dataUnit = strSJY.Replace(" ", "").StringToPairs(); - var dataList = BuildSendCommand(address, "1C", dataUnit); + var dataList = Build645SendCommand(address, "1C", dataUnit); return dataList; //string strLen = (strSJY.Replace(" ", "").Length / 2).ToString("X2"); @@ -552,31 +556,24 @@ namespace JiShe.CollectBus.Common.Extensions /// /// 电表地址 /// - /// + /// true 保电 false 保电解除 + /// 型号码 /// public static List BuildAmmeterLockSendDataUnit(string address, string password, bool state, string modelCode = "") { - string code = string.Empty; - if (state) - code = "3A"; - else - code = "3B"; - string strDate = (code + DateTime.Now.AddDays(1).ToString("00000012ddMMyy")).StrAddSpan(); + var code = state ? "3A" : "3B"; + + var strDate = (code + DateTime.Now.AddDays(1).ToString("00000012ddMMyy")).StrAddSpan(); if (modelCode == "SZBD_DDZY1225") strDate = $"{code} 00 FF FF FF FF FF FF"; - string strP = password.StrAddSpan().StrReverseOrder(); - string strSJY = " 02 " + strP + " 01 00 00 00 " + strDate; + var strP = password.StrAddSpan().StrReverseOrder(); + var strSJY = " 02 " + strP + " 01 00 00 00 " + strDate; var dataUnit = strSJY.Replace(" ", "").StringToPairs(); - var dataList = BuildSendCommand(address, "1C", dataUnit); + var dataList = Build645SendCommand(address, "1C", dataUnit); return dataList; - //string strLen = (strSJY.Replace(" ", "").Length / 2).ToString("X2"); - //string strReturn = "68 " + address.StrAddSpan().StrReverseOrder() + " 68 1C " + strLen + " " + strSJY.StrAddHex33() + " "; - //string strSum = strReturn.Split(new string[] { " " }, System.StringSplitOptions.RemoveEmptyEntries).Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X"); - //strReturn += strSum.Substring(strSum.Length - 2) + " 16"; - //return strReturn.Split(' ').ToList(); } /// @@ -586,19 +583,19 @@ namespace JiShe.CollectBus.Common.Extensions /// 控制码 /// 数据域 发送方按字节进行加33处理,接收方按字节减33 /// - public static List BuildSendCommand(string ammeterAddress, string controlCode, List? dataUnit) + public static List Build645SendCommand(string ammeterAddress, string controlCode, List? dataUnit) { var cmdStrList = new List(); cmdStrList.Add(startStr); ammeterAddress = ammeterAddress.PadLeft(12, '0'); - var addressList = ammeterAddress.StringToPairs(); + var addressList = ammeterAddress.StringToPairs(); addressList.Reverse(); cmdStrList.AddRange(addressList); cmdStrList.Add(startStr); - var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2,'0') : "00"; + var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2, '0') : "00"; cmdStrList.Add(len); if (dataUnit != null) { @@ -634,25 +631,75 @@ namespace JiShe.CollectBus.Common.Extensions #endregion + #region 188 下行命令 + /// /// 标准 188协议阀控 WaterMeterSend /// - /// - /// + /// + /// 表计类型 /// - public static List Confirm188WaterValve(string address, bool state, string mtype = "10") + public static List BuildConfirm188WaterValve(string waterMeterAddress, bool state, string mtype = "10") { - if (string.IsNullOrWhiteSpace(address)) return null; - var frm = $"68 {mtype} [00 00 00 00 00 00 00] 04 04 A0 17 00 {(state ? "55" : "99")} 21 16".Split(' ').ToList(); - address = address.PadLeft(14, '0'); - int n = 0; - for (int i = 7; i > 0; i--) + if (string.IsNullOrWhiteSpace(waterMeterAddress)) return null; + + var dataUnit = new List() { "A0", "17", "00", state ? "55" : "99" }; + + var dataList = Build188SendCommand(waterMeterAddress, "04", dataUnit); + + return dataList; + } + + /// + /// 构建188水表抄读下发数据单元 + /// + /// + /// + public static List Build188WaterMeterReadingSendDataUnit(string waterMeterAddress) + { + //TODO:90 1F 还是1F 90 + var dataUnit = new List() { "90", "1F", "00" }; + var dataList = Build188SendCommand(waterMeterAddress, "01", dataUnit); + + return dataList; + } + + + /// + /// 构建188协议下发命令 + /// + /// 水表地址 + /// 控制码 + /// 数据域 + /// 表类型 + /// + public static List Build188SendCommand(string waterMeterAddress, string controlCode, List? dataUnit = null, string meterType = "10") + { + var cmdStrList = new List(); + cmdStrList.Add(startStr); + cmdStrList.Add(meterType); + + waterMeterAddress = waterMeterAddress.PadLeft(14, '0'); + var addressList = waterMeterAddress.StringToPairs(); + addressList.Reverse(); + cmdStrList.AddRange(addressList); + + //控制码 + cmdStrList.Add(controlCode); + + var len = dataUnit != null ? dataUnit.Count.DecToHex().PadLeft(2, '0') : "00"; + cmdStrList.Add(len); + if (dataUnit != null) { - frm[i + 1] = address.Substring(n, 2); - n += 2; + cmdStrList.AddRange(dataUnit); } - frm[frm.Count - 2] = GetCRC(frm.Take(frm.Count - 2).ToList()); - return frm; + + var strSum = cmdStrList.Select(i => Convert.ToInt32(i, 16)).Sum().ToString("X"); + strSum = strSum.Substring(strSum.Length - 2); + cmdStrList.Add(strSum); + cmdStrList.Add(endStr); + + return cmdStrList; } public static string GetCRC(List inputFrm, int startIndex = 0) @@ -666,5 +713,45 @@ namespace JiShe.CollectBus.Common.Extensions return sum16.Substring(sum16.Length - 2, 2).ToUpper(); } + public static object GetAnalyzeValue(this List hexStringList, CommandChunkEnum188 chunk) + { + if (hexStringList.Count < 11) + { + return null; + } + + switch (chunk) + { + case CommandChunkEnum188.A: + var aHexList = hexStringList[(int)CommandChunkEnum188.A].Take(7).ToList(); + aHexList.Reverse(); + return string.Join("", aHexList.Skip(1).Take(6).ToList()); + case CommandChunkEnum188.C: + var cHex = hexStringList[(int)CommandChunkEnum188.C]; + return cHex; + case CommandChunkEnum188.Data: + var lenIndex = (int)CommandChunkEnum188.L; + var len = hexStringList[lenIndex].HexToDec(); + + //验证长度 2=(帧校验和+结束字符) + if (hexStringList.Count - 2 != 11 + len) + return null; + + var dataHexList = hexStringList.Skip(11).Take(len).ToList(); + return dataHexList; + default: + throw new ArgumentOutOfRangeException(nameof(chunk), chunk, null); + } + } + + //public double AnalyzeCurrentTotalRate(List hexList) + //{ + // var str = string.Join("", hexList); + // var number = Convert.ToInt32(str) * 0.01; + // return number; + //} + + #endregion + } } diff --git a/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs b/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs index ea61aec..6243016 100644 --- a/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs +++ b/JiShe.CollectBus.Protocol.Contracts/Abstracts/BaseProtocolPlugin.cs @@ -629,7 +629,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts #endregion - + } }