From 66a9965c44ecc32a6696abca876ab9d1cd091584 Mon Sep 17 00:00:00 2001 From: gxc <guoxuecheng@guoxuechengdeMacBook-Pro.local> Date: 星期五, 28 二月 2020 15:25:13 +0800 Subject: [PATCH] 2020.2.28 --- ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs | 237 +++++++++++++++++++---------------------------------------- 1 files changed, 76 insertions(+), 161 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs index 63fc904..3cccd94 100755 --- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs +++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs @@ -7,18 +7,18 @@ namespace Shared.Phone.UserCenter { /// <summary> - /// 璁惧灞炴�т笂鎶ョ殑閫昏緫绫� + /// 璁惧灞炴�х殑閫昏緫绫� /// </summary> - public class HdlDeviceAttributeLogic : ZigBee.Common.IStatus + public class HdlDeviceAttributeLogic { #region 鈻� 鍙橀噺澹版槑___________________________ /// <summary> - /// 灞炴�т笂鎶ョ殑閫昏緫 + /// 灞炴�х殑閫昏緫 /// </summary> private static HdlDeviceAttributeLogic m_Current = null; /// <summary> - /// 灞炴�т笂鎶ョ殑閫昏緫 + /// 灞炴�х殑閫昏緫 /// </summary> public static HdlDeviceAttributeLogic Current { @@ -36,170 +36,85 @@ } } - /// <summary> - /// 浜嬩欢闆嗗悎 - /// </summary> - private Dictionary<string, Action<CommonDevice>> dicEvent = new Dictionary<string, Action<CommonDevice>>(); - /// <summary> - /// 鍛戒护鍖哄垎 - /// </summary> - private Dictionary<string, string> dicCommandDiv = new Dictionary<string, string>(); - #endregion - #region 鈻� 娣诲姞浜嬩欢___________________________ + #region 鈻� 鍐欏叆璁惧灞炴�______________________ /// <summary> - /// 娣诲姞鑾峰彇璁惧灞炴�х殑浜嬩欢(鎺ㄩ�佸凡缁忓己鍒舵寚瀹氳繍琛屼簬涓荤嚎绋嬶紝灞炴�т笂鎶ョ殑瀵硅薄锛歞evice.DeviceStatusReport) + /// 璁剧疆绌鸿皟鐨勮嚜瀹氫箟妯″紡 /// </summary> - /// <param name="mainKeys">鏍囪瘑浜嬩欢鐨勪富閿�(鍙互闅忎究濉�,涓昏鏄拡瀵瑰涓晫闈竴璧蜂娇鐢ㄧ殑鎯呭喌)</param> - /// <param name="comand">鍛戒护鍖哄垎,姣斿锛欴eviceStatusReport,IASInfoReport绛夌瓑</param> - /// <param name="action">褰撴帴鏀跺埌缃戝叧鍥炲涔嬪悗鐨勫洖璋冨嚱鏁�,灞炴�т笂鎶ョ殑瀵硅薄锛歞evice.DeviceStatusReport</param> - public void AddAttributeEvent(string mainKeys, string comand, Action<CommonDevice> action) - { - lock (this.dicEvent) - { - if (this.dicEvent.Count == 0) - { - ZbGateway.StatusList.Add(this); - } - this.dicEvent[mainKeys] = action; - this.dicCommandDiv[mainKeys] = comand; - } - } - - #endregion - - #region 鈻� 绉婚櫎鐩戝惉___________________________ - - /// <summary> - /// 绉婚櫎浜嬩欢 - /// </summary> - /// <param name="mainKeys">鏍囪瘑浜嬩欢鐨勪富閿�(鍙互闅忎究濉�,涓昏鏄拡瀵瑰涓晫闈竴璧蜂娇鐢ㄧ殑鎯呭喌)</param> - public void RemoveEvent(string mainKeys) - { - lock (this.dicEvent) - { - if (this.dicEvent.ContainsKey(mainKeys) == true) - { - var action = this.dicEvent[mainKeys]; - this.dicEvent.Remove(mainKeys); - this.dicCommandDiv.Remove(mainKeys); - - action = null; - } - if (this.dicEvent.Count == 0) - { - ZbGateway.StatusList.Remove(this); - } - } - } - - /// <summary> - /// 绉婚櫎鍏ㄩ儴鐨勪簨浠� - /// </summary> - public void RemoveAllEvent() - { - lock (this.dicEvent) - { - var list = new HashSet<string>(); - foreach (var keys in this.dicEvent.Keys) - { - list.Add(keys); - } - foreach (var keys in list) - { - //闇�瑕佹參鎱竴涓竴涓殑閲婃斁Action,鍚 - this.RemoveEvent(keys); - } - } - } - - #endregion - - #region 鈻� 瀹炵幇鎺ュ彛___________________________ - - /// <summary> - /// 璁惧鐘舵�侀�氱煡 - /// </summary> - /// <param name="common"></param> - /// <param name="typeTag"></param> - public void DeviceInfoChange(CommonDevice common, string typeTag) - { - if (common == null || string.IsNullOrEmpty(common.DeviceAddr) == true) - { - //鎴戜篃涓嶇煡閬撹繖鏈夋病鏈夊彲鑳� - return; - } - - lock (this.dicEvent) - { - var list = new List<Action<CommonDevice>>(); - foreach (string keys in this.dicEvent.Keys) - { - if (this.dicCommandDiv[keys] != typeTag) - { - //鍛戒护鍖哄垎涓嶄竴鑷达紝鍒欎笉璋冪敤鍥炶皟鍑芥暟 - continue; - } - //鍛戒护鍖哄垎涓�鑷存椂锛屽垯璋冪敤鍥炶皟鍑芥暟 - list.Add(this.dicEvent[keys]); - } - //鏈夊彲鑳藉湪鍥炶皟鍑芥暟涓Щ闄や簡浜嬩欢锛屽鑷存姤閿欙紝鎵�浠ュ厛鏀堕泦锛屽啀璋冪敤 - Application.RunOnMainThread(() => - { - foreach (var action in list) - { - try - { - action?.Invoke(common); - } - catch (Exception ex) - { - //Log鍑哄姏 - string msg = "褰撳墠婵�娲荤殑鐣岄潰[" + UserCenterResourse.NowActionFormID + "]"; - HdlLogLogic.Current.WriteLog(-1, msg); - HdlLogLogic.Current.WriteLog(ex); - } - - } - }); - } - } - - /// <summary> - /// 涓嶄娇鐢� - /// </summary> - /// <param name="common"></param> - public void Changed(CommonDevice common) - { - } - - /// <summary> - /// 涓嶄娇鐢� - /// </summary> - public void ChangedILogicStatus(ZigBee.Device.Logic logic) - { - } - - /// <summary> - /// 涓嶄娇鐢� - /// </summary> - public void ChangedISceneStatus(Scene scene) - { - } - #endregion - - #region 鈻� 涓�鑸柟娉昣__________________________ - - /// <summary> - /// 鏄惁瀛樺湪鎸囧畾鐨勪簨浠� - /// </summary> - /// <param name="mainkeys"></param> + /// <param name="device">璁惧瀵硅薄</param> + /// <param name="clusterId">闀濱D</param> + /// <param name="attributeId">灞炴�D</param> + /// <param name="attributeDataType">鏁版嵁绫诲瀷</param> + /// <param name="attributeData">闇�瑕佸啓鍏ョ殑鏁版嵁</param> /// <returns></returns> - public bool IsEsixt(string mainkeys) + public async System.Threading.Tasks.Task<CommonDevice.SetWritableValueResponAllData> WriteDeviceAttribute(CommonDevice device, int clusterId, int attributeId, int attributeDataType, string attributeData) { - return this.dicCommandDiv.ContainsKey(mainkeys); + var MyGateway = device.Gateway; + if (MyGateway == null) + { + return null; + } + + CommonDevice.SetWritableValueResponAllData d = null; + Action<string, string> action = (topic, message) => + { + var gatewayID = topic.Split('/')[0]; + var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); + + if (topic == gatewayID + "/" + "Error_Respon") + { + var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString()); + if (temp == null) + { + d = new CommonDevice.SetWritableValueResponAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" }; + } + else + { + d = new CommonDevice.SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = HdlCheckLogic.Current.CheckCommonErrorCode(temp.Error) }; + } + } + + if (topic == gatewayID + "/" + "SetWritableValue_Respon") + { + var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.SetWritableValueResponData>(jobject["Data"].ToString()); + if (tempData == null) + { + d = new CommonDevice.SetWritableValueResponAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" }; + } + else + { + d = new CommonDevice.SetWritableValueResponAllData { setWritableValueResponData = tempData }; + } + } + }; + MyGateway.Actions += action; + try + { + var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", device.DeviceEpoint }, { "Cluster_ID", clusterId }, { "Command", 120 } }; + var data = new Newtonsoft.Json.Linq.JObject { { "Undivided", 0 }, { "AttributeId", attributeId }, { "AttributeDataType", attributeDataType }, { "AttributeData", attributeData } }; + jObject.Add("Data", data); + MyGateway.Send("SetWritableValue", jObject.ToString()); + } + catch { } + + var timeOut = 0; + while (timeOut <= 30) + { + await System.Threading.Tasks.Task.Delay(100); + if (d != null) + { + break; + } + timeOut++; + } + if (timeOut > 30 && d == null) + { + d = new CommonDevice.SetWritableValueResponAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" }; + } + MyGateway.Actions -= action; + return d; } #endregion -- Gitblit v1.8.0