From 9ef48d7b2da7c408b53f73be0f6eef3cbac1c84a Mon Sep 17 00:00:00 2001
From: 黄学彪 <hxb@hdlchina.com.cn>
Date: 星期四, 19 十一月 2020 10:23:45 +0800
Subject: [PATCH] Evoyo.Home1.1.0120111601_Release

---
 ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs |  522 +++++++++++++++++++++++++++++++++------------------------
 1 files changed, 304 insertions(+), 218 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs
index fc831b0..b6df0c0 100755
--- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs
@@ -178,6 +178,10 @@
                     //灏嗙綉鍏崇殑鏁版嵁璁剧疆鍒版湰鍦扮紦瀛樹腑
                     this.SetGatewayDataToLocalMemmory(gateway, result);
                 }
+                if (gateway.HomeId == string.Empty)
+                {
+                    gateway.HomeId = Config.Instance.Home.Id;
+                }
                 return gateway;
             }
             catch (Exception ex)
@@ -196,16 +200,21 @@
         /// </summary>
         /// <param name="zbGateway">缃戝叧</param>
         /// <param name="mode">鏄惁鏄剧ず閿欒</param>
-        public async Task<bool> AddNewGateway(ZbGateway zbGateway, ShowErrorMode mode)
+        /// <param name="logMode">鏄惁鍐橪og</param>
+        public bool AddNewGateway(ZbGateway zbGateway, ShowErrorMode mode, WriteLogMode logMode = WriteLogMode.NO)
         {
             //璁剧疆缃戝叧鐨勭粡绾害
             bool falge = this.SetGatewaySite(zbGateway, Common.Config.Instance.Home.Longitude, Common.Config.Instance.Home.Latitude, ShowErrorMode.NO);
             if (falge == false)
             {
+                if (logMode == WriteLogMode.YES)
+                {
+                    HdlLogLogic.Current.WriteLog(-1, zbGateway.GwIP + " 璁剧疆缁忕含搴﹀け璐�");
+                }
                 return falge;
             }
             //鎵ц娣诲姞缃戝叧鍒板唴瀛�
-            var result = await this.DoAddGatewayToMemory(zbGateway, mode);
+            var result = this.DoAddGatewayToMemory(zbGateway, mode, logMode);
             //鍓嶇殑缃戝叧缁戝畾鍦ㄤ簡褰撳墠璐﹀彿涓嬬殑涓嶅悓浣忓畢閲岄潰
             if (result == 0)
             {
@@ -219,6 +228,10 @@
                     }
                     this.ShowTipMsg(msg);
                 }
+                if (logMode == WriteLogMode.YES)
+                {
+                    HdlLogLogic.Current.WriteLog(-1, zbGateway.GwIP + " 缃戝叧缁戝畾鍦ㄤ簡褰撳墠璐﹀彿涓嬬殑涓嶅悓浣忓畢閲岄潰,浜戠涓嶇粰缁戝畾");
+                }
                 return false;
             }
             if (result == -1)
@@ -228,6 +241,20 @@
             //娣诲姞缃戝叧鐨勮瘽,寮哄埗涓婚〉鍒锋柊
             UserView.UserPage.Instance.RefreshAllForm = true;
 
+            if (Config.Instance.Home.TemplateMode == 2)
+            {
+                //濡傛灉杩欎釜绫诲瀷鐨勭綉鍏冲彧鏈変竴涓ā鏉�,鍒欒嚜鍔ㄥ尮閰�
+                var dicName = TemplateData.TemplateCommonLogic.Current.GetGatewayCanSelectTemplateName(zbGateway);
+                if (dicName.Count == 1)
+                {
+                    foreach (var tempId in dicName.Keys)
+                    {
+                        TemplateData.TemplateCommonLogic.Current.AddGatewayTemplateSelect(zbGateway.GwId, tempId);
+                        break;
+                    }
+                }
+            }
+
             return true;
         }
 
@@ -249,8 +276,9 @@
         /// </summary>
         /// <param name="zbGateway">缃戝叧瀵硅薄</param>
         /// <param name="mode">鏄惁鏄剧ず閿欒</param>
+        /// <param name="logMode">鏄惁鍐橪og</param>
         /// <returns></returns>
-        private async Task<int> DoAddGatewayToMemory(ZbGateway zbGateway, ShowErrorMode mode)
+        private int DoAddGatewayToMemory(ZbGateway zbGateway, ShowErrorMode mode, WriteLogMode logMode = WriteLogMode.NO)
         {
             if (zbGateway == null)
             {
@@ -272,13 +300,17 @@
                     string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
                     this.ShowTipMsg(msg);
                 }
+                if (logMode == WriteLogMode.YES)
+                {
+                    HdlLogLogic.Current.WriteLog(-1, zbGateway.GwIP + " 鑾峰彇缃戝叧淇℃伅澶辫触");
+                }
                 return -1;
             }
 
             //璁剧疆浣忓畢ID鍒扮綉鍏�
             if (result.HomeId != Common.Config.Instance.HomeId)
             {
-                bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId, mode);
+                bool flage2 = this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId, mode);
                 if (flage2 == false)
                 {
                     if (mode == ShowErrorMode.YES)
@@ -286,6 +318,10 @@
                         //鍚戠綉鍏宠缃綇瀹匢D澶辫触
                         string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
                         this.ShowTipMsg(msg);
+                    }
+                    if (logMode == WriteLogMode.YES)
+                    {
+                        HdlLogLogic.Current.WriteLog(-1, zbGateway.GwIP + " 鍚戠綉鍏宠缃綇瀹匢D澶辫触");
                     }
                     return -1;
                 }
@@ -316,7 +352,7 @@
             }
 
             //鍒锋柊鐨勬槸缂撳瓨,涓嶅埛鏂扮湡瀹炵墿鐞嗙綉鍏�
-            this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
+            this.dicGateway[gwID].OnlineTime = DateTime.Now;
             //灏嗙綉鍏崇殑鏁版嵁璁剧疆鍒版湰鍦扮紦瀛樹腑
             this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result);
             //椤轰究杩欎釜鍙橀噺涔熻缃竴涓�
@@ -337,10 +373,28 @@
         /// <param name="zbGateway"></param>
         /// <param name="HomeId"></param>
         /// <returns></returns>
-        public async Task<bool> SetHomeIdToGateway(ZbGateway zbGateway, string HomeId, ShowErrorMode mode)
+        public bool SetHomeIdToGateway(ZbGateway zbGateway, string HomeId, ShowErrorMode mode)
         {
-            ZbGateway realWay = null;
-            if (this.GetRealGateway(ref realWay, zbGateway) == false)
+            //璐﹀彿ID
+            string accountId = string.Empty;
+            if (HomeId != string.Empty)
+            {
+                if (UserCenterResourse.UserInfo.AuthorityNo == 1)
+                {
+                    //涓昏处鍙�
+                    accountId = Config.Instance.Guid;
+                }
+                else
+                {
+                    accountId = Config.Instance.Home.MainUserDistributedMark;
+                }
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 82 } };
+            var data = new Newtonsoft.Json.Linq.JObject { { "HomeId", HomeId }, { "AccountId", accountId } };
+            jObject.Add("Data", data);
+            //浣忓畢ID鐨勮缃�,鍥哄畾浣跨敤灞�鍩熺綉,涓嶅瓨鍦ㄨ繙绋嬬殑璇存硶
+            var result = this.SendJobjectDataToGateway(zbGateway.GwId, "GwSetHomeId", jObject.ToString(), "GwSetHomeId_Respon", 5, true);
+            if (result.ErrorMsgDiv == -1)
             {
                 if (mode == ShowErrorMode.YES)
                 {
@@ -350,13 +404,11 @@
                 }
                 return false;
             }
-
-            var info = await realWay.GwSetHomeIdAsync(HomeId);
-            if (info != null && info.gwSetHomeIdData != null)
+            if (result.ErrorMsgDiv == 0)
             {
-                return true;
+                return false;
             }
-            return false;
+            return true;
         }
 
         /// <summary>
@@ -372,7 +424,7 @@
             //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
             bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
 
-            var result = UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, new List<string> { "NotCheck" });
+            var result = UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, new List<string> { "NotCheck" }, false);
             if (result == "Error")
             {
                 return -1;
@@ -418,7 +470,7 @@
         /// </summary>
         /// <param name="zbGateway">缃戝叧</param>
         /// <param name="btnMsg">娑堟伅鎺т欢</param>
-        public async Task<int> ReBindNewGateway(ZbGateway zbGateway, NormalViewControl btnMsg = null)
+        public int ReBindNewGateway(ZbGateway zbGateway, NormalViewControl btnMsg = null)
         {
             if (zbGateway == null)
             {
@@ -435,7 +487,7 @@
             }
 
             //璁剧疆浣忓畢ID鍒扮綉鍏�
-            bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId, ShowErrorMode.YES);
+            bool flage2 = this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId, ShowErrorMode.YES);
             if (flage2 == false)
             {
                 //鍚戠綉鍏宠缃綇瀹匢D澶辫触
@@ -470,7 +522,7 @@
                     btnMsg.TextID = R.MyInternationalizationString.uGatewayDataIsChangingPleaseWhait;
                 });
             }
-            await Task.Delay(8000);
+            System.Threading.Thread.Sleep(8000);
 
             //鑾峰彇缃戝叧鐨勪俊鎭�
             ZbGatewayData.GetGwData result = null;
@@ -484,7 +536,7 @@
                 }
                 count--;
                 //鏈�澶氬啀绛�20绉�
-                await Task.Delay(4000);
+                System.Threading.Thread.Sleep(4000);
             }
             if (result == null)
             {
@@ -506,7 +558,7 @@
             }
 
             //鍒锋柊鐨勬槸缂撳瓨,涓嶅埛鏂扮湡瀹炵墿鐞嗙綉鍏�
-            this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
+            this.dicGateway[gwID].OnlineTime = DateTime.Now;
             //灏嗙綉鍏崇殑鏁版嵁璁剧疆鍒版湰鍦扮紦瀛樹腑
             this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result);
             //椤轰究杩欎釜鍙橀噺涔熻缃竴涓�
@@ -520,6 +572,20 @@
 
             //娣诲姞缃戝叧鐨勮瘽,寮哄埗涓婚〉鍒锋柊
             UserView.UserPage.Instance.RefreshAllForm = true;
+
+            if (Config.Instance.Home.TemplateMode == 2)
+            {
+                //濡傛灉杩欎釜绫诲瀷鐨勭綉鍏冲彧鏈変竴涓ā鏉�,鍒欒嚜鍔ㄥ尮閰�
+                var dicName = TemplateData.TemplateCommonLogic.Current.GetGatewayCanSelectTemplateName(zbGateway);
+                if (dicName.Count == 1)
+                {
+                    foreach (var tempId in dicName.Keys)
+                    {
+                        TemplateData.TemplateCommonLogic.Current.AddGatewayTemplateSelect(zbGateway.GwId, tempId);
+                        break;
+                    }
+                }
+            }
 
             return 1;
         }
@@ -544,7 +610,7 @@
             var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 91 } };
             var data = new Newtonsoft.Json.Linq.JObject { { "GwName", gatewayName } };
             jObject.Add("Data", data);
-            var result = this.SendJobjectDataToGateway(zbGateway, "GwReName", jObject.ToString(), "GwReName_Respon");
+            var result = this.SendJobjectDataToGateway(zbGateway.GwId, "GwReName", jObject.ToString(), "GwReName_Respon");
             if (result.ErrorMsg != null)
             {
                 this.ShowTipMsg(result.ErrorMsg);
@@ -579,12 +645,10 @@
         /// 鎵ц鍒囨崲缃戝叧鎿嶄綔
         /// </summary>
         /// <param name="gatewayId"></param>
-        public async Task<bool> DoSwitchGateway(string gatewayId)
+        public bool DoSwitchGateway(string gatewayId)
         {
-            var zbGateway = this.GetLocalGateway(gatewayId);
-
             //閲嶆柊鑾峰彇鍦ㄧ嚎缃戝叧鐨勪俊鎭�
-            var result = await this.GetOnlineGatewayInfo(gatewayId);
+            var result = this.GetOnlineGatewayInfo(gatewayId);
             if (result == false)
             {
                 return false;
@@ -603,7 +667,7 @@
         /// </summary>
         /// <param name="gatewayId"></param>
         /// <returns></returns>
-        private async Task<bool> GetOnlineGatewayInfo(string gatewayId)
+        private bool GetOnlineGatewayInfo(string gatewayId)
         {
             //鏄剧ず杩涘害鏉�
             ProgressBar.Show();
@@ -616,7 +680,7 @@
                 //閲嶆柊璁剧疆浣忓畢ID(杩欎釜搴旇鏄笉缁忚繃APP,鐩存帴鎶婄綉鍏虫仮澶嶄簡鍑哄巶璁剧疆)
                 if (this.HomeIdIsEmpty(realWay.HomeId) == true)
                 {
-                    int result2 = await this.ReBindNewGateway(realWay);
+                    int result2 = this.ReBindNewGateway(realWay);
                     if (result2 == 0)
                     {
                         //鍑虹幇鏈煡閿欒,璇风◢鍚庡啀璇�
@@ -646,9 +710,14 @@
                     return false;
                 }
             }
+            //鍒锋柊鍏ㄩ儴鍦烘櫙
+            if (this.IsMainGateway(realWay) == 1)
+            {
+                HdlSceneLogic.Current.RefreshSceneUIList(false);
+            }
 
             //鑾峰彇鍏ㄩ儴璁惧
-            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay, false);
+            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay.GwId, false);
             //鍏抽棴杩涘害鏉�
             ProgressBar.Close();
             if (result == -1)
@@ -675,25 +744,15 @@
         /// <summary>
         /// 鍒犻櫎缃戝叧锛屽寘鎷簯绔拰鏈湴(澶辫触鏃朵笉浼氭樉绀轰俊鎭紝骞朵笖浼氳繑鍥瀟rue)
         /// </summary>
-        /// <param name="zbGateway"></param>
-        public async Task<bool> DeleteGateway(ZbGateway zbGateway)
-        {
-            //绉婚櫎鏈湴缃戝叧淇℃伅
-            return await this.DeleteGateway(zbGateway.GwId);
-        }
-
-        /// <summary>
-        /// 鍒犻櫎缃戝叧锛屽寘鎷簯绔拰鏈湴(澶辫触鏃朵笉浼氭樉绀轰俊鎭紝骞朵笖浼氳繑鍥瀟rue)
-        /// </summary>
         /// <param name="zbGatewayID"></param>
-        public async Task<bool> DeleteGateway(string zbGatewayID)
+        public bool DeleteGateway(string zbGatewayID)
         {
             ZbGateway realWay = null;
             this.GetRealGateway(ref realWay, zbGatewayID);
             //娓呯┖缃戝叧鐨勪綇瀹匢D 缃戝叧瑙g粦澶辫触  涓嶇悊瀹�,鍥犱负缃戝叧鍙互鎸夋寜閿己鍒舵悳绱㈠緱鍒�
             if (realWay != null)
             {
-                await this.SetHomeIdToGateway(realWay, string.Empty, ShowErrorMode.NO);
+                this.SetHomeIdToGateway(realWay, string.Empty, ShowErrorMode.NO);
             }
 
             //鍒犻櫎浜戠鐨勭綉鍏�
@@ -707,7 +766,7 @@
             //鏂紑mqtt杩炴帴
             if (realWay != null)
             {
-                realWay.DisConnectLocalMqttClient("GD");
+                realWay.CloseLocalConnectionOnForce();
             }
 
             return true;
@@ -787,29 +846,14 @@
                     //铏氭嫙鐗╃悊缃戝叧
                     listRealWay.Add(listGateway[i]);
                 }
-                //鏍囪瘑鎸囧畾缃戝叧涓轰笉鍦ㄧ嚎
-                listRealWay[i].GatewayOnlineFlage = false;
             }
-
-            //杩欐槸绗竴閬撳潕,寮哄埗妫�鏌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 = zbway.GwId;
-                if (this.dicGateway.ContainsKey(gwID) == false)
-                {
-                    continue;
-                }
-                this.dicGateway[gwID].GatewayOnlineFlage = zbway.GatewayOnlineFlage;
-            }
+            //wifi鎯呭喌涓�,鐢盇pplication鑷繁鍒锋柊鏍囪瘑
         }
 
         /// <summary>
@@ -821,8 +865,8 @@
         {
             foreach (var zbway in listGateway)
             {
-                //鏄惁瀛樺湪缃戝叧瀛樺湪浜嶹IFI涓�
-                if (zbway.GatewayOnlineFlage == true)
+                //濡傛灉骞挎挱寰楀埌缃戝叧,鍒欎細鍒锋柊OnlineTime,濡傛灉涓庡綋鍓嶆椂闂寸浉宸皯浜庢寚瀹氱鏁�,鍒欏垽鏂负瀛樺湪缃戝叧瀛樺湪浜嶹IFI涓�
+                if ((DateTime.Now - zbway.OnlineTime).TotalSeconds <= ZigBee.Common.Application.SendTime * 2)
                 {
                     return true;
                 }
@@ -838,7 +882,7 @@
         private void RefreshGatewayOnlineOnRemode(List<ZbGateway> listGateway)
         {
             //鑾峰彇浜戠涓婇潰鐨勭綉鍏�
-            Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
+            Dictionary<string, GatewayResult> dicDbGateway = this.GetGateWayListFromDataBase();
             if (dicDbGateway == null)
             {
                 return;
@@ -850,19 +894,20 @@
                     continue;
                 }
                 string strId = way.GwId;
-                if (dicDbGateway.ContainsKey(strId) == true) //濡傛灉浜戠涓婇潰鏈夎繖涓綉鍏�
+                if (dicDbGateway.ContainsKey(strId) == true
+                    && dicDbGateway[strId].MqttOnlineStatus == true) //濡傛灉浜戠涓婇潰鏈夎繖涓綉鍏�
                 {
-                    way.GatewayOnlineFlage = dicDbGateway[strId].MqttOnlineStatus;
+                    way.OnlineTime = DateTime.Now;
                 }
             }
         }
 
         /// <summary>
-        /// 鏍规嵁鏌愮鏍囪瘑鍒ゆ柇鎸囧畾缃戝叧鏄惁鍦ㄧ嚎
+        /// 鏍规嵁鏈湴缂撳瓨鍒ゆ柇鎸囧畾缃戝叧鏄惁鍦ㄧ嚎
         /// </summary>
         /// <param name="zbGateway"></param>
         /// <returns></returns>
-        public bool CheckGatewayOnlineByFlag(ZbGateway zbGateway)
+        public bool CheckGatewayOnlineByMemory(ZbGateway zbGateway)
         {
             if (zbGateway == null)
             {
@@ -872,10 +917,42 @@
             string gwID = zbGateway.GwId;
             if (this.dicGateway.ContainsKey(gwID) == true)
             {
-                return this.dicGateway[gwID].GatewayOnlineFlage;
+                return this.CheckGatewayOnlineByFlage(dicGateway[gwID]);
             }
 
-            return zbGateway.GatewayOnlineFlage;
+            return this.CheckGatewayOnlineByFlage(zbGateway);
+        }
+
+        /// <summary>
+        /// 鍒锋柊缃戝叧鐨勫湪绾挎椂闂寸偣
+        /// </summary>
+        /// <param name="i_gatewayId">缃戝叧ID</param>
+        public void RefreshGatewayOnlineTime(string i_gatewayId)
+        {
+            try
+            {
+                if (this.dicGateway.ContainsKey(i_gatewayId) == true)
+                {
+                    this.dicGateway[i_gatewayId].OnlineTime = DateTime.Now;
+                }
+            }
+            catch { }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鎸囧畾鏍囪瘑,鍒ゆ柇缃戝叧鏄惁鍦ㄧ嚎
+        /// </summary>
+        /// <param name="zbGateway"></param>
+        /// <returns></returns>
+        private bool CheckGatewayOnlineByFlage(ZbGateway zbGateway)
+        {
+            if (this.nowGwConnectMode == GatewayConnectMode.Remote)
+            {
+                //杩滅▼姣�20绉掓娴嬩竴娆�
+                return (DateTime.Now - zbGateway.OnlineTime).TotalSeconds <= 40;
+            }
+            //濡傛灉骞挎挱寰楀埌缃戝叧,鍒欎細鍒锋柊OnlineTime,濡傛灉涓庡綋鍓嶆椂闂寸浉宸皯浜�10绉�,鍒欏垽鏂负鍦ㄧ嚎
+            return (DateTime.Now - zbGateway.OnlineTime).TotalSeconds <= 15;
         }
 
         #endregion
@@ -1383,7 +1460,7 @@
         {
             //鑾峰彇缃戝叧鐗堟湰淇℃伅
             var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 95 } };
-            var result = this.SendJobjectDataToGateway(zbGateway, "GetZbGwInfo", jObject.ToString(), "GetZbGwInfo_Respon", 5, useLocalConnect);
+            var result = this.SendJobjectDataToGateway(zbGateway.GwId, "GetZbGwInfo", jObject.ToString(), "GetZbGwInfo_Respon", 5, useLocalConnect);
 
             if (result.ErrorMsgDiv != 1)
             {
@@ -1425,6 +1502,7 @@
             localWay.GwSerialNum = data.GWSN;
             localWay.IsMainGateWay = data.IsDominant == 1 ? true : false;
             localWay.GwIP = data.GwIP;
+            localWay.GwMac = data.GwMac;
             localWay.LinuxImageType = data.LinuxImageType;
             localWay.LinuxHardVersion = data.LinuxHWVersion;
             localWay.LinuxFirmwareVersion = data.LinuxFWVersion;
@@ -1433,6 +1511,8 @@
             localWay.CoordinatorImageId = data.ZbImageType;
             localWay.DriveCodeList = data.DriveCodeList;
             localWay.GwVersionDate = data.AppVersion;
+            localWay.OnlineTime = DateTime.Now;
+
             if (saveFile == true)
             {
                 localWay.ReSave();
@@ -1441,70 +1521,39 @@
 
         #endregion
 
-        #region 鈻� 缃戝叧鎴块棿鐩稿叧_______________________
+        #region 鈻� 娓呯┖鐪熷疄缃戝叧閾炬帴___________________
 
         /// <summary>
-        /// 鑾峰彇缃戝叧鎵�鍦ㄧ殑鎴块棿
+        /// 娓呯┖鍏ㄩ儴鐨勭湡瀹炵墿鐞嗙綉鍏崇殑閾炬帴
         /// </summary>
-        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
-        /// <returns></returns>
-        public Room GetRoomByGateway(ZbGateway zbGateway)
+        /// <param name="roadGateway">鏄惁鍔犺浇鏈湴鐨勭綉鍏冲璞″埌鐪熷疄鍒楄〃涓�</param>
+        public void ClearAllRealGatewayConection(bool roadGateway)
         {
-            return this.GetRoomByGateway(zbGateway.GwId);
-        }
-
-        /// <summary>
-        /// 鑾峰彇缃戝叧鎵�鍦ㄧ殑鎴块棿
-        /// </summary>
-        /// <param name="gatewayId">缃戝叧ID</param>
-        /// <returns></returns>
-        public Room GetRoomByGateway(string gatewayId)
-        {
-            var localGateway = this.GetLocalGateway(gatewayId);
-            if (localGateway == null)
+            //鏂紑mqtt杩炴帴(鍗充娇淇濆瓨鍦ㄥ唴瀛樺綋涓篃娌¢棶棰�,鍥犱负濡傛灉骞挎挱涓嶅埌,鍒欏畠涓嶄細寤虹珛閾炬帴)
+            for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
             {
-                return null;
+                ZbGateway.GateWayList[i].CloseLocalConnectionOnForce();
             }
-            return HdlRoomLogic.Current.GetRoomById(localGateway.RoomId);
-        }
-
-        /// <summary>
-        /// 鍙樻洿缃戝叧鎴块棿
-        /// </summary>
-        /// <param name="gwId">缃戝叧Id</param>
-        /// <param name="roomId">鎴块棿ID</param>
-        public void ChangedGatewayRoom(string gwId, string roomId)
-        {
-            var localGateway = this.GetLocalGateway(gwId);
-            if (localGateway != null)
+            //鍔犺浇鏈湴缃戝叧瀵硅薄
+            if (roadGateway == true)
             {
-                localGateway.RoomId = roomId;
-                localGateway.ReSave();
-                //娣诲姞澶囦唤
-                HdlAutoBackupLogic.AddOrEditorFile(localGateway.FilePath);
+                List<string> listFile = this.GetAllGatewayFile();
+                //鍙嶅簭鍒楀寲娣诲姞鍒扮紦瀛�
+                foreach (string file in listFile)
+                {
+                    //浠庢枃浠朵腑鍙嶅簭鍒楀寲鍑虹綉鍏冲璞�
+                    var gateway = this.GetGatewayFromFile(file);
+                    if (gateway == null)
+                    {
+                        continue;
+                    }
+                    var tempWay = ZbGateway.GateWayList.Find(obj => (obj != null) && (obj.GwId == gateway.GwId));
+                    if (tempWay == null)
+                    {
+                        ZbGateway.GateWayList.Add(gateway);
+                    }
+                }
             }
-        }
-
-        #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
@@ -1519,6 +1568,11 @@
         /// <returns></returns>
         public List<FirmwareVersionInfo> GetGatewayAllNewVersion(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
         {
+            //濡傛灉鏄睍绀烘ā鏉�,鎴栬�呮槸铏氭嫙浣忓畢鐨勮瘽,娌℃湁浠�涔堟柊鐗堟湰鐨勮娉�
+            if (Common.Config.Instance.Home.IsVirtually == true || Common.Config.Instance.Home.IsShowTemplate == true)
+            {
+                return new List<FirmwareVersionInfo> { null, null, null };
+            }
             //鑾峰彇缃戝叧鐗堟湰淇℃伅
             var result = this.GetGatewayInfo(zbGateway, false, mode);
             if (result == null)
@@ -1541,7 +1595,7 @@
             if (flage == 1)
             {
                 //娌$綉鐨勬椂鍊欎笉鍐嶅鐞�
-                HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.Coordinator,
+                HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.A鍗忚皟鍣�,
                     localWay.CoordinatorHardVersion.ToString(),
                     localWay.CoordinatorImageId.ToString());
             }
@@ -1553,7 +1607,7 @@
                 localWay.LinuxFirmwareVersion);
 
             //鍗忚皟鍣ㄧ増鏈�
-            var coordinatorFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.Coordinator,
+            var coordinatorFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.A鍗忚皟鍣�,
                 localWay.CoordinatorHardVersion.ToString(),
                 localWay.CoordinatorImageId.ToString(),
                 localWay.CoordinatorFirmwareVersion);
@@ -1571,13 +1625,13 @@
                     //娣诲姞铏氭嫙椹卞姩鐨勫崌绾у浐浠�(鎴愪笉鎴愬姛閮芥棤鎵�璋�) 蹇呴』鑳藉鑱旂綉鎵嶈
                     if (flage == 1)
                     {
-                        HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.VirtualDevice,
+                        HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.A铏氭嫙椹卞姩,
                            data.DriveHwVersion.ToString(),
                            data.DriveImageType.ToString());
                     }
 
                     //铏氭嫙椹卞姩
-                    var virtualFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.VirtualDevice,
+                    var virtualFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.A铏氭嫙椹卞姩,
                         data.DriveHwVersion.ToString(),
                         data.DriveImageType.ToString(),
                         data.DriveFwVersion);
@@ -1604,8 +1658,15 @@
         /// <returns></returns>
         public List<ZbGatewayData.DriveCodeObj> GetListVDDriveCode(ZbGateway zbGateway)
         {
+            //濡傛灉鏄睍绀烘ā鏉�,鎴栬�呮槸铏氭嫙浣忓畢鐨勮瘽,鐩存帴鍙栫紦瀛�
+            if (Common.Config.Instance.Home.IsVirtually == true || Common.Config.Instance.Home.IsShowTemplate == true)
+            {
+                //鍙栨湰鍦板璞�
+                var localgw = this.GetLocalGateway(zbGateway.GwId);
+                return localgw != null ? zbGateway.DriveCodeList : zbGateway.DriveCodeList;
+            }
             var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 505 } };
-            var result = this.SendJobjectDataToGateway(zbGateway, "VirtualDrive/CatDriveCode", jObject.ToString(), "VirtualDrive/CatDriveCode_Respon");
+            var result = this.SendJobjectDataToGateway(zbGateway.GwId, "VirtualDrive/CatDriveCode", jObject.ToString(), "VirtualDrive/CatDriveCode_Respon");
             if (result.ErrorMsg != null)
             {
                 this.ShowTipMsg(result.ErrorMsg);
@@ -1639,12 +1700,16 @@
         /// <returns></returns>
         public int IsMainGateway(string waiID)
         {
-            ZbGateway zbGateway = null;
-            if (this.GetRealGateway(ref zbGateway, waiID) == false)
+            var realWay = ZbGateway.GateWayList.Find((obj) =>
+            {
+                return obj.GwId == waiID;
+            });
+            //铏氭嫙缃戝叧涔熻繑鍥� 0
+            if (realWay == null || realWay.IsVirtual == true)
             {
                 return 0;
             }
-            return zbGateway.IsMainGateWay == true ? 1 : 2;
+            return realWay.IsMainGateWay == true ? 1 : 2;
         }
 
         #endregion
@@ -1811,7 +1876,7 @@
                 //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
                 pra.ReqDto.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
 
-                var result = UserCenterLogic.GetResponseDataByRequestHttps("App/GetSingleHomeGatewayPagger", true, pra, list);
+                var result = UserCenterLogic.GetResponseDataByRequestHttps("App/GetSingleHomeGatewayPagger", true, pra, list, false);
                 if (string.IsNullOrEmpty(result) == true)
                 {
                     canBreak = true;
@@ -1867,6 +1932,11 @@
                     this.ShowTipMsg(msg);
                 }
                 return false;
+            }
+            if (((decimal)Longitude) == 0 && ((decimal)Latitude) == 0)
+            {
+                //娌℃湁閰嶇疆杩囩粡绾害
+                return true;
             }
 
             int result = -1;
@@ -1943,7 +2013,7 @@
 
             List<string> listNotShowError = new List<string>() { "NoExist", "NoBind", "NoRecord", "NotCheck" };
 
-            bool result = UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", true, Pra, listNotShowError);
+            bool result = UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", true, Pra, listNotShowError, false);
             if (result == false)
             {
                 return false;
@@ -1974,54 +2044,53 @@
         /// <summary>
         /// 閲嶆柊鍙戦�佸懡浠ゅ幓缁戝畾鏂綉鎯呭喌涓嬪浠界殑缃戝叧
         /// </summary>
-        public void ResetComandToBindBackupGateway()
+        public bool ResetComandToBindBackupGateway()
         {
-            HdlThreadLogic.Current.RunThread(() =>
+            var fileData = HdlFileLogic.Current.ReadFileByteContent(DirNameResourse.BackupGatewayIdFile);
+            if (fileData == null)
             {
-                var fileData = HdlFileLogic.Current.ReadFileByteContent(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);
+                return true;
+            }
+            this.listBackupGwId = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(System.Text.Encoding.UTF8.GetString(fileData));
+            var listTempId = new List<string>();
+            listTempId.AddRange(this.listBackupGwId);
 
-                //璋冪敤鎺ュ彛锛岀粦瀹氱綉鍏�
-                var bindGateway = new BindGatewayPra();
-                //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
-                bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
+            //璋冪敤鎺ュ彛锛岀粦瀹氱綉鍏�
+            var bindGateway = new BindGatewayPra();
+            //鑾峰彇鎺у埗涓讳汉璐﹀彿鐨凾oken
+            bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
 
-                foreach (var gwId in listTempId)
+            foreach (var gwId in listTempId)
+            {
+                bindGateway.BindGateways.Clear();
+                bindGateway.BindGateways.Add(gwId);
+                var result = UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, new List<string> { "NotCheck" }, false);
+                if (result == "Success")
                 {
-                    bindGateway.BindGateways.Clear();
-                    bindGateway.BindGateways.Add(gwId);
-                    var result = UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, new List<string> { "NotCheck" });
-                    if (result == "Success")
-                    {
-                        this.listBackupGwId.Remove(gwId);
-                    }
-                    if (result == "Error")
-                    {
-                        break;
-                    }
+                    this.listBackupGwId.Remove(gwId);
                 }
+                if (result == "Error")
+                {
+                    break;
+                }
+            }
 
-                if (this.listBackupGwId.Count == 0)
+            if (this.listBackupGwId.Count == 0)
+            {
+                //濡傛灉娌℃湁浜嗗唴瀹�,鍒欏垹闄ゆ枃浠�
+                string file = DirNameResourse.BackupGatewayIdFile;
+                if (System.IO.File.Exists(file) == true)
                 {
-                    //濡傛灉娌℃湁浜嗗唴瀹�,鍒欏垹闄ゆ枃浠�
-                    string file = DirNameResourse.BackupGatewayIdFile;
-                    if (System.IO.File.Exists(file) == true)
-                    {
-                        System.IO.File.Delete(file);
-                    }
+                    System.IO.File.Delete(file);
                 }
-                else
-                {
-                    //澶囦唤
-                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.BackupGatewayIdFile, listBackupGwId);
-                }
-            });
+                return true;
+            }
+            else
+            {
+                //澶囦唤
+                HdlFileLogic.Current.SaveFileContent(DirNameResourse.BackupGatewayIdFile, listBackupGwId);
+                return false;
+            }
         }
 
         #endregion
@@ -2038,26 +2107,16 @@
         /// <param name="waitTime">瓒呮椂鏃堕棿(绉�)</param>
         /// <param name="useLocalConnect">鏄惁寮哄埗浣跨敤鏈湴杩炴帴鍙戦��</param>
         /// <returns>缃戝叧杩斿洖鐨勬暟鎹�</returns>
-        public ReceiptGatewayResult SendJobjectDataToGateway(ZbGateway gateway, string sendTopic, string sendData, string receiptTopic, int waitTime = 5, bool useLocalConnect = false)
+        public ReceiptGatewayResult SendJobjectDataToGateway(string gatewayId, string sendTopic, string sendData, string receiptTopic, int waitTime = 5, bool useLocalConnect = false)
         {
             var reResult = new ReceiptGatewayResult();
 
-            ZbGateway myGateway = null;
-            if (this.GetRealGateway(ref myGateway, gateway) == false)
-            {
-                //鑾峰彇缃戝叧瀵硅薄澶辫触
-                reResult.ErrorMsg = Language.StringByID(R.MyInternationalizationString.uGetGatewayTagartFail);
-                reResult.ErrorMsgDiv = -1;
-                return reResult;
-            }
-            //缃戝叧ID
-            string gatewayID = gateway.GwId;
             //閿欒涓婚
-            string errorTopic = gatewayID + "/" + "Error_Respon";
+            string errorTopic = gatewayId + "/" + "Error_Respon";
             //妫�娴嬪璞$殑涓婚
-            string checkTopic = gatewayID + "/" + receiptTopic;
+            string checkTopic = gatewayId + "/" + receiptTopic;
 
-            Action<string, string> receiptAction = (topic, message) =>
+            HdlGatewayReceiveLogic.Current.AddGatewayReceiveEvent(gatewayId, (topic, message) =>
             {
                 var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
 
@@ -2072,17 +2131,10 @@
                 {
                     reResult.ReceiptData = jobject["Data"].ToString();
                 }
-            };
-            myGateway.Actions += receiptAction;
+            });
+
             //鍙戦�佹暟鎹�
-            if (useLocalConnect == false)
-            {
-                myGateway.Send(sendTopic, sendData);
-            }
-            else
-            {
-                myGateway.SendLocation(sendTopic, System.Text.Encoding.UTF8.GetBytes(sendData));
-            }
+            this.SendJobjectData(gatewayId, sendTopic, sendData, useLocalConnect);
 
             //瓒呮椂鏃堕棿
             int TimeOut = 0;
@@ -2093,14 +2145,53 @@
                 System.Threading.Thread.Sleep(50);
                 TimeOut++;
             }
-            myGateway.Actions -= receiptAction;
-            receiptAction = null;
+            //绉婚櫎缃戝叧鐩戝惉浜嬩欢
+            HdlGatewayReceiveLogic.Current.RemoveGatewayReceiveEvent();
+
             if (reResult.ReceiptData == null)
             {
                 reResult.ErrorMsgDiv = 0;
             }
 
             return reResult;
+        }
+
+        /// <summary>
+        /// 鍗曠函鎵ц鍙戦�乯son鏁版嵁鍒扮綉鍏�
+        /// </summary>
+        /// <param name="i_gatewayId">缃戝叧id</param>
+        /// <param name="topic">涓婚</param>
+        /// <param name="sendData">鍙戦�佺殑json鏁版嵁</param>
+        /// <param name="useLocalConnect">鏄惁寮哄埗浣跨敤鏈湴杩炴帴鍙戦��</param>
+        public void SendJobjectData(string i_gatewayId, string topic, string sendData, bool useLocalConnect = false)
+        {
+            ZbGateway realWay = null;
+            for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
+            {
+                //瀵绘壘鐪熷疄鐗╃悊缃戝叧瀵硅薄
+                if (ZbGateway.GateWayList[i].GwId == i_gatewayId)
+                {
+                    realWay = ZbGateway.GateWayList[i];
+                    break;
+                }
+            }
+            if (realWay == null)
+            {
+                //濡傛灉缃戝叧瀵硅薄涓㈠け浜�,鍒欏垱寤轰釜鏂扮殑
+                realWay = new ZbGateway { IsVirtual = true, };
+                realWay.GwId = i_gatewayId;
+                realWay.HomeId = Config.Instance.HomeId;
+                ZbGateway.GateWayList.Add(realWay);
+            }
+            if (useLocalConnect == false)
+            {
+                realWay.Send(topic, System.Text.Encoding.UTF8.GetBytes(sendData));
+            }
+            else
+            {
+                //寮哄埗浣跨敤鏈湴杩炴帴
+                realWay.SendLocation(topic, System.Text.Encoding.UTF8.GetBytes(sendData));
+            }
         }
 
         #endregion
@@ -2152,8 +2243,8 @@
                     }
                     else if (this.nowGwConnectMode == GatewayConnectMode.WIFI)
                     {
-                        //灞�鍩熺綉姣�5绉掓娴嬩竴娆�
-                        if (waitCount < 5) { continue; }
+                        //灞�鍩熺綉姣�8绉掓娴嬩竴娆�
+                        if (waitCount < 8) { continue; }
                     }
                     waitCount = 0;
 
@@ -2186,27 +2277,18 @@
         private void CheckGatewayStatuByWIFI(Dictionary<string, bool> dicOldOnline)
         {
             //浠庣綉鍏宠幏鍙栧叏閮ㄧ殑缃戝叧
-            List<ZbGateway> list = this.GetAllGatewayFromGateway();
-            foreach (var way in list)
-            {
-                //灏嗘爣璇嗙疆涓篺alse
-                way.GatewayOnlineFlage = false;
-            }
-            //绛変釜2绉�
-            System.Threading.Thread.Sleep(2000);
+            List<ZbGateway> list = this.GetAllLocalGateway();
 
             //2020.05.25杩藉姞:姝や綇瀹呮槸鍚︽嫢鏈夌綉鍏冲湪绾�
             var hadGwOnline = false;
             foreach (var way in list)
             {
-                if (dicOldOnline.ContainsKey(way.GwId) == true)
+                if (dicOldOnline.ContainsKey(way.GwId) == true
+                    && this.CheckGatewayOnlineByFlage(way) == true)
                 {
-                    if (way.GatewayOnlineFlage == true)
-                    {
-                        //鏈変竴涓綉鍏冲湪绾�,鍗冲湪绾�
-                        hadGwOnline = true;
-                        break;
-                    }
+                    //鏈変竴涓綉鍏冲湪绾�,鍗冲湪绾�
+                    hadGwOnline = true;
+                    break;
                 }
             }
 
@@ -2216,7 +2298,8 @@
                 if (dicOldOnline.ContainsKey(gwId) == true)
                 {
                     //缃戝叧涔熶笉澶�,鐩存帴鎺ㄩ�佸惂
-                    this.PushGatewayOnlineStatuToForm(gwId, way.GatewayOnlineFlage, hadGwOnline);
+                    bool online = this.CheckGatewayOnlineByFlage(way);
+                    this.PushGatewayOnlineStatuToForm(gwId, online, hadGwOnline);
                 }
                 else
                 {
@@ -2232,7 +2315,7 @@
         private void CheckGatewayStatuByRemote(Dictionary<string, bool> dicOldOnline)
         {
             //鑾峰彇浜戠涓婇潰鐨勭綉鍏�
-            Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
+            Dictionary<string, GatewayResult> dicDbGateway = this.GetGateWayListFromDataBase();
             if (dicDbGateway == null)
             {
                 //濡傛灉缃戠粶涓嶉��,鍒欎篃寰�涓嬭蛋
@@ -2288,7 +2371,7 @@
                 foreach (var zbway in this.dicGateway.Values)
                 {
                     //鑾峰彇鍓嶅洖鐨勫湪绾跨姸鎬�
-                    dicOldOnline[zbway.GwId] = zbway.GatewayOnlineFlage;
+                    dicOldOnline[zbway.GwId] = this.CheckGatewayOnlineByFlage(zbway);
                 }
                 return dicOldOnline;
             }
@@ -2317,7 +2400,10 @@
                     if (zbway != null)
                     {
                         //鍒囨崲浣忓畢鏃�,杩欎釜涓滆タ鏈夊彲鑳芥槸null
-                        zbway.GatewayOnlineFlage = online;
+                        if (online == true)
+                        {
+                            zbway.OnlineTime = DateTime.Now;
+                        }
                         UserCenterResourse.DicActionForm[formId]?.GatewayOnlinePush(zbway, online, hadGwOnline);
                     }
                 }

--
Gitblit v1.8.0