From 6fa9d69da922c8049f5acfcbb9ce9fd26811024c Mon Sep 17 00:00:00 2001
From: xm <1271024303@qq.com>
Date: 星期四, 16 四月 2020 17:10:57 +0800
Subject: [PATCH] 请合并代码

---
 ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs | 2756 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2,756 insertions(+), 0 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs
new file mode 100755
index 0000000..3e23033
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs
@@ -0,0 +1,2756 @@
+锘縰sing Newtonsoft.Json;
+using Shared.Common;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using ZigBee.Device;
+
+namespace Shared.Phone.UserCenter
+{
+    /// <summary>
+    /// 缃戝叧涓氬姟鐨勯�昏緫绫�
+    /// </summary>
+    public class HdlGatewayLogic
+    {
+        #region 鈻� 鍙橀噺澹版槑___________________________
+
+        /// <summary>
+        /// 缃戝叧涓氬姟鐨勯�昏緫绫�
+        /// </summary>
+        private static HdlGatewayLogic m_Current = null;
+        /// <summary>
+        /// 缃戝叧涓氬姟鐨勯�昏緫绫�
+        /// </summary>
+        public static HdlGatewayLogic Current
+        {
+            get
+            {
+                if (m_Current == null)
+                {
+                    m_Current = new HdlGatewayLogic();
+                }
+                return m_Current;
+            }
+        }
+        /// <summary>
+        /// 澶囦唤鐢ㄧ殑缃戝叧ID
+        /// </summary>
+        private List<string> listBackupGwId = new List<string>();
+        /// <summary>
+        /// 缃戝叧鏂囦欢鐨勫墠缂�鍚嶅瓧
+        /// </summary>
+        private string gwFirstName = "Gateway_";
+        /// <summary>
+        /// 鍏ㄩ儴缃戝叧(杩欓噷淇濆瓨鐨勬槸铏氭嫙缃戝叧,鑰屼笉鏄湡瀹炵墿鐞嗙綉鍏冲璞�)
+        /// </summary>
+        private Dictionary<string, ZbGateway> dicGateway = new Dictionary<string, ZbGateway>();
+
+        #endregion
+
+        #region 鈻� 鍒锋柊缃戝叧___________________________
+
+        /// <summary>
+        /// 鍒锋柊鏈湴缃戝叧淇℃伅
+        /// </summary>
+        public void ReFreshByLocal()
+        {
+            lock (dicGateway)
+            {
+                this.dicGateway.Clear();
+
+                List<string> listFile = this.GetAllGatewayFile();
+                //鍙嶅簭鍒楀寲娣诲姞鍒扮紦瀛�
+                foreach (string file in listFile)
+                {
+                    //浠庢枃浠朵腑鍙嶅簭鍒楀寲鍑虹綉鍏冲璞�
+                    var gateway = this.GetGatewayFromFile(file);
+                    if (gateway == null)
+                    {
+                        continue;
+                    }
+                    //娣诲姞缂撳瓨
+                    string gwID = HdlGatewayLogic.Current.GetGatewayId(gateway);
+                    dicGateway[gwID] = gateway;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鍒锋柊APP鍓嶄竴娆¢�夋嫨鐨勭綉鍏矷D
+        /// </summary>
+        public void RefreshAppOldSelectGatewayId()
+        {
+            GatewayResourse.AppOldSelectGatewayId = string.Empty;
+
+            //浠庢枃浠朵腑鑾峰彇涓婁竴娆¢�夋嫨鐨勭綉鍏砳d
+            byte[] data = Global.ReadFileByDirectory(DirNameResourse.LocalMemoryDirectory, DirNameResourse.AppOldSelectGatewayFile);
+            if (data != null)
+            {
+                string strvalue = System.Text.Encoding.UTF8.GetString(data);
+                GatewayResourse.AppOldSelectGatewayId = JsonConvert.DeserializeObject<string>(strvalue);
+            }
+            //濡傛灉鏈湴娌℃湁杩欎釜缃戝叧鐨勮瘽
+            if (this.IsGatewayExist(GatewayResourse.AppOldSelectGatewayId) == false)
+            {
+                GatewayResourse.AppOldSelectGatewayId = string.Empty;
+                lock (dicGateway)
+                {
+                    //闅忎究閫変竴涓綉鍏�
+                    foreach (string wayId in this.dicGateway.Keys)
+                    {
+                        GatewayResourse.AppOldSelectGatewayId = wayId;
+                        break;
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鍚屾浜戠鐨勭綉鍏砳d锛屽鏋滄湰鍦版嫢鏈変簯绔笉瀛樺湪鐨刬d锛屽垯琛ㄧず搴旇琚崲缁戜簡锛岀洿鎺ュ垹闄�(鍒囨崲浣忓畢鍚庯紝閲嶆柊鍒锋柊缃戝叧鍒楄〃鍜岃澶囦箣鍚庝娇鐢�)
+        /// </summary>
+        /// <returns></returns>
+        public void SynchronizeDbGateway()
+        {
+            //浠庝簯绔幏鍙栫綉鍒楄〃ID
+            Dictionary<string, GatewayResult> result = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
+            if (result == null)
+            {
+                return;
+            }
+
+            List<string> listBackupGwId = new List<string>();
+            var fileData = Global.ReadFileByDirectory(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile);
+            if (fileData != null)
+            {
+                //鏂板锛氳櫧鐒舵鐜囦綆锛屼絾鏄‘瀹炲彂鐢熶簡銆傚鏋滄湁缃戠粶鏃讹紝App閲嶆柊缁戝畾璁板綍鐨勭綉鍏冲け璐ョ殑璇�
+                //涓嶅簲璇ュ垹闄ゅ畠
+                listBackupGwId = JsonConvert.DeserializeObject<List<string>>(System.Text.Encoding.UTF8.GetString(fileData));
+            }
+
+            List<string> listDelete = new List<string>();
+            foreach (var gatewayId in this.dicGateway.Keys)
+            {
+                if (result.ContainsKey(gatewayId) == false && listBackupGwId.Contains(gatewayId) == false)
+                {
+                    //鏈湴瀛樺湪浜戠涓嶅瓨鍦ㄧ殑缃戝叧锛屽垯鍒犻櫎
+                    listDelete.Add(gatewayId);
+                }
+            }
+            foreach (var gatewayId in listDelete)
+            {
+                //鍒犻櫎鏈湴杩欎釜缃戝叧鎵�鏈夌殑璁惧
+                List<CommonDevice> list = Common.LocalDevice.Current.GetDeviceByGatewayID(gatewayId);
+                foreach (var device in list)
+                {
+                    //鍒犻櫎涓�鑸澶�
+                    Common.LocalDevice.Current.DeleteMemmoryDevice(device, true);
+                    //鍒犻櫎Ota璁惧
+                    Common.LocalDevice.Current.DeleteMemmoryOtaDevice(device.DeviceAddr);
+                }
+                //鍒犻櫎缃戝叧鏂囦欢
+                this.DeleteGatewayFile(gatewayId);
+            }
+            //LOG杈撳嚭
+            if (listDelete.Count > 0)
+            {
+                string msg = "鏈湴鎷ユ湁鐨勭綉鍏筹細";
+                foreach (var gatewayId in this.dicGateway.Keys)
+                {
+                    msg += gatewayId + ",";
+                }
+                msg += "\r\n琚垹闄ょ殑缃戝叧锛�";
+                foreach (var gatewayId in listDelete)
+                {
+                    msg += gatewayId + ",";
+                }
+                msg += "\r\n姝ゆ椂浜戠杩斿洖褰撳墠璐﹀彿鎵�缁戝畾鏈夌殑缃戝叧锛�";
+                foreach (var gatewayId in result.Keys)
+                {
+                    msg += gatewayId + ",";
+                }
+                var bytes = System.Text.Encoding.UTF8.GetBytes(msg);
+                Common.Global.WriteFileByBytesByHomeId("GatewayDeleteLog.txt", bytes);
+            }
+        }
+
+        /// <summary>
+        /// 浠庢枃浠朵腑鍙嶅簭鍒楀寲鍑虹綉鍏冲璞�
+        /// </summary>
+        /// <param name="file"></param>
+        /// <returns></returns>
+        private ZbGateway GetGatewayFromFile(string file)
+        {
+            try
+            {
+                byte[] filebyte = Global.ReadFileByHomeId(file);
+                string strvalue = System.Text.Encoding.UTF8.GetString(filebyte);
+                var gateway = JsonConvert.DeserializeObject<ZbGateway>(strvalue);
+                return gateway;
+            }
+            catch (Exception ex)
+            {
+                HdlLogLogic.Current.WriteLog(ex);
+                return null;
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 娣诲姞缃戝叧___________________________
+
+        /// <summary>
+        /// 娣诲姞鏂扮綉鍏�(浠呴檺杩藉姞鏂扮殑缃戝叧)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧</param>
+        /// <param name="mode">鏄惁鏄剧ず閿欒</param>
+        public async Task<bool> AddNewGateway(ZbGateway zbGateway, ShowErrorMode mode)
+        {
+            //璁剧疆缃戝叧鐨勭粡绾害
+            bool falge = this.SetGatewaySite(zbGateway, Common.Config.Instance.Home.Longitude, Common.Config.Instance.Home.Latitude, ShowErrorMode.NO);
+            if (falge == false)
+            {
+                return falge;
+            }
+            //鎵ц娣诲姞缃戝叧鍒板唴瀛�
+            var result = await this.DoAddGatewayToMemory(zbGateway, mode);
+            //鍓嶇殑缃戝叧缁戝畾鍦ㄤ簡褰撳墠璐﹀彿涓嬬殑涓嶅悓浣忓畢閲岄潰
+            if (result == 0)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //缃戝叧缁戝畾鍦ㄥ綋鍓嶈处鍙蜂笅鐨勫叾浠栦綇瀹呴噷\r\n璇疯В闄ょ粦瀹氬悗鍐嶈瘯
+                    string msg = Language.StringByID(R.MyInternationalizationString.uTheGatewayInOtherResidenceMsg);
+                    if (msg.Contains("{0}") == true)
+                    {
+                        msg = string.Format(msg, "\r\n");
+                    }
+                    this.ShowTipMsg(msg);
+                }
+                return false;
+            }
+            if (result == -1)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 鍒涘缓涓�涓櫄鎷熺殑缃戝叧瀵硅薄
+        /// </summary>
+        /// <param name="gatewayId">缃戝叧ID</param>
+        public void AddVirtualGateway(string gatewayId)
+        {
+            var gateWay = new ZbGateway { IsVirtual = true };
+            gateWay.getGatewayBaseInfo.gwID = gatewayId;
+            gateWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId;
+            gateWay.ReSave();
+            this.dicGateway[gatewayId] = gateWay;
+        }
+
+        /// <summary>
+        /// 鎵ц娣诲姞缃戝叧鍒板唴瀛�(1:姝e父  -1:寮傚父  0:褰撳墠鐨勭綉鍏崇粦瀹氬湪浜嗗綋鍓嶈处鍙蜂笅鐨勪笉鍚屼綇瀹呴噷闈�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <param name="mode">鏄惁鏄剧ず閿欒</param>
+        /// <returns></returns>
+        private async Task<int> DoAddGatewayToMemory(ZbGateway zbGateway, ShowErrorMode mode)
+        {
+            if (zbGateway == null)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //閿欒:缃戝叧瀵硅薄涓㈠け
+                    string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
+                    this.ShowTipMsg(msg);
+                }
+                return -1;
+            }
+            //鑾峰彇缃戝叧鐨勪俊鎭�
+            var result = await zbGateway.GetZbGwInfoAsync();
+            //妫�娴嬬綉鍏宠繑鍥炵殑鍏遍�氶敊璇姸鎬佺爜
+            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
+            if (error != null)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    this.ShowTipMsg(error);
+                }
+                return -1;
+            }
+
+            if (result == null)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //鑾峰彇缃戝叧淇℃伅澶辫触
+                    string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
+                    this.ShowTipMsg(msg);
+                }
+                return -1;
+            }
+
+            if (result.getGwData == null)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //鑾峰彇缃戝叧淇℃伅澶辫触
+                    string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
+                    this.ShowTipMsg(msg);
+                }
+                return -1;
+            }
+
+            //璁剧疆浣忓畢ID鍒扮綉鍏�
+            bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId);
+            if (flage2 == false)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //鍚戠綉鍏宠缃綇瀹匢D澶辫触
+                    string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
+                    this.ShowTipMsg(msg);
+                }
+                return -1;
+            }
+
+            //鏇存柊浜戠鏁版嵁搴�
+            int flage1 = await this.SetGatewayIdToDataBase(zbGateway);
+            //寮傚父涔熶笉楦熷畠,0鏄壒娈婂惈涔�
+            if (flage1 == 0)
+            {
+                return flage1;
+            }
+            if (flage1 == -1)
+            {
+                //澶囦唤澶辫触鐨勭綉鍏矷D
+                HdlGatewayLogic.Current.BackupGatewayIdOnNotNetwork(zbGateway);
+            }
+
+            //鏄惁宸茬粡瀛樺湪
+            string gwID = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
+            bool isEsist = HdlGatewayLogic.Current.IsGatewayExist(zbGateway);
+            if (isEsist == false)
+            {
+                //鏂板缓涓�涓櫄鎷熺殑缃戝叧鍑烘潵
+                zbGateway.ReSave();
+                var way = this.GetGatewayFromFile(zbGateway.FilePath);
+                this.dicGateway[gwID] = way;
+            }
+
+            //鍒锋柊鐨勬槸缂撳瓨,涓嶅埛鏂扮湡瀹炵墿鐞嗙綉鍏�
+            this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
+            this.dicGateway[gwID].getGwInfo = result.getGwData;
+            this.dicGateway[gwID].getGatewayBaseInfo.GwName = result.getGwData.GwName;
+            this.dicGateway[gwID].getGatewayBaseInfo.IpAddress = result.getGwData.GwIP;
+            this.dicGateway[gwID].getGatewayBaseInfo.HomeId = Common.Config.Instance.HomeId;
+            this.dicGateway[gwID].ReSave();
+            if (isEsist == false)
+            {
+                //娣诲姞澶囦唤
+                HdlAutoBackupLogic.AddOrEditorFile(this.dicGateway[gwID].FilePath);
+            }
+
+            return 1;
+        }
+
+        /// <summary>
+        /// 璁剧疆浣忓畢ID鍒扮綉鍏�(澶辫触鏃�,涓嶅脊鍑轰换浣曢敊璇俊鎭�,缃戝叧鏂綉闄ゅ)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <param name="HomeId"></param>
+        /// <returns></returns>
+        public async Task<bool> SetHomeIdToGateway(ZbGateway zbGateway, string HomeId)
+        {
+            var info = await zbGateway.GwSetHomeIdAsync(HomeId);
+            if (info != null && info.gwSetHomeIdData != null)
+            {
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 鏇存柊缃戝叧ID鍒颁簯绔暟鎹簱(1:姝e父  -1:寮傚父  0:褰撳墠鐨勭綉鍏崇粦瀹氬湪浜嗗綋鍓嶈处鍙蜂笅鐨勪笉鍚屼綇瀹呴噷闈�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        private async Task<int> SetGatewayIdToDataBase(ZbGateway zbGateway)
+        {
+            //璋冪敤鎺ュ彛锛岀粦瀹氱綉鍏�(鍗充娇澶辫触锛屼篃杩斿洖true寰�涓嬭蛋)
+            var bindGateway = new BindGatewayPra();
+            string gwID = this.GetGatewayId(zbGateway);
+            bindGateway.BindGateways.Add(gwID);
+            //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
+            bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
+
+            //涓嶆樉绀哄凡缁忚缁戝畾杩囩殑淇℃伅,NotSetAgain:鍋囧鏂綉鏃�,涓嶄簩娆″彂閫�
+            List<string> listNotShow = new List<string>() { "NotSetAgain" };
+            var result = await UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, listNotShow);
+            if (result == "Error" || result == "ErrorEx")
+            {
+                return -1;
+            }
+            if (result == "BindGatewaysExists")
+            {
+                return 0;
+            }
+
+            return result == "Success" ? 1 : -1;
+        }
+
+        /// <summary>
+        /// 浣忓畢ID鏄惁涓虹┖
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public bool HomeIdIsEmpty(ZbGateway zbGateway)
+        {
+            return this.HomeIdIsEmpty(zbGateway.getGatewayBaseInfo.HomeId);
+        }
+
+        /// <summary>
+        /// 浣忓畢ID鏄惁涓虹┖
+        /// </summary>
+        /// <param name="HomeId"></param>
+        /// <returns></returns>
+        public bool HomeIdIsEmpty(string HomeId)
+        {
+            if (string.IsNullOrEmpty(HomeId) == true || HomeId[0] == '\0')
+            {
+                return true;
+            }
+            return false;
+        }
+
+        #endregion
+
+        #region 鈻� 閲嶆柊缁戝畾缃戝叧_______________________
+
+        /// <summary>
+        /// 閲嶆柊缁戝畾缃戝叧(1:姝e父  -1:寮傚父  0:褰撳墠鐨勭綉鍏崇粦瀹氬湪浜嗗綋鍓嶈处鍙蜂笅鐨勪笉鍚屼綇瀹呴噷闈�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧</param>
+        /// <param name="btnMsg">娑堟伅鎺т欢</param>
+        public async Task<int> ReBindNewGateway(ZbGateway zbGateway, NormalViewControl btnMsg = null)
+        {
+            if (zbGateway == null)
+            {
+                //閿欒:缃戝叧瀵硅薄涓㈠け
+                string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
+                this.ShowTipMsg(msg);
+                return -1;
+            }
+            //璁剧疆缃戝叧鐨勭粡绾害
+            bool falge = this.SetGatewaySite(zbGateway, Common.Config.Instance.Home.Longitude, Common.Config.Instance.Home.Latitude, ShowErrorMode.YES);
+            if (falge == false)
+            {
+                return -1;
+            }
+
+            //璁剧疆浣忓畢ID鍒扮綉鍏�
+            bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId);
+            if (flage2 == false)
+            {
+                //鍚戠綉鍏宠缃綇瀹匢D澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
+                this.ShowTipMsg(msg);
+                return -1;
+            }
+
+            //鏇存柊浜戠鏁版嵁搴�
+            int flage1 = await this.SetGatewayIdToDataBase(zbGateway);
+            //寮傚父涔熶笉楦熷畠,0鏄壒娈婂惈涔�
+            if (flage1 == 0)
+            {
+                return flage1;
+            }
+            if (flage1 == -1)
+            {
+                //澶囦唤澶辫触鐨勭綉鍏矷D
+                HdlGatewayLogic.Current.BackupGatewayIdOnNotNetwork(zbGateway);
+            }
+
+            if (btnMsg == null)
+            {
+                //缃戝叧鍐呴儴鏁版嵁鍙樻洿涓�,璇风◢鍚�
+                ProgressBar.SetValue(Language.StringByID(R.MyInternationalizationString.uGatewayDataIsChangingPleaseWhait));
+            }
+            else
+            {
+                HdlThreadLogic.Current.RunMain(() =>
+                {
+                    //缃戝叧鍐呴儴鏁版嵁鍙樻洿涓�,璇风◢鍚�
+                    btnMsg.TextID = R.MyInternationalizationString.uGatewayDataIsChangingPleaseWhait;
+                });
+            }
+            await Task.Delay(8000);
+
+            //鑾峰彇缃戝叧鐨勪俊鎭�
+            var result = await zbGateway.GetZbGwInfoAsync();
+            //妫�娴嬬綉鍏宠繑鍥炵殑鍏遍�氶敊璇姸鎬佺爜
+            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
+            if (error != null)
+            {
+                this.ShowTipMsg(error);
+                return -1;
+            }
+
+            if (result == null || result.getGwData == null)
+            {
+                //鑾峰彇缃戝叧淇℃伅澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
+                this.ShowTipMsg(msg);
+                return -1;
+            }
+
+            //鏄惁宸茬粡瀛樺湪
+            string gwID = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
+            bool isEsist = HdlGatewayLogic.Current.IsGatewayExist(zbGateway);
+            if (isEsist == false)
+            {
+                //鏂板缓涓�涓櫄鎷熺殑缃戝叧鍑烘潵
+                zbGateway.ReSave();
+                var way = this.GetGatewayFromFile(zbGateway.FilePath);
+                this.dicGateway[gwID] = way;
+            }
+
+            //鍒锋柊鐨勬槸缂撳瓨,涓嶅埛鏂扮湡瀹炵墿鐞嗙綉鍏�
+            this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
+            this.dicGateway[gwID].getGwInfo = result.getGwData;
+            this.dicGateway[gwID].getGatewayBaseInfo.GwName = result.getGwData.GwName;
+            this.dicGateway[gwID].getGatewayBaseInfo.IpAddress = result.getGwData.GwIP;
+            this.dicGateway[gwID].getGatewayBaseInfo.HomeId = Common.Config.Instance.HomeId;
+            this.dicGateway[gwID].ReSave();
+            if (isEsist == false)
+            {
+                //娣诲姞澶囦唤
+                HdlAutoBackupLogic.AddOrEditorFile(this.dicGateway[gwID].FilePath);
+            }
+            return 1;
+        }
+
+        #endregion
+
+        #region 鈻� 淇敼缃戝叧___________________________
+
+        /// <summary>
+        /// 淇敼鏈湴缃戝叧鍚嶅瓧(澶辫触鏃朵細鏄剧ず淇℃伅)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <param name="gatewayName">缃戝叧鍚�</param>
+        public async Task<bool> ReName(ZbGateway zbGateway, string gatewayName)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                //鑾峰彇缃戝叧瀵硅薄澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayTagartFail);
+                this.ShowErrorMsg(msg);
+                return false;
+            }
+
+            var result = await realWay.GwReNameAsync(gatewayName);
+            //妫�娴嬬綉鍏宠繑鍥炵殑鍏遍�氶敊璇姸鎬佺爜
+            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
+            if (error != null)
+            {
+                this.ShowErrorMsg(error);
+                return false;
+            }
+
+            if (result == null)
+            {
+                //缃戝叧鍚嶇О淇敼澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGatewayReNameFail);
+
+                this.ShowErrorMsg(msg);
+                return false;
+            }
+
+            //缃戝叧淇敼澶辫触
+            if (result.gwReNameData == null)
+            {
+                //缃戝叧鍚嶇О淇敼澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGatewayReNameFail);
+
+                this.ShowErrorMsg(msg);
+                return false;
+            }
+
+            //淇敼缂撳瓨
+            string gwID = this.GetGatewayId(zbGateway);
+            this.dicGateway[gwID].getGatewayBaseInfo.GwName = gatewayName;
+            this.dicGateway[gwID].ReSave();
+
+            //娣诲姞鑷姩澶囦唤
+            HdlAutoBackupLogic.AddOrEditorFile(zbGateway.FilePath);
+
+            return true;
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鍒囨崲___________________________
+
+        /// <summary>
+        /// 鎵ц鍒囨崲缃戝叧鎿嶄綔
+        /// </summary>
+        /// <param name="gatewayId"></param>
+        public async Task<bool> DoSwitchGateway(string gatewayId)
+        {
+            var zbGateway = this.GetLocalGateway(gatewayId);
+            if (this.CheckGatewayOnlineByFlag(zbGateway) == true)
+            {
+                //閲嶆柊鑾峰彇鍦ㄧ嚎缃戝叧鐨勪俊鎭�
+                var result = await this.GetOnlineGatewayInfo(gatewayId);
+                if (result == false)
+                {
+                    return false;
+                }
+            }
+            //鍒囨崲缃戝叧,淇濆瓨缂撳瓨
+            this.SaveGatewayIdToLocation(gatewayId);
+            return true;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍦ㄧ嚎缃戝叧淇℃伅
+        /// </summary>
+        /// <param name="gatewayId"></param>
+        /// <returns></returns>
+        private async Task<bool> GetOnlineGatewayInfo(string gatewayId)
+        {
+            //鏄剧ず杩涘害鏉�
+            ProgressBar.Show();
+
+            //妫�娴嬪箍鎾埌鐨勮繖涓綉鍏虫槸鍚︽嫢鏈変綇瀹匢D
+            ZbGateway realWay = null;
+            bool getGatewayInfo = true;
+            if (this.GetRealGateway(ref realWay, gatewayId) == true)
+            {
+                //閲嶆柊璁剧疆浣忓畢ID(杩欎釜搴旇鏄笉缁忚繃APP,鐩存帴鎶婄綉鍏虫仮澶嶄簡鍑哄巶璁剧疆)
+                if (this.HomeIdIsEmpty(realWay.getGatewayBaseInfo.HomeId) == true)
+                {
+                    int result2 = await this.ReBindNewGateway(realWay);
+                    if (result2 == 0)
+                    {
+                        //鍑虹幇鏈煡閿欒,璇风◢鍚庡啀璇�
+                        this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uUnKnowErrorAndResetAgain));
+                        //鍏抽棴杩涘害鏉�
+                        ProgressBar.Close();
+                    }
+                    else if (result2 == -1)
+                    {
+                        //鍏抽棴杩涘害鏉�
+                        ProgressBar.Close();
+                        return false;
+                    }
+                    //閲嶆柊缁戝畾缃戝叧閲岄潰宸茬粡閲嶆柊鑾峰彇浜嗙綉鍏充俊鎭�
+                    getGatewayInfo = false;
+                }
+            }
+
+            if (getGatewayInfo == true)
+            {
+                //鑾峰彇缃戝叧淇℃伅
+                var info = await this.GetGatewayNewInfoAsync(realWay);
+                if (info == null)
+                {
+                    //鍏抽棴杩涘害鏉�
+                    ProgressBar.Close();
+                    return false;
+                }
+            }
+
+            //鑾峰彇鍏ㄩ儴璁惧
+            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay);
+            //鍏抽棴杩涘害鏉�
+            ProgressBar.Close();
+            if (result == -1)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 淇濆瓨閫夋嫨鐨勭綉鍏矷D鍒版湰鍦�
+        /// </summary>
+        /// <param name="gatewayId"></param>
+        public void SaveGatewayIdToLocation(string gatewayId)
+        {
+            GatewayResourse.AppOldSelectGatewayId = gatewayId;
+            byte[] data = System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(GatewayResourse.AppOldSelectGatewayId));
+            Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.AppOldSelectGatewayFile, data);
+        }
+
+        #endregion
+
+        #region 鈻� 鍒犻櫎缃戝叧___________________________
+
+        /// <summary>
+        /// 鍒犻櫎缃戝叧锛屽寘鎷簯绔拰鏈湴(澶辫触鏃朵笉浼氭樉绀轰俊鎭紝骞朵笖浼氳繑鍥瀟rue)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        public async Task<bool> DeleteGateway(ZbGateway zbGateway)
+        {
+            string gwID = this.GetGatewayId(zbGateway);
+            //绉婚櫎鏈湴缃戝叧淇℃伅
+            return await this.DeleteGateway(gwID);
+        }
+
+        /// <summary>
+        /// 鍒犻櫎缃戝叧锛屽寘鎷簯绔拰鏈湴(澶辫触鏃朵笉浼氭樉绀轰俊鎭紝骞朵笖浼氳繑鍥瀟rue)
+        /// </summary>
+        /// <param name="zbGatewayID"></param>
+        public async Task<bool> DeleteGateway(string zbGatewayID)
+        {
+            ZbGateway realWay = null;
+            bool hadReal = this.GetRealGateway(ref realWay, zbGatewayID);
+
+            //鏆備笉鏀寔鍒嗕韩
+            if (hadReal == true && realWay.GatewayOnlineFlage == true)
+            {
+                //娓呯┖缃戝叧鐨勪綇瀹匢D
+                bool result = await this.SetHomeIdToGateway(realWay, string.Empty);
+                if (result == false)
+                {
+                    //缃戝叧瑙g粦澶辫触  涓嶇悊瀹�,鍥犱负缃戝叧鍙互鎸夋寜閿己鍒舵悳绱㈠緱鍒�
+                    string msg = Language.StringByID(R.MyInternationalizationString.uGatewayUnBindFail);
+                    //this.ShowErrorMsg(msg);
+                    //return false;
+                }
+            }
+
+            //鍒犻櫎浜戠鐨勭綉鍏�
+            await this.DeleteDataBaseGateway(zbGatewayID);
+
+            //鍒犻櫎缃戝叧鏂囦欢
+            this.DeleteGatewayFile(zbGatewayID);
+
+            //绉婚櫎
+            ZbGateway.GateWayList.RemoveAll((obj) => this.GetGatewayId(obj) == zbGatewayID);
+            //鏂紑mqtt杩炴帴
+            realWay.DisConnectLocalMqttClient("GD");
+
+            return true;
+        }
+
+        /// <summary>
+        /// 鍒犻櫎缃戝叧鏂囦欢
+        /// </summary>
+        /// <param name="zbGatewayID">缃戝叧id</param>
+        public void DeleteGatewayFile(string zbGatewayID)
+        {
+            if (dicGateway.ContainsKey(zbGatewayID) == false)
+            {
+                return;
+            }
+            //鍒犻櫎鏂囦欢
+            string file = dicGateway[zbGatewayID].FilePath;
+            if (Global.IsExistsByHomeId(file) == true)
+            {
+                Global.DeleteFilebyHomeId(file);
+            }
+
+            //绉婚櫎缂撳瓨
+            dicGateway.Remove(zbGatewayID);
+            //鍒犻櫎鑷姩澶囦唤
+            HdlAutoBackupLogic.DeleteFile(file);
+
+            //鍒犻櫎璁惧鏂囦欢
+            List<CommonDevice> list = Common.LocalDevice.Current.GetDeviceByGatewayID(zbGatewayID);
+            foreach (var device in list)
+            {
+                //鍒犻櫎璁惧鏂囦欢
+                Common.LocalDevice.Current.DeleteMemmoryDevice(device, true);
+                //鍒犻櫎Ota璁惧
+                Common.LocalDevice.Current.DeleteMemmoryOtaDevice(device.DeviceAddr);
+            }
+            //濡傛灉鏄富缃戝叧
+            if (this.IsMainGateway(zbGatewayID) == 1)
+            {
+                var listAllRoom = UserCenter.HdlRoomLogic.Current.GetAllListRooms();
+                foreach (var room in listAllRoom)
+                {
+                    //鍒犻櫎鍦烘櫙鏂囦欢
+                    foreach (var sceneId in room.ListSceneId)
+                    {
+                        if (Global.IsExistsByHomeId($"Scene_{sceneId}.json") == true)
+                        {
+                            Global.DeleteFilebyHomeId($"Scene_{sceneId}.json");
+                        }
+                    }
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鎺夌嚎___________________________
+
+        /// <summary>
+        /// 鍒锋柊缃戝叧鐨勫湪绾跨姸鎬�(娉ㄦ剰,鍒锋柊鐨勬槸缂撳瓨,璇疯皟鐢–heckGatewayOnlineByFlag鏉ュ垽鏂槸鍚﹀湪绾�)
+        /// </summary>
+        /// <param name="listGateway"></param>
+        /// <param name="waitTime">灞�鍩熺綉鐨勬椂鍊�,鏃跺�欑瓑寰�3绉掑欢杩�</param>
+        /// <returns></returns>
+        public void RefreshGatewayOnlineStatu(List<ZbGateway> listGateway, bool waitTime = true)
+        {
+            var listRealWay = new List<ZbGateway>();
+            for (int i = 0; i < listGateway.Count; i++)
+            {
+                ZbGateway zbTemp = null;
+                if (this.GetRealGateway(ref zbTemp, listGateway[i]) == true)
+                {
+                    //鐪熷疄鐗╃悊缃戝叧
+                    listRealWay.Add(zbTemp);
+                }
+                else
+                {
+                    //铏氭嫙鐗╃悊缃戝叧
+                    listRealWay.Add(listGateway[i]);
+                    if (waitTime == false)
+                    {
+                        //涓嶇瓑寰呯殑璇�,鏍囪瘑鎸囧畾缃戝叧涓轰笉鍦ㄧ嚎
+                        this.SetGatewayNotOnLineFlag(listRealWay[i]);
+                    }
+                }
+                if (waitTime == true)
+                {
+                    //鍙湁绛夊緟鐨勬椂鍊�,鎵嶆爣璇嗘寚瀹氱綉鍏充负涓嶅湪绾�
+                    this.SetGatewayNotOnLineFlag(listRealWay[i]);
+                }
+            }
+
+            if (waitTime == true)
+            {
+                //杩欐槸绗竴閬撳潕,寮哄埗妫�鏌IFI:绛夊緟2绉�(鍥犱负wifi鐨勬椂鍊欙紝瀹冧細鑷姩鍘诲埛鏂癴lage)
+                System.Threading.Thread.Sleep(2000);
+                //妫�鏌ユ槸鍚︽嫢鏈夌綉鍏冲瓨鍦ㄤ簬WIFi涓�
+                if (this.CheckHadGatewayInWifi(listRealWay) == false)
+                {
+                    //绗簩閬撳潕锛氬湪杩滅▼鐨勬儏鍐典笅鍒锋柊缃戝叧鐨勫湪绾跨姸鎬�
+                    this.RefreshGatewayOnlineOnRemode(listRealWay);
+                }
+            }
+
+            //鍒锋柊缂撳瓨鐨勫湪绾挎爣璇�
+            foreach (var zbway in listRealWay)
+            {
+                string gwID = this.GetGatewayId(zbway);
+                if (this.dicGateway.ContainsKey(gwID) == false)
+                {
+                    continue;
+                }
+                this.dicGateway[gwID].GatewayOnlineFlage = zbway.GatewayOnlineFlage;
+                this.dicGateway[gwID].ReSave();
+            }
+        }
+
+        /// <summary>
+        /// 妫�鏌ユ槸鍚︽嫢鏈夌綉鍏冲瓨鍦ㄤ簬WIFi涓�
+        /// </summary>
+        /// <param name="listGateway"></param>
+        /// <returns></returns>
+        private bool CheckHadGatewayInWifi(List<ZbGateway> listGateway)
+        {
+            foreach (var zbway in listGateway)
+            {
+                //鏄惁瀛樺湪缃戝叧瀛樺湪浜嶹IFI涓�
+                if (zbway.GatewayOnlineFlage == true)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 鍦ㄨ繙绋嬬殑鎯呭喌涓嬪埛鏂扮綉鍏崇殑鍦ㄧ嚎鐘舵��
+        /// </summary>
+        /// <param name="listGateway"></param>
+        /// <returns></returns>
+        private void RefreshGatewayOnlineOnRemode(List<ZbGateway> listGateway)
+        {
+            //鑾峰彇浜戠涓婇潰鐨勭綉鍏�
+            Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
+            if (dicDbGateway == null)
+            {
+                return;
+            }
+            foreach (var way in listGateway)
+            {
+                if (way == null || way.getGatewayBaseInfo == null)
+                {
+                    continue;
+                }
+                string strId = this.GetGatewayId(way);
+                if (dicDbGateway.ContainsKey(strId) == true //濡傛灉浜戠涓婇潰鏈夎繖涓綉鍏�
+                    && dicDbGateway[strId].MqttOnlineStatus == true //濡傛灉浜戠涓婇潰杩欎釜缃戝叧鏄湪绾跨殑
+                    )
+                {
+                    way.GatewayOnlineFlage = true;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鏍囪瘑鎸囧畾缃戝叧涓轰笉鍦ㄧ嚎
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        public void SetGatewayNotOnLineFlag(ZbGateway zbGateway)
+        {
+            if (zbGateway == null)
+            {
+                return;
+            }
+            zbGateway.GatewayOnlineFlage = false;
+        }
+
+        /// <summary>
+        /// 鏍规嵁鏌愮鏍囪瘑鍒ゆ柇鎸囧畾缃戝叧鏄惁鍦ㄧ嚎
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public bool CheckGatewayOnlineByFlag(ZbGateway zbGateway)
+        {
+            if (zbGateway == null)
+            {
+                return false;
+            }
+            //浣跨敤缂撳瓨鐨勶紝鍥犱负鍒锋柊鍦ㄧ嚎鐘舵�佺殑鏃跺�欙紝鍒锋柊鐨勫氨鏄紦瀛橈紝鑰屼笉鏄湡瀹炵墿鐞嗙綉鍏�
+            string gwID = this.GetGatewayId(zbGateway);
+            if (this.dicGateway.ContainsKey(gwID) == true)
+            {
+                return this.dicGateway[gwID].GatewayOnlineFlage;
+            }
+
+            return zbGateway.GatewayOnlineFlage;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇缃戝叧___________________________
+
+        /// <summary>
+        /// 浠庣綉鍏宠幏鍙栧叏閮ㄧ殑缃戝叧(浠ユ湰鍦扮綉鍏充负鏍囧噯)
+        /// </summary>
+        /// <returns></returns>
+        public List<ZbGateway> GetAllGatewayFromGateway()
+        {
+            //涓嶈鍘籉oreach 瀹冪殑鍒楄〃
+            List<ZbGateway> list = new List<ZbGateway>();
+            list.AddRange(ZbGateway.GateWayList);
+
+            List<ZbGateway> newlist = new List<ZbGateway>();
+            foreach (var way in list)
+            {
+                if (Config.Instance.HomeId != way.getGatewayBaseInfo.HomeId)
+                {
+                    //濡傛灉涓嶆槸褰撳墠浣忓畢
+                    continue;
+                }
+                string gwID = this.GetGatewayId(way);
+                if (this.dicGateway.ContainsKey(gwID) == false)
+                {
+                    //濡傛灉鏈湴骞舵病鏈夎繖涓綉鍏�
+                    continue;
+                }
+                newlist.Add(way);
+            }
+            return newlist;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏈湴鍏ㄩ儴鐨勭綉鍏�
+        /// </summary>
+        /// <returns>The all gateway.</returns>
+        public List<ZbGateway> GetAllLocalGateway()
+        {
+            List<ZbGateway> listData = new List<ZbGateway>();
+            lock (dicGateway)
+            {
+                foreach (var way in dicGateway.Values)
+                {
+                    listData.Add(way);
+                }
+            }
+            return listData;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏈湴鐨勭綉鍏�
+        /// </summary>
+        /// <param name="gatewayId">缃戝叧ID</param>
+        /// <returns></returns>
+        public ZbGateway GetLocalGateway(string gatewayId)
+        {
+            if (this.dicGateway.ContainsKey(gatewayId) == true)
+            {
+                return this.dicGateway[gatewayId];
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏈湴鎵�鏈夌殑缃戝叧鏂囦欢
+        /// </summary>
+        /// <returns></returns>
+        public List<string> GetAllGatewayFile()
+        {
+            List<string> list = new List<string>();
+            List<string> listFile = Global.FileListByHomeId();
+            foreach (string file in listFile)
+            {
+                //鍙幏鍙栫綉鍏宠澶�
+                if (file.StartsWith(gwFirstName) == false)
+                {
+                    continue;
+                }
+                list.Add(file);
+            }
+            return list;
+        }
+
+        /// <summary>
+        /// 鑾峰彇绯荤粺鍐呴儴鐨勭湡瀹炵綉鍏冲璞″彉閲�
+        /// </summary>
+        /// <param name="zbGateway">鐪熷疄缃戝叧</param>
+        /// <param name="tagartWay">鐩爣缃戝叧</param>
+        /// <returns></returns>
+        public bool GetRealGateway(ref ZbGateway zbGateway, ZbGateway tagartWay)
+        {
+            if (tagartWay == null || tagartWay.getGatewayBaseInfo == null)
+            {
+                return false;
+            }
+            return this.GetRealGateway(ref zbGateway, this.GetGatewayId(tagartWay));
+        }
+
+        /// <summary>
+        /// 鑾峰彇绯荤粺鍐呴儴鐨勭湡瀹炵綉鍏冲璞″彉閲�
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <param name="gwId"></param>
+        /// <returns></returns>
+        public bool GetRealGateway(ref ZbGateway zbGateway, string gwId)
+        {
+            var realWay = ZbGateway.GateWayList.Find((obj) =>
+            {
+                return this.GetGatewayId(obj) == gwId;
+            });
+            if (realWay == null)
+            {
+                //濡傛灉缃戝叧瀵硅薄涓㈠け浜�,鍒欏垱寤轰釜鏂扮殑
+                realWay = new ZbGateway { IsVirtual = true, };
+                realWay.getGatewayBaseInfo.gwID = gwId;
+                realWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId;
+                ZbGateway.GateWayList.Add(realWay);
+            }
+            zbGateway = realWay;
+            return true;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇鍗忚皟鍣ㄥ綋鍓嶄俊閬揰________________
+
+        /// <summary>
+        /// 鑾峰彇鍗忚皟鍣ㄥ綋鍓嶄俊閬�(浼氭湁绛夊緟寤惰繜,杩斿洖-1浠h〃閿欒)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public int GetGatewayChannelId(ZbGateway zbGateway)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                //閿欒:缃戝叧瀵硅薄涓㈠け
+                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
+                return -1;
+            }
+            int data = -1;
+            Action<string, string> action = (topic, message) =>
+            {
+                var gatewayID = topic.Split('/')[0];
+                if (topic == gatewayID + "/" + "ZbGw/GetChannel_Respon")
+                {
+                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
+                    data = Convert.ToInt32(jobject["Data"]["Channel"].ToString());
+                }
+            };
+            realWay.Actions += action;
+
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 64512 }, { "Command", 8 } };
+            realWay.Send("ZbGw/GetChannel", jObject.ToString());
+
+            int TimeOut = 0;
+            while (data == -1 && TimeOut < 30)
+            {
+                System.Threading.Thread.Sleep(100);
+                TimeOut++;
+            }
+
+            realWay.Actions -= action;
+            if (data == -1)
+            {
+                //鑾峰彇鍗忚皟鍣ㄤ俊閬撳け璐�
+                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayChannelIdFail);
+                msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                this.ShowTipMsg(msg);
+            }
+
+            return data;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇鍗忚皟鍣∕AC______________________
+
+        /// <summary>
+        /// 鑾峰彇鍗忚皟鍣∕AC鍦板潃(浼氭湁绛夊緟寤惰繜,杩斿洖null浠h〃閿欒)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public string GetGatewayCoordinatorMac(ZbGateway zbGateway)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                //閿欒:缃戝叧瀵硅薄涓㈠け
+                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
+                return null;
+            }
+            string data = null;
+            Action<string, string> action = (topic, message) =>
+            {
+                var gatewayID = topic.Split('/')[0];
+                if (topic == gatewayID + "/" + "ZbGw/GetMac_Respon")
+                {
+                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
+                    data = jobject["Data"]["MacAddr"].ToString();
+                }
+            };
+            realWay.Actions += action;
+
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 64512 }, { "Command", 13 } };
+            realWay.Send("ZbGw/GetMac", jObject.ToString());
+
+            int TimeOut = 0;
+            while (data == null && TimeOut < 30)
+            {
+                System.Threading.Thread.Sleep(100);
+                TimeOut++;
+            }
+
+            realWay.Actions -= action;
+            if (data == null)
+            {
+                //鑾峰彇鍗忚皟鍣∕ac澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayCoordinatorMacFail);
+                msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                this.ShowTipMsg(msg);
+            }
+
+            return data;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇鍗忚皟鍣≒anID____________________
+
+        /// <summary>
+        /// 鑾峰彇鍗忚皟鍣≒anID(浼氭湁绛夊緟寤惰繜,杩斿洖-1浠h〃閿欒)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public int GetGatewayPanId(ZbGateway zbGateway)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                //閿欒:缃戝叧瀵硅薄涓㈠け
+                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
+                return -1;
+            }
+            int panId = -1;
+            Action<string, string> action = (topic, message) =>
+            {
+                var gatewayID = topic.Split('/')[0];
+                if (topic == gatewayID + "/" + "ZbGw/GetPanId_Respon")
+                {
+                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
+                    panId = Convert.ToInt32(jobject["Data"]["PANID"].ToString());
+                }
+            };
+            realWay.Actions += action;
+
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 64512 }, { "Command", 12 } };
+            realWay.Send("ZbGw/GetPanId", jObject.ToString());
+
+            int TimeOut = 0;
+            while (panId == -1 && TimeOut < 30)
+            {
+                System.Threading.Thread.Sleep(100);
+                TimeOut++;
+            }
+
+            realWay.Actions -= action;
+            if (panId == -1)
+            {
+                //鑾峰彇鍗忚皟鍣≒anID澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayPanIDFail);
+                msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                this.ShowTipMsg(msg);
+            }
+
+            return panId;
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鑷姩澶囦唤璁剧疆___________________
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧鑷姩澶囦唤璁剧疆(-1:寮傚父 0:鍏抽棴 1:鎵撳紑)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public int GetGatewayAutoBackupStatu(ZbGateway zbGateway)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                //閿欒:缃戝叧瀵硅薄涓㈠け
+                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
+                return -1;
+            }
+            int statu = -1;
+            Action<string, string> action = (topic, message) =>
+            {
+                var gatewayID = topic.Split('/')[0];
+                if (topic == gatewayID + "/GatewayAutoBackup_Respon")
+                {
+                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
+                    statu = Convert.ToInt32(jobject["Data"]["AutoBackupStatus"].ToString());
+                }
+            };
+            realWay.Actions += action;
+
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 6205 } };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AutoBackup", 1 } };
+            jObject.Add("Data", data);
+            realWay.Send("GatewayAutoBackup", jObject.ToString());
+
+            int TimeOut = 0;
+            while (statu == -1 && TimeOut < 60)
+            {
+                System.Threading.Thread.Sleep(100);
+                TimeOut++;
+            }
+
+            realWay.Actions -= action;
+            if (statu == -1)
+            {
+                //鑾峰彇缃戝叧鑷姩澶囦唤璁剧疆澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayAutoBackupStatuFail);
+                msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                this.ShowTipMsg(msg);
+            }
+
+            return statu;
+        }
+
+        /// <summary>
+        /// 璁剧疆缃戝叧鑷姩澶囦唤璁剧疆
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <param name="statu"></param>
+        /// <returns></returns>
+        public bool SetGatewayAutoBackupStatu(ZbGateway zbGateway, bool statu)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                //閿欒:缃戝叧瀵硅薄涓㈠け
+                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
+                return false;
+            }
+            int result = -1;
+            Action<string, string> action = (topic, message) =>
+            {
+                var gatewayID = topic.Split('/')[0];
+                if (topic == gatewayID + "/GatewayAutoBackup_Respon")
+                {
+                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
+                    result = Convert.ToInt32(jobject["Data"]["AutoBackupStatus"].ToString());
+                }
+            };
+            realWay.Actions += action;
+
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 6205 } };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AutoBackup", statu == true ? 2 : 3 } };
+            jObject.Add("Data", data);
+            realWay.Send("GatewayAutoBackup", jObject.ToString());
+
+            int TimeOut = 0;
+            while (result == -1 && TimeOut < 60)
+            {
+                System.Threading.Thread.Sleep(100);
+                TimeOut++;
+            }
+
+            realWay.Actions -= action;
+            if (result == -1)
+            {
+                //璁剧疆缃戝叧鑷姩澶囦唤澶辫触
+                string msg = Language.StringByID(R.MyInternationalizationString.uSetGatewayAutoBackupStatuFail);
+                msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                this.ShowTipMsg(msg);
+                return false;
+            }
+
+            return true;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇缃戝叧GwInfo閲岄潰鐨勫睘鎬__________
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧GwInfo閲岄潰鐨勫睘鎬�
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <param name="attributeName">getGwInfo閲岄潰灞炴�х殑鍚嶅瓧</param>
+        /// <param name="defult">濡傛灉鑾峰彇涓嶅埌鏃讹紝璁剧疆鐨勯粯璁ゅ��</param>
+        /// <returns></returns>
+        public object GetGwInfoAttribute(ZbGateway zbGateway, string attributeName, string defult = "")
+        {
+            string gwID = this.GetGatewayId(zbGateway);
+            var localWay = this.GetLocalGateway(gwID);
+
+            object objValue = null;
+            if (localWay == null || localWay.getGwInfo == null)
+            {
+                //鏈湴娌℃湁璁板綍鏈夎繖涓笢瑗�,鍒欑洿鎺ヨ繑鍥炲弬鏁扮殑鏁版嵁
+                if (zbGateway.getGwInfo != null)
+                {
+                    objValue = zbGateway.getGwInfo.GetType().InvokeMember(attributeName, System.Reflection.BindingFlags.GetField, null, zbGateway.getGwInfo, null);
+                }
+                else
+                {
+                    return defult;
+                }
+            }
+            else
+            {
+                //鑾峰彇鏈湴鐨勫睘鎬� 
+                objValue = localWay.getGwInfo.GetType().InvokeMember(attributeName, System.Reflection.BindingFlags.GetField, null, localWay.getGwInfo, null);
+            }
+
+            if (objValue == null)
+            {
+                return defult;
+            }
+            return objValue;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇缃戝叧ID(鏈夌壒娈婃剰涔�)_____________
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧瀵硅薄閲岄潰鐨勭綉鍏矷D(灏佽杩欎釜鏂规硶鏈夌壒娈婃剰涔�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        public string GetGatewayId(ZbGateway zbGateway)
+        {
+            //杩欎釜涓滆タ涓嶄細涓虹┖
+            return zbGateway.getGatewayBaseInfo.gwID;
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇鍚嶇О___________________________
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧鍔犵壒鏁堢殑鍚嶇О
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <param name="mode"></param>
+        /// <returns></returns>
+        public string GetGatewayName(ZbGateway zbGateway, GetNameMode mode = GetNameMode.SpecialGateway)
+        {
+            string gwId = this.GetGatewayId(zbGateway);
+            if (this.dicGateway.ContainsKey(gwId) == false)
+            {
+                return zbGateway.getGatewayBaseInfo.GwName == null ? string.Empty : zbGateway.getGatewayBaseInfo.GwName;
+            }
+            var localWay = this.dicGateway[gwId];
+
+            string name = this.GetGatewaySimpleName(localWay);
+            if (string.IsNullOrEmpty(name) == false)
+            {
+                return name;
+            }
+
+            if (mode == GetNameMode.SpecialGateway && localWay.getGwInfo != null)
+            {
+                string keyName = Common.LocalDevice.deviceModelIdName + this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString();
+                if (LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
+                {
+                    //娌℃湁鍚嶇О鏃讹紝鍒欎娇鐢≧鏂囦欢閲岄潰璁剧疆鐨勯粯璁よ澶囧悕绉�
+                    return Language.StringByID(LocalDevice.Current.dicDeviceAllNameID[keyName] + 20000);
+                }
+            }
+
+            return string.Empty;
+        }
+
+        /// <summary>
+        /// 鍗曠函鑾峰彇缃戝叧鍚嶇О
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        private string GetGatewaySimpleName(ZbGateway zbGateway)
+        {
+            if (zbGateway == null)
+            {
+                return string.Empty;
+            }
+            return zbGateway.getGatewayBaseInfo.GwName;
+        }
+
+        /// <summary>
+        /// 璁剧疆缃戝叧闀滃儚绫诲瀷鐨勭炕璇戝悕瀛�
+        /// </summary>
+        /// <param name="button"></param>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public void SetGatewayImageText(Button button, ZbGateway zbGateway)
+        {
+            //鍒濆鍊�:鏃犳硶璇嗗埆鐨勭綉鍏宠澶�
+            button.TextID = R.MyInternationalizationString.uUnDistinguishTheGatewayDevice;
+
+            string gwId = this.GetGatewayId(zbGateway);
+            if (this.dicGateway.ContainsKey(gwId) == false || this.dicGateway[gwId].getGwInfo == null)
+            {
+                //濡傛灉杩欎釜缃戝叧娌℃湁淇℃伅锛屽垯浠庢柊鑾峰彇
+                if (zbGateway.getGwInfo != null && zbGateway.getGwInfo.LinuxImageType != 0)
+                {
+                    string keyName = Common.LocalDevice.deviceModelIdName + zbGateway.getGwInfo.LinuxImageType;
+                    if (Common.LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
+                    {
+                        //浣跨敤R鏂囦欢閲岄潰璁剧疆鐨勪笢瑗�
+                        button.TextID = LocalDevice.Current.dicDeviceAllNameID[keyName];
+                    }
+                }
+                else
+                {
+                    //缁欎竴涓嚎绋嬪幓鑾峰彇瀹冪殑闀滃儚绫诲瀷
+                    HdlThreadLogic.Current.RunThread(async () =>
+                    {
+                        var result = await this.GetGatewayNewInfoAsync(zbGateway, ShowErrorMode.NO);
+                        if (result != null)
+                        {
+                            zbGateway.getGwInfo = result;
+                            HdlThreadLogic.Current.RunMain(() =>
+                            {
+                                string keyName = Common.LocalDevice.deviceModelIdName + zbGateway.getGwInfo.LinuxImageType;
+                                if (Common.LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
+                                {
+                                    //浣跨敤R鏂囦欢閲岄潰璁剧疆鐨勪笢瑗�
+                                    button.TextID = LocalDevice.Current.dicDeviceAllNameID[keyName];
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+            else
+            {
+                string keyName = Common.LocalDevice.deviceModelIdName + this.dicGateway[gwId].getGwInfo.LinuxImageType;
+                if (Common.LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
+                {
+                    //浣跨敤R鏂囦欢閲岄潰璁剧疆鐨勪笢瑗�
+                    button.TextID = Common.LocalDevice.Current.dicDeviceAllNameID[keyName];
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 鑾峰彇缃戝叧淇℃伅_______________________
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧淇℃伅(鐗堟湰淇℃伅,闀滃儚绫诲瀷,鍩烘湰淇℃伅绛夈�傚彧鍒锋柊鏈湴缃戝叧鐨勭紦瀛�)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <param name="mode"></param>
+        /// <returns></returns>
+        public async Task<ZbGatewayData.GetGwData> GetGatewayNewInfoAsync(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
+                    this.ShowTipMsg(msg);
+                }
+                return null;
+            }
+            //鑾峰彇缃戝叧鐗堟湰淇℃伅
+            var imageTypeResult = await realWay.GetZbGwInfoAsync();
+            //妫�娴嬬綉鍏宠繑鍥炵殑鍏遍�氶敊璇姸鎬佺爜
+            string error = HdlCheckLogic.Current.CheckCommonErrorCode(imageTypeResult);
+            if (error != null)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    this.ShowTipMsg(error);
+                }
+                return null;
+            }
+
+            if (imageTypeResult == null || imageTypeResult.getGwData == null)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //鑾峰彇缃戝叧淇℃伅澶辫触
+                    string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
+                    //鎷兼帴涓娿�愮綉鍏冲洖澶嶈秴鏃躲�戠殑Msg
+                    msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                    this.ShowErrorMsg(msg);
+                }
+                return null;
+            }
+
+            string gwID = this.GetGatewayId(zbGateway);
+            if (this.dicGateway.ContainsKey(gwID) == true)
+            {
+                //鍒锋柊缂撳瓨
+                ZbGateway localWay = this.dicGateway[gwID];
+                localWay.getGwInfo = imageTypeResult.getGwData;
+                localWay.getGatewayBaseInfo.GwName = imageTypeResult.getGwData.GwName;
+                localWay.getGatewayBaseInfo.IpAddress = imageTypeResult.getGwData.GwIP;
+
+                localWay.ReSave();
+            }
+
+            return imageTypeResult.getGwData;
+        }
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧淇℃伅,闈炲紓姝�,浼氱瓑寰�(鐗堟湰淇℃伅,闀滃儚绫诲瀷,鍩烘湰淇℃伅绛夈�傚彧鍒锋柊鏈湴缃戝叧鐨勭紦瀛�)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <param name="mode"></param>
+        /// <returns></returns>
+        public ZbGatewayData.GetGwData GetGatewayNewInfo(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
+        {
+            bool bolBreak = false;
+            ZbGatewayData.GetGwData result = null;
+            HdlThreadLogic.Current.RunThread(async () =>
+            {
+                result = await this.GetGatewayNewInfoAsync(zbGateway, mode);
+                bolBreak = true;
+            });
+
+            while (bolBreak == false)
+            {
+                System.Threading.Thread.Sleep(500);
+            }
+            return result;
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鎴块棿鐩稿叧_______________________
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧鎵�鍦ㄧ殑鎴块棿
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        public Room GetRoomByGateway(ZbGateway zbGateway)
+        {
+            var gatewayId = this.GetGatewayId(zbGateway);
+            return this.GetRoomByGateway(gatewayId);
+        }
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧鎵�鍦ㄧ殑鎴块棿
+        /// </summary>
+        /// <param name="gatewayId">缃戝叧ID</param>
+        /// <returns></returns>
+        public Room GetRoomByGateway(string gatewayId)
+        {
+            var localGateway = this.GetLocalGateway(gatewayId);
+            if (localGateway == null)
+            {
+                return null;
+            }
+            return HdlRoomLogic.Current.GetRoomById(localGateway.RoomId);
+        }
+
+        /// <summary>
+        /// 鍙樻洿缃戝叧鎴块棿
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <param name="roomId">鎴块棿ID</param>
+        public void ChangedGatewayRoom(ZbGateway zbGateway, string roomId)
+        {
+            var gatewayId = this.GetGatewayId(zbGateway);
+            var localGateway = this.GetLocalGateway(gatewayId);
+            if (localGateway != null)
+            {
+                localGateway.RoomId = roomId;
+                localGateway.ReSave();
+                //娣诲姞澶囦唤
+                HdlAutoBackupLogic.AddOrEditorFile(localGateway.FilePath);
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 娓呯┖鐪熷疄缃戝叧鍒楄〃___________________
+
+        /// <summary>
+        /// 娓呯┖鍏ㄩ儴鐨勭湡瀹炵墿鐞嗙綉鍏冲璞�
+        /// </summary>
+        public void ClearAllRealGateway()
+        {
+            //鍥犱负閭d竴鐬棿锛屾湁鍙兘mqtt浼氬姞鍥炴潵,鎵�浠ュ厛鍔犵紦瀛�
+            var list = new List<ZbGateway>();
+            list.AddRange(ZbGateway.GateWayList);
+            //鐒跺悗娓呯┖鎺�
+            ZbGateway.GateWayList.Clear();
+            //鏈�鍚庡啀鏂紑mqtt杩炴帴
+            for (int i = 0; i < list.Count; i++)
+            {
+                list[i].DisConnectLocalMqttClient("G");
+            }
+            list.Clear();
+        }
+
+        #endregion
+
+        #region 鈻� 妫�娴嬪苟鑾峰彇缃戝叧鍚勭鍥轰欢鏂扮増鏈琠______
+
+        /// <summary>
+        /// 妫�娴嬪苟鑾峰彇缃戝叧鍚勫浐浠剁殑鏂扮増鏈�,娌℃湁鏂扮増鏈�,鍒欏搴斾綅缃瓨鐨勬槸null,鐩存帴杩斿洖null浠h〃澶辫触(0:Linux鏂扮増鏈�  1:鍗忚皟鍣ㄦ柊鐗堟湰  2锝瀀:閮芥槸铏氭嫙椹卞姩鐨�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <param name="mode">閿欒鏃讹紝鏄惁鏄剧ず閿欒</param>
+        /// <returns></returns>
+        public async Task<List<FirmwareVersionInfo>> GetGatewayAllNewVersion(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
+        {
+            //鑾峰彇缃戝叧鐗堟湰淇℃伅
+            var result = await HdlGatewayLogic.Current.GetGatewayNewInfoAsync(zbGateway, mode);
+            if (result == null)
+            {
+                return null;
+            }
+            //浣跨敤鏈湴缂撳瓨瀵硅薄
+            string gwID = this.GetGatewayId(zbGateway);
+            var localWay = this.GetLocalGateway(gwID);
+            if (localWay == null)
+            {
+                return null;
+            }
+
+            //娣诲姞缃戝叧鐨勫崌绾у浐浠�(鎴愪笉鎴愬姛閮芥棤鎵�璋�)
+            var flage = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.Linux,
+                this.GetGwInfoAttribute(localWay, "LinuxHWVersion").ToString(),
+                this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString());
+
+            //娣诲姞鍗忚皟鍣ㄧ殑鍗囩骇鍥轰欢(鎴愪笉鎴愬姛閮芥棤鎵�璋�)
+            flage = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.Coordinator,
+                this.GetGwInfoAttribute(localWay, "ZbHWVersion").ToString(),
+                this.GetGwInfoAttribute(localWay, "ZbImageType").ToString());
+
+            //缃戝叧鐨勭増鏈�
+            var gatewayFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.Linux,
+                this.GetGwInfoAttribute(localWay, "LinuxHWVersion").ToString(),
+                this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString(),
+                Convert.ToInt32(this.GetGwInfoAttribute(localWay, "LinuxFWVersion")));
+
+            //鍗忚皟鍣ㄧ増鏈�
+            var coordinatorFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.Coordinator,
+                this.GetGwInfoAttribute(localWay, "ZbHWVersion").ToString(),
+                this.GetGwInfoAttribute(localWay, "ZbImageType").ToString(),
+                Convert.ToInt32(this.GetGwInfoAttribute(localWay, "ZbFWVersion")));
+
+            var list = new List<FirmwareVersionInfo>();
+            list.Add(gatewayFirmware);
+            list.Add(coordinatorFirmware);
+
+            //杩欎釜缃戝叧闇�瑕佹湁铏氭嫙椹卞姩杩欎釜涓滆タ鎵嶈
+            string linImage = this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString();
+            if (linImage != "6")
+            {
+                //铏氭嫙椹卞姩鍙�
+                var listvVode = await HdlGatewayLogic.Current.GetListVDDriveCode(localWay);
+                if (listvVode != null && listvVode.Count > 0)
+                {
+                    foreach (var data in listvVode)
+                    {
+                        //娣诲姞铏氭嫙椹卞姩鐨勫崌绾у浐浠�(鎴愪笉鎴愬姛閮芥棤鎵�璋�)
+                        flage = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.VirtualDevice,
+                            data.DriveHwVersion.ToString(),
+                            data.DriveImageType.ToString());
+
+                        //铏氭嫙椹卞姩
+                        var virtualFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.VirtualDevice,
+                            data.DriveHwVersion.ToString(),
+                            data.DriveImageType.ToString(),
+                            data.DriveFwVersion);
+
+                        if (virtualFirmware != null)
+                        {
+                            virtualFirmware.VirtualCode = data.DriveCode;
+                            list.Add(virtualFirmware);
+                        }
+                    }
+                }
+            }
+            if (list.Count == 2)
+            {
+                //铏氭嫙椹卞姩濡傛灉娌℃湁鏂扮増鏈殑璇濓紝鍥哄畾娣诲姞涓�涓┖鐨�
+                list.Add(null);
+            }
+            return list;
+        }
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧鐨勮櫄鎷熼┍鍔ㄥ彿(杩斿洖null鏃朵唬琛ㄨ幏鍙栧け璐�)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public async Task<List<ZbGatewayData.DriveCodeObj>> GetListVDDriveCode(ZbGateway zbGateway)
+        {
+            ZbGateway zbTemp = null;
+            if (this.GetRealGateway(ref zbTemp, zbGateway) == false)
+            {
+                return null;
+            }
+            var result = await zbTemp.CheckVDDriveCodeAsync();
+            //妫�娴嬬綉鍏宠繑鍥炵殑鍏遍�氶敊璇姸鎬佺爜
+            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
+            if (error != null)
+            {
+                this.ShowTipMsg(error);
+                return null;
+            }
+
+            if (result == null || result.vDriveDriveCodeResponData == null || result.vDriveDriveCodeResponData.DriveCodeList == null)
+            {
+                return null;
+            }
+            if (result.vDriveDriveCodeResponData.DriveCodeList.Count > 0)
+            {
+                return result.vDriveDriveCodeResponData.DriveCodeList;
+            }
+            return null;
+        }
+
+        #endregion
+
+        #region 鈻� 涓荤綉鍏冲垽瀹歘________________________
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓荤綉鍏�(1:涓荤綉鍏� 0:涓嶅湪绾� 2:瀛愮綉鍏�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        public int IsMainGateway(ZbGateway zbGateway)
+        {
+            string gwID = this.GetGatewayId(zbGateway);
+            return this.IsMainGateway(gwID);
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇鏄惁涓荤綉鍏�(1:涓荤綉鍏� 0:涓嶅湪绾� 2:瀛愮綉鍏�)
+        /// </summary>
+        /// <param name="waiID">缃戝叧id</param>
+        /// <returns></returns>
+        public int IsMainGateway(string waiID)
+        {
+            ZbGateway zbGateway = null;
+            if (this.GetRealGateway(ref zbGateway, waiID) == false)
+            {
+                return 0;
+            }
+            return zbGateway.IsMainGateWay == true ? 1 : 2;
+        }
+
+        #endregion
+
+        #region 鈻� 璁剧疆缃戝叧鍥剧墖_______________________
+
+        /// <summary>
+        /// 璁剧疆鐪熷疄缃戝叧鐨勫浘鐗�
+        /// </summary>
+        /// <param name="button"></param>
+        /// <param name="zbGateway"></param>
+        public void SetRealGatewayPictrue(Button button, ZbGateway zbGateway)
+        {
+            string gwID = this.GetGatewayId(zbGateway);
+            var localWay = this.GetLocalGateway(gwID);
+            if (localWay == null || localWay.getGwInfo == null)
+            {
+                if (zbGateway.getGwInfo != null && zbGateway.getGwInfo.LinuxImageType != 0)
+                {
+                    button.UnSelectedImagePath = "Gateway/RealGateway" + zbGateway.getGwInfo.LinuxImageType + ".png";
+                }
+                else
+                {
+                    //缁欎竴涓嚎绋嬪幓鑾峰彇瀹冪殑闀滃儚绫诲瀷
+                    HdlThreadLogic.Current.RunThread(async () =>
+                    {
+                        var result = await this.GetGatewayNewInfoAsync(zbGateway, ShowErrorMode.NO);
+                        if (result != null)
+                        {
+                            zbGateway.getGwInfo = result;
+                            HdlThreadLogic.Current.RunMain(() =>
+                            {
+                                button.UnSelectedImagePath = "Gateway/RealGateway" + result.LinuxImageType + ".png";
+                            });
+                        }
+                    });
+                }
+            }
+            else
+            {
+                button.UnSelectedImagePath = "Gateway/RealGateway" + localWay.getGwInfo.LinuxImageType + ".png";
+            }
+        }
+
+        /// <summary>
+        /// 璁剧疆缃戝叧鍥炬爣
+        /// </summary>
+        /// <param name="button"></param>
+        /// <param name="zbGateway"></param>
+        public void SetGatewayIcon(Button button, ZbGateway zbGateway)
+        {
+            string gwID = this.GetGatewayId(zbGateway);
+            var localWay = this.GetLocalGateway(gwID);
+            if (localWay == null || localWay.getGwInfo == null)
+            {
+                if (zbGateway.getGwInfo != null && zbGateway.getGwInfo.LinuxImageType != 0)
+                {
+                    button.UnSelectedImagePath = "Gateway/GatewayIcon" + zbGateway.getGwInfo.LinuxImageType + ".png";
+                }
+                else
+                {
+                    //缁欎竴涓嚎绋嬪幓鑾峰彇瀹冪殑闀滃儚绫诲瀷
+                    HdlThreadLogic.Current.RunThread(async () =>
+                    {
+                        var result = await this.GetGatewayNewInfoAsync(zbGateway, ShowErrorMode.NO);
+                        if (result != null)
+                        {
+                            zbGateway.getGwInfo = result;
+                            HdlThreadLogic.Current.RunMain(() =>
+                            {
+                                button.UnSelectedImagePath = "Gateway/GatewayIcon" + result.LinuxImageType + ".png";
+                            });
+                        }
+                    });
+                }
+            }
+            else
+            {
+                button.UnSelectedImagePath = "Gateway/GatewayIcon" + localWay.getGwInfo.LinuxImageType + ".png";
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧瀛樺湪妫�娴媉______________________
+
+        /// <summary>
+        /// 缃戝叧鏄惁宸茬粡瀛樺湪
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        public bool IsGatewayExist(ZbGateway zbGateway)
+        {
+            string gwID = this.GetGatewayId(zbGateway);
+            return this.IsGatewayExist(gwID);
+        }
+
+        /// <summary>
+        /// 缃戝叧鏄惁宸茬粡瀛樺湪
+        /// </summary>
+        /// <param name="gatewayId">缃戝叧ID</param>
+        /// <returns></returns>
+        public bool IsGatewayExist(string gatewayId)
+        {
+            if (gatewayId == null)
+            {
+                return false;
+            }
+            return dicGateway.ContainsKey(gatewayId);
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧瀹氫綅___________________________
+
+        /// <summary>
+        /// 鍙戦�佹寚浠ゅ埌缃戝叧杩涜瀹氫綅(缃戝叧LED闂儊璇嗗埆)
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        public void SetFixedPositionCommand(ZbGateway zbGateway)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 85 } };
+            if (this.IsGatewayExist(zbGateway) == true)
+            {
+                realWay.Send("GwLinuxLocate_Respon", jObject.ToString());
+            }
+            else
+            {
+                //濡傛灉杩欎釜缃戝叧杩樻病鏈夌粦瀹氱殑璇濓紝鍒欏己鍒朵娇鐢ㄦ湰鍦拌繛鎺�
+                realWay.SendLocation("GwLinuxLocate_Respon", System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鐩戣___________________________
+
+        #region 鈻� 鍙橀噺澹版槑___________________________
+
+        /// <summary>
+        /// 褰撳墠鐨勭綉缁滆繛鎺ユā寮�
+        /// </summary>
+        private GatewayConnectMode nowGwConnectMode = GatewayConnectMode.None;
+        /// <summary>
+        /// 鏄惁瀛樺湪缃戝叧姝e湪鍗囩骇
+        /// </summary>
+        private bool hadGatewayUpdate = false;
+
+        #endregion
+
+        #region 鈻� 缃戝叧杩炴帴鏂瑰紡鍙樻洿___________________
+
+        /// <summary>
+        /// 褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,妫�娴嬬綉鍏�,鐒跺悗鏄剧ず鐗规晥
+        /// </summary>
+        /// <param name="connectMode">缃戝叧鍙樻洿鍚庣殑杩炴帴鏂瑰紡</param>
+        public void CheckGatewayByConnectChanged(GatewayConnectMode connectMode)
+        {
+            if (this.nowGwConnectMode == connectMode || this.hadGatewayUpdate == true)
+            {
+                //鐩稿悓鐨勮繛鎺ユā寮�,鎴栬�呮湁缃戝叧姝e湪鍗囩骇,鍒欎笉闇�瑕佹搷浣�
+                return;
+            }
+
+            //娌℃湁缃戠粶
+            if (connectMode == GatewayConnectMode.NoLine)
+            {
+                nowGwConnectMode = GatewayConnectMode.NoLine;
+                //鍦ㄨ繙绋嬬殑鏉′欢涓嬶紝妫�鏌ョ綉鍏崇殑鍦ㄧ嚎鐘舵��(缃戠粶鍙樻洿鏃惰Е鍙�)
+            }
+            //鍙互鍙�4G
+            else if (connectMode == GatewayConnectMode.Remote)
+            {
+                nowGwConnectMode = GatewayConnectMode.Remote;
+                //鍦ㄨ繙绋嬬殑鏉′欢涓嬶紝妫�鏌ョ綉鍏崇殑鍦ㄧ嚎鐘舵��(缃戠粶鍙樻洿鏃惰Е鍙�)
+                this.CheckGatewayStatuByRemote();
+            }
+            //WIFI
+            else if (connectMode == GatewayConnectMode.WIFI)
+            {
+                nowGwConnectMode = GatewayConnectMode.WIFI;
+                //鍦╓IFI鐨勬潯浠朵笅锛屾鏌ョ綉鍏崇殑鍦ㄧ嚎鐘舵��(缃戠粶鍙樻洿鏃惰Е鍙�)
+                this.CheckGatewayStatuByWIFI();
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 妫�鏌ョ綉鍏�(WIFI)_____________________
+
+        /// <summary>
+        /// 鍦╓IFI鐨勬潯浠朵笅锛屾鏌ョ綉鍏崇殑鍦ㄧ嚎鐘舵��(缃戠粶鍙樻洿鏃惰Е鍙�)
+        /// </summary>
+        private void CheckGatewayStatuByWIFI()
+        {
+            if (this.dicGateway.Count == 0)
+            {
+                //濡傛灉鏈湴閮芥病鏈夌綉鍏崇殑璇濓紝涓嶉渶瑕佸鐞�
+                return;
+            }
+
+            HdlThreadLogic.Current.RunThread(() =>
+            {
+                var dicStatu = this.GetNowOnlineStatuBeforeCheck();
+                //绛変釜3绉掞紝鍑嗗涓�涓�
+                System.Threading.Thread.Sleep(3000);
+                if (nowGwConnectMode != GatewayConnectMode.WIFI)
+                {
+                    //缃戠粶涓存椂鍙樻洿锛燂紵
+                    return;
+                }
+
+                //浠庣綉鍏宠幏鍙栧叏閮ㄧ殑缃戝叧
+                List<ZbGateway> list = this.GetAllGatewayFromGateway();
+                foreach (var way in list)
+                {
+                    string gwId = this.GetGatewayId(way);
+                    if (this.dicGateway.ContainsKey(gwId) == true)
+                    {
+                        //鍒锋柊涓�涓嬬紦瀛�
+                        this.dicGateway[gwId].GatewayOnlineFlage = way.GatewayOnlineFlage;
+                    }
+                    if (this.CheckGatewayOnlineByFlag(way) == true)
+                    {
+                        //缃戝叧鍦ㄧ嚎
+                        dicStatu[gwId] = true;
+                    }
+                }
+                //灏嗗彉鍖栫殑缃戝叧鎺ㄩ�佸埌鐣岄潰涓�
+                this.PushGatewayOnlineStatuToForm(dicStatu);
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 妫�鏌ョ綉鍏�(4G)_______________________
+
+        /// <summary>
+        /// 鍦ㄨ繙绋嬬殑鏉′欢涓嬶紝妫�鏌ョ綉鍏崇殑鍦ㄧ嚎鐘舵��(缃戠粶鍙樻洿鏃惰Е鍙�)
+        /// </summary>
+        private void CheckGatewayStatuByRemote()
+        {
+            if (this.dicGateway.Count == 0)
+            {
+                //濡傛灉鏈湴閮芥病鏈夌綉鍏崇殑璇濓紝涓嶉渶瑕佸鐞�
+                return;
+            }
+
+            HdlThreadLogic.Current.RunThread(() =>
+            {
+                //鍏堣幏鍙栫幇鍦ㄥ叏閮ㄧ殑缃戝叧锛屽垵鏈熷�よ缃负涓嶅湪绾�
+                var dicStatu = this.GetNowOnlineStatuBeforeCheck();
+
+                //鑾峰彇浜戠涓婇潰鐨勭綉鍏�
+                Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
+                if (nowGwConnectMode != GatewayConnectMode.Remote || dicDbGateway == null)
+                {
+                    //缃戠粶涓存椂鍙樻洿锛燂紵
+                    return;
+                }
+
+                bool hadOnline = false;
+                lock (dicGateway)
+                {
+                    foreach (var way in this.dicGateway.Values)
+                    {
+                        //寰幆澶勭悊鏈湴鍏ㄩ儴鐨勭綉鍏冲垪琛�
+                        string gwId = this.GetGatewayId(way);
+                        if (dicDbGateway.ContainsKey(gwId) == true//濡傛灉浜戠涓婇潰鏈夎繖涓綉鍏�
+                            && dicDbGateway[gwId].MqttOnlineStatus == true//濡傛灉浜戠涓婇潰杩欎釜缃戝叧鏄湪绾跨殑
+                            )
+                        {
+                            dicGateway[gwId].GatewayOnlineFlage = true;
+                            //瀹冩槸鍦ㄧ嚎鐨�
+                            dicStatu[gwId] = true;
+                            hadOnline = true;
+                        }
+                    }
+                }
+
+                //灏嗗彉鍖栫殑缃戝叧鎺ㄩ�佸埌鐣岄潰涓�
+                this.PushGatewayOnlineStatuToForm(dicStatu);
+
+                //濡傛灉娌℃湁缃戝叧鍦ㄧ嚎
+                if (hadOnline == false)
+                {
+                    //杩滅▼杩炴帴瓒呮椂,娌℃湁缃戝叧鍦ㄧ嚎
+                    string msg = Language.StringByID(R.MyInternationalizationString.uRemoteTimeOutAndNotGatewaiOnline);
+                    //this.ShowTipMsg(msg);
+                }
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 妫�鏌ョ綉鍏�(鏃犵綉缁�)___________________
+
+        /// <summary>
+        /// 鍦ㄨ繙绋嬬殑鏉′欢涓嬶紝妫�鏌ョ綉鍏崇殑鍦ㄧ嚎鐘舵��(缃戠粶鍙樻洿鏃惰Е鍙�)
+        /// </summary>
+        private void CheckGatewayStatuByNotNet()
+        {
+            //褰撳墠鏃犵綉缁滆繛鎺�,璇风‘璁ょ綉缁�
+            string msg = Language.StringByID(R.MyInternationalizationString.uNowIsDonotNetworkAndCheckNetwork);
+            this.ShowTipMsg(msg);
+        }
+
+        #endregion
+
+        #region 鈻� 缃戝叧鎺ㄩ�乢__________________________
+
+        /// <summary>
+        /// 灏嗗彉鍖栫殑缃戝叧鎺ㄩ�佸埌鐣岄潰涓�
+        /// </summary>
+        /// <param name="dicStatu"></param>
+        private void PushGatewayOnlineStatuToForm(Dictionary<string, bool> dicStatu)
+        {
+            List<ZbGateway> listChange = new List<ZbGateway>();
+            List<bool> listChangeStatu = new List<bool>();
+            foreach (string gwid in dicStatu.Keys)
+            {
+                //缃戝叧涓嶅锛岀洿鎺ユ帹閫�,涓嶅垽鏂槸鍚︽敼鍙樹簡
+                ZbGateway zbGateway = this.GetLocalGateway(gwid);
+                if (zbGateway != null)
+                {
+                    listChange.Add(zbGateway);
+                    listChangeStatu.Add(dicStatu[gwid]);
+
+                    zbGateway.GatewayOnlineFlage = dicStatu[gwid];
+                }
+            }
+
+            if (listChange.Count == 0)
+            {
+                return;
+            }
+            //淇濆瓨褰撳墠婵�娲荤殑鐣岄潰ID
+            var listId = new List<string>();
+            listId.AddRange(UserCenterResourse.listActionFormId);
+            for (int i = 0; i < listId.Count; i++)
+            {
+                if (UserCenterResourse.DicActionForm.ContainsKey(listId[i]) == false)
+                {
+                    continue;
+                }
+                //缃戝叧鍦ㄧ嚎鎺ㄩ��
+                for (int j = 0; j < listChange.Count; j++)
+                {
+                    UserCenterResourse.DicActionForm[listId[i]]?.GatewayOnlinePush(listChange[j], listChangeStatu[j]);
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 涓�鑸柟娉昣__________________________
+
+        /// <summary>
+        /// 璁剧疆瀛樺湪缃戝叧姝e湪鍗囩骇鐨勬爣璇�
+        /// </summary>
+        /// <param name="update">鏄惁鏈夌綉鍏冲湪鍗囩骇</param>
+        public void SetHadGatewayUpdateFlage(bool update)
+        {
+            this.hadGatewayUpdate = update;
+        }
+
+        /// <summary>
+        /// 鍦ㄧ綉缁滆繛鎺ュ彉鏇翠箣鍚庯紝缃戝叧杩炴帴妫�娴嬩箣鍓嶏紝璁剧疆鍏ㄩ儴缃戝叧涓虹绾跨姸鎬�(浠ユ湰鍦扮綉鍏充负鏍囧噯)
+        /// </summary>
+        /// <returns></returns>
+        private Dictionary<string, bool> GetNowOnlineStatuBeforeCheck()
+        {
+            //鍏堣幏鍙栫幇鍦ㄥ叏閮ㄧ殑缃戝叧
+            List<ZbGateway> listOldGateway = this.GetAllGatewayFromGateway();
+            var dicOldZb = new Dictionary<string, ZbGateway>();
+            foreach (var zb in listOldGateway)
+            {
+                string gwID = this.GetGatewayId(zb);
+                dicOldZb[gwID] = zb;
+            }
+
+            var dicStatu = new Dictionary<string, bool>();
+            lock (dicGateway)
+            {
+                foreach (string gwId in this.dicGateway.Keys)
+                {
+                    if (dicOldZb.ContainsKey(gwId) == true)
+                    {
+                        //鏍囪涓轰笉鍦ㄧ嚎
+                        this.SetGatewayNotOnLineFlag(dicOldZb[gwId]);
+                    }
+                    dicStatu[gwId] = false;
+                }
+            }
+            return dicStatu;
+        }
+
+        #endregion
+
+        #endregion
+
+        #region 鈻� 浠庝簯绔幏鍙栧叏閮ㄧ綉鍏冲垪琛↖D___________
+
+        /// <summary>
+        /// 浠庝簯绔幏鍙栧叏閮ㄧ綉鍏冲垪琛↖D
+        /// </summary>
+        /// <returns>浠庝簯绔幏鍙栧叏閮ㄧ綉鍏冲垪琛↖D</returns>
+        public Dictionary<string, GatewayResult> GetGateWayListFromDataBase()
+        {
+            Dictionary<string, GatewayResult> dicDbGateway = null;
+            if (UserCenterResourse.UserInfo.AuthorityNo == 3)
+            {
+                //鎴愬憳
+                return dicDbGateway;
+            }
+
+            bool canBreak = false;
+            HdlThreadLogic.Current.RunThread(async () =>
+            {
+                List<string> list = new List<string>() { "NotSetAgain", "NotCheck" };
+
+                //璁剧疆璁块棶鎺ュ彛鐨勫弬鏁�
+                var pra = new GetGatewayPra();
+                pra.ReqDto.PageSetting.Page = 1;
+                pra.ReqDto.PageSetting.PageSize = 999;
+                //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
+                pra.ReqDto.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
+
+                var result = await UserCenterLogic.GetResponseDataByRequestHttps("App/GetSingleHomeGatewayPagger", true, pra, list);
+                if (string.IsNullOrEmpty(result) == true)
+                {
+                    canBreak = true;
+                    return;
+                }
+                var infoResult = Newtonsoft.Json.JsonConvert.DeserializeObject<GetGatewayResult>(result);
+
+                Dictionary<string, GatewayResult> dic = new Dictionary<string, GatewayResult>();
+                foreach (var data in infoResult.PageData)
+                {
+                    dic[data.GatewayUniqueId] = data;
+                }
+                dicDbGateway = dic;
+                canBreak = true;
+            });
+
+            int count = 0;
+            while (canBreak == false)
+            {
+                System.Threading.Thread.Sleep(200);
+                count++;
+                if (count == 25)
+                {
+                    //濡傛灉5绉掕繕涓嶈兘鑾峰彇寰楀埌鏁版嵁锛屽垯涓柇姝ゆ鎿嶄綔
+                    break;
+                }
+            }
+
+            return dicDbGateway;
+        }
+
+        #endregion
+
+        #region 鈻� 璁剧疆缃戝叧缁忕含搴____________________
+
+        /// <summary>
+        /// 璁剧疆缃戝叧缁忕含搴�
+        /// </summary>
+        /// <param name="gateway">缃戝叧瀵硅薄</param>
+        /// <param name="Longitude">缁忓害</param>
+        /// <param name="Latitude">缁村害</param>
+        /// <param name="mode">鏄剧ず閿欒</param>
+        /// <returns></returns>
+        public bool SetGatewaySite(ZbGateway gateway, double Longitude, double Latitude, ShowErrorMode mode)
+        {
+            ZbGateway realWay = null;
+            if (this.GetRealGateway(ref realWay, gateway) == false)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //閿欒:缃戝叧瀵硅薄涓㈠け
+                    string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
+                    this.ShowTipMsg(msg);
+                }
+                return false;
+            }
+
+            int result = -1;
+            Action<string, string> action = (topic, message) =>
+            {
+                var gatewayID = topic.Split('/')[0];
+                if (topic == gatewayID + "/" + "Logic/SetSite_Respon")
+                {
+                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
+                    result = Convert.ToInt32(jobject["Data"]["Result"].ToString());
+                }
+            };
+            realWay.Actions += action;
+            //涓や綅灏忔暟
+            Longitude = Math.Round(Longitude, 2);
+            Latitude = Math.Round(Latitude, 2);
+
+            int intLongitude = Convert.ToInt32(Longitude.ToString().Replace(".", string.Empty));
+            int intLatitude = Convert.ToInt32(Latitude.ToString().Replace(".", string.Empty));
+
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 2013 } };
+            var data = new Newtonsoft.Json.Linq.JObject { { "Longitude", intLongitude }, { "Latitude", intLatitude } };
+            jObject.Add("Data", data);
+            if (this.IsGatewayExist(gateway) == true)
+            {
+                realWay.Send("Logic/SetSite", jObject.ToString());
+            }
+            else
+            {
+                //濡傛灉杩欎釜缃戝叧杩樻病鏈夌粦瀹氱殑璇濓紝鍒欏己鍒朵娇鐢ㄦ湰鍦拌繛鎺�
+                realWay.SendLocation("Logic/SetSite", System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
+            }
+
+            int TimeOut = 0;
+            while (result == -1 && TimeOut < 30)
+            {
+                System.Threading.Thread.Sleep(100);
+                TimeOut++;
+            }
+
+            realWay.Actions -= action;
+            if (result != 0)
+            {
+                if (mode == ShowErrorMode.YES)
+                {
+                    //璁剧疆缃戝叧缁忕含搴﹀け璐�
+                    string msg = Language.StringByID(R.MyInternationalizationString.uSetGatewaySiteFail);
+                    if (result == -1)
+                    {
+                        msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂");
+                    }
+                    this.ShowTipMsg(msg);
+                }
+                return false;
+            }
+
+            return true;
+        }
+
+        #endregion
+
+        #region 鈻� 瑙g粦浜戠缃戝叧_______________________
+
+        /// <summary>
+        /// 瑙g粦浜戠缁戝畾鐨勭綉鍏�
+        /// </summary>
+        /// <param name="strWayId"></param>
+        public async Task<bool> DeleteDataBaseGateway(string strWayId)
+        {
+            var Pra = new DeleteGatewayPra();
+            Pra.BindGateways.Add(strWayId);
+            //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
+            Pra.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
+
+            List<string> listNotShowError = new List<string>() { "NoExist", "NoBind", "NoRecord", "NotSetAgain" };
+
+            bool result = await UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", true, Pra, listNotShowError);
+            if (result == false)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        #endregion
+
+        #region 鈻� 鏂綉澶囦唤鍙婄粦瀹氱綉鍏矷D_______________
+
+        /// <summary>
+        /// 鍦ㄦ病缃戠殑鎯呭喌涓嬪浠界綉鍏矷D
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        public void BackupGatewayIdOnNotNetwork(ZbGateway zbGateway)
+        {
+            var strId = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
+            if (listBackupGwId.Contains(strId) == false)
+            {
+                listBackupGwId.Add(strId);
+
+                //澶囦唤
+                var strData = Newtonsoft.Json.JsonConvert.SerializeObject(listBackupGwId);
+                var byteData = System.Text.Encoding.UTF8.GetBytes(strData);
+                Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile, byteData);
+            }
+        }
+
+        /// <summary>
+        /// 閲嶆柊鍙戦�佸懡浠ゅ幓缁戝畾鏂綉鎯呭喌涓嬪浠界殑缃戝叧
+        /// </summary>
+        public void ResetComandToBindBackupGateway()
+        {
+            HdlThreadLogic.Current.RunThread(async () =>
+            {
+                var fileData = Global.ReadFileByDirectory(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile);
+                if (fileData == null)
+                {
+                    return;
+                }
+                this.listBackupGwId = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(System.Text.Encoding.UTF8.GetString(fileData));
+                var listTempId = new List<string>();
+                listTempId.AddRange(this.listBackupGwId);
+
+                //涓嶆樉绀哄凡缁忚缁戝畾杩囩殑淇℃伅,NotSetAgain:鍋囧鏂綉鏃�,涓嶄簩娆″彂閫�
+                List<string> listNotShow = new List<string>() { "NotSetAgain" };
+                //璋冪敤鎺ュ彛锛岀粦瀹氱綉鍏�
+                var bindGateway = new BindGatewayPra();
+                //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
+                bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
+
+                foreach (var gwId in listTempId)
+                {
+                    bindGateway.BindGateways.Clear();
+                    bindGateway.BindGateways.Add(gwId);
+                    var result = await UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, listNotShow);
+                    if (result == "Success")
+                    {
+                        this.listBackupGwId.Remove(gwId);
+                    }
+                    if (result == "Error" || result == "ErrorEx")
+                    {
+                        break;
+                    }
+                }
+
+                if (this.listBackupGwId.Count == 0)
+                {
+                    //濡傛灉娌℃湁浜嗗唴瀹�,鍒欏垹闄ゆ枃浠�
+                    string file = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile);
+                    if (System.IO.File.Exists(file) == true)
+                    {
+                        System.IO.File.Delete(file);
+                    }
+                }
+                else
+                {
+                    //澶囦唤
+                    var strData = Newtonsoft.Json.JsonConvert.SerializeObject(listBackupGwId);
+                    var byteData = System.Text.Encoding.UTF8.GetBytes(strData);
+                    Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile, byteData);
+                }
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 涓婁紶璁惧澶囦唤鍒扮綉鍏砡________________
+
+        /// <summary>
+        /// 涓婁紶璁惧澶囦唤鍒扮綉鍏�(鏈�濂戒笉瑕佸幓鐞嗗畠鐨勮繑鍥炵粨鏋�)
+        /// </summary>
+        /// <param name="device">璁惧瀵硅薄</param>
+        /// <param name="backupEnum">澶囦唤绫诲瀷</param>
+        /// <param name="upLaodData">澶囦唤鐨勬暟鎹�</param>
+        /// <returns></returns>
+        public async Task<bool> UpLoadDeviceBackupDataToGateway(CommonDevice device, GatewayBackupEnum backupEnum, object upLaodData)
+        {
+            ZbGateway realWay = null;
+            if (HdlGatewayLogic.Current.GetRealGateway(ref realWay, device.CurrentGateWayId) == false)
+            {
+                //娌℃湁鎵惧埌鐪熷疄鐗╃悊缃戝叧
+                return false;
+            }
+            string fileName = device.FilePath + ((int)backupEnum).ToString().PadLeft(5, '0');
+            //鍒涘缓鏂囦欢瀵硅薄
+            var result = await realWay.CreateFileAsync(fileName);
+            if (result == null || result.Result != 0)
+            {
+                return false;
+            }
+            //鍙戦�佹暟鎹祦
+            var data = Newtonsoft.Json.JsonConvert.SerializeObject(upLaodData);
+            var byteData = System.Text.Encoding.UTF8.GetBytes(data);
+            var result2 = await realWay.SendFileAsync(byteData);
+            if (result2 == null || result2.Result != 0)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        #endregion
+
+        #region 鈻� 鎭㈠缃戝叧___________________________
+
+        /// <summary>
+        /// 鎭㈠缃戝叧閰嶇疆
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <param name="listGatewayFile">缃戝叧閲岄潰鎷ユ湁鐨勬枃浠�</param>
+        /// <param name="backDirectory">浜戠涓嬭浇鐨勫浠芥暟鎹殑鏂囦欢澶瑰悕瀛�</param>
+        /// <returns></returns>
+        public async Task<bool> RecoverGatewaySettion(ZbGateway zbGateway, List<string> listGatewayFile, string backDirectory)
+        {
+            //鑾峰彇浠庝簯绔偅閲屽緱鏉ョ殑鍏ㄩ儴鏂囦欢
+            var listBackFile = HdlAutoBackupLogic.GetFileFromDirectory(UserCenterLogic.CombinePath(backDirectory));
+            listBackFile.Sort();
+            //娣诲姞闄勫姞鎯呮姤:杩樺師璁惧閰嶇疆
+            ProgressBar.SetAppendText(Language.StringByID(R.MyInternationalizationString.uRecoverDeviceSettion));
+            ProgressBar.SetMaxValue(listBackFile.Count);
+            ProgressBar.Show();
+
+            var listSaveFile = new HashSet<string>();
+            foreach (string fileName in listBackFile)
+            {
+                if (fileName.Length < 10 || fileName.StartsWith("Device_") == false)
+                {
+                    //涓嶆槸璁惧澶囦唤鏂囦欢
+                    continue;
+                }
+                //鎭㈠璁惧閰嶇疆
+                var result = await this.RecoverDeviceSettion(backDirectory, fileName);
+                if (result == -1)
+                {
+                    ProgressBar.Close();
+                    return false;
+                }
+                if (result == 1 || result == 2)
+                {
+                    listSaveFile.Add(fileName);
+                }
+
+                ProgressBar.SetValue(1);
+                listGatewayFile.Remove(fileName);
+            }
+            //娣诲姞闄勫姞鎯呮姤:瑕嗙洊缃戝叧澶囦唤涓�
+            ProgressBar.SetAppendText(Language.StringByID(R.MyInternationalizationString.uGatewayBackupDataIsCovering));
+            foreach (var file in listSaveFile)
+            {
+                //鍒涘缓鏂囦欢瀵硅薄
+                var result = await zbGateway.CreateFileAsync(file);
+                if (result == null || result.Result != 0)
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        //瑕嗙洊缃戝叧澶囦唤澶辫触
+                        string msg = Language.StringByID(R.MyInternationalizationString.uCoverGatewayBackupDataFail);
+                        var control = new ShowMsgControl(ShowMsgType.Tip, msg);
+                        control.Show();
+                    });
+                    ProgressBar.Close();
+                    return false;
+                }
+                //鍙戦�佹暟鎹祦
+                var byteData = Shared.Common.Global.ReadFileByDirectory(backDirectory, file);
+                var result2 = await zbGateway.SendFileAsync(byteData);
+                if (result2 == null || result2.Result != 0)
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        //瑕嗙洊缃戝叧澶囦唤澶辫触
+                        string msg = Language.StringByID(R.MyInternationalizationString.uCoverGatewayBackupDataFail);
+                        var control = new ShowMsgControl(ShowMsgType.Tip, msg);
+                        control.Show();
+                    });
+                    ProgressBar.Close();
+                    return false;
+                }
+            }
+            //鍒犻櫎澶氫綑鐨勬枃浠�
+            foreach (var deleteFile in listGatewayFile)
+            {
+                if (deleteFile.Length > 12)
+                {
+                    string deviceFileName = deleteFile.Substring(5);
+                    if (deviceFileName.StartsWith("Device_") == false)
+                    {
+                        //涓嶆槸璁惧鏂囦欢
+                        continue;
+                    }
+                    string[] strArry = deviceFileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
+                    if (strArry.Length < 4 || listSaveFile.Contains(deleteFile) == true)
+                    {
+                        //鎴戜篃涓嶇煡閬撳畠鏄粈涔堟枃浠�,鎴栬�呰繖涓枃浠舵槸瑕嗙洊鐨�
+                        continue;
+                    }
+                    //杩欎釜鎴栬鍙互涓嶇悊浠�
+                    var result = await zbGateway.DelFileOrDirAsync("/etc/hdlDat/" + deleteFile);
+                }
+            }
+            ProgressBar.Close();
+
+            return true;
+        }
+
+        /// <summary>
+        /// 鎭㈠璁惧閰嶇疆
+        /// </summary>
+        /// <param name="backDirectory">浜戠涓嬭浇鐨勫浠芥暟鎹殑鏂囦欢澶瑰悕瀛�</param>
+        /// <param name="backFileName">缃戝叧鐨勮澶囧浠藉悕瀛�</param>
+        /// <returns></returns>
+        private async Task<int> RecoverDeviceSettion(string backDirectory, string backFileName)
+        {
+            string deviceFileName = backFileName.Substring(0, backFileName.Length - 5);
+            string[] strArry = deviceFileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
+            if (strArry.Length < 4)
+            {
+                //鎴戜篃涓嶇煡閬撳畠鏄粈涔堟枃浠�
+                return 0;
+            }
+            var device = Common.LocalDevice.Current.GetDevice(strArry[2], Convert.ToInt32(strArry[3]));
+            if (device == null)
+            {
+                //杩欎釜璁惧涓嶈浜�
+                return 2;
+            }
+
+            var byteData = Shared.Common.Global.ReadFileByDirectory(backDirectory, backFileName);
+            var backType = (GatewayBackupEnum)Convert.ToInt32(backFileName.Substring(backFileName.Length - 5, 5));
+
+            bool result = true;
+            if (backType == GatewayBackupEnum.AMac鍚嶇О)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await Common.LocalDevice.Current.ReMacName(new List<CommonDevice>() { device }, recoverData);
+            }
+            else if (backType == GatewayBackupEnum.A绔偣鍚嶇О)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await Common.LocalDevice.Current.ReName(device, recoverData);
+            }
+            else if (backType == GatewayBackupEnum.APir鐏厜閰嶇疆)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<IASZone.ConfigureParamates>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await HdlDevicePirSensorLogic.Current.SetPirSensorSettion((IASZone)device, recoverData);
+            }
+            else if (backType == GatewayBackupEnum.A骞叉帴鐐归鑹茶皟鑺�)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Panel.KeyColorData>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await HdlDevicePanelLogic.Current.SetPanelEpointColorInfo((Panel)device, recoverData);
+            }
+            else if (backType == GatewayBackupEnum.A骞叉帴鐐逛寒搴﹁皟鑺�)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
+                int directionsLevel = Convert.ToInt32(recoverData["directionsLevel"]);
+                int backlightLevel = Convert.ToInt32(recoverData["backlightLevel"]);
+                result = await HdlDevicePanelLogic.Current.SetDeviceLightSettion((Panel)device, directionsLevel, backlightLevel);
+            }
+            else if (backType == GatewayBackupEnum.A骞叉帴鐐硅妭鑳芥ā寮�)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
+                bool modeEnable = Convert.ToBoolean(recoverData["modeEnable"]);
+                int modeTime = Convert.ToInt32(recoverData["modeTime"]);
+                int level = Convert.ToInt32(recoverData["level"]);
+                result = await HdlDevicePanelLogic.Current.SetDeviceEnergyConservationMode((Panel)device, modeEnable, modeTime, level);
+            }
+            else if (backType == GatewayBackupEnum.A骞叉帴鐐圭涓夌骇鍒鏈夊睘鎬�)
+            {
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await HdlDevicePanelLogic.Current.EditorDryContactThirdFunction((Panel)device, recoverData);
+            }
+            else if (backType == GatewayBackupEnum.A绐楀笜鏂瑰悜)
+            {
+                var statu = Newtonsoft.Json.JsonConvert.DeserializeObject<bool>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await HdlDeviceCurtainLogic.Current.SetCurtainDirection((Rollershade)device, statu);
+            }
+            else if (backType == GatewayBackupEnum.A绐楀笜鎵嬫媺鎺у埗)
+            {
+                var statu = Newtonsoft.Json.JsonConvert.DeserializeObject<bool>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await HdlDeviceCurtainLogic.Current.SetHandPullControl((Rollershade)device, statu);
+            }
+            else if (backType == GatewayBackupEnum.A绐楀笜涓婁笅闄愪綅)
+            {
+                var curtainDevice = (Rollershade)device;
+                var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
+                int upLimit = Convert.ToInt32(recoverData["upLimit"]);
+                int downLimit = Convert.ToInt32(recoverData["downLimit"]);
+                //鍏堥噸缃獥甯�
+                result = await HdlDeviceCurtainLogic.Current.RestoreCurtain(curtainDevice);
+                if (result == false) { return -1; }
+                await Task.Delay(5000);
+                //閲嶇疆涓婇檺浣�
+                result = await HdlDeviceCurtainLogic.Current.DeleteCurtainLimitPoint(curtainDevice, Rollershade.LimiType.UpLimit);
+                if (result == false) { return -1; }
+                //灏嗙獥甯樿皟鏁村埌鎸囧畾鐧惧垎姣�
+                curtainDevice.WcdGoToTiltValue(upLimit);
+                await Task.Delay(3000);
+                //鎵ц纭鍙婅鐩栫獥甯橀檺浣嶇偣
+                result = await HdlDeviceCurtainLogic.Current.CommitCurtainLimitPoint(curtainDevice, Rollershade.CurtainPrivateInstalledLimi.UpLimit, -1, -1);
+                if (result == false) { return -1; }
+
+                await Task.Delay(2000);
+                //閲嶇疆涓嬮檺浣�
+                result = await HdlDeviceCurtainLogic.Current.DeleteCurtainLimitPoint(curtainDevice, Rollershade.LimiType.DownLimit);
+                if (result == false) { return -1; }
+                //灏嗙獥甯樿皟鏁村埌鎸囧畾鐧惧垎姣�
+                curtainDevice.WcdGoToTiltValue(downLimit);
+                await Task.Delay(3000);
+                //鎵ц纭鍙婅鐩栫獥甯橀檺浣嶇偣
+                result = await HdlDeviceCurtainLogic.Current.CommitCurtainLimitPoint(curtainDevice, Rollershade.CurtainPrivateInstalledLimi.DownLimit, -1, -1);
+            }
+            else if (backType == GatewayBackupEnum.A绌鸿皟鑷畾涔夋ā寮�)
+            {
+                var data = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(System.Text.Encoding.UTF8.GetString(byteData));
+                result = await HdlDeviceAirConditionerLogic.Current.SetAcModeSupport((AC)device, data);
+                if (result == true)
+                {
+                    //杞崲涓轰簩杩涘埗
+                    var value = Convert.ToString(data, 2).PadLeft(16, '0');
+                    //杩欎簲涓缃槸鏀惧湪鍚庨潰鐨�
+                    var fixValue = value.Substring(0, value.Length - 5);
+                    var reportValue = value.Substring(fixValue.Length);
+                    //鏇存敼缂撳瓨
+                    for (int i = 0; i < reportValue.Length; i++)
+                    {
+                        ((AC)device).listSupportMode[i] = Convert.ToInt32(reportValue[i]);
+                    }
+                    device.ReSave();
+                }
+            }
+            return result == true ? 1 : -1;
+        }
+
+        #endregion
+
+        #region 鈻� 涓�鑸柟娉昣__________________________
+
+        /// <summary>
+        /// 寮瑰嚭缃戝叧涓嶅湪绾跨殑
+        /// </summary>
+        private void ShowGatewayNotOnlineMsg()
+        {
+            Application.RunOnMainThread(() =>
+            {
+                //缃戝叧杩炴帴澶辫触,璇风‘璁ょ綉缁�
+                string msg = Language.StringByID(R.MyInternationalizationString.uGatewayIsNotLinkAndCheckNetwork);
+                var control = new ShowMsgControl(ShowMsgType.Tip, msg);
+                control.Show();
+            });
+        }
+
+        /// <summary>
+        /// 鏄剧ず閿欒淇℃伅绐楀彛
+        /// </summary>
+        /// <param name="msg"></param>
+        private void ShowErrorMsg(string msg)
+        {
+            Application.RunOnMainThread(() =>
+            {
+                var contr = new ShowMsgControl(ShowMsgType.Error, msg);
+                contr.Show();
+            });
+        }
+
+        /// <summary>
+        /// 鏄剧ずTip淇℃伅绐楀彛
+        /// </summary>
+        /// <param name="msg"></param>
+        private void ShowTipMsg(string msg)
+        {
+            Application.RunOnMainThread(() =>
+            {
+                var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
+                contr.Show();
+            });
+        }
+
+        #endregion
+    }
+}

--
Gitblit v1.8.0