HDL Home App 第二版本 旧平台金堂用 正在使用
黄学彪
2020-01-06 72be4f06a683de33ddd563c8447c39f7f17e5b7d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using Shared.Common;
using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
 
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 设备属性的逻辑类
    /// </summary>
    public class HdlDeviceAttributeLogic
    {
        #region ■ 变量声明___________________________
 
        /// <summary>
        /// 属性的逻辑
        /// </summary>
        private static HdlDeviceAttributeLogic m_Current = null;
        /// <summary>
        /// 属性的逻辑
        /// </summary>
        public static HdlDeviceAttributeLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlDeviceAttributeLogic();
                }
                return m_Current;
            }
            set
            {
                m_Current = value;
            }
        }
 
        #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, string 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
    }
}