From 25429f085093d89d543a0b90e30d0d62d1b7dac9 Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期二, 30 八月 2022 09:37:38 +0800
Subject: [PATCH] 合并了IOS的代码

---
 ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs | 1848 +++++++++++++++++++----------------------------------------
 1 files changed, 598 insertions(+), 1,250 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs
index f2e05ad..5bb5fac 100755
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs
@@ -2,284 +2,17 @@
 using System.Collections.Generic;
 using System.Text;
 using Newtonsoft.Json.Linq;
+using Shared;
 
 namespace ZigBee.Device
 {
     [System.Serializable]
     public class CommonDevice
     {
-        [Newtonsoft.Json.JsonIgnore]
-        public DateTime LastDateTime = DateTime.MinValue;
-        /// <summary>
-        /// 鏄惁宸茬粡璇诲彇浜嗚澶囩姸鎬�(姝ゅ睘鎬ф槸缁欎富椤典娇鐢ㄧ殑)
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public bool HadReadDeviceStatu = false;
+        #region 闇�瑕佷繚瀛樼殑鍙橀噺
 
         /// <summary>
-        /// 璋冭瘯鏃舵墦寮�鎵撳嵃淇℃伅锛宼rue:鎵撳嵃锛宖alse:涓嶆墦鍗�
-        /// </summary>
-        /// <param name="msg">Message.</param>
-        /// <param name="flage">If set to <c>true</c> flage.</param>
-        public static void DebugPrintLog(string msg, bool flage = true)
-        {
-#if DEBUG
-            if (flage == true)
-            {
-                if (msg.Contains("DeviceStatusReport") == false)
-                {
-                    System.Console.WriteLine(msg + "  " + System.DateTime.Now.ToLongTimeString() + " " + System.DateTime.Now.Millisecond);
-                }
-            }
-#endif
-        }
-
-        /// <summary>
-        /// 绛夊緟浠庣綉鍏虫帴鏀舵暟鎹殑鏃堕棿
-        /// </summary>
-        /// <value>The wait receive data time.</value>
-        public virtual int WaitReceiveDataTime
-        {
-            get
-            {
-                if (Device.ZbGateway.RemoteMqttClient != null && Device.ZbGateway.RemoteMqttClient.IsConnected)
-                {
-                    return 10000;
-                }
-                else
-                {
-                    return 3000;
-                }
-            }
-        }
-
-
-        [Newtonsoft.Json.JsonIgnore]
-        public bool IsValid
-        {
-            get
-            {
-                return (DateTime.Now - LastDateTime).TotalSeconds < 10;
-            }
-        }
-
-        /// <summary>
-        /// 閫氳繃璁惧璋冪敤缃戝叧
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public ZbGateway Gateway
-        {
-            get
-            {
-                if (string.IsNullOrEmpty(CurrentGateWayId))
-                {
-                    return null;
-                }
-                var gateWay = ZbGateway.GateWayList.Find(obj => (obj != null) && (obj.getGatewayBaseInfo != null) && (obj.getGatewayBaseInfo.gwID == CurrentGateWayId));
-                if (gateWay == null)
-                {
-                    gateWay = new ZbGateway { IsVirtual = true, };
-                    gateWay.getGatewayBaseInfo.gwID = CurrentGateWayId;
-                    gateWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId;
-                    ZbGateway.GateWayList.Add(gateWay);
-                }
-
-                return gateWay;
-            }
-        }
-
-        /// <summary>
-        /// 淇濆瓨璁惧鏁版嵁鐨勬枃浠跺悕
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public virtual string FilePath
-        {
-            get
-            {
-                var deviceType = Type.ToString();
-                var fileName = "Device_" + deviceType + "_" + DeviceAddr;
-                fileName += "_" + (DeviceEpoint.ToString().Length < 2 ? "0" + DeviceEpoint.ToString() : DeviceEpoint.ToString());
-                return fileName;
-            }
-        }
-
-        /// <summary>
-        /// 鐢辫澶囪矾寰勬仮澶嶈澶囧璞�
-        /// </summary>
-        /// <returns>The device by file path.</returns>
-        /// <param name="deviceFilePath">Device file path.</param>
-        public static CommonDevice CommonDeviceByFilePath(string deviceFilePath)
-        {
-            var v = deviceFilePath.Split('_');
-            if (v.Length < 3)
-            {
-                return null;
-            }
-            return CommonDeviceByByteString(v[1], System.Text.Encoding.UTF8.GetString(Shared.Common.Global.ReadFileByHomeId(deviceFilePath)));
-        }
-
-        /// <summary>
-        /// 鐢辫澶囧瓧绗︿覆姣旂壒鎭㈠璁惧瀵硅薄
-        /// </summary>
-        /// <param name="strDeviceType">璁惧DeviceType鐨勫瓧绗︿覆绫诲瀷</param>
-        /// <param name="strDeviceByte">璁惧Json鏂囦欢杞负姣旂壒鍚庡啀杞负鐨勫瓧绗︿覆</param>
-        /// <returns></returns>
-        public static CommonDevice CommonDeviceByByteString(string strDeviceType, string strDeviceByte)
-        {
-            if (strDeviceType == ZigBee.Device.DeviceType.DimmableLight.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<DimmableLight>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.OnOffOutput.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<ToggleLight>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.WindowCoveringDevice.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<Rollershade>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.OnOffSwitch.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<Panel>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.IASZone.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<IASZone>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.OtaDevice.ToString() || strDeviceType == ZigBee.Device.DeviceType.OtaPanelDevice.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<OTADevice>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.AirSwitch.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<AirSwitch>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.Repeater.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<Repeater>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.Thermostat.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.Transverter.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<Transverter>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.DoorLock.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<DoorLock>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.TemperatureSensor.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<TemperatureSensor>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.FreshAirHumiditySensor.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<HumiditySensor>(strDeviceByte);
-            }
-            else if (strDeviceType == ZigBee.Device.DeviceType.FreshAir.ToString())
-            {
-                return Newtonsoft.Json.JsonConvert.DeserializeObject<FreshAir>(strDeviceByte);
-            }
-            return null;
-        }
-
-        /// <summary>
-        /// 淇濆瓨璁惧
-        /// </summary>
-        public void Save()
-        {
-            if (Shared.Common.Global.IsExistsByHomeId(FilePath))
-            {
-                return;
-            }
-            ReSave();
-        }
-
-        /// <summary>
-        /// 閲嶆柊淇濆瓨璁惧
-        /// </summary>
-        public void ReSave()
-        {
-            if (IconPath == string.Empty)
-            {
-                //淇濆瓨璁惧鍥炬爣(杩欓噷浼氫繚瀛樹竴娆�,涓嬮潰灏变笉鐢ㄤ繚瀛樹簡)
-                this.SaveDeviceIcon();
-                return;
-            }
-            Shared.Common.Global.WriteFileByBytesByHomeId(FilePath, System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)));
-        }
-
-        /// <summary>
-        /// 淇濆瓨璁惧鍥炬爣
-        /// </summary>
-        private void SaveDeviceIcon()
-        {
-            if (IconPath == string.Empty)
-            {
-                //骞叉帴鐐�
-                if (this.Type == DeviceType.OnOffSwitch)
-                {
-                    IconPath = "Device/DryContact.png";
-                }
-                else if (this.Type == DeviceType.ColorDimmableLight)
-                {
-                    //褰╃伅
-                    IconPath = "Device/ColorLight.png";
-                }
-                else if (this.Type == DeviceType.DimmableLight)
-                {
-                    //璋冨厜鍣�
-                    IconPath = "Device/Light.png";
-                }
-                else if (this.Type == DeviceType.OnOffOutput)
-                {
-                    //缁х數鍣�
-                    IconPath = "Device/RelayEpoint.png";
-                }
-                else if (this.Type == DeviceType.Thermostat)
-                {
-                    //绌鸿皟 
-                    IconPath = "Device/AirConditionerEpoint.png";
-                }
-                else if (this.Type == DeviceType.FreshAir)
-                {
-                    //鏂伴 
-                    IconPath = "Device/FreshAirEpoint.png";
-                }
-                else if (this.Type == DeviceType.FreshAirHumiditySensor)
-                {
-                    //婀垮害浼犳劅鍣�
-                    IconPath = "Device/SensorHumidity.png";
-                }
-                else if (this.Type == DeviceType.TemperatureSensor)
-                {
-                    if (((TemperatureSensor)this).SensorDiv == 1)
-                    {
-                        //娓╁害浼犳劅鍣�
-                        IconPath = "Device/SensorTemperature.png";
-                    }
-                    else if (((TemperatureSensor)this).SensorDiv == 2)
-                    {
-                        //婀垮害浼犳劅鍣�
-                        IconPath = "Device/SensorHumidity.png";
-                    }
-                }
-                else if (this.Type != DeviceType.UnKown)
-                {
-                    //鍏朵粬鐨勫浘鏍囨湁鐐圭壒娈�
-                    string unSelectPic = string.Empty;
-                    string selectPic = string.Empty;
-                    Shared.Common.LocalDevice.Current.GetDeviceObjectIcon(new List<CommonDevice> { this }, ref unSelectPic, ref selectPic);
-                    IconPath = unSelectPic;
-                }
-                Shared.Common.Global.WriteFileByBytesByHomeId(FilePath, System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)));
-            }
-        }
-
-        /// <summary>
-        /// 鏄惁鏄嚜瀹氫箟鍥剧墖
+        /// 鏄惁鏄嚜瀹氫箟鍥剧墖
         /// </summary>
         public bool IsCustomizeImage = false;
         /// <summary>
@@ -307,7 +40,6 @@
                 return $"{pathArr[0]}Selected.png";
             }
         }
-
         /// <summary>
         /// 褰撳墠缃戝叧鐨処D
         /// </summary>
@@ -315,45 +47,22 @@
         /// <summary>
         /// 褰撳墠璁惧绫诲瀷
         /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
         public DeviceType Type = DeviceType.UnKown;
-        /// <summary>
-        /// 璁惧鐨勫姛鑳界被鍨�(姝ょ被鍨嬬洰鍓嶅彧閽堝缁х數鍣ㄥ洖璺湁鏁�,榛樿鏈寚瀹�)
+        /// <summary>
+        /// 璁惧鐨勫姛鑳界被鍨�(姝ょ被鍨嬬洰鍓嶅彧閽堝缁х數鍣ㄥ洖璺湁鏁�,榛樿鏈寚瀹�)
         /// </summary>
         public DeviceFunctionType DfunctionType = DeviceFunctionType.A鏈畾涔�;
         /// <summary>
         /// MAC鍦板潃
         /// </summary>
         public string DeviceAddr;
-
         /// <summary>
         /// 璁惧绔彛鍙�
         /// </summary>
         public int DeviceEpoint;
-
         /// <summary>
-        /// 璁惧鍛戒护鏍煎紡锛歁ac+绔彛
-        /// </summary>
-        /// <value>The common device address epoint.</value>
-        public string CommonDeviceAddrEpoint
-        {
-            get
-            {
-                return DeviceAddr + "_" + DeviceEpoint.ToString();
-            }
-        }
-
-        /// <summary>
-        /// 缃戝叧鍙嶉鐨勬椂闂存埑
-        /// </summary>
-        public int Time;
-
-        /// <summary>
-        /// 缃戝叧鍥炲鐨勬暟鎹甀D
-        /// </summary>
-        public int DataID;
-
-        /// <summary>
-        /// 璁惧id
+        /// 瀹為檯鐨勮澶噄d
         /// <para>258:color dimmable light,璋冨叧鐏� </para>
         /// <para>10:Door lock,闂ㄩ攣</para>
         /// <para>514:Window covering device,绐楀笜</para>
@@ -365,7 +74,16 @@
         /// <para>1026:sensor,浼犳劅鍣紝鍏蜂綋绫诲瀷鐨勪紶鎰熷櫒DeviceType鏉ュ尯鍒�</para>
         /// </summary>
         public int DeviceID;
-
+        /// <summary>
+        /// <para>2020.09.21杩藉姞:涓轰簡瀵瑰簲绗笁鏂硅澶�,浠ュ強涔嬪悗鐨勫璁惧ID闂,杩藉姞鐨勫彉閲�</para>
+        /// <para>杩欐槸涓壒娈婄殑,骞朵笖涓嶄繚瀛樺湪鏂囦欢褰撲腑鐨処D, DeviceType鐢辨鍊兼槧灏勫嚭鏉�</para>
+        /// <para>褰撹澶囨槸娌充笢璁惧鏃�,瀹冧笌DeviceID鐩哥瓑</para>
+        /// <para>褰撴槸鐪熸鐨勭涓夋柟璁惧鏃�,瀹冩湁鍙兘涓嶥eviceID涓嶇浉绛�</para>
+        /// <para>姣斿锛�2鍜�256閮芥槸缁х數鍣�,閭d箞銆怐eviceID涓�2 鎴栬�� DeviceID涓�256銆� 鑰� 銆怑xDeviceID鍥哄畾涓�2銆�,銆怐eviceType涓篛nOffOutput銆�</para>
+        /// <para>閫氫織鏉ヨ锛欴eviceID鏄疄闄呮纭殑ID,鑰屻�怑xDeviceID鏄竴绉嶆墍灞炴蹇电殑ID銆�</para>
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public int ExDeviceID;
         /// <summary>
         /// 璇ュ瓧娈典富瑕侀拡瀵笽AS瀹夐槻璁惧璁剧珛銆傛墍鏈塈AS瀹夐槻璁惧鍏辩敤涓�涓狣eviceID涓�1026銆傛墍浠ヨ鍖哄垎瀛愯澶囩被鍨嬶紝闇�瑕佽瀛楁銆�
         /// 鐬棿鏁版嵁涓婃姤鐨勪紶鎰熷櫒 (MomentStatus=1    TriggerZoneStatus>=1锛滄姤璀︼紴)
@@ -380,17 +98,14 @@
         /// <para>22:Door/Window 闂ㄧ獥浼犳劅鍣紙鏈�21鍜�22锛岃繖閲屾病鏈夊啓閿�</para>
         /// </summary>
         public int IasDeviceType;
-
         /// <summary>
         /// 璁惧鍚嶇О,浠ヨ澶囩殑MAC鍛藉悕
         /// </summary>
         public string DeviceName = "UnKown";
-
         /// <summary>
         /// 璁惧绔偣鍚嶇О锛屼互璁惧绔偣鍚嶇О鍛藉悕
         /// </summary>
         public string DeviceEpointName = "UnKown";
-
         /// <summary>
         /// 鐢ㄤ簬鍒ゆ柇璁惧鐨剒igbee鍗忚鐗堟湰銆�
         ///<para>49246锛歓LL1.0鏍囧噯璁惧銆�</para>
@@ -398,6 +113,7 @@
         ///<para>41440锛歓GP3.0鏍囧噯璁惧銆�</para>
         ///<para>265锛歓SE1.4鏍囧噯璁惧銆�</para>
         /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
         public int Profile;
         /// <summary>
         /// 0锛氳澶囦笉鍦ㄧ嚎
@@ -405,7 +121,12 @@
         /// </summary>
         public int IsOnline;
         /// <summary>
-        /// 褰撳墠杩愯绋嬪簭鐗堟湰淇℃伅銆� 鏈�澶�64瀛楄妭
+        /// 1锛氳矾鐢辫澶�
+        /// <para>2锛氱粓绔澶囷紝鐢垫睜璁惧</para>
+        /// </summary>
+        public int ZigbeeType;
+        /// <summary>
+        /// 鍥轰欢鐗堟湰
         /// </summary>
         public int ImgVersion;
         /// <summary>
@@ -420,7 +141,7 @@
         /// 椹卞姩浠g爜銆備负0鏃讹紝琛ㄧずzigbee鍗忚皟鍣ㄨ澶囥�傚叾浠栧�艰〃绀轰负铏氭嫙椹卞姩璁惧
         /// </summary>
         public int DriveCode;
-        /// <summary>
+        /// <summary>
         /// 鐢熶骇鍟嗗悕瀛�
         /// </summary>
         public string ManufacturerName = string.Empty;
@@ -441,18 +162,6 @@
         /// </summary>
         public string SerialNumber = string.Empty;
         /// <summary>
-        /// 鎵�鏈夋寚瀹歝luster鏄惁閮藉凡缁忔垚鍔熺粦瀹氬崗璋冨櫒
-        ///<para>0:鏈畬鍏ㄧ粦瀹�</para>
-        ///<para>1锛氬凡缁忕粦瀹�</para>
-        /// </summary>
-        public int ClusterBindZbSuccess = -1;
-        /// <summary>
-        /// 鏄惁鑾峰彇鎵�鏈夐粯璁ょ粦瀹氫俊鎭�
-        ///<para>0锛氬惁</para>
-        ///<para>1锛氭槸</para>
-        /// </summary>
-        public int IsGetAllDefaultBind = -1;
-        /// <summary>
         /// 杈撳叆绨囧垪琛�
         /// </summary>
         public List<InClusterObj> InClusterList = new List<InClusterObj>();
@@ -461,9 +170,374 @@
         /// </summary>
         public List<OutClusterObj> OutClusterList = new List<OutClusterObj>();
         /// <summary>
-        /// 鐢ㄤ簬璁板綍璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�傛渶澶ф敮鎸佽褰�16涓睘鎬х姸鎬侊紝涓斿彧璁板綍灞炴�у�奸暱搴︿笉澶т簬4瀛楄妭鐨勬暟鎹��
+        /// 鐢ㄤ簬璁板綍璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�
         /// </summary>
         public List<AttributeStatusObj> AttributeStatus = new List<AttributeStatusObj>();
+
+        [Newtonsoft.Json.JsonIgnore]
+        public DateTime LastDateTime = DateTime.MinValue;
+        /// <summary>
+        /// 鏄惁宸茬粡璇诲彇浜嗚澶囩姸鎬�(姝ゅ睘鎬ф槸缁欎富椤典娇鐢ㄧ殑)
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public bool HadReadDeviceStatu = false;
+
+        /// <summary>
+        /// 鏄惁鏄綆鐢甸噺(杩欎釜鍙橀噺鐩墠鏄粰浼犳劅鍣ㄧ敤鐨�)
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public bool IsBatteryDown = false;
+
+        /// <summary>
+        /// 绛夊緟浠庣綉鍏虫帴鏀舵暟鎹殑鏃堕棿
+        /// </summary>
+        /// <value>The wait receive data time.</value>
+        [Newtonsoft.Json.JsonIgnore]
+        public virtual int WaitReceiveDataTime
+        {
+            get
+            {
+                if (Device.ZbGateway.RemoteMqttClient != null && Device.ZbGateway.RemoteMqttClient.IsConnected)
+                {
+                    return 10000;
+                }
+                else
+                {
+                    return 3000;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 閫氳繃璁惧璋冪敤缃戝叧
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public ZbGateway Gateway
+        {
+            get
+            {
+                if (string.IsNullOrEmpty(CurrentGateWayId))
+                {
+                    return null;
+                }
+                var gateWay = ZbGateway.GateWayList.Find(obj => (obj != null) && (obj.GwId == CurrentGateWayId));
+                if (gateWay == null)
+                {
+                    gateWay = new ZbGateway { IsVirtual = true, };
+                    gateWay.GwId = CurrentGateWayId;
+                    gateWay.HomeId = Shared.Common.Config.Instance.HomeId;
+                    ZbGateway.GateWayList.Add(gateWay);
+                }
+
+                return gateWay;
+            }
+        }
+
+        /// <summary>
+        /// 淇濆瓨璁惧鏁版嵁鐨勬枃浠跺悕
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public virtual string FilePath
+        {
+            get
+            {
+                //2020.09.21 瀵瑰簲绗笁鏂硅澶囧彲浠ュ叆缃�,璁惧鏂囦欢鍚嶅瓧,鍘绘帀 deviceType
+                return "Device_" + DeviceAddr + "_" + DeviceEpoint.ToString().PadLeft(2, '0');
+            }
+        }
+
+        #endregion
+
+        #region 璁惧淇濆瓨鍙婄敓鎴�
+
+        /// <summary>
+        /// 鐢辫澶囧瓧绗︿覆姣旂壒鎭㈠璁惧瀵硅薄
+        /// </summary>
+        /// <param name="intDeviceType">璁惧DeviceType鐨勬暣鍨嬪��</param>
+        /// <param name="strDeviceByte">璁惧Json鏂囦欢杞负姣旂壒鍚庡啀杞负鐨勫瓧绗︿覆</param>
+        /// <returns></returns>
+        public static CommonDevice CommonDeviceByByteString(int intDeviceType, string strDeviceByte)
+        {
+            //杩欐槸娌充笢鐨勭壒娈婄鐐�,涓嶉渶瑕佸鐞�
+            if (intDeviceType == 49408)
+            {
+                return null;
+            }
+
+            CommonDevice device = null;
+            if (intDeviceType == (int)DeviceType.DimmableLight || intDeviceType == 3)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<DimmableLight>(strDeviceByte);
+                device.ExDeviceID = (int)DeviceType.DimmableLight;
+            }
+            else if (intDeviceType == (int)DeviceType.OnOffOutput || intDeviceType == 256)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<ToggleLight>(strDeviceByte);
+                device.ExDeviceID = (int)DeviceType.OnOffOutput;
+            }
+            else if (intDeviceType == (int)DeviceType.ColorDimmerSwitch)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<ColorDimmerSwitch>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.LevelControlSwitch)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<LevelControlSwitch>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.WindowCoveringDevice)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<Rollershade>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.WindowCoveringController)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<WindowCoveringController>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.OnOffSwitch)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<Panel>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.IASZone)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<IASZone>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.OtaDevice || intDeviceType == (int)DeviceType.OtaPanelDevice)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<OTADevice>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.AirSwitch)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<AirSwitch>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.Repeater)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<Repeater>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.Thermostat)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.Transverter)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<Transverter>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.DoorLock)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<DoorLock>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.TemperatureSensor)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<TemperatureSensor>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.FreshAirHumiditySensor)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<HumiditySensor>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.FreshAir)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<FreshAir>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.PMSensor)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<PMSensor>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.ColorTemperatureLight)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<ColorTemperatureLight>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.Buzzer)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<Buzzer>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.ColorDimmableLight)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<ColorDimmableLight>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.DimmerSwitch)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<DimmerSwitch>(strDeviceByte);
+            }
+            else if (intDeviceType == (int)DeviceType.Airer)
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<Airer>(strDeviceByte);
+            }
+            else
+            {
+                device = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice>(strDeviceByte);
+            }
+
+            //杩欐槸娌充笢鐨勭壒娈婄鐐�,涓嶉渶瑕佸鐞�
+            if (device.DeviceEpoint == 242 && intDeviceType == 97)
+            {
+                return null;
+            }
+
+            if (device.ExDeviceID == 0)
+            {
+                //璧嬪垵濮嬪��
+                device.ExDeviceID = device.DeviceID;
+            }
+
+            //鑳藉皯瀛樹竴涓彉閲忓氨灏戝瓨涓�涓�
+            device.Type = (DeviceType)device.ExDeviceID;
+
+            return device;
+        }
+
+        /// <summary>
+        /// 淇濆瓨璁惧
+        /// </summary>
+        public void Save()
+        {
+            if (Shared.Common.Global.IsExistsByHomeId(FilePath))
+            {
+                return;
+            }
+            ReSave();
+        }
+
+        /// <summary>
+        /// 閲嶆柊淇濆瓨璁惧
+        /// </summary>
+        public void ReSave()
+        {
+            if (Shared.Common.Config.Instance.Home.IsShowTemplate == true)
+            {
+                //灞曠ず妯℃澘鏃�,涓嶅厑璁镐繚瀛樻枃浠�(闃叉灞炴�т笂鎶ョ敤鐨�)
+                return;
+            }
+            if (IconPath == string.Empty)
+            {
+                //淇濆瓨璁惧鍥炬爣(杩欓噷浼氫繚瀛樹竴娆�,涓嬮潰灏变笉鐢ㄤ繚瀛樹簡)
+                this.SaveDeviceIcon();
+                return;
+            }
+            Shared.Common.Global.WriteFileByBytesByHomeId(FilePath, System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)));
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁鏄┖姘旇川閲忎紶鎰熷櫒
+        /// </summary>
+        /// <param name="dev"></param>
+        /// <returns></returns>
+        public bool isAirQualitySensor(CommonDevice dev)
+        {
+            bool hasT = false;
+            bool hasH = false;
+            bool hasPM = false;
+            bool hasCo2 = false;
+            foreach (var clu in dev.InClusterList)
+            {
+                switch (clu.InCluster)
+                {
+                    case 1026:
+                        hasT = true;
+                        break;
+                    case 1029:
+                        hasH = true;
+                        break;
+                    case 1037:
+                        hasCo2 = true;
+                        break;
+                    case 1066:
+                        hasPM = true;
+                        break;
+                }
+            }
+
+            if (hasT == true && hasH == true && hasPM == true && hasCo2 == true)
+            {
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 淇濆瓨璁惧鍥炬爣
+        /// </summary>
+        private void SaveDeviceIcon()
+        {
+            if (IconPath == string.Empty)
+            {
+                //骞叉帴鐐�
+                if (this.Type == DeviceType.OnOffSwitch)
+                {
+                    IconPath = "Device/DryContact.png";
+                }
+                else if (this.Type == DeviceType.ColorDimmableLight)
+                {
+                    //褰╃伅
+                    IconPath = "Device/ColorLight.png";
+                }
+                else if (this.Type == DeviceType.DimmableLight)
+                {
+                    //璋冨厜鍣�
+                    IconPath = "Device/Light.png";
+                }
+                else if (this.Type == DeviceType.ColorTemperatureLight)
+                {
+                    //鑹叉俯鐏�
+                    IconPath = "Device/ColorLightTemperature.png";
+                }
+                else if (this.Type == DeviceType.OnOffOutput)
+                {
+                    //缁х數鍣�
+                    IconPath = "Device/RelayEpoint.png";
+                }
+                else if (this.Type == DeviceType.Thermostat)
+                {
+                    //绌鸿皟 
+                    IconPath = "Device/AirConditionerEpoint.png";
+                }
+                else if (this.Type == DeviceType.FreshAir)
+                {
+                    //鏂伴 
+                    IconPath = "Device/FreshAirEpoint.png";
+                }
+                else if (this.Type == DeviceType.PMSensor)
+                {
+                    //PM2.5绌烘皵璐ㄩ噺浼犳劅鍣� 
+                    IconPath = "Device/AirQualitySensorEpoint.png";
+                }
+                else if (this.Type == DeviceType.FreshAirHumiditySensor)
+                {
+                    //婀垮害浼犳劅鍣�
+                    IconPath = "Device/SensorHumidity.png";
+                }
+                else if (this.Type == DeviceType.TemperatureSensor)
+                {
+                    if (isAirQualitySensor(this))
+                    {
+                        //绌烘皵璐ㄩ噺浼犳劅鍣�
+                        IconPath = "Device/AirQualitySensorEpoint.png";
+                    }
+                    else
+                    {
+                        if (((TemperatureSensor)this).SensorDiv == 1)
+                        {
+                            //娓╁害浼犳劅鍣�
+                            IconPath = "Device/SensorTemperature.png";
+                        }
+                        else if (((TemperatureSensor)this).SensorDiv == 2)
+                        {
+                            //婀垮害浼犳劅鍣�
+                            IconPath = "Device/SensorHumidity.png";
+                        }
+                    }
+                }
+                else if (this.Type != DeviceType.UnKown)
+                {
+                    //鍏朵粬鐨勫浘鏍囨湁鐐圭壒娈�
+                    string unSelectPic = string.Empty;
+                    string selectPic = string.Empty;
+                    Shared.Common.LocalDevice.Current.GetDeviceObjectIcon(new List<CommonDevice> { this }, ref unSelectPic, ref selectPic);
+                    IconPath = unSelectPic;
+                }
+                Shared.Common.Global.WriteFileByBytesByHomeId(FilePath, System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)));
+            }
+        }
+
+        #endregion
+
+        #region 杈撳叆杈撳嚭闀炲畾涔�
 
         /// <summary>
         /// 璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�
@@ -480,7 +554,7 @@
             /// </summary>
             public int AttributeId;
             /// <summary>
-            /// 灞炴�у�硷紝鏈�澶у崰鐢�4涓瓧鑺�
+            /// 灞炴�у�硷紝杩欎釜涓滆タ涓嶉渶瑕佷粈涔堥珮浣嶅湪鍚庝綆浣嶅湪鍓�,瀹冨凡缁忔槸杞负浜�10杩涘埗
             /// </summary>
             public int AttributeData;
             /// <summary>
@@ -517,6 +591,8 @@
             /// 娓╁害娴嬮噺鍔熻兘鐨勮澶囧锛氭俯搴︿紶鎰熷櫒銆傘�傘��
             /// <para>1029:Relative Humidity Measurement,璁惧鏀寔鈥滄箍搴︽祴閲忓姛鑳解��</para>
             /// 婀垮害娴嬮噺鍔熻兘鐨勮澶囧锛氭箍搴︿紶鎰熷櫒銆傘�傘��
+            /// <para>1066:Pm2.5  Measurement,璁惧鏀寔鈥減m2.5娴嬮噺鍔熻兘鈥�</para>
+            /// Pm2.5娴嬮噺鍔熻兘鐨勮澶囧锛歅m2.5浼犳劅鍣ㄣ�傘�傘��
             /// </summary>
             public int InCluster;
         }
@@ -609,12 +685,15 @@
             public int commandId;
         }
 
-        #region 浜屻�佽幏鍙栧凡鍏ョ綉璁惧淇℃伅
+        #endregion
+
+        #region 鑾峰彇宸插叆缃戣澶囦俊鎭�
 
         /// <summary>
         /// 缃戝叧涓殑璁惧淇℃伅
         /// </summary>
-        public DeviceInfoData DeviceInfo = new DeviceInfoData();
+        [Newtonsoft.Json.JsonIgnore]
+        public DeviceInfoData DeviceInfo = null;
         /// <summary>
         /// 缃戝叧涓殑璁惧淇℃伅
         /// </summary>
@@ -686,19 +765,23 @@
             /// 椹卞姩浠g爜銆備负0鏃讹紝琛ㄧずzigbee鍗忚皟鍣ㄨ澶囥�傚叾浠栧�艰〃绀轰负铏氭嫙椹卞姩璁惧
             /// </summary>
             public int DriveCode;
-            /// <summary>
-            /// 鍘傚晢鍚嶇О
+            /// <summary>
+            /// 鍘傚晢鍚嶇О
             /// </summary>
             public string ManufacturerName = string.Empty;
-            /// <summary>
-            /// 妯″潡ID
+            /// <summary>
+            /// 妯″潡ID
             /// </summary>
             public string ModelIdentifier = string.Empty;
-            /// <summary>
-            /// 濂藉儚鏄簭鍒楀彿
+            /// <summary>
+            /// 濂藉儚鏄簭鍒楀彿
             /// </summary>
             public string ProductCode = string.Empty;
             /// <summary>
+            /// 璁惧鍔熻兘绫诲瀷(绌烘皵寮�鍏冲拰缁х數鍣ㄤ笓鐢�)
+            /// </summary>
+            public int FunctionType = -1;
+            /// <summary>
             /// 杈撳叆绨囧垪琛�
             /// </summary>
             public List<InClusterObj> InClusterList = new List<InClusterObj>();
@@ -713,110 +796,15 @@
 
         }
 
+        #endregion
+
+        #region 閿欒缁撴灉瀹氫箟
+
         /// <summary>
-        /// 鑾峰彇鎵�鏈夌綉鍏崇殑鑺傜偣璁惧淇℃伅锛堢敤浜庝富缃戝叧锛�
-        /// </summary>
-        public AllGatewayDeviceInfo getAllGatewayDeviceInfo;
-        /// <summary>
-        /// 鑾峰彇鎵�鏈夌綉鍏崇殑鑺傜偣璁惧淇℃伅锛堢敤浜庝富缃戝叧锛�
+        /// 缃戝叧淇℃伅閿欒鍙嶉鍏遍��
         /// </summary>
         [System.Serializable]
-        public class AllGatewayDeviceInfo
-        {
-            /// <summary>
-            /// 鍏ョ綉璁惧鎬绘暟銆傜瓑浜�0鏃讹紝琛ㄧず娌℃湁璁惧淇℃伅锛屼笅闈㈠瓧娈靛皢涓嶅瓨鍦ㄣ��
-            /// </summary>
-            public int TotalNum;
-            /// <summary>
-            /// 鏍囪瘑褰撳墠璁惧鏄彂閫佺殑鏄鍑犱釜璁惧銆侱eviceNum浠�1寮�濮嬫瘡鍙戦�佷竴涓澶囦俊鎭紝涓嬩竴涓澶囦俊鎭殑DeviceNum灏嗗姞1銆傜洿鍒癉eviceNum绛変簬TotalNum璇存槑鎵�鏈夎澶囦俊鎭彂閫佸畬姣曘��
-            /// </summary>
-            public int DeviceNum;
-            /// <summary>
-            /// 璁惧鎵�鍦ㄧ綉鍏崇殑缃戝叧id
-            /// </summary>
-            public string GwId;
-            /// <summary>
-            /// 鍏ョ綉鐨剈tc鏃堕棿鎴�
-            /// </summary>
-            public int JoinTime;
-            /// <summary>
-            /// 1:璺敱鍣ㄨ澶�
-            /// <para>2:缁堢璁惧</para>
-            /// </summary>
-            public int ZigbeeType;
-            /// <summary>
-            /// 璁惧缃戠粶鍦板潃
-            /// </summary>
-            public int NwkAddr;
-            /// <summary>
-            /// 璇ュ瓧娈典富瑕侀拡瀵笽AS瀹夐槻璁惧璁剧珛銆傛墍鏈塈AS瀹夐槻璁惧鍏辩敤涓�涓狣eviceID涓�1026銆傛墍浠ヨ鍖哄垎瀛愯澶囩被鍨嬶紝闇�瑕佽瀛楁銆�
-            /// <para>13:Motion sensor (杩愬姩浼犳劅鍣級</para>
-            /// <para>43:Carbon Monoxide sensor (涓�姘у寲纰充紶鎰熷櫒锛�</para>
-            /// <para>44:Personal emergency device (绱ф�ユ寜閽級</para>
-            /// </summary>
-            public int DeviceType;
-            /// <summary>
-            /// 鐢ㄤ簬鍒ゆ柇璁惧鐨剒igbee鍗忚鐗堟湰銆�
-            /// <para>49246锛歓LL1.0鏍囧噯璁惧銆�</para>
-            /// <para>260锛� ZHA1.2鏍囧噯璁惧銆� Z3.0鏍囧噯璁惧銆�</para>
-            /// <para>41440锛歓GP3.0鏍囧噯璁惧銆�</para>
-            /// <para>265锛歓SE1.4鏍囧噯璁惧銆�</para>
-            /// </summary>
-            public int Profile;
-            /// <summary>
-            /// 璁惧绔偣鍚�
-            /// </summary>
-            public string DeviceName;
-            /// <summary>
-            /// 璁惧鍚�
-            /// </summary>
-            public string MacName;
-            /// <summary>
-            /// 0锛氳澶囦笉鍦ㄧ嚎
-            /// <para>1锛氳澶囧湪绾�</para>
-            /// </summary>
-            public int IsOnline;
-            /// <summary>
-            /// 褰撳墠杩愯绋嬪簭鐗堟湰淇℃伅銆� 鏈�澶�64瀛楄妭
-            /// </summary>
-            public int ImgVersion;
-            /// <summary>
-            /// 纭欢鐗堟湰
-            /// </summary>
-            public int HwVersion;
-            /// <summary>
-            /// 褰撳墠闀滃儚绫诲瀷id
-            /// </summary>
-            public int ImgTypeId;
-            /// <summary>
-            /// 椹卞姩浠g爜銆備负0鏃讹紝琛ㄧずzigbee鍗忚皟鍣ㄨ澶囥�傚叾浠栧�艰〃绀轰负铏氭嫙椹卞姩璁惧
-            /// </summary>
-            public int DriveCode;
-            /// <summary>
-            /// 杈撳叆绨囧垪琛�
-            /// </summary>
-            public List<InClusterObj> InClusterList = new List<InClusterObj>();
-
-            /// <summary>
-            /// 杈撳嚭绨囧垪琛�
-            /// </summary>
-            public List<OutClusterObj> OutClusterList = new List<OutClusterObj>();
-            /// <summary>
-            /// 鐢ㄤ簬璁板綍璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�傛渶澶ф敮鎸佽褰�16涓睘鎬х姸鎬侊紝涓斿彧璁板綍灞炴�у�奸暱搴︿笉澶т簬4瀛楄妭鐨勬暟鎹��
-            /// </summary>
-            public List<AttributeStatusObj> AttributeStatus = new List<AttributeStatusObj>();
-
-        }
-
-        /// <summary>
-        /// 鑾峰彇缃戝叧璁板綍鐨勮澶囧睘鎬х姸鎬�
-        /// </summary>
-        public GetStatusRecordAllInfo getStatusRecordAllInfo;
-        /// <summary>
-        /// 鑾峰彇缃戝叧璁板綍鐨勮澶囧睘鎬х姸鎬�
-        /// </summary>
-        [System.Serializable]
-        public class GetStatusRecordAllInfo
+        public class ErrorResponCommon
         {
             /// <summary>
             /// 閿欒淇℃伅
@@ -827,269 +815,8 @@
             /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
             /// </summary>
             public ErrorResponData errorResponData;
-            /// <summary>
-            /// 璁惧鍚嶇О淇敼
-            /// </summary>
-            public GetStatusRecordInfo getStatusRecordInfo;
         }
 
-        /// <summary>
-        /// 鑾峰彇鎵�鏈夌綉鍏崇殑鑺傜偣璁惧淇℃伅锛堢敤浜庝富缃戝叧锛�
-        /// </summary>
-        public GetStatusRecordInfo getStatusRecordInfo;
-        /// <summary>
-        /// 鑾峰彇鎵�鏈夌綉鍏崇殑鑺傜偣璁惧淇℃伅锛堢敤浜庝富缃戝叧锛�
-        /// </summary>
-        [System.Serializable]
-        public class GetStatusRecordInfo
-        {
-            /// <summary>
-            /// 璁惧鎵�鍦ㄧ綉鍏崇殑缃戝叧id
-            /// </summary>
-            public string GwId;
-            /// <summary>
-            /// 鍏ョ綉鐨剈tc鏃堕棿鎴�
-            /// </summary>
-            public int JoinTime;
-            /// <summary>
-            /// 1:璺敱鍣ㄨ澶�
-            /// <para>2:缁堢璁惧</para>
-            /// </summary>
-            public int ZigbeeType;
-            /// <summary>
-            /// 璁惧缃戠粶鍦板潃
-            /// </summary>
-            public int NwkAddr;
-            /// <summary>
-            /// 璇ュ瓧娈典富瑕侀拡瀵笽AS瀹夐槻璁惧璁剧珛銆傛墍鏈塈AS瀹夐槻璁惧鍏辩敤涓�涓狣eviceID涓�1026銆傛墍浠ヨ鍖哄垎瀛愯澶囩被鍨嬶紝闇�瑕佽瀛楁銆�
-            /// <para>13:Motion sensor (杩愬姩浼犳劅鍣級</para>
-            /// <para>43:Carbon Monoxide sensor (涓�姘у寲纰充紶鎰熷櫒锛�</para>
-            /// <para>44:Personal emergency device (绱ф�ユ寜閽級</para>
-            /// </summary>
-            public int DeviceType;
-            /// <summary>
-            /// 鐢ㄤ簬鍒ゆ柇璁惧鐨剒igbee鍗忚鐗堟湰銆�
-            /// <para>49246锛歓LL1.0鏍囧噯璁惧銆�</para>
-            /// <para>260锛� ZHA1.2鏍囧噯璁惧銆� Z3.0鏍囧噯璁惧銆�</para>
-            /// <para>41440锛歓GP3.0鏍囧噯璁惧銆�</para>
-            /// <para>265锛歓SE1.4鏍囧噯璁惧銆�</para>
-            /// </summary>
-            public int Profile;
-            /// <summary>
-            /// 璁惧绔偣鍚�
-            /// </summary>
-            public string DeviceName;
-            /// <summary>
-            /// 璁惧鍚�
-            /// </summary>
-            public string MacName;
-            /// <summary>
-            /// 0锛氳澶囦笉鍦ㄧ嚎
-            /// <para>1锛氳澶囧湪绾�</para>
-            /// </summary>
-            public int IsOnline;
-            /// <summary>
-            /// 褰撳墠杩愯绋嬪簭鐗堟湰淇℃伅銆� 鏈�澶�64瀛楄妭
-            /// </summary>
-            public int ImgVersion;
-            /// <summary>
-            /// 纭欢鐗堟湰
-            /// </summary>
-            public int HwVersion;
-            /// <summary>
-            /// 褰撳墠闀滃儚绫诲瀷id
-            /// </summary>
-            public int ImgTypeId;
-            /// <summary>
-            /// 椹卞姩浠g爜銆備负0鏃讹紝琛ㄧずzigbee鍗忚皟鍣ㄨ澶囥�傚叾浠栧�艰〃绀轰负铏氭嫙椹卞姩璁惧
-            /// </summary>
-            public int DriveCode;
-            /// <summary>
-            /// 杈撳叆绨囧垪琛�
-            /// </summary>
-            public List<InClusterObj> InClusterList = new List<InClusterObj>();
-            /// <summary>
-            /// 杈撳嚭绨囧垪琛�
-            /// </summary>
-            public List<OutClusterObj> OutClusterList = new List<OutClusterObj>();
-            /// <summary>
-            /// 鐢ㄤ簬璁板綍璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�傛渶澶ф敮鎸佽褰�16涓睘鎬х姸鎬侊紝涓斿彧璁板綍灞炴�у�奸暱搴︿笉澶т簬4瀛楄妭鐨勬暟鎹��
-            /// </summary>
-            public List<AttributeStatusObj> AttributeStatus = new List<AttributeStatusObj>();
-        }
-        #endregion
-
-        /// <summary>
-        /// 鏈夋柊璁惧鍔犲叆zigbee缃戠粶鐨勪俊鎭�
-        /// </summary>
-        public DeviceDeviceJoinZbNetResponData deviceDeviceJoinZbNetResponData;
-        /// <summary>
-        /// 鏈夋柊璁惧鍔犲叆zigbee缃戠粶鐨勪俊鎭�
-        /// </summary>
-        [System.Serializable]
-        public class DeviceDeviceJoinZbNetResponData
-        {
-            /// <summary>
-            /// 璁惧缃戠粶鍦板潃
-            /// </summary>
-            public int NwkAddr;
-            /// <summary>
-            /// 1:璺敱鍣ㄨ澶�
-            /// <para>2:缁堢璁惧</para>
-            /// </summary>
-            public int ZigbeeType;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鏂拌澶囨墍鏈夌鐐逛俊鎭槸鍚︽垚鍔熶俊鎭�
-        /// </summary>
-        public DeviceIsGetEpointInfoResponData deviceIsGetEpointInfoResponData;
-        /// <summary>
-        /// 鑾峰彇鏂拌澶囨墍鏈夌鐐逛俊鎭槸鍚︽垚鍔熶俊鎭�
-        /// </summary>
-        [System.Serializable]
-        public class DeviceIsGetEpointInfoResponData
-        {
-            /// <summary>
-            /// 0锛氭垚鍔熻幏鍙栨墍鏈夌鐐逛俊鎭�
-            ///<para>1锛氳幏鍙栧け璐�</para>
-            /// </summary>
-            public int Result;
-        }
-
-        /// <summary>
-        /// 缃戝叧涓柊鎼滅储鍑虹殑璁惧淇℃伅
-        /// </summary>
-        public NewDeviceInfoData getNewDeviceInfo;
-        /// <summary>
-        /// 缃戝叧涓柊鎼滅储鍑虹殑璁惧淇℃伅
-        /// </summary>
-        [System.Serializable]
-        public class NewDeviceInfoData
-        {
-            /// <summary>
-            /// 鍏ョ綉鐨剈tc鏃堕棿鎴�
-            /// </summary>
-            public int JoinTime;
-            /// <summary>
-            /// 1:璺敱鍣ㄨ澶�
-            /// <para>2:缁堢璁惧</para>
-            /// </summary>
-            public int ZigbeeType;
-            /// <summary>
-            /// 璁惧缃戠粶鍦板潃
-            /// </summary>
-            public int NwkAddr;
-            /// <summary>
-            /// 璇ュ瓧娈典富瑕侀拡瀵笽AS瀹夐槻璁惧璁剧珛銆傛墍鏈塈AS瀹夐槻璁惧鍏辩敤涓�涓狣eviceID涓�1026銆傛墍浠ヨ鍖哄垎瀛愯澶囩被鍨嬶紝闇�瑕佽瀛楁銆�
-            /// <para>13:Motion sensor (杩愬姩浼犳劅鍣級</para>
-            /// <para>43:Carbon Monoxide sensor (涓�姘у寲纰充紶鎰熷櫒锛�</para>
-            /// <para>44:Personal emergency device (绱ф�ユ寜閽級</para>
-            /// </summary>
-            public int DeviceType;
-            /// <summary>
-            /// 鐢ㄤ簬鍒ゆ柇璁惧鐨剒igbee鍗忚鐗堟湰銆傚尯鍒�3.0璁惧鍜孼HA璁惧
-            /// <para>49246锛歓LL1.0鏍囧噯璁惧銆�</para>
-            /// <para>260锛� ZHA1.2鏍囧噯璁惧銆� Z3.0鏍囧噯璁惧銆�</para>
-            /// <para>41440锛歓GP3.0鏍囧噯璁惧銆�</para>
-            /// <para>265锛歓SE1.4鏍囧噯璁惧銆�</para>
-            /// </summary>
-            public int Profile;
-            /// <summary>
-            /// 鏄惁鏄柊鍏ョ綉璁惧銆�
-            /// <para>濡傛灉缃戝叧鍌ㄥ瓨鐨勮澶囧垪琛ㄤ腑鍘熸潵鏄病鏈夎璁惧鍒欎负鏂板叆缃戣澶囥��</para>
-            /// <para>濡傛灉缃戝叧鍌ㄥ瓨鐨勮澶囧垪琛ㄤ腑鏈夎璁惧鍒欎负鏃ц澶囥��</para>
-            /// <para>濡傛灉閲嶅叆缃戝悗璁惧淇℃伅宸茬粡鏀瑰彉锛堝璁惧鐨勭綉缁滃湴鍧�锛岃澶嘔D锛宑luster鍒楄〃锛夊垯涔熻涓烘柊璁惧鍏ョ綉銆�</para>
-            /// <para>璇ュ瓧娈电敤鏉ュ垽鍒敤鎴峰彲鑳介�氳繃鑺傜偣鐨勫疄浣撴寜閿皢璁惧鎭㈠鍑哄巶璁惧鍚庤妭鐐硅澶囬噸鏂板叆缃戠殑鎯呭喌鎴栬妭鐐硅澶囬噸鍚富鍔ㄥ彂閫佸叆缃戜俊鎭殑鎯呭喌銆�</para>
-            /// <para>0锛氭棫璁惧鍏ョ綉</para>
-            /// <para>1锛氭柊璁惧鍏ョ綉</para>
-            /// <para>2锛氳澶囦负鏂拌澶囷紝骞跺湪涓婃姤璇ヤ俊鎭墠宸茬粡閫�缃戯紝鍗宠澶囧叆缃戝悗缃戝叧杩樻潵涓嶅強涓婃姤璇ヨ澶囦俊鎭澶囦究宸茬粡閫�缃戙�傦紙璁惧鍏ョ綉锛屽埌缃戝叧涓婃姤璁惧淇℃伅鏈変竴娈靛欢鏃讹紝濡傛灉鍦ㄦ鏈熼棿濡傛灉璁惧宸茬粡閫�缃戯紝灏嗗弽棣堣鍊笺�傝鍊间负寮傚父鎯呭喌锛屽綋鏀跺埌璇ュ�兼椂鍊欒鏄庤澶囧苟娌″叆缃戯紝鍙涪寮冭繖涓叆缃戜俊鎭級</para>
-            /// </summary>
-            public int IsNewDev;
-            /// <summary>
-            /// 褰撳墠杩愯绋嬪簭鐗堟湰淇℃伅銆� 鏈�澶�64瀛楄妭
-            /// </summary>
-            public int ImgVersion;
-            /// <summary>
-            /// 纭欢鐗堟湰
-            /// </summary>
-            public int HwVersion;
-            /// <summary>
-            /// 褰撳墠闀滃儚绫诲瀷id
-            /// </summary>
-            public int ImgTypeId;
-            /// <summary>
-            /// 椹卞姩浠g爜銆備负0鏃讹紝琛ㄧずzigbee鍗忚皟鍣ㄨ澶囥�傚叾浠栧�艰〃绀轰负铏氭嫙椹卞姩璁惧
-            /// </summary>
-            public int DriveCode;
-            /// <summary>
-            /// 璁惧鎵�鍦ㄧ綉鍏崇殑缃戝叧id
-            /// </summary>
-            public string GwId;
-            /// <summary>
-            /// 璁惧鍚�
-            /// </summary>
-            public string MacName;
-            /// <summary>
-            /// 璁惧绔偣鍚�
-            /// </summary>
-            public string DeviceName;
-            /// <summary>
-            /// 0锛氳澶囦笉鍦ㄧ嚎
-            /// <para>1锛氳澶囧湪绾�</para>
-            /// </summary>
-            public int IsOnline;
-            /// <summary>
-            /// 鎵�鏈夋寚瀹歝luster鏄惁閮藉凡缁忔垚鍔熺粦瀹氬崗璋冨櫒
-            ///<para>0:鏈畬鍏ㄧ粦瀹�</para>
-            ///<para>1锛氬凡缁忕粦瀹�</para>
-            /// </summary>
-            public int ClusterBindZbSuccess = -1;
-            /// <summary>
-            /// 鏄惁鑾峰彇鎵�鏈夐粯璁ょ粦瀹氫俊鎭�
-            ///<para>0锛氬惁</para>
-            ///<para>1锛氭槸</para>
-            /// </summary>
-            public int IsGetAllDefaultBind = -1;
-            /// <summary>
-            /// 鐢熶骇鍟嗗悕瀛�
-            /// </summary>
-            public string ManufacturerName = string.Empty;
-            /// <summary>
-            /// 妯″潡ID锛堣繖涓笢瑗夸篃鍙�愬瀷鍙风爜銆戯級
-            /// </summary>
-            public string ModelIdentifier = string.Empty;
-            /// <summary>
-            /// 鐢熶骇鏃ユ湡
-            /// </summary>
-            public string ProductionDate = string.Empty;
-            /// <summary>
-            /// 鐢垫簮
-            /// </summary>
-            public int PowerSource = -1;
-            /// <summary>
-            /// 搴忓垪鍙�
-            /// </summary>
-            public string SerialNumber = string.Empty;
-            /// <summary>
-            /// 杈撳叆绨囧垪琛�
-            /// </summary>
-            public List<InClusterObj> InClusterList = new List<InClusterObj>();
-            /// <summary>
-            /// 杈撳嚭绨囧垪琛�
-            /// </summary>
-            public List<OutClusterObj> OutClusterList = new List<OutClusterObj>();
-            /// <summary>
-            /// 鐢ㄤ簬璁板綍璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�傛渶澶ф敮鎸佽褰�16涓睘鎬х姸鎬侊紝涓斿彧璁板綍灞炴�у�奸暱搴︿笉澶т簬4瀛楄妭鐨勬暟鎹��
-            /// </summary>
-            public List<AttributeStatusObj> AttributeStatus = new List<AttributeStatusObj>();
-        }
-
-        /// <summary>
-        /// 缃戝叧淇℃伅閿欒鍙嶉
-        /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-        /// </summary>
-        public ErrorResponData errorResponData;
         /// <summary>
         /// 缃戝叧淇℃伅閿欒鍙嶉
         /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
@@ -1137,87 +864,10 @@
             return message;
         }
 
+        #endregion
+
         #region 淇敼璁惧绔彛鍚嶇О
-        ///<summary >
-        /// 淇敼璁惧绔彛锛堟寜閿級鍚嶇О
-        /// <para>Gateway:璁惧鎵�灞炵綉鍏筹紙璋冪敤鏂规硶锛歞evice.Gateway)</para>
-        /// <para>deviceName:鎸夐敭鍚嶇О</para>
-        /// </summary>
-        public async System.Threading.Tasks.Task<DeviceRenameAllData> RenameDeviceNameAsync(string deviceAddr, int deviceEpoint, string deviceName)
-        {
-            if (Gateway == null)
-            {
-                return null;
-            }
-            return await System.Threading.Tasks.Task.Run(async () =>
-            {
-                DeviceRenameAllData 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 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)
-                        {
-                            d = new DeviceRenameAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
-                        }
-                        else
-                        {
-                            d = new DeviceRenameAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
-                        }
-                    }
-
-                    if (topic == gatewayID + "/" + "DeviceRenameRespon")
-                    {
-                        var receiptData = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceRenameResponseData>(jobject["Data"].ToString());
-                        d = new DeviceRenameAllData { deviceRenameData = receiptData };
-                    }
-                };
-                Gateway.Actions += action;
-                System.Console.WriteLine("DeviceRename_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
-                try
-                {
-                    var bytes = new byte[64];
-                    var reamarkGwBytes = Encoding.UTF8.GetBytes(deviceName);
-                    System.Array.Copy(reamarkGwBytes, 0, bytes, 0, 64 < reamarkGwBytes.Length ? 64 : reamarkGwBytes.Length);
-                    deviceName = Encoding.UTF8.GetString(bytes);
-
-                    var jObject = new JObject { { "DeviceAddr", deviceAddr }, { "Epoint", deviceEpoint }, { "Cluster_ID", 0 }, { "Command", 96 } };
-                    var data = new JObject { { "DeviceName", deviceName } };
-                    jObject.Add("Data", data);
-                    Gateway?.Send(("DeviceRename"), jObject.ToString());
-                }
-                catch { }
-
-                var dateTime = DateTime.Now;
-                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
-                {
-                    await System.Threading.Tasks.Task.Delay(10);
-                    if (d != null)
-                    {
-                        break;
-                    }
-                }
-                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
-                {
-                    d = new DeviceRenameAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
-                }
-
-                Gateway.Actions -= action;
-                System.Console.WriteLine("DeviceRename_Actions閫�鍑�" + System.DateTime.Now.ToString());
-                return d;
-            });
-        }
-
-        /// <summary>
-        /// 閲嶅懡鍚嶈澶�,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
-        public DeviceRenameAllData renameDeviceAllData;
         /// <summary>
         /// 閲嶅懡鍚嶈澶�,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
@@ -1242,10 +892,6 @@
         /// <summary>
         /// 璁惧鍚嶇О淇敼
         /// </summary>
-        public DeviceRenameResponseData renameDeviceData;
-        /// <summary>
-        /// 璁惧鍚嶇О淇敼
-        /// </summary>
         [System.Serializable]
         public class DeviceRenameResponseData
         {
@@ -1262,111 +908,19 @@
         #endregion
 
         #region 淇敼璁惧mac鍚嶇О
-        ///<summary >
-        /// 淇敼璁惧mac鍚嶇О
-        /// <para>macName:璁惧鍚嶇О</para>
-        /// </summary>
-        public async System.Threading.Tasks.Task<RenameDeviceMacNameAllData> RenameDeviceMacNameAsync(string deviceAddr, int deviceEpoint, string macName)
-        {
-            if (Gateway == null)
-            {
-                return null;
-            }
-            return await System.Threading.Tasks.Task.Run(async () =>
-            {
-                RenameDeviceMacNameAllData 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 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)
-                        {
-                            d = new RenameDeviceMacNameAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
-                        }
-                        else
-                        {
-                            d = new RenameDeviceMacNameAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
-                        }
-                    }
-
-                    if (topic == gatewayID + "/" + "MacRename_Respon")
-                    {
-                        var deviceID = jobject.Value<int>("Device_ID");
-                        d = new RenameDeviceMacNameAllData { renameDeviceMacNameData = Newtonsoft.Json.JsonConvert.DeserializeObject<ToggleLight.RenameDeviceMacNameData>(jobject["Data"].ToString()) };
-                    }
-                };
-                Gateway.Actions += action;
-                System.Console.WriteLine("MacRename_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
-                try
-                {
-                    var bytes = new byte[64];
-                    var reamarkGwBytes = Encoding.UTF8.GetBytes(macName);
-                    System.Array.Copy(reamarkGwBytes, 0, bytes, 0, 64 < reamarkGwBytes.Length ? 64 : reamarkGwBytes.Length);
-                    macName = Encoding.UTF8.GetString(bytes);
-
-                    var jObject = new JObject { { "DeviceAddr", deviceAddr }, { "Epoint", deviceEpoint }, { "Cluster_ID", 0 }, { "Command", 100 } };
-                    var data = new JObject { { "MacName", macName } };
-                    jObject.Add("Data", data);
-                    Gateway?.Send(("MacRename"), jObject.ToString());
-                }
-                catch { }
-
-                var dateTime = DateTime.Now;
-                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
-                {
-                    await System.Threading.Tasks.Task.Delay(10);
-                    if (d != null)
-                    {
-                        break;
-                    }
-                }
-
-                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
-                {
-                    d = new RenameDeviceMacNameAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
-                }
-
-                Gateway.Actions -= action;
-                System.Console.WriteLine("MacRename_Action閫�鍑�" + System.DateTime.Now.ToString());
-                return d;
-            });
-        }
-
-        /// <summary>
-        /// 淇敼璁惧mac鍚嶇О鏁版嵁,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
-        public RenameDeviceMacNameAllData renameDeviceMacNameAllData;
         /// <summary>
         /// 淇敼璁惧mac鍚嶇О鏁版嵁,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
         [System.Serializable]
-        public class RenameDeviceMacNameAllData
+        public class RenameDeviceMacNameAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 淇敼璁惧mac鍚嶇О鏁版嵁
             /// </summary>
             public RenameDeviceMacNameData renameDeviceMacNameData;
         }
 
-        /// <summary>
-        /// 淇敼璁惧mac鍚嶇О鏁版嵁
-        /// </summary>
-        public RenameDeviceMacNameData renameDeviceMacNameData;
         /// <summary>
         /// 淇敼璁惧mac鍚嶇О鏁版嵁
         /// </summary>
@@ -1385,29 +939,106 @@
         }
         #endregion
 
-        #region 璁惧鎭㈠鍑哄巶璁剧疆涓庡嚭缃�
-        ///<summary >
-        /// 浣胯澶囨仮澶嶅嚭鍘傝缃�
-        /// <para>浠呮仮澶嶅嚭鍘傝缃紝涓嶇缃戙�備絾鏈変簺涓嶆爣鍑嗙殑3.0璁惧锛屾仮澶嶅嚭鍘傝缃氨浼氱缃戙�� 瀹㈡埛绔垨浜戠鍒扮綉鍏�</para>
+        #region 涓�閿洿鏂板洓瀵稿睆鎸夐敭灞炴��
+        /// <summary>
+        /// 鍚屾璁惧鍔熻兘
         /// </summary>
-        public async void ResetDeviceFactoryAsync(string deviceAddr, int deviceEpoint)
+        /// <returns></returns>
+        public async System.Threading.Tasks.Task<SynchronizationDeviceResponseAllData> SyncMsgToBindSource(string deviceAddr, int deviceEpoint)
         {
             if (Gateway == null)
             {
-                return;
+                return null;
             }
-            //Action<string, string> action = (topic, message) => { };
-            //Gateway.Actions += action;
-            System.Console.WriteLine("FactoryResete_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
-            try
-            {
-                var jObject = new JObject { { "DeviceAddr", deviceAddr }, { "Epoint", deviceEpoint }, { "Cluster_ID", 0 }, { "Command", 97 } };
-                Gateway.Send("FactoryReset", jObject.ToString());
-            }
-            catch { }
 
-            //Gateway.Actions -= action;
-            System.Console.WriteLine("FactoryReset_Action閫�鍑�" + System.DateTime.Now.ToString());
+            return await System.Threading.Tasks.Task.Run(async () =>
+            {
+                SynchronizationDeviceResponseAllData resContent = 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<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
+
+                        if (temp == null)
+                        {
+                            resContent = new SynchronizationDeviceResponseAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+                        }
+                        else
+                        {
+                            resContent = new SynchronizationDeviceResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
+                        }
+                    }
+
+                    if (topic == gatewayID + "/" + "Bind/SyncMsgToBindSourceRespon")
+                    {
+                        var res = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(jobject["Data"]["Result"].ToString());
+                        if (res == null)
+                        {
+                            resContent = new SynchronizationDeviceResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
+                        }
+                        else
+                        {
+                            resContent = new SynchronizationDeviceResponseAllData { result = res };
+                            System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
+                        }
+                    }
+                };
+                Gateway.Actions = action;
+                DebugPrintLog("Bind/SyncMsgToBindSourceRespon_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
+
+                try
+                {
+                    var jObject = new JObject { { "DeviceAddr", deviceAddr }, { "Epoint", deviceEpoint }, { "Cluster_ID", 0 }, { "Command", 5010 } };
+                    Gateway.Send("Bind/SyncMsgToBindSource", jObject.ToString());
+                }
+                catch { }
+
+                var dateTime = DateTime.Now;
+                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
+                {
+                    await System.Threading.Tasks.Task.Delay(10);
+                    if (resContent != null)
+                    {
+                        break;
+                    }
+                }
+                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
+                {
+                    resContent = new SynchronizationDeviceResponseAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
+                }
+                Gateway.Actions -= action;
+                DebugPrintLog("Bind/SyncMsgToBindSource_Actions 閫�鍑�" + System.DateTime.Now.ToString());
+
+                return resContent;
+            });
+
+        }
+
+        /// <summary>
+        /// 鍚屾璁惧,缃戝叧鍙嶉鍏蜂綋淇℃伅
+        /// </summary>
+        [System.Serializable]
+        public class SynchronizationDeviceResponseAllData
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            /// 鍚屾缁撴灉
+            /// 0:鎴愬姛锛氱綉鍏冲唴閮ㄨ嚜鍔ㄥ啓鍏ヨ澶囩洰鏍囧悕瀛椼�佽澶囩洰鏍囧姛鑳界被鍨嬨�佸満鏅洰鏍囧悕瀛椼�乽tc鏃堕棿鍐欏叆4瀵稿睆
+            /// 1:澶辫触
+            /// </summary>
+            public int result;
         }
         #endregion
 
@@ -1433,8 +1064,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -1448,22 +1078,21 @@
 
                     if (topic == gatewayID + "/" + "RemoveDeviceRespon")
                     {
-                        var gatewayTemp = new ZbGateway() { DeviceAddr = jobject.Value<string>("DeviceAddr"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
-                        gatewayTemp.removeDeviceResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.RemoveDeviceResponseData>(jobject["Data"].ToString());
+                        var removeDeviceResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.RemoveDeviceResponseData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.removeDeviceResponseData == null)
+                        if (removeDeviceResponseData == null)
                         {
                             d = new RemoveDeviceResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new RemoveDeviceResponseAllData { removeDeviceResponseData = gatewayTemp.removeDeviceResponseData };
+                            d = new RemoveDeviceResponseAllData { removeDeviceResponseData = removeDeviceResponseData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
                 };
                 Gateway.Actions += action;
-                System.Console.WriteLine("RemoveDevice_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
+                DebugPrintLog("RemoveDevice_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
 
                 try
                 {
@@ -1501,16 +1130,12 @@
                     d = new RemoveDeviceResponseAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
                 }
                 Gateway.Actions -= action;
-                System.Console.WriteLine("RemoveDevice_Actions 閫�鍑�" + System.DateTime.Now.ToString());
+                DebugPrintLog("RemoveDevice_Actions 閫�鍑�" + System.DateTime.Now.ToString());
 
                 return d;
             });
         }
 
-        /// <summary>
-        /// 闇�瑕佸垹闄よ澶囩殑鏁版嵁
-        /// </summary>
-        public RemoveDeviceData removeDeviceData;
         /// <summary>
         /// 闇�瑕佸垹闄よ澶囩殑鏁版嵁
         /// </summary>
@@ -1543,10 +1168,6 @@
         /// <summary>
         /// 绉婚櫎璁惧,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
-        public RemoveDeviceResponseAllData removeDeviceResponseAllData;
-        /// <summary>
-        /// 绉婚櫎璁惧,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
         [System.Serializable]
         public class RemoveDeviceResponseAllData
         {
@@ -1565,10 +1186,6 @@
             public RemoveDeviceResponseData removeDeviceResponseData;
         }
 
-        /// <summary>
-        /// 鍒犻櫎璁惧鍥炲鏁版嵁
-        /// </summary>
-        public RemoveDeviceResponseData removeDeviceResponseData;
         /// <summary>
         /// 鍒犻櫎璁惧鍥炲鏁版嵁
         /// <para>杩斿洖缁撴灉Resul=锛屽垹闄ゆ垚鍔�</para>
@@ -1609,135 +1226,6 @@
             public int Epoint;
 
         }
-        #endregion
-
-        #region 浠庢�昏澶囧垪琛ㄤ腑绉婚櫎涓�涓綉鍏崇殑鎵�鏈夎妭鐐硅澶囷紙鐢ㄤ簬涓荤綉鍏筹級
-        ///<summary >
-        /// 浠庢�昏澶囧垪琛ㄤ腑绉婚櫎涓�涓綉鍏崇殑鎵�鏈夎妭鐐硅澶囷紙鐢ㄤ簬涓荤綉鍏筹級
-        /// <para>GwId:瑕佺Щ闄よ妭鐐硅澶囩殑缃戝叧id</para>
-        /// </summary>
-        public async System.Threading.Tasks.Task<RemoveGatewayDeviceListAllData> RemoveGatewayDeviceListAsync(string gwId)
-        {
-            if (Gateway == null || gwId == null)
-            {
-                return null;
-            }
-            return await System.Threading.Tasks.Task.Run(async () =>
-            {
-                RemoveGatewayDeviceListAllData 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 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)
-                        {
-                            d = new RemoveGatewayDeviceListAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
-                        }
-                        else
-                        {
-                            d = new RemoveGatewayDeviceListAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
-                        }
-                    }
-                    if (topic == gatewayID + "/" + "RemoveEqOfGw_Respon")
-                    {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
-                        gatewayTemp.removeGatewayDeviceListData = Newtonsoft.Json.JsonConvert.DeserializeObject<RemoveGatewayDeviceListData>(jobject["Data"].ToString());
-
-                        if (gatewayTemp.removeGatewayDeviceListData == null)
-                        {
-                            d = new RemoveGatewayDeviceListAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
-                        }
-                        else
-                        {
-                            d = new RemoveGatewayDeviceListAllData { removeGatewayDeviceListData = gatewayTemp.removeGatewayDeviceListData };
-                            System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
-                        }
-                    }
-                };
-
-                Gateway.Actions += action;
-                System.Console.WriteLine("RemoveEqOfGw_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
-
-                try
-                {
-                    var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 81 } };
-                    var data = new JObject { { "GwId", gwId } };
-                    jObject.Add("Data", data);
-                    Gateway.Send(("RemoveEqOfGw"), jObject.ToString());
-                }
-                catch { }
-
-
-                var dateTime = DateTime.Now;
-                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
-                {
-                    await System.Threading.Tasks.Task.Delay(10);
-                    if (d != null)
-                    {
-                        break;
-                    }
-                }
-                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
-                {
-                    d = new RemoveGatewayDeviceListAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
-                }
-                Gateway.Actions -= action;
-                System.Console.WriteLine("RemoveEqOfGw_Actions 閫�鍑�" + System.DateTime.Now.ToString());
-
-                return d;
-            });
-        }
-
-        /// <summary>
-        /// 绉婚櫎璁惧,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
-        public RemoveGatewayDeviceListAllData removeGatewayDeviceListAllData;
-        /// <summary>
-        /// 绉婚櫎璁惧,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
-        [System.Serializable]
-        public class RemoveGatewayDeviceListAllData
-        {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
-            /// <summary>
-            /// 璁惧鍚嶇О淇敼
-            /// </summary>
-            public RemoveGatewayDeviceListData removeGatewayDeviceListData;
-        }
-
-        /// <summary>
-        /// 浠庢�昏澶囧垪琛ㄤ腑绉婚櫎涓�涓綉鍏崇殑鎵�鏈夎妭鐐硅澶囷紙鐢ㄤ簬涓荤綉鍏筹級
-        /// </summary>
-        public RemoveGatewayDeviceListData removeGatewayDeviceListData;
-        /// <summary>
-        /// 浠庢�昏澶囧垪琛ㄤ腑绉婚櫎涓�涓綉鍏崇殑鎵�鏈夎妭鐐硅澶囷紙鐢ㄤ簬涓荤綉鍏筹級
-        /// </summary>
-        [System.Serializable]
-        public class RemoveGatewayDeviceListData
-        {
-            /// <summary>
-            /// 瑕佺Щ闄よ妭鐐硅澶囩殑缃戝叧id
-            /// </summary>
-            public string GwId;
-            /// <summary>
-            /// 琚垹闄よ澶囩殑鏁伴噺
-            /// </summary>
-            public int RemoveNum;
-        }
-
         #endregion
 
         #region 璇嗗埆璁惧
@@ -1817,7 +1305,8 @@
         /// <summary>
         /// 璁惧灞炴�х姸鎬佷笂鎶�
         /// </summary>
-        public DeviceStatusReportData DeviceStatusReport = new DeviceStatusReportData { };
+        [Newtonsoft.Json.JsonIgnore]
+        public DeviceStatusReportData DeviceStatusReport = new DeviceStatusReportData();
         /// <summary>
         /// 璁惧灞炴�х姸鎬佷笂鎶�
         /// </summary>
@@ -1863,12 +1352,11 @@
         /// 璁剧疆鍙啓灞炴�х殑鍊�
         /// </summary>
         /// <returns>The writable value async.</returns>
-        /// <param name="gateway">Gateway.</param>
         /// <param name="clusterID">瑕侀厤缃殑灞炴�ф墍鍦ㄧ殑cluster.</param>
         /// <param name="setWritableValue">璁剧疆鍙啓灞炴�х殑鏁版嵁</param>
-        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetWritableValueAsync(ZigBee.Device.ZbGateway gateway, int clusterID, SetWritableValueData setWritableValue)
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetWritableValueAsync(int clusterID, SetWritableValueData setWritableValue)
         {
-            if (gateway == null || setWritableValue == null)
+            if (Gateway == null || setWritableValue == null)
             {
                 return null;
             }
@@ -1882,8 +1370,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -1897,7 +1384,6 @@
 
                     if (topic == gatewayID + "/" + "SetWritableValue_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value<int>("Device_ID"), DeviceAddr = jobject.Value<string>("DeviceAddr"), DeviceEpoint = jobject.Value<int>("Epoint"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = gateway.getGatewayBaseInfo.gwID };
                         var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<SetWritableValueResponData>(jobject["Data"].ToString());
 
                         if (tempData == null)
@@ -1911,7 +1397,7 @@
                         }
                     }
                 };
-                gateway.Actions += action;
+                Gateway.Actions += action;
                 System.Console.WriteLine("SetWritableValue_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
 
                 try
@@ -1919,7 +1405,7 @@
                     var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", clusterID }, { "Command", 120 } };
                     var data = new JObject { { "Undivided", setWritableValue.Undivided }, { "AttributeId", setWritableValue.AttributeId }, { "AttributeDataType", setWritableValue.AttributeDataType }, { "AttributeData", setWritableValue.AttributeData } };
                     jObject.Add("Data", data);
-                    gateway.Send("SetWritableValue", jObject.ToString());
+                    Gateway.Send("SetWritableValue", jObject.ToString());
                 }
                 catch { }
 
@@ -1936,7 +1422,7 @@
                 {
                     d = new SetWritableValueResponAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
                 }
-                gateway.Actions -= action;
+                Gateway.Actions -= action;
                 System.Console.WriteLine("SetWritableValue_Actions 閫�鍑�" + System.DateTime.Now.ToString());
 
                 return d;
@@ -1946,22 +1432,9 @@
         /// <summary>
         /// 缃戝叧鐗堟湰淇℃伅,缃戝叧鍙嶉淇℃伅
         /// </summary>
-        public SetWritableValueResponAllData setWritableValueResponAllData;
-        /// <summary>
-        /// 缃戝叧鐗堟湰淇℃伅,缃戝叧鍙嶉淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class SetWritableValueResponAllData
+        public class SetWritableValueResponAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 缃戝叧鐗堟湰淇℃伅
             /// </summary>
@@ -1992,10 +1465,6 @@
 
         }
 
-        /// <summary>
-        /// 璁剧疆鍙啓灞炴�х殑鍊肩殑鏁版嵁
-        /// </summary>
-        public SetWritableValueData setWritableValueData;
         /// <summary>
         /// 璁剧疆鍙啓灞炴�х殑鍊肩殑鏁版嵁
         /// </summary>
@@ -2072,8 +1541,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -2087,22 +1555,21 @@
 
                     if (topic == gatewayID + "/" + "Cluster/OwnAttributes_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = gateway.getGatewayBaseInfo.gwID };
-                        gatewayTemp.clusterOwnAttributesResponData = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ClusterOwnAttributesResponData>(jobject["Data"].ToString());
+                        var clusterOwnAttributesResponData = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ClusterOwnAttributesResponData>(jobject["Data"].ToString());
                         var tempAttributes = Newtonsoft.Json.Linq.JArray.Parse(jobject["Data"]["Attribute"].ToString());
                         for (int m = 0; tempAttributes != null && m < tempAttributes.Count; m++)
                         {
                             var tempAttribute = tempAttributes[m];
-                            gatewayTemp.clusterOwnAttributesResponData.AttributeList.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<AttributeObj>(tempAttribute.ToString()));
+                            clusterOwnAttributesResponData.AttributeList.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<AttributeObj>(tempAttribute.ToString()));
                         }
 
-                        if (gatewayTemp.clusterOwnAttributesResponData == null)
+                        if (clusterOwnAttributesResponData == null)
                         {
                             d = new ClusterOwnAttributesResponAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new ClusterOwnAttributesResponAllData { clusterOwnAttributesResponData = gatewayTemp.clusterOwnAttributesResponData };
+                            d = new ClusterOwnAttributesResponAllData { clusterOwnAttributesResponData = clusterOwnAttributesResponData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
 
                         }
@@ -2141,32 +1608,15 @@
         /// <summary>
         /// 鍙戠幇灞炴��,缃戝叧鍙嶉淇℃伅
         /// </summary>
-        public ClusterOwnAttributesResponAllData clusterOwnAttributesResponAllData;
-        /// <summary>
-        /// 鍙戠幇灞炴��,缃戝叧鍙嶉淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class ClusterOwnAttributesResponAllData
+        public class ClusterOwnAttributesResponAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 缃戝叧鐗堟湰淇℃伅
             /// </summary>
             public ClusterOwnAttributesResponData clusterOwnAttributesResponData;
         }
 
-        /// <summary>
-        /// 鍙戠幇灞炴�ф暟鎹�
-        /// </summary>
-        public ClusterOwnAttributesResponData clusterOwnAttributesResponData;
         [System.Serializable]
         public class ClusterOwnAttributesResponData
         {
@@ -2205,8 +1655,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -2221,17 +1670,16 @@
 
                     if (topic == gatewayID + "/" + "Cluster/OwnCommand_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = gateway.getGatewayBaseInfo.gwID };
-                        gatewayTemp.clusterOwnCommandResponData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClusterOwnCommandResponData>(jobject["Data"].ToString());
+                        var clusterOwnCommandResponData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClusterOwnCommandResponData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.clusterOwnCommandResponData == null)
+                        if (clusterOwnCommandResponData == null)
                         {
                             d = new ClusterOwnCommandResponAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
 
                         }
                         else
                         {
-                            d = new ClusterOwnCommandResponAllData { clusterOwnCommandResponData = gatewayTemp.clusterOwnCommandResponData };
+                            d = new ClusterOwnCommandResponAllData { clusterOwnCommandResponData = clusterOwnCommandResponData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
@@ -2270,32 +1718,15 @@
         /// <summary>
         /// 璁惧鏌恈luster鎵�鏀寔鐨凜ommand鏁版嵁,缃戝叧鍙嶉淇℃伅
         /// </summary>
-        public ClusterOwnCommandResponAllData clusterOwnCommandResponAllData;
-        /// <summary>
-        /// 璁惧鏌恈luster鎵�鏀寔鐨凜ommand鏁版嵁,缃戝叧鍙嶉淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class ClusterOwnCommandResponAllData
+        public class ClusterOwnCommandResponAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 缃戣澶囨煇cluster鎵�鏀寔鐨凜ommand鏁版嵁
             /// </summary>
             public ClusterOwnCommandResponData clusterOwnCommandResponData;
         }
 
-        /// <summary>
-        /// 璁惧鏌恈luster鎵�鏀寔鐨凜ommand鏁版嵁
-        /// </summary>
-        public ClusterOwnCommandResponData clusterOwnCommandResponData;
         /// <summary>
         /// 璁惧鏌恈luster鎵�鏀寔鐨凜ommand鏁版嵁
         /// </summary>
@@ -2333,8 +1764,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -2349,16 +1779,15 @@
 
                     if (topic == gatewayID + "/" + "OTA/SetImage_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
-                        gatewayTemp.oTASetImageData = Newtonsoft.Json.JsonConvert.DeserializeObject<OTASetImageData>(jobject["Data"].ToString());
+                        var oTASetImageData = Newtonsoft.Json.JsonConvert.DeserializeObject<OTASetImageData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.oTASetImageData == null)
+                        if (oTASetImageData == null)
                         {
                             d = new OTASetImageResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new OTASetImageResponseAllData { otaSetImageData = gatewayTemp.oTASetImageData };
+                            d = new OTASetImageResponseAllData { otaSetImageData = oTASetImageData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
@@ -2398,31 +1827,15 @@
         /// <summary>
         /// 璁惧杩涜OTA鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
-        public OTASetImageResponseAllData otaSetImageResponseAllData;
-        /// <summary>
-        /// 璁惧杩涜OTA鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class OTASetImageResponseAllData
+        public class OTASetImageResponseAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 淇濆瓨zigbee鍗忚皟鍣ㄧ粍缃戜俊鎭�
             /// </summary>
             public OTASetImageData otaSetImageData;
         }
-        /// <summary>
-        /// 璁惧杩涜OTA鍗囩骇
-        /// </summary>
-        public OTASetImageData oTASetImageData;
+
         [System.Serializable]
         public class OTASetImageData
         {
@@ -2496,8 +1909,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -2512,16 +1924,15 @@
 
                     if (topic == gatewayID + "/" + "OTA/StartUpdate_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
-                        gatewayTemp.startUpdateDeviceData = Newtonsoft.Json.JsonConvert.DeserializeObject<StartDeviceUpdateData>(jobject["Data"].ToString());
+                        var startUpdateDeviceData = Newtonsoft.Json.JsonConvert.DeserializeObject<StartDeviceUpdateData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.startUpdateDeviceData == null)
+                        if (startUpdateDeviceData == null)
                         {
                             d = new StartDeviceUpdateResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new StartDeviceUpdateResponseAllData { startUpdateDeviceData = gatewayTemp.startUpdateDeviceData };
+                            d = new StartDeviceUpdateResponseAllData { startUpdateDeviceData = startUpdateDeviceData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
@@ -2574,10 +1985,6 @@
         /// <summary>
         /// 鍚姩鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
-        public StartDeviceUpdateResponseAllData startUpdateDeviceResponseAllData;
-        /// <summary>
-        /// 鍚姩鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
         [System.Serializable]
         public class StartDeviceUpdateResponseAllData
         {
@@ -2595,10 +2002,7 @@
             /// </summary>
             public StartDeviceUpdateData startUpdateDeviceData;
         }
-        /// <summary>
-        /// 鍚姩鍗囩骇
-        /// </summary>
-        public StartDeviceUpdateData startUpdateDeviceData;
+
         [System.Serializable]
         public class StartDeviceUpdateData
         {
@@ -2639,7 +2043,9 @@
         /// <summary>
         /// 鍚姩鍗囩骇
         /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
         public OTAScheduleResponData oTAScheduleResponData;
+
         [System.Serializable]
         public class OTAScheduleResponData
         {
@@ -2660,10 +2066,6 @@
             public int Percent = 999;
         }
 
-        /// <summary>
-        ///  鍚姩鍗囩骇鐨勬暟鎹�
-        /// </summary>
-        public StartUpdateData startUpdateData;
         [System.Serializable]
         public class StartUpdateData
         {
@@ -2693,8 +2095,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -2709,16 +2110,15 @@
 
                     if (topic == gatewayID + "/" + "ZbDataPassthrough")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
-                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
+                        var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.clientDataPassthroughResponseData == null)
+                        if (clientDataPassthroughResponseData == null)
                         {
                             d = new ClientDataPassthroughResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new ClientDataPassthroughResponseAllData { clientDataPassthroughResponseData = gatewayTemp.clientDataPassthroughResponseData };
+                            d = new ClientDataPassthroughResponseAllData { clientDataPassthroughResponseData = clientDataPassthroughResponseData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
@@ -2758,22 +2158,9 @@
         /// <summary>
         /// 瀹㈡埛绔悜鑺傜偣璁惧閫忎紶鏁版嵁,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
-        public ClientDataPassthroughResponseAllData clientDataPassthroughResponseAllData;
-        /// <summary>
-        /// 瀹㈡埛绔悜鑺傜偣璁惧閫忎紶鏁版嵁,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class ClientDataPassthroughResponseAllData
+        public class ClientDataPassthroughResponseAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 瀹㈡埛绔悜鑺傜偣璁惧閫忎紶鏁版嵁
             /// </summary>
@@ -2782,7 +2169,9 @@
         /// <summary>
         /// 瀹㈡埛绔悜鑺傜偣璁惧閫忎紶鏁版嵁
         /// </summary>
-        public ClientDataPassthroughResponseData clientDataPassthroughResponseData = new ClientDataPassthroughResponseData { };
+        [Newtonsoft.Json.JsonIgnore]
+        public ClientDataPassthroughResponseData clientDataPassthroughResponseData = new ClientDataPassthroughResponseData();
+
         [System.Serializable]
         public class ClientDataPassthroughResponseData
         {
@@ -2795,31 +2184,15 @@
         /// <summary>
         /// 鍚敤鎴栧叧闂妭鐐硅澶囬�忎紶鏁版嵁涓婁紶鎺ュ彛,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
-        public OnZbDataPassthroughResponseAllData onZbDataPassthroughResponseAllData;
-        /// <summary>
-        /// 鍚敤鎴栧叧闂妭鐐硅澶囬�忎紶鏁版嵁涓婁紶鎺ュ彛,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class OnZbDataPassthroughResponseAllData
+        public class OnZbDataPassthroughResponseAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 鍚敤鎴栧叧闂妭鐐硅澶囬�忎紶鏁版嵁涓婁紶鎺ュ彛
             /// </summary>
             public OnZbDataPassthroughData onZbDataPassthroughData;
         }
-        /// <summary>
-        /// 鍚敤鎴栧叧闂妭鐐硅澶囬�忎紶鏁版嵁涓婁紶鎺ュ彛
-        /// </summary>
-        public OnZbDataPassthroughData onZbDataPassthroughData;
+
         [System.Serializable]
         public class OnZbDataPassthroughData
         {
@@ -2854,8 +2227,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -2869,16 +2241,15 @@
 
                     if (topic == gatewayID + "/" + "DownloadFile_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
-                        gatewayTemp.downloadFileResponData = Newtonsoft.Json.JsonConvert.DeserializeObject<DownloadFileResponData>(jobject["Data"].ToString());
+                        var downloadFileResponData = Newtonsoft.Json.JsonConvert.DeserializeObject<DownloadFileResponData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.downloadFileResponData == null)
+                        if (downloadFileResponData == null)
                         {
                             d = new DownloadFileResponAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new DownloadFileResponAllData { downloadFileResponData = gatewayTemp.downloadFileResponData };
+                            d = new DownloadFileResponAllData { downloadFileResponData = downloadFileResponData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
@@ -2919,35 +2290,19 @@
             });
 
         }
-        /// <summary>
-        /// 缃戝叧绯荤粺鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
-        public DownloadFileResponAllData downloadFileResponAllData;
+
         /// <summary>
         /// 缃戝叧绯荤粺鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
         [System.Serializable]
-        public class DownloadFileResponAllData
+        public class DownloadFileResponAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 涓嬭浇浜戠鍥轰欢
             /// </summary>
             public DownloadFileResponData downloadFileResponData;
         }
 
-        /// <summary>
-        /// 涓嬭浇浜戠鍥轰欢
-        /// </summary>
-        public DownloadFileResponData downloadFileResponData;
         /// <summary>
         /// 涓嬭浇浜戠鍥轰欢
         /// </summary>
@@ -2971,6 +2326,7 @@
         /// <summary>
         /// 涓嬭浇杩涘害
         /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
         public DownloadFileProgressResponData downloadFileProgressResponData;
         /// <summary>
         /// 涓嬭浇杩涘害
@@ -3023,8 +2379,7 @@
 
                     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());
+                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
 
                         if (temp == null)
                         {
@@ -3039,16 +2394,15 @@
 
                     if (topic == gatewayID + "/" + "OTA/KillUpdate_Respon")
                     {
-                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
-                        gatewayTemp.killUpdateData = Newtonsoft.Json.JsonConvert.DeserializeObject<KillUpdateData>(jobject["Data"].ToString());
+                        var killUpdateData = Newtonsoft.Json.JsonConvert.DeserializeObject<KillUpdateData>(jobject["Data"].ToString());
 
-                        if (gatewayTemp.killUpdateData == null)
+                        if (killUpdateData == null)
                         {
                             d = new KillUpdateResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
                         }
                         else
                         {
-                            d = new KillUpdateResponseAllData { killUpdateData = gatewayTemp.killUpdateData };
+                            d = new KillUpdateResponseAllData { killUpdateData = killUpdateData };
                             System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
                         }
                     }
@@ -3086,31 +2440,15 @@
         /// <summary>
         /// 缁堟璁惧鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
         /// </summary>
-        public KillUpdateResponseAllData killUpdateResponseAllData;
-        /// <summary>
-        /// 缁堟璁惧鍗囩骇,缃戝叧鍙嶉鍏蜂綋淇℃伅
-        /// </summary>
         [System.Serializable]
-        public class KillUpdateResponseAllData
+        public class KillUpdateResponseAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 缁堟璁惧鍗囩骇
             /// </summary>
             public KillUpdateData killUpdateData;
         }
-        /// <summary>
-        /// 缁堟璁惧鍗囩骇
-        /// </summary>
-        public KillUpdateData killUpdateData;
+
         [System.Serializable]
         public class KillUpdateData
         {
@@ -3123,22 +2461,10 @@
         #endregion
 
         #region 绉佹湁鍗忚缃戝叧鍜岃澶囩殑榛樿鍥炲
-        /// <summary>
-        /// 绉佹湁鍗忚缃戝叧鍜岃澶囩殑榛樿鍥炲
-        /// </summary>
-        public ResponseAllData keyColorDataResponseAllData;
+
         [System.Serializable]
-        public class ResponseAllData
+        public class ResponseAllData : ErrorResponCommon
         {
-            /// <summary>
-            /// 閿欒淇℃伅
-            /// </summary>
-            public string errorMessageBase;
-            /// <summary>
-            /// 缃戝叧淇℃伅閿欒鍙嶉
-            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
-            /// </summary>
-            public ErrorResponData errorResponData;
             /// <summary>
             /// 鎸夐敭鎸囩ず鐏鑹蹭俊鎭�
             /// </summary>
@@ -3162,5 +2488,27 @@
             public int status = -1;
         }
         #endregion
+
+        #region 鈻� 璋冭瘯鎵撳嵃
+
+        /// <summary>
+        /// 璋冭瘯鏃舵墦寮�鎵撳嵃淇℃伅锛宼rue:鎵撳嵃锛宖alse:涓嶆墦鍗�
+        /// </summary>
+        /// <param name="msg">Message.</param>
+        /// <param name="flage">If set to <c>true</c> flage.</param>
+        public static void DebugPrintLog(string msg, bool flage = true)
+        {
+#if DEBUG
+      if (flage == true)
+      {
+        if (msg.Contains("DeviceStatusReport") == false)
+        {
+          System.Console.WriteLine(msg + "  " + System.DateTime.Now.ToLongTimeString() + " " + System.DateTime.Now.Millisecond);
+        }
+      }
+#endif
+        }
+
+        #endregion
     }
 }

--
Gitblit v1.8.0