using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JiShe.CollectBus.Common.BuildSendDatas { public static class Build188SendData { //起始字符 private const string startStr = "68"; //结束字符 private const string endStr = "16"; #region 188 下行命令 /// /// 标准 188协议阀控 /// /// /// 表计类型 /// public static List BuildConfirm188WaterValve(string waterMeterAddress, bool state, string mtype = "10") { 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) { var dataUnit = new List() { "1F", "90", "00" }; var dataList = Build188SendCommand(waterMeterAddress, "01", dataUnit); return dataList; } /// /// 构建188协议下发命令 /// /// 水表地址 /// 控制码 /// 数据域 /// 表类型 /// public static List Build188SendCommand(string waterMeterAddress, string controlCode, List? dataUnit = null, string meterType = "10") { //address.Substring(address.Length - 12, 12) 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) { cmdStrList.AddRange(dataUnit); } 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; } /// /// 组装水表阀控 /// /// 水表地址 /// The password. /// The poprotocol. /// if set to true [isopenvalve]. /// public static List? WaterMeterValveControl(string waterMeterAddress, string password, int protocol, bool state) { List? turnData = null; if (protocol == 1) turnData = GetControlCode97(waterMeterAddress.Substring(waterMeterAddress.Length - 12, 12), password, state ? "3355" : "9966");//开阀/关阀 else if (protocol == 30) turnData = GetControlCode07(waterMeterAddress.Substring(waterMeterAddress.Length - 12, 12), password, state ? "3355" : "9966");//开阀/关阀 return turnData; } private static List GetControlCode97(string waterMeterAddress, string password, string valueCode) { var dataList = new List(); var passwordList = password.StringToPairs(); passwordList.Reverse(); var valueCodeList = valueCode.StringToPairs(); valueCodeList.Reverse(); dataList.AddRange(valueCodeList); dataList.AddRange(passwordList); dataList.AddRange(valueCodeList); return GetCode(waterMeterAddress, "04", dataList); } private static List GetControlCode07(string waterMeterAddress, string password, string valueCode) { var dataList = new List(); dataList.Add("02"); var passwordList = password.StringToPairs(); passwordList.Reverse(); dataList.AddRange(passwordList); dataList.AddRange("01000000".StringToPairs()); dataList.AddRange(valueCode.StringToPairs()); dataList.Add("00"); var time = DateTime.Now.AddDays(1).ToString("yyMMddHHmmss"); var timeList = time.StringToPairs(); timeList.Reverse(); dataList.AddRange(timeList); return GetCode(waterMeterAddress, "1C", dataList); } public static List GetCode(string waterMeterAddress, string controlCode, List childDataList) { var dataList = new List { startStr }; waterMeterAddress = waterMeterAddress.PadLeft(12, '0'); var addressList = waterMeterAddress.StringToPairs(); addressList.Reverse(); dataList.AddRange(addressList); dataList.Add(startStr); dataList.Add(controlCode); var num = childDataList.Count; dataList.Add(num.ToString("X2")); dataList.AddRange(childDataList.AddHex33()); var cs = dataList.Select(it => Convert.ToInt32(it, 16)).Sum().ToString("X2"); cs = cs.Substring(cs.Length - 2, 2); dataList.Add(cs); dataList.Add(endStr); return dataList; } 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 } }