From fa6bcb2e9907772480f99205f36ec2a1ce735a22 Mon Sep 17 00:00:00 2001 From: 黄学彪 <hxb@hdlchina.com.cn> Date: 星期四, 09 一月 2020 14:11:07 +0800 Subject: [PATCH] 合并代码 --- ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs | 636 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 635 insertions(+), 1 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs index 888db58..2b57c17 100755 --- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs +++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAirConditionerLogic.cs @@ -1,4 +1,5 @@ -锘縰sing System; +锘縰sing Newtonsoft.Json.Linq; +using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; @@ -151,6 +152,47 @@ #endregion + #region 鈻� 璁剧疆鍚敤绌鸿皟鐨勬憜椋庡姛鑳絖____________ + + /// <summary> + /// 璁剧疆鍚敤绌鸿皟鐨勬憜椋庡姛鑳� + /// </summary> + /// <param name="device">绌鸿皟瀵硅薄</param> + /// <param name="data">浠庝簩杩涘埗杞崲鐨勫崄杩涘埗鍊�</param> + /// <returns></returns> + public async Task<bool> SetUseAcSwingFunctionStatu(AC device, int data) + { + var result = await HdlDeviceAttributeLogic.Current.WriteDeviceAttribute(device, 514, 4097, 25, data.ToString()); + //妫�娴嬬綉鍏宠繑鍥炵殑鍏遍�氶敊璇姸鎬佺爜 + string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); + if (error != null) + { + this.ShowTipMsg(error); + return false; + } + if (result == null || result.setWritableValueResponData == null) + { + //璁剧疆绌鸿皟鎽嗛澶辫触 + string msg = Language.StringByID(R.MyInternationalizationString.uSetAirConditionerSwingFunctionFail); + //鎷兼帴涓娿�愮綉鍏冲洖澶嶈秴鏃躲�戠殑Msg + msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); + this.ShowTipMsg(msg); + return false; + } + if (result.setWritableValueResponData.Status != 0) + { + //璁剧疆绌鸿皟鎽嗛澶辫触 + string msg = Language.StringByID(R.MyInternationalizationString.uSetAirConditionerSwingFunctionFail); + this.ShowTipMsg(msg); + return false; + } + await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(device, GatewayBackupEnum.A绌鸿皟鎽嗛鍔熻兘, data); + + return true; + } + + #endregion + #region 鈻� 涓�鑸柟娉昣__________________________ /// <summary> @@ -180,5 +222,597 @@ } #endregion + + + #region 鈻� 鍗囩骇绌鸿皟绗笁鏂规ā鍧楃殑鎺ュ彛___________ + + #region 璇诲彇IRACC妯″潡鍥轰欢鐗堟湰锛圓PP -> Zigbee MCU锛� + ///<summary > + ///璇诲彇IRACC妯″潡鍥轰欢鐗堟湰 + /// </summary> + public async System.Threading.Tasks.Task<ReadACFirewareVersionResponAllData> ReadACFirewareVersionAsync(CommonDevice device) + { + ReadACFirewareVersionResponAllData result = null; + var Gateway = device.Gateway; + if (Gateway == null) + { + result = new ReadACFirewareVersionResponAllData { errorMessageBase = "褰撳墠娌℃湁缃戝叧" }; + return result; + } + return await System.Threading.Tasks.Task.Run(async () => + { + Action<string, string> action = (topic, message) => + { + var gatewayID = topic.Split('/')[0]; + var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); + + if (topic == gatewayID + "/" + "ZbDataPassthrough") + { + var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") }; + gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ClientDataPassthroughResponseData>(jobject["Data"].ToString()); + + if (gatewayTemp.clientDataPassthroughResponseData == null) + { + result = new ReadACFirewareVersionResponAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" }; + } + else + { + if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) + { + var data = gatewayTemp.clientDataPassthroughResponseData.PassData; + var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); + if (command == "0259") + { + var tempD = new ReadACFirewareVersionResponData(); + tempD.Status = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16); + if (data.Length == 82) + { + var firewareString = data.Substring(12); + var aa = firewareString.Length; + firewareVersion = firewareString; + var bytes = new byte[firewareString.Length / 2]; + for (int i = 0; i < bytes.Length; i++) + { + bytes[i] = Convert.ToByte(firewareString.Substring(i * 2, 2), 16); + } + + var firewareVersionTemp = System.Text.Encoding.ASCII.GetString(bytes); + tempD.FirewareVersion = firewareVersionTemp.Replace('\0', ' ').Trim(); + } + result = new ReadACFirewareVersionResponAllData { readACFirewareVersionResponData = tempD }; + System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0258_{topic}"); + } + } + } + } + }; + + Gateway.Actions += action; + System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString()); + + try + { + var passData = ReadACFirewareVersionData("01"); + var jObject = new JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; + var data = new JObject { { "PassData", passData } }; + jObject.Add("Data", data); + Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); + } + catch { } + + var dateTime = DateTime.Now; + while ((DateTime.Now - dateTime).TotalMilliseconds < 3000) + { + await System.Threading.Tasks.Task.Delay(10); + if (result != null) + { + break; + } + } + if ((DateTime.Now - dateTime).TotalMilliseconds > 3000) + { + result = new ReadACFirewareVersionResponAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" }; + } + Gateway.Actions -= action; + System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString()); + + return result; + }); + } + + /// <summary> + /// 璇诲彇IRACC妯″潡鍥轰欢鐗堟湰 + /// </summary> + string ReadACFirewareVersionData(string reserve) + { + string data = ""; + string dataLength = "05"; + string dataComand1 = "58"; + string dataComand2 = "02"; + string dataSerialNum = "01"; + string addDataLength = "01"; + string reserveData = reserve; + + try + { + data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + + reserveData; + } + catch { }; + + return data; + } + + /// <summary> + /// IRACC妯″潡鍥轰欢鐗堟湰,缃戝叧鍙嶉淇℃伅 + /// </summary> + public ReadACFirewareVersionResponAllData readACFirewareVersionResponAllData; + /// <summary> + /// IRACC妯″潡鍥轰欢鐗堟湰,缃戝叧鍙嶉淇℃伅 + /// </summary> + [System.Serializable] + public class ReadACFirewareVersionResponAllData + { + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public string errorMessageBase; + /// <summary> + /// 缃戝叧淇℃伅閿欒鍙嶉 + /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para> + /// </summary> + public CommonDevice.ErrorResponData errorResponData; + /// <summary> + /// IRACC妯″潡鍥轰欢鐗堟湰淇℃伅 + /// </summary> + public ReadACFirewareVersionResponData readACFirewareVersionResponData; + } + + /// <summary> + /// IRACC妯″潡鍥轰欢鐗堟湰鐨勬暟鎹� + /// </summary> + [System.Serializable] + public class ReadACFirewareVersionResponData + { + /// <summary> + /// 鐘舵�� + ///<para>0--鎴愬姛</para> + ///<para>1--澶辫触</para> + ///<para>ff--鏃犳晥</para> + /// </summary> + public int Status; + /// <summary> + /// 鍥轰欢鐗堟湰 + /// </summary> + public string FirewareVersion; + } + #endregion + + #region 鍗囩骇IRACC妯″潡閫氱煡锛圓PP -> Zigbee MCU锛� + ///<summary > + ///鍗囩骇IRACC妯″潡閫氱煡 + /// <para>firewareVer:鍥轰欢鐗堟湰</para> + /// <para>firewareSize:鍥轰欢澶у皬</para> + /// </summary> + public async System.Threading.Tasks.Task<ResponseAllData> UpggradeACNotificationAsync(CommonDevice device, string firewareVer, long firewareSize) + { + ResponseAllData result = null; + var Gateway = device.Gateway; + if (Gateway == null) + { + result = new ResponseAllData { errorMessageBase = "褰撳墠娌℃湁缃戝叧" }; + return result; + } + return await System.Threading.Tasks.Task.Run(async () => + { + Action<string, string> action = (topic, message) => + { + var gatewayID = topic.Split('/')[0]; + var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); + + if (topic == gatewayID + "/" + "ZbDataPassthrough") + { + var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") }; + gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ClientDataPassthroughResponseData>(jobject["Data"].ToString()); + + if (gatewayTemp.clientDataPassthroughResponseData == null) + { + result = new ResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" }; + } + else + { + if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) + { + var data = gatewayTemp.clientDataPassthroughResponseData.PassData; + var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); + if (command == "025b") + { + var tempD = new ResponseData(); + if (data.Length == 12) + { + tempD.status = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16); + } + result = new ResponseAllData { responseData = tempD }; + System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}"); + } + } + } + } + }; + + Gateway.Actions += action; + System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString()); + + try + { + var passData = UpggradeACNotificationData(firewareVer, firewareSize); + var jObject = new JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; + var data = new JObject { { "PassData", passData } }; + jObject.Add("Data", data); + Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); + } + catch { } + + var dateTime = DateTime.Now; + while ((DateTime.Now - dateTime).TotalMilliseconds < 3000) + { + await System.Threading.Tasks.Task.Delay(10); + if (result != null) + { + break; + } + } + if ((DateTime.Now - dateTime).TotalMilliseconds > 3000) + { + result = new ResponseAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" }; + } + Gateway.Actions -= action; + System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString()); + + return result; + }); + } + + private string firewareVersion = string.Empty; + /// <summary> + /// 鍗囩骇IRACC妯″潡閫氱煡杩斿洖 + /// </summary> + string UpggradeACNotificationData(string firewareVer, long firewareSize) + { + string data = ""; + string dataLength = "2C"; + string dataComand1 = "5A"; + string dataComand2 = "02"; + string dataSerialNum = "01"; + string addDataLength = "28"; + string deviceUpgradeMethod = "01"; + string firewareVersionData = ""; + string firewareSizeData = ""; + + try + { + //鍥轰欢鐗堟湰 + var firewareVerBytes = System.Text.Encoding.ASCII.GetBytes(firewareVer); + for (int i = 0; i < firewareVerBytes.Length; i++) + { + var fw = Convert.ToString(firewareVerBytes[i], 16); + if (fw.Length == 1) + { + fw = "0" + fw; + } + firewareVersionData += fw; + } + + var aa = firewareVersionData.Length; + firewareVersionData = firewareVersionData.PadRight(70, '0'); + + //鍥轰欢灏哄 + var tempFwSize = Convert.ToString(firewareSize, 16); + tempFwSize = tempFwSize.PadLeft(8, '0'); + for (int i = 6; i >= 0; i = i - 2) + { + firewareSizeData += tempFwSize.Substring(i, 2); + } + + data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + + deviceUpgradeMethod + firewareVersionData + firewareSizeData; + + } + catch { }; + + return data; + } + + /// <summary> + ///鍗囩骇IRACC妯″潡閫氱煡鍥炲 + /// </summary> + public ResponseAllData keyColorDataResponseAllData; + [System.Serializable] + public class ResponseAllData + { + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public string errorMessageBase; + /// <summary> + /// 缃戝叧淇℃伅閿欒鍙嶉 + /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para> + /// </summary> + public CommonDevice.ErrorResponData errorResponData; + /// <summary> + /// 鍗囩骇IRACC妯″潡閫氱煡淇℃伅 + /// </summary> + public ResponseData responseData; + } + + /// <summary> + /// 鍗囩骇IRACC妯″潡閫氱煡鍥炲锛圸igbee MCU -> APP锛� + /// </summary> + [System.Serializable] + public class ResponseData + { + /// <summary> + /// 鐘舵�佸�� + /// <para>0--鐗堟湰鍙蜂笉涓�鑷达紙鍙互鍗囩骇</para> + /// <para>1--鐗堟湰鍙蜂竴鑷达紙涓嶇敤鍗囩骇</para> + /// <para>2--棰勭暀锛堟殏鏃朵笉鐢ㄥ埌</para> + /// <para>ff--鏃犳晥锛堟殏鏃朵笉鐢ㄥ埌锛�</para> + /// </summary> + public int status = -1; + } + #endregion + + #region 璁惧璇锋眰APP鑾峰彇鍗囩骇鏁版嵁 锛圸igbee MCU -> APP,涓诲姩涓婃姤锛� + /// <summary> + ///璁惧璇锋眰APP鑾峰彇鍗囩骇鏁版嵁锛圸igbee MCU -> APP,涓诲姩涓婃姤锛� + /// </summary> + [System.Serializable] + public class DeviceRequestUpgradeResponseData + { + /// <summary> + /// 鏁版嵁鍋忕Щ閲忥紝姣忎釜鍒嗗寘鍋忕Щ閲�+锛�1-43锛� + /// </summary> + public string offset = string.Empty; + /// <summary> + /// 鏁版嵁闀垮害len + /// </summary> + public int dataLength = -1; + } + #endregion + + #region 鍙戝崌绾ф暟鎹埌璁惧锛圓PP -> Zigbee MCU锛� + ///<summary > + ///璇诲彇IRACC妯″潡鍥轰欢鐗堟湰 + /// <para>reserve:0-ff</para> + /// </summary> + public async void UpgradeAsync(CommonDevice device, SendUpgradeData upgradeData) + { + var Gateway = device.Gateway; + if (Gateway == null) + { + return; + } + Action<string, string> action = (topic, message) => { }; + Gateway.Actions += action; + System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString()); + + try + { + string passData = ""; + if (upgradeData != null) + { + passData = SendUpgrade(upgradeData); + } + + var jObject = new JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; + var data = new JObject { { "PassData", passData } }; + jObject.Add("Data", data); + Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); + } + catch { } + + Gateway.Actions -= action; + System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString()); + } + + /// <summary> + /// 鍙戝崌绾ф暟鎹埌璁惧 + /// </summary> + string SendUpgrade(SendUpgradeData upgradeData) + { + string data = ""; + string dataLength = ""; + string dataComand1 = "5D"; + string dataComand2 = "02"; + string dataSerialNum = "01"; + string addDataLength = ""; + + string status = ""; + string offset = ""; + string upgradeDataLength = ""; + string dataString = ""; + + try + { + var len = 4 + 1 + 4 + 1 + upgradeData.dataLength; + dataLength = Convert.ToString(len, 16); + if (dataLength.Length == 1) + { + dataLength = "0" + dataLength; + } + + addDataLength = Convert.ToString(6 + upgradeData.dataLength, 16); + if (addDataLength.Length == 1) + { + addDataLength = "0" + addDataLength; + } + + if (upgradeData.status == 0) + { + status = "00"; + } + else if (upgradeData.status == 1) + { + status = "01"; + } + else + { + status = "ff"; + } + + + offset = upgradeData.offset; + + var dl = Convert.ToString(upgradeData.dataLength, 16); + if (dl.Length == 1) + { + upgradeDataLength = "0" + dl; + } + else + { + upgradeDataLength = dl; + } + + for (int i = 0; i < upgradeData.databytes.Length; i++) + { + var dataB = Convert.ToString(upgradeData.databytes[i], 16); + if (dataB.Length == 1) + { + dataB = "0" + dataB; + } + dataString += dataB; + } + + data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + + status + offset + upgradeDataLength + dataString; + } + catch { }; + + return data; + } + + /// <summary> + /// 鍙戦�佸崌绾ф暟鎹埌璁惧锛圓PP -> Zigbee MCU锛� + /// </summary> + [System.Serializable] + public class SendUpgradeData + { + /// <summary> + /// 0--鎴愬姛 + ///<para>1--澶辫触</para> + ///<para>ff--鏃犳晥</para> + /// </summary> + public int status = 0; + /// <summary> + /// 鏁版嵁鍋忕Щ閲忥紝姣忎釜鍒嗗寘鍋忕Щ閲�+锛�1-43锛� + /// </summary> + public string offset; + /// <summary> + /// 鏁版嵁闀垮害len + /// </summary> + public int dataLength = -1; + + /// <summary> + /// 鍒嗗寘鏁版嵁 + /// </summary> + public byte[] databytes; + } + #endregion + + #region 鍒嗗寘缁撴潫锛圸igbee MCU -> APP,涓诲姩涓婃姤锛� + /// <summary> + /// 璁惧璇锋眰APP鑾峰彇鍒嗗寘缁撴潫鍛戒护锛圸igbee MCU -> APP锛� + /// </summary> + [System.Serializable] + public class DeviceRequestFinishResponseData + { + /// <summary> + /// 0-ff + /// </summary> + public int reserve = -1; + } + #endregion + + #region 鍒嗗寘缁撴潫锛圓PP -> Zigbee MCU锛� + ///<summary > + ///璇诲彇IRACC妯″潡鍥轰欢鐗堟湰 + /// <para>status:0--鎴愬姛;1--澶辫触;ff--鏃犳晥 .</para> + /// </summary> + public async void SendFinishAsync(CommonDevice device, int status) + { + var Gateway = device.Gateway; + if (Gateway == null) + { + return; + } + Action<string, string> action = (topic, message) => { }; + Gateway.Actions += action; + System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString()); + + try + { + var passData = SendFinishDataString(status); + var jObject = new JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; + var data = new JObject { { "PassData", passData } }; + jObject.Add("Data", data); + Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); + } + catch { } + + Gateway.Actions -= action; + System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString()); + } + + /// <summary> + /// 鍙戝崌绾ф暟鎹埌璁惧 + /// </summary> + string SendFinishDataString(int status) + { + string data = ""; + string dataLength = "05"; + string dataComand1 = "5F"; + string dataComand2 = "02"; + string dataSerialNum = "01"; + string addDataLength = "01"; + string statusString = ""; + try + { + if (status == 0) + { + statusString = "00"; + } + else if (status == 1) + { + statusString = "01"; + } + else + { + statusString = "ff"; + } + data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + + statusString; + } + catch { }; + + return data; + } + + /// <summary> + /// 鍒嗗寘缁撴潫杩斿洖锛圓PP -> Zigbee MCU + /// </summary> + //[System.Serializable] + public class SendFinishData + { + /// <summary> + /// 鐘舵�侊細鎴愬姛/澶辫触 + ///<para>0--鎴愬姛<<para> + ///<para>1--澶辫触<<para> + ///<para>ff--鏃犳晥<<para> + /// </summary> + public int status = -1; + } + + #endregion + #endregion } } -- Gitblit v1.8.0