From f759dc1e6f49c53733eafda82207c85af18f9931 Mon Sep 17 00:00:00 2001
From: 陈嘉乐 <cjl@hdlchina.com.cn>
Date: 星期四, 28 五月 2020 15:46:54 +0800
Subject: [PATCH] 2020-05-28-1

---
 ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs |  159 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 103 insertions(+), 56 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs b/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs
index 93698ba..ec0ce95 100755
--- a/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs
@@ -22,6 +22,10 @@
         /// 鏂板彂鐜扮殑缃戝叧閫氱煡
         /// </summary>
         public static Action<ZigBee.Device.ZbGateway> NewGateWayAction;
+        /// <summary>
+        /// 涓婁竴娆$殑浣忓畢ID
+        /// </summary>
+        private static string oldHomeID = string.Empty;
 
         public static void Init()
         {
@@ -35,7 +39,6 @@
             {
                 var gateWayList = new List<ZbGateway> { };
                 var searchCount = 6;
-                var oldHomeID = string.Empty;
                 var broadBytes = new byte[44];// byteHomeId[0] ,//H
                 broadBytes[0] = 0xfe;
                 broadBytes[1] = 0x29;
@@ -50,7 +53,9 @@
                     try
                     {
                         if (string.IsNullOrEmpty(Shared.Common.Config.Instance.HomeId))
-                        {
+                        {
+                            //浣忓畢ID涓虹┖鍙湁涓�绉嶅彲鑳藉氨鏄��鍑轰簡鐧诲綍锛岃繖閲岀殑涓婁竴娆′綇瀹匢D瑕佹竻绌�
+                            oldHomeID = "?";
                             System.Threading.Thread.Sleep(1000);
                             continue;
                         }
@@ -99,21 +104,28 @@
                             {
                                 searchCount = 6;
                                 ZbGateway.IsRemote = false;
+                                //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮�
+                                Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.WIFI);
                             }
                             else
                             {
                                 if (searchCount < 0)
                                 {
                                     ZbGateway.IsRemote = true;
+                                    //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮�
+                                    Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote);
                                 }
                             }
                         }
                         else
                         {
                             ZbGateway.IsRemote = true;
+                            //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮�
+                            Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote);
+
                             for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
                             {
-                                 ZbGateway.GateWayList[i].DisConnectLocalMqttClient("1");
+                                ZbGateway.GateWayList[i].DisConnectLocalMqttClient("1");
                             }
                         }
 
@@ -140,7 +152,11 @@
                                         FindGateWaySocket.BeginSend(new System.Net.IPEndPoint(broadcastIpAddress, 7624), broadBytes);
                                     }
                                 }
-                                catch { }
+                                catch
+                                {   
+                                    //鍏抽棴Socket,涓嬫鍙戦�佷細鑷姩杩炴帴
+                                    FindGateWaySocket.Stop();
+                                }
                                 System.Threading.Thread.Sleep(500);
                             }
                         })
@@ -180,7 +196,6 @@
                                         getGatewayBaseInfo = new ZbGateway.GatewayBaseInfo
                                         {
                                             IpAddress = ipAddress,
-                                            Time = time,
                                             GwName = gwName,
                                             HomeId = homeID,
                                             IsMainGateWay = isMainGateWay,
@@ -202,11 +217,11 @@
                                         {
                                             gateWayList.Add(zbGateWay);
                                         }
-                                        //缃戝叧涓埌浣忓畢ID涓虹┖姝ゆ椂涔熼�氳
-                                        else if (homeID == string.Empty)
-                                        {
-                                            gateWayList.Add(zbGateWay);
-                                        }
+                                        //缃戝叧涓埌浣忓畢ID涓虹┖姝ゆ椂涔熼�氳 2020.01.14鍙樻洿锛氭病杩欎釜蹇呰,涓婇潰閭d釜鍙橀噺灏辫兘澶勭悊
+                                        //else if (homeID == string.Empty)
+                                        //{
+                                        //    gateWayList.Add(zbGateWay);
+                                        //}
                                     }
                                     //缃戝叧鍒楄〃瀛樺偍澶勭悊
                                     var gateWay = ZbGateway.GateWayList.Find(obj => obj.getGatewayBaseInfo != null && obj.getGatewayBaseInfo.gwID == zbGateWay.getGatewayBaseInfo.gwID);
@@ -232,7 +247,6 @@
                                         else
                                         {
                                             gateWay.PubKey = pubKey;
-                                            gateWay.getGatewayBaseInfo.Time = time;
                                             gateWay.getGatewayBaseInfo.GwName = gwName;
                                             gateWay.getGatewayBaseInfo.HomeId = homeID;
                                             await gateWay.StartLocalMqtt(ipAddress);
@@ -253,10 +267,30 @@
                                             //鏍囪褰撳墠缃戝叧鏄富缃戝叧
                                             gateWay.getGatewayBaseInfo.IsMainGateWay = true;
                                         }
+                                    }
+
+                                    //娴嬭瘯鑳藉惁骞挎挱寰楀埌缃戝叧,閫氬父鎯呭喌涓嬩笉妫�娴�
+                                    if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.CheckCanReceiveGateway == 1)
+                                    {
+                                        if (Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest.ContainsKey(id) == false)
+                                        {
+                                            if (gateWay == null)
+                                            {
+                                                Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest[id] = zbGateWay;
+                                            }
+                                            else
+                                            {
+                                                Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest[id] = gateWay;
+                                            }
+                                        }
                                     }
                                 }
                             }
-                            catch { }
+                            catch
+                            {
+                                //鍏抽棴Socket,涓嬫鍙戦�佷細鑷姩杩炴帴
+                                FindGateWaySocket.Stop();
+                            }
                         }
                         #endregion
                     }
@@ -274,48 +308,7 @@
                     try
                     {
                         //瀹氭椂妫�娴嬭繙绋嬭繛鎺ユ儏鍐�
-                        await ZbGateway.StartRemoteMqtt(); 
-                        if (!ZbGateway.IsRemote)
-                        {
-                            System.Threading.Thread.Sleep(500);
-                            continue;
-                        }
-                        var gateWayList =ZbGateway.GateWayList.FindAll(obj => obj.getGatewayBaseInfo.HomeId == Shared.Common.Config.Instance.HomeId);
-
-                        if (gateWayList.Count == 1)
-                        {
-                            gateWayList[0].getGatewayBaseInfo.IsMainGateWay = true;
-                        }
-                        else
-                        {
-                            if (gateWayList.Find((obj) => obj.getGatewayBaseInfo.IsMainGateWay) == null)
-                            {
-                                for (int i = 0; i < gateWayList.Count; i++)
-                                {
-                                    var gateWay = gateWayList[i];
-                                    var info = await gateWay.GetZbGwInfoAsync();
-                                    if (info == null || info.getGwData == null)
-                                    {
-                                        continue;
-                                    }
-                                    if (info.getGwData.IsDominant == 1)
-                                    {
-                                        for (int j = 0; j < gateWayList.Count; j++)
-                                        {
-                                            if (gateWayList[i].getGatewayBaseInfo.gwID == info.getGwData.GwId)
-                                            {
-                                                gateWayList[i].getGatewayBaseInfo.IsMainGateWay = true;
-                                            }
-                                            else
-                                            {
-                                                gateWayList[i].getGatewayBaseInfo.IsMainGateWay = false;
-                                            }
-                                        }
-                                        break;
-                                    }
-                                }
-                            }
-                        }
+                        await ZbGateway.StartRemoteMqtt();
                     }
                     catch { }
                     System.Threading.Thread.Sleep(2000);
@@ -324,6 +317,14 @@
             { IsBackground = true }.Start();
         }
 
+        /// <summary>
+        /// 閲嶆柊鎼滅储,娉ㄦ剰锛氳皟鐢ㄨ鏂规硶,鍒欎績浣垮叏閮ㄧ綉鍏崇殑mqtt鍏ㄩ儴鏂紑,鐒跺悗閲嶆柊鎼滅储(鍙兘浼氭湁1绉掑欢杩�)
+        /// </summary>
+        public static void ReSearch()
+        {
+            //涓轰簡閭d箞澶氬皯涓囧垎涔嬩竴鐨勫嚑鐜�,杩欓噷璁剧疆鎴愬埆鐨勫彟涓�绫荤殑鍊�
+            oldHomeID = "**";
+        }
 
         /// <summary>
         /// 鎺ユ敹澶勭悊UDP鏁版嵁鍖�
@@ -332,7 +333,11 @@
         public static class FindGateWaySocket
         {
             //鏈湴Socket
-            public static System.Net.Sockets.Socket busSocket;
+            public static Socket busSocket;
+            /// <summary>
+            /// 璁℃椂鍣�
+            /// </summary>
+            private static int timeCount = 0;
 
             /// <summary>
             /// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳�
@@ -378,7 +383,7 @@
             {
                 get
                 {
-                    return null == busSocket ? false : true;
+                    return busSocket == null ? false : true;
                 }
             }
 
@@ -390,12 +395,54 @@
             {
                 try
                 {
+                    //妫�娴嬭繛鎺ョ姸鎬�
+                    CheckConnectiton();
+
                     Start(7624);
                     busSocket.BeginSendTo(bytes, 0, bytes.Length, SocketFlags.None, iPEndPoint, new AsyncCallback(asyncEndSend), null);
                 }
                 catch { }
             }
 
+            /// <summary>
+            /// 妫�娴嬭繛鎺ョ姸鎬�
+            /// </summary>
+            private static void CheckConnectiton()
+            {
+                if (busSocket == null) { return; }
+                timeCount++;
+                if (timeCount < 20)
+                {
+                    //姣�10绉掓娴嬩竴娆�
+                    return;
+                }
+                timeCount = 0;
+
+                bool blockingState = busSocket.Blocking;
+                try
+                {
+                    byte[] tmp = new byte[1];
+
+                    busSocket.Blocking = false;
+                    busSocket.Send(tmp, 0, 0);
+                    //tcp杩樺湪杩炴帴鐫�
+                    busSocket.Blocking = blockingState;
+                }
+                catch (SocketException e)
+                {
+                    // 10035 == WSAEWOULDBLOCK
+                    if (e.NativeErrorCode.Equals(10035))
+                    {
+                        //Still Connected, but the Send would block
+                    }
+                    else
+                    {
+                        //tcp宸茬粡鏂紑浜嗚繛鎺�
+                        Stop();
+                    }
+                }
+            }
+
             /// <summary>
             /// 寮傛鍙戦�佹暟鎹粨鏉�
             /// </summary>

--
Gitblit v1.8.0