黄学彪
2019-11-07 82a773d1783549caca563831aac8affc059deedf
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs
@@ -203,5 +203,86 @@
        }
        #endregion
        #region ■ 写入设备属性_______________________
        /// <summary>
        /// 设置空调的自定义模式
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <param name="clusterId">镞ID</param>
        /// <param name="attributeId">属性ID</param>
        /// <param name="attributeDataType">数据类型</param>
        /// <param name="attributeData">需要写入的数据</param>
        /// <returns></returns>
        public async System.Threading.Tasks.Task<CommonDevice.SetWritableValueResponAllData> WriteDeviceAttribute(CommonDevice device, int clusterId, int attributeId, int attributeDataType, int attributeData)
        {
            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
    }
}