xm
2020-04-16 6fa9d69da922c8049f5acfcbb9ce9fd26811024c
ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs
@@ -35,6 +35,10 @@
        public string currentUserDisplayMethod = string.Empty;//当前用户显示方式
        //本地所有账户列表
        public List<Shared.Phone.UserCenter.MemberInfoRes> localAllAccountList = new List<Shared.Phone.UserCenter.MemberInfoRes> { };
        /// <summary>
        /// 是否常开模式[当数据获取失败,返回空]
        /// </summary>
        public Dictionary<string, bool> IsDoorLockNormallyMode = new Dictionary<string, bool> { };//是否冻结子账户
        public string LocalTempPassword = string.Empty;//本地生成的临时密码
        public Dictionary<string, bool> IsFreezeAccount = new Dictionary<string, bool> { };//是否冻结子账户
        public Dictionary<string, bool> HasRemoteUnlockAccess = new Dictionary<string, bool> { };//是否给子账户拥有远程开锁的条件
@@ -42,6 +46,7 @@
        public string RemoteUnlockPassword = string.Empty;//远程开锁密码
        public static int RemoteUnlockCount = 5;//远程开锁次数限制
        public static int failedCount = 3;//远程开锁失败次数
        public static DateTime maxValue = DateTime.MaxValue;
        public static DateTime minValue = DateTime.MinValue;
@@ -491,6 +496,25 @@
            /// 云端帐号Id -->键名 : CloudAccountId (可选)
            /// </summary>
            public string CloudAccountId = "";
            /// <summary>
            /// 第几页
            /// </summary>
            public PageSetting pageSetting = new PageSetting();
        }
        /// <summary>
        ///  获取门锁
        /// </summary>
        public class PageSetting
        {
            /// <summary>
            /// 第几页
            /// </summary>
            public int Page = 1;
            /// <summary>
            /// 第几页
            /// </summary>
            public int PageSize = 10;
        }
        [Serializable]
@@ -959,8 +983,8 @@
        /// <summary>
        /// 矫正门锁时间
        /// </summary>
        /// <returns>The writable value async.</returns>
        /// <param name="timestamp">矫正门锁的时间</param>
        /// <param name="timestamp"></param>
        /// <returns></returns>
        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> RectifyDoorLockTimeAsync(int timestamp)
        {
            if (Gateway == null)
@@ -1144,8 +1168,11 @@
                                        var tempD = new DefaultControlResponseData();
                                        tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString();
                                        tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
                                        result = new DefaultControlResponseAllData { defaultControlResponseData = tempD };
                                        DebugPrintLog($"UI收到通知后的主题_command:0450_{ topic}");
                                        if (tempD.command == "0450")
                                        {
                                            result = new DefaultControlResponseAllData { defaultControlResponseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0450_{ topic}");
                                        }
                                    }
                                }
                            }
@@ -1183,6 +1210,109 @@
                return result;
            });
        }
        /// <summary>
        /// 用户管理发送数据
        /// userIdList:个数不能超过10个
        /// </summary>
        public string FreezeAccountData(List<int> userIdList, AccessType accessType)
        {
            string data = "";
            string dataLength = "";
            string dataComand1 = "50";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "";
            string delUserTypeStr = "";
            string userIdStr = "";
            try
            {
                if (userIdList.Count == 0)
                {
                    return null;
                }
                if (userIdList.Count > 9)
                {
                    return null;
                }
                var tempLength = 5 + userIdList.Count * 2;
                string tempLength1 = Convert.ToString(tempLength, 16);
                switch (tempLength1.Length)
                {
                    case 1:
                        dataLength = "0" + tempLength1.ToUpper();
                        break;
                    case 2:
                        dataLength = tempLength1.ToUpper();
                        break;
                }
                var tempAddDataLength = 1 + userIdList.Count * 2;
                string tempAddDataLength1 = Convert.ToString(tempAddDataLength, 16);
                switch (tempAddDataLength1.Length)
                {
                    case 1:
                        addDataLength = "0" + tempAddDataLength1.ToUpper();
                        break;
                    case 2:
                        addDataLength = tempAddDataLength1.ToUpper();
                        break;
                }
                switch ((int)accessType)
                {
                    case 0:
                        delUserTypeStr = "00";
                        break;
                    case 1:
                        delUserTypeStr = "01";
                        break;
                    case 2:
                        delUserTypeStr = "20";
                        break;
                    case 3:
                        delUserTypeStr = "21";
                        break;
                    case 4:
                        delUserTypeStr = "10";
                        break;
                    case 5:
                        delUserTypeStr = "30";
                        break;
                    case 6:
                        delUserTypeStr = "31";
                        break;
                }
                var sbString = new System.Text.StringBuilder();
                foreach (var userId in userIdList)
                {
                    string temp = Convert.ToString(userId, 16);
                    switch (temp.Length)
                    {
                        case 1:
                            userIdStr = "0" + temp + "00";
                            break;
                        case 2:
                            userIdStr = temp + "00";
                            break;
                        case 3:
                            var thirdBit = temp.Substring(temp.Length - 2, 1);
                            userIdStr = temp + "0" + thirdBit;
                            break;
                        case 4:
                            userIdStr = temp;
                            break;
                    }
                    sbString.Append(userIdStr.ToString().ToUpper());
                }
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                   delUserTypeStr + sbString;
            }
            catch { };
            return data;
        }
        /// <summary>
@@ -1278,8 +1408,8 @@
            /// <summary>
            /// 状态值
            /// <para>默认响应结果:
            ///<para>0 删除成功</para>
            ///<para>1 删除失败</para>
            ///<para>0 成功</para>
            ///<para>1 失败</para>
            ///<para>2 用户不存在</para>
            ///<para>32 冻结成功</para>
            ///<para>34 冻结失败</para>
@@ -1292,7 +1422,7 @@
        public enum AccessType
        {
            /// <summary>
            /// 0x00 删除全部单次用户
            /// 0x00 删除全部临时用户
            /// </summary>
            DelAllUsers = 0,
            /// <summary>
@@ -1307,6 +1437,18 @@
            /// 0x21 解冻指定用户
            /// </summary>
            Enable = 3,
            /// <summary>
            /// 0x10 多个指定用户删除
            /// </summary>
            DelMoreUsers = 4,
            /// <summary>
            /// 0x30 多个指定用户冻结
            /// </summary>
            DisEnableMoreUsers = 5,
            /// <summary>
            /// 0x31 多个指定用户解冻
            /// </summary>
            EnableMoreUsers = 6,
        }
        #endregion
@@ -1528,8 +1670,11 @@
                                        var tempD = new RemoteResponseData();
                                        tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString();
                                        tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
                                        result = new RemoteResponseAllData { responseData = tempD };
                                        DebugPrintLog($"UI收到通知后的主题_command:0462_{ topic}");
                                        if (tempD.command == "0462")
                                        {
                                            result = new RemoteResponseAllData { responseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0462_{ topic}");
                                        }
                                    }
                                }
                            }
@@ -1654,7 +1799,7 @@
        #region 临时密码发送数据
        ///<summary >
        ///远程开锁
        ///临时密码
        ///<para>inputPassword: 输入密码/para>
        /// </summary>
        public async System.Threading.Tasks.Task<TempPasswordResponseAllData> TempPasswordAsync(string inputPassword, System.DateTime startTime, System.DateTime endTime, string fixedPassword = "190605")
@@ -1709,8 +1854,11 @@
                                        var tempD = new TempPasswordResponseData();
                                        tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString();
                                        tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
                                        result = new TempPasswordResponseAllData { responseData = tempD };
                                        DebugPrintLog($"UI收到通知后的主题_command:0463_{ topic}");
                                        if (tempD.command == "0463")
                                        {
                                            result = new TempPasswordResponseAllData { responseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0463_{ topic}");
                                        }
                                    }
                                }
                            }
@@ -2081,6 +2229,8 @@
                                    doorLockUserDetailData.userType = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16);
                                    doorLockUserDetailData.totalNum = Convert.ToInt32(data[12].ToString() + data[13].ToString(), 16);
                                    doorLockUserDetailData.currentNum = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
                                    totalNum = doorLockUserDetailData.totalNum;
                                    currentNum = doorLockUserDetailData.currentNum;
                                    result = new DoorlockUserInfo { doorLockUserDetailData = doorLockUserDetailData };
                                    DebugPrintLog($"UI收到通知后的主题_command:0451_{ topic}");
                                }
@@ -2099,15 +2249,22 @@
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                //接收一个包最多等3秒,没有收到就退出
                //接收一个包最多等3秒,没有收到就退出,单次数据包不超过30个用户
                while ((DateTime.Now - dateTime).TotalMilliseconds < 3000)
                {
                    await System.Threading.Tasks.Task.Delay(100);
                    if (totalNum == currentNum)
                    {
                        break;
                    }
                }
                //if ((DateTime.Now - dateTime).TotalMilliseconds > 3000)
                //{
                //    result = new DoorlockUserInfo { errorMessageBase = " 回复超时,请重新操作" };
                //}
                Gateway.Actions -= action;
                DebugPrintLog("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
@@ -2196,6 +2353,591 @@
        }
        #endregion
        #region 音量
        ///<summary >
        ///获取音量
        /// </summary>
        public async System.Threading.Tasks.Task<VolumeResponseAllData> GetVolumeAsync()
        {
            VolumeResponseAllData result = null;
            if (Gateway == null)
            {
                result = new VolumeResponseAllData { 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 + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new VolumeResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new VolumeResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new VolumeResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 14)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0456")
                                    {
                                        var tempD = new VolumeResponseData();
                                        tempD.command = data[10].ToString() + data[11].ToString();
                                        tempD.value = Convert.ToInt32(data[12].ToString() + data[13].ToString(), 16);
                                        result = new VolumeResponseAllData { volumeResponseData = tempD };
                                        DebugPrintLog($"UI收到通知后的主题_command:0456_{ topic}");
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                DebugPrintLog("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = VolumeData(-1);
                    var jObject = new JObject { { "DeviceAddr", 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 < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null && result.volumeResponseData != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)
                {
                    result = new VolumeResponseAllData
                    { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                DebugPrintLog("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        ///<summary >
        ///音量
        ///<para>命令值: comandValue</para>
        ///<para>comandValue: 0-0x64 音量</para>
        /// </summary>
        public async System.Threading.Tasks.Task<DefaultControlResponseAllData> SetVolumeAsync(int comandValue)
        {
            DefaultControlResponseAllData result = null;
            if (Gateway == null)
            {
                result = new DefaultControlResponseAllData { 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 + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new DefaultControlResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new DefaultControlResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new DefaultControlResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0002")
                                    {
                                        var tempD = new DefaultControlResponseData();
                                        tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString();
                                        tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
                                        if (tempD.command == "0455")
                                        {
                                            result = new DefaultControlResponseAllData { defaultControlResponseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0455_{ topic}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                DebugPrintLog("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = VolumeData(comandValue);
                    var jObject = new JObject { { "DeviceAddr", 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 < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null && result.defaultControlResponseData != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)
                {
                    result = new DefaultControlResponseAllData
                    { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                DebugPrintLog("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 音量发送数据
        ///<para>comandValue: 0-100 音量</para>
        /// </summary>
        public string VolumeData(int comandValue)
        {
            string data = "";
            string dataLength = "05";
            string dataComand1 = "55";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "01";
            string cValue = "";
            try
            {
                if (comandValue >= 1)
                {
                    cValue = Convert.ToString(comandValue, 16).ToUpper();
                    if (cValue.Length == 1)
                    {
                        cValue = "0" + cValue;
                    }
                    else
                    {
                        cValue = cValue;
                    }
                }
                else
                {
                    switch (comandValue)
                    {
                        case -1:
                            cValue = "AA";
                            break;
                        case 0:
                            cValue = "EB";
                            break;
                    }
                }
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                   cValue;
            }
            catch (Exception ex)
            {
                var mess = ex.Message;
            };
            return data;
        }
        /// <summary>
        /// 音量回复数据
        /// </summary>
        public VolumeResponseAllData volumeResponseAllData;
        [System.Serializable]
        public class VolumeResponseAllData
        {
            /// <summary>
            /// 错误信息
            /// </summary>
            public string errorMessageBase;
            /// <summary>
            /// 网关信息错误反馈
            /// <para>当网关接收到客户端信息后,出现以下异常情况将反馈错误。</para>
            /// </summary>
            public ErrorResponData errorResponData;
            /// <summary>
            /// 音量回复数据
            /// </summary>
            public VolumeResponseData volumeResponseData;
        }
        /// <summary>
        /// 音量回复数据
        /// </summary>
        [System.Serializable]
        public class VolumeResponseData
        {
            /// <summary>
            ///命令
            ///<para>0x00 接收成功</para>
            ///<para>0xea 语音模式</para>
            ///<para>0xeb 静音模式</para>
            /// </summary>
            public string command = "";
            /// <summary>
            /// 音量值
            /// <para>0xf1~0xfe  1-14音量</para>
            /// <para>0 无音量值</para>
            /// </summary>
            public int value = -1;
        }
        #endregion
        #region 常开模式         
        /// <summary>
        /// 读取常开模式
        /// </summary>
        /// <returns></returns>
        public async System.Threading.Tasks.Task<OpenModeResponseAllData> ReadNormallyOpenModeFuncAsync()
        {
            OpenModeResponseAllData result = null;
            if (Gateway == null)
            {
                result = new OpenModeResponseAllData { 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 + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new OpenModeResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new OpenModeResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new OpenModeResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 12)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0458")
                                    {
                                        result = new OpenModeResponseAllData();
                                        result.command = data[10].ToString() + data[11].ToString();
                                        DebugPrintLog($"UI收到通知后的主题_command:0457_{ topic}");
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                DebugPrintLog("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = OpenModeData(SwitchMode.Obtain);
                    var jObject = new JObject { { "DeviceAddr", 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 < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)
                {
                    result = new OpenModeResponseAllData
                    { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                DebugPrintLog("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 设置常开模式
        /// </summary>
        /// <param name="IsNormallyOpenMode">是否打开常开模式:true:打开 false:关闭</param>
        /// <returns></returns>
        public async System.Threading.Tasks.Task<DefaultControlResponseAllData> SetNormallyOpenModeFuncAsync(bool IsNormallyOpenMode)
        {
            DefaultControlResponseAllData result = null;
            if (Gateway == null)
            {
                result = new DefaultControlResponseAllData { 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 + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new DefaultControlResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new DefaultControlResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new DefaultControlResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0002")
                                    {
                                        var tempD = new DefaultControlResponseData();
                                        tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString();
                                        tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
                                        if (tempD.command == "0457")
                                        {
                                            result = new DefaultControlResponseAllData { defaultControlResponseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0457_{ topic}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                DebugPrintLog("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = "";
                    if (IsNormallyOpenMode)
                    {
                        passData = OpenModeData(SwitchMode.NormallyOpen);
                    }
                    else
                    {
                        passData = OpenModeData(SwitchMode.NormallyClose);
                    }
                    var jObject = new JObject { { "DeviceAddr", 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 < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null && result.defaultControlResponseData != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)
                {
                    result = new DefaultControlResponseAllData
                    { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                DebugPrintLog("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 常开模式 发送数据
        /// </summary>
        public string OpenModeData(SwitchMode switchMode)
        {
            string data = "";
            string dataLength = "05";
            string dataComand1 = "57";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "01";
            string cValue = "";
            try
            {
                switch (switchMode)
                {
                    case SwitchMode.Obtain:
                        cValue = "10";
                        break;
                    case SwitchMode.NormallyOpen:
                        cValue = "12";
                        break;
                    case SwitchMode.NormallyClose:
                        cValue = "13";
                        break;
                }
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                   cValue;
            }
            catch (Exception ex)
            {
                var mess = ex.Message;
            };
            return data;
        }
        /// <summary>
        /// 常开模式 回复数据
        /// </summary>
        public OpenModeResponseAllData openModeResponseAllData;
        [System.Serializable]
        public class OpenModeResponseAllData
        {
            /// <summary>
            /// 错误信息
            /// </summary>
            public string errorMessageBase;
            /// <summary>
            /// 网关信息错误反馈
            /// <para>当网关接收到客户端信息后,出现以下异常情况将反馈错误。</para>
            /// </summary>
            public ErrorResponData errorResponData;
            /// <summary>
            /// 0x10 常开已开启
            /// <para>0x11 常开已关闭</para>
            /// </summary>
            public string command;
        }
        /// <summary>
        /// 开关模式
        /// </summary>
        public enum SwitchMode
        {
            /// <summary>
            /// 0x10 查询常开状态
            /// </summary>
            Obtain = 0x10,
            /// <summary>
            /// 0x12 开启常开
            /// </summary>
            NormallyOpen = 0x12,
            /// <summary>
            /// 0x13 关闭常开
            /// </summary>
            NormallyClose = 0x13
        }
        #endregion
        #endregion
    }
}