From dc6493db59dcb0893eac50b72122f94c24056b3f Mon Sep 17 00:00:00 2001 From: 黄学彪 <hxb@hdlchina.com.cn> Date: 星期一, 12 十月 2020 14:35:39 +0800 Subject: [PATCH] 新版本 --- ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs | 204 +++++++++++++++++++++++++++++++------------------- 1 files changed, 127 insertions(+), 77 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs index 9631ac2..73158b0 100755 --- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs +++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs @@ -232,6 +232,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; } @@ -320,7 +334,7 @@ } //鍒锋柊鐨勬槸缂撳瓨,涓嶅埛鏂扮湡瀹炵墿鐞嗙綉鍏� - this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage; + this.dicGateway[gwID].OnlineTime = DateTime.Now; //灏嗙綉鍏崇殑鏁版嵁璁剧疆鍒版湰鍦扮紦瀛樹腑 this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result); //椤轰究杩欎釜鍙橀噺涔熻缃竴涓� @@ -361,7 +375,7 @@ var data = new Newtonsoft.Json.Linq.JObject { { "HomeId", HomeId }, { "AccountId", accountId } }; jObject.Add("Data", data); //浣忓畢ID鐨勮缃�,鍥哄畾浣跨敤灞�鍩熺綉,涓嶅瓨鍦ㄨ繙绋嬬殑璇存硶 - var result = this.SendJobjectDataToGateway(zbGateway, "GwSetHomeId", jObject.ToString(), "GwSetHomeId_Respon", 5, true); + var result = this.SendJobjectDataToGateway(zbGateway.GwId, "GwSetHomeId", jObject.ToString(), "GwSetHomeId_Respon", 5, true); if (result.ErrorMsgDiv == -1) { if (mode == ShowErrorMode.YES) @@ -526,7 +540,7 @@ } //鍒锋柊鐨勬槸缂撳瓨,涓嶅埛鏂扮湡瀹炵墿鐞嗙綉鍏� - this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage; + this.dicGateway[gwID].OnlineTime = DateTime.Now; //灏嗙綉鍏崇殑鏁版嵁璁剧疆鍒版湰鍦扮紦瀛樹腑 this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result); //椤轰究杩欎釜鍙橀噺涔熻缃竴涓� @@ -540,6 +554,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; } @@ -564,7 +592,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); @@ -671,7 +699,7 @@ } //鑾峰彇鍏ㄩ儴璁惧 - int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay, false); + int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay.GwId, false); //鍏抽棴杩涘害鏉� ProgressBar.Close(); if (result == -1) @@ -800,29 +828,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> @@ -835,7 +848,7 @@ foreach (var zbway in listGateway) { //鏄惁瀛樺湪缃戝叧瀛樺湪浜嶹IFI涓� - if (zbway.GatewayOnlineFlage == true) + if (this.CheckGatewayOnlineByFlage(zbway) == true) { return true; } @@ -851,7 +864,7 @@ private void RefreshGatewayOnlineOnRemode(List<ZbGateway> listGateway) { //鑾峰彇浜戠涓婇潰鐨勭綉鍏� - Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase(); + Dictionary<string, GatewayResult> dicDbGateway = this.GetGateWayListFromDataBase(); if (dicDbGateway == null) { return; @@ -863,19 +876,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) { @@ -885,10 +899,26 @@ 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="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 @@ -1396,7 +1426,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) { @@ -1438,6 +1468,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; @@ -1446,6 +1477,8 @@ localWay.CoordinatorImageId = data.ZbImageType; localWay.DriveCodeList = data.DriveCodeList; localWay.GwVersionDate = data.AppVersion; + localWay.OnlineTime = DateTime.Now; + if (saveFile == true) { localWay.ReSave(); @@ -1645,7 +1678,7 @@ 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); @@ -2087,26 +2120,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); @@ -2121,17 +2144,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; @@ -2142,14 +2158,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 @@ -2201,8 +2256,8 @@ } else if (this.nowGwConnectMode == GatewayConnectMode.WIFI) { - //灞�鍩熺綉姣�5绉掓娴嬩竴娆� - if (waitCount < 5) { continue; } + //灞�鍩熺綉姣�8绉掓娴嬩竴娆� + if (waitCount < 8) { continue; } } waitCount = 0; @@ -2236,26 +2291,17 @@ { //浠庣綉鍏宠幏鍙栧叏閮ㄧ殑缃戝叧 List<ZbGateway> list = this.GetAllGatewayFromGateway(); - foreach (var way in list) - { - //灏嗘爣璇嗙疆涓篺alse - way.GatewayOnlineFlage = false; - } - //绛変釜2绉� - System.Threading.Thread.Sleep(2000); //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; } } @@ -2265,7 +2311,8 @@ if (dicOldOnline.ContainsKey(gwId) == true) { //缃戝叧涔熶笉澶�,鐩存帴鎺ㄩ�佸惂 - this.PushGatewayOnlineStatuToForm(gwId, way.GatewayOnlineFlage, hadGwOnline); + bool online = this.CheckGatewayOnlineByFlage(way); + this.PushGatewayOnlineStatuToForm(gwId, online, hadGwOnline); } else { @@ -2281,7 +2328,7 @@ private void CheckGatewayStatuByRemote(Dictionary<string, bool> dicOldOnline) { //鑾峰彇浜戠涓婇潰鐨勭綉鍏� - Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase(); + Dictionary<string, GatewayResult> dicDbGateway = this.GetGateWayListFromDataBase(); if (dicDbGateway == null) { //濡傛灉缃戠粶涓嶉��,鍒欎篃寰�涓嬭蛋 @@ -2337,7 +2384,7 @@ foreach (var zbway in this.dicGateway.Values) { //鑾峰彇鍓嶅洖鐨勫湪绾跨姸鎬� - dicOldOnline[zbway.GwId] = zbway.GatewayOnlineFlage; + dicOldOnline[zbway.GwId] = this.CheckGatewayOnlineByFlage(zbway); } return dicOldOnline; } @@ -2366,7 +2413,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