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
-
+
}
}