黄学彪
2020-01-17 4b378188ce972df432b23d9cb73babb6cc0679c6
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
123
124
125
126
127
128
129
130
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, object 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 } };
                Newtonsoft.Json.Linq.JObject data = null;
                if (attributeData is int)
                {
                    data = new Newtonsoft.Json.Linq.JObject { { "Undivided", 0 }, { "AttributeId", attributeId }, { "AttributeDataType", attributeDataType }, { "AttributeData", Convert.ToInt32(attributeData) } };
                }
                else
                {
                    data = new Newtonsoft.Json.Linq.JObject { { "Undivided", 0 }, { "AttributeId", attributeId }, { "AttributeDataType", attributeDataType }, { "AttributeData", attributeData.ToString() } };
                }
                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
    }
}