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