From c1de48884fa145a16a0f8bcee93274dcfaa0ff82 Mon Sep 17 00:00:00 2001
From: xm <1271024303@qq.com>
Date: 星期四, 07 五月 2020 10:40:28 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev-tzy' into dev-2020xm

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

diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs b/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs
new file mode 100755
index 0000000..89ec837
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs
@@ -0,0 +1,450 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+
+using Shared.Common;
+using ZigBee.Device;
+
+
+namespace ZigBee.Common
+{
+    public static class Application
+    {
+        public static bool isInited;
+        static bool isEncry;
+        /// <summary>
+        /// 鏄惁姝e湪鎼滅储缃戝叧
+        /// </summary>
+        public static bool IsSearchingGateway = false;
+        /// <summary>
+        /// 鏂板彂鐜扮殑缃戝叧閫氱煡
+        /// </summary>
+        public static Action<ZigBee.Device.ZbGateway> NewGateWayAction;
+        /// <summary>
+        /// 涓婁竴娆$殑浣忓畢ID
+        /// </summary>
+        private static string oldHomeID = string.Empty;
+
+        public static void Init()
+        {
+            if (isInited)
+            {
+                return;
+            }
+            isInited = true;
+
+            new System.Threading.Thread(async () =>
+            {
+                var gateWayList = new List<ZbGateway> { };
+                var searchCount = 6;
+                var broadBytes = new byte[44];// byteHomeId[0] ,//H
+                broadBytes[0] = 0xfe;
+                broadBytes[1] = 0x29;
+                broadBytes[2] = 0x00;
+                broadBytes[3] = 0x00;
+                broadBytes[4] = 0x00;
+                broadBytes[5] = 0x00;
+                broadBytes[6] = 0x00;
+                broadBytes[43] = 0x02;
+                while (true)
+                {
+                    try
+                    {
+                        if (string.IsNullOrEmpty(Shared.Common.Config.Instance.HomeId))
+                        {
+                            //浣忓畢ID涓虹┖鍙湁涓�绉嶅彲鑳藉氨鏄��鍑轰簡鐧诲綍锛岃繖閲岀殑涓婁竴娆′綇瀹匢D瑕佹竻绌�
+                            oldHomeID = "?";
+                            System.Threading.Thread.Sleep(1000);
+                            continue;
+                        }
+                        //棣栨杩涘叆缃戝叧锛屽拰鍒囨崲浣忓畢浼氭竻闄ょ綉鍏冲垪琛紝閲嶆柊鎼滅储瀛樺偍
+                        if (Shared.Common.Config.Instance.HomeId != oldHomeID)
+                        {
+                            //鍥犱负閭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("1");
+                            }
+                            list.Clear();
+                            oldHomeID = Shared.Common.Config.Instance.HomeId;
+                            var tempBytes = System.Text.Encoding.UTF8.GetBytes(Shared.Common.Config.Instance.HomeId);
+                            System.Array.Copy(tempBytes, 0, broadBytes, 7, 36 < tempBytes.Length ? 36 : tempBytes.Length);
+                            //浣忓畢涓凡缁忓瓨鍦ㄧ殑缃戝叧濡傛灉灞�鍩熺綉涓嶅瓨鍦紝闇�瑕佸湪褰撳墠浣忓畢涓櫄鎷熶竴涓綉鍏矷D鐩稿悓鐨勭綉鍏�
+                            var gateWayFileList = Global.FileListByHomeId().FindAll(obj => obj.StartsWith("Gateway_"));
+                            foreach (var filePath in gateWayFileList)
+                            {
+                                var paths = filePath.Split('_');
+                                if (paths.Length < 3)
+                                    continue;
+
+                                var gateWay = ZbGateway.GateWayList.Find(obj => (obj != null) && (obj.getGatewayBaseInfo != null) && (obj.getGatewayBaseInfo.gwID == paths[2]));
+                                if (gateWay == null)
+                                {
+                                    gateWay = new ZbGateway { IsVirtual = true };
+                                    gateWay.getGatewayBaseInfo.gwID = paths[2];
+                                    gateWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId;
+                                    ZbGateway.GateWayList.Add(gateWay);
+                                }
+                            }
+                        }
+
+                        var broadcastIpAddress = new Shared.Net.NetWiFi().BroadcastIpAddress;
+
+
+                        if (Shared.Application.IsWifi)
+                        {
+                            if (0 < gateWayList.Count)
+                            {
+                                searchCount = 6;
+                                ZbGateway.IsRemote = false;
+                            }
+                            else
+                            {
+                                if (searchCount < 0)
+                                {
+                                    ZbGateway.IsRemote = true;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            ZbGateway.IsRemote = true;
+                            for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
+                            {
+                                ZbGateway.GateWayList[i].DisConnectLocalMqttClient("1");
+                            }
+                        }
+
+                        searchCount--;
+
+                        #region 1绉掓悳绱竴娆$綉鍏�
+                        //姣�0.5绉掑箍鎾彂鐜颁竴娆$綉鍏筹紝鍏�1s
+                        int count = 2;
+                        new System.Threading.Thread(() =>
+                        {
+                            gateWayList.Clear();
+                            while (0 < count--)
+                            {
+                                try
+                                {
+                                    //鐐瑰鐐瑰彂閫�(鍏堝彂涓�鏉″凡鏈夌殑鐐规挱锛屽洖澶嶅嚑鐜囬珮涓�鐐癸級
+                                    for (int i = 0; i < gateWayList.Count; i++)
+                                    {
+                                        FindGateWaySocket.BeginSend(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(gateWayList[i].getGatewayBaseInfo.IpAddress), 7624), broadBytes);
+                                    }
+                                    //骞挎挱鍙戦��
+                                    if (broadcastIpAddress.ToString() != "0.0.0.0")
+                                    {
+                                        FindGateWaySocket.BeginSend(new System.Net.IPEndPoint(broadcastIpAddress, 7624), broadBytes);
+                                    }
+                                }
+                                catch
+                                {   
+                                    //鍏抽棴Socket,涓嬫鍙戦�佷細鑷姩杩炴帴
+                                    FindGateWaySocket.Stop();
+                                }
+                                System.Threading.Thread.Sleep(500);
+                            }
+                        })
+                        { IsBackground = true }.Start();
+
+                        while (0 < count)
+                        {
+                            try
+                            {
+                                if (FindGateWaySocket.busSocket == null)
+                                {
+                                    System.Threading.Thread.Sleep(100);
+                                    continue;
+                                }
+                                var bytes = new byte[1024];
+
+                                var len = FindGateWaySocket.busSocket.Receive(bytes, bytes.Length, System.Net.Sockets.SocketFlags.None);
+
+                                if (bytes[43] == 0xA2)
+                                {
+                                    //骞挎挱鍥炲缃戝叧鐨勫熀鏈俊鎭鐞�
+                                    var ipAddress = $"{bytes[3]}.{bytes[4]}.{bytes[5]}.{bytes[6]}";
+                                    var homeID = System.Text.Encoding.UTF8.GetString(bytes, 7, 36);
+                                    homeID = homeID.Replace('\0', ' ').Trim();
+                                    var isMainGateWay = bytes[44] == 1;
+                                    var time = (bytes[48] & 0xff) << 24 | (bytes[47] & 0xff) << 16 | (bytes[46] & 0xff) << 8 | (bytes[45] & 0xff);
+                                    var gwNameLength = bytes[49];
+                                    var gwName = System.Text.Encoding.UTF8.GetString(bytes, 50, gwNameLength);
+                                    var gwIdLength = bytes[49 + gwNameLength + 1];
+                                    var id = Encoding.UTF8.GetString(bytes, 49 + gwNameLength + 2, gwIdLength);
+                                    var pubKeyLengthByte0 = bytes[49 + gwNameLength + 1 + gwIdLength + 1];
+                                    var pubKeyLengthByte1 = bytes[49 + gwNameLength + 1 + gwIdLength + 2];
+                                    int pubKeyLength = ((pubKeyLengthByte1 & 0xff) << 8 | (pubKeyLengthByte0 & 0xff));
+                                    var pubKey = Encoding.UTF8.GetString(bytes, 49 + gwNameLength + 1 + gwIdLength + 2 + 1, pubKeyLength);
+                                    var zbGateWay = new ZbGateway
+                                    {
+                                        getGatewayBaseInfo = new ZbGateway.GatewayBaseInfo
+                                        {
+                                            IpAddress = ipAddress,
+                                            Time = time,
+                                            GwName = gwName,
+                                            HomeId = homeID,
+                                            IsMainGateWay = isMainGateWay,
+                                            gwID = id,
+                                        },
+                                        GatewayOnlineFlage = true,
+                                        PubKey = pubKey
+                                    };
+                                    //閫氳鍒扮綉鍏冲垪琛�
+                                    if (gateWayList.Find(obj => obj.getGatewayBaseInfo.gwID == zbGateWay.getGatewayBaseInfo.gwID) == null)
+                                    {
+                                        //缃戝叧鍖归厤褰撳墠浣忓畢涓埌缃戝叧
+                                        if (Shared.Common.Config.Instance.HomeId == homeID)
+                                        {
+                                            gateWayList.Add(zbGateWay);
+                                        }
+                                        //UI鐣岄潰姝e湪鎼滅储锛屼笉蹇呴厤褰撳墠浣忓畢鍒板埌缃戝叧姝ゆ椂涔熼�氳
+                                        else if (IsSearchingGateway)
+                                        {
+                                            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);
+                                    if (gateWay == null)
+                                    {
+                                        ZbGateway.GateWayList.Add(zbGateWay);
+                                        await zbGateWay.StartLocalMqtt(ipAddress);
+                                        NewGateWayAction?.Invoke(zbGateWay);
+                                    }
+                                    else
+                                    {
+                                        gateWay.IsVirtual = false;
+                                        //灏嗚缃戝叧鏍囪瘑涓恒�愬彲鎼滅储鍒帮紝鍗筹細鍦ㄧ嚎銆�
+                                        gateWay.GatewayOnlineFlage = true;
+                                        if (gateWay.getGatewayBaseInfo.IpAddress != ipAddress)
+                                        {
+                                            await gateWay.DisConnectLocalMqttClient("2");
+                                            ZbGateway.GateWayList.Remove(gateWay);
+                                            gateWay = zbGateWay;
+                                            ZbGateway.GateWayList.Add(gateWay);
+                                            await zbGateWay.StartLocalMqtt(ipAddress);
+                                        }
+                                        else
+                                        {
+                                            gateWay.PubKey = pubKey;
+                                            gateWay.getGatewayBaseInfo.Time = time;
+                                            gateWay.getGatewayBaseInfo.GwName = gwName;
+                                            gateWay.getGatewayBaseInfo.HomeId = homeID;
+                                            await gateWay.StartLocalMqtt(ipAddress);
+                                        }
+
+                                        //涓荤綉鍏宠缃�
+                                        if (isMainGateWay && oldHomeID == gateWay.getGatewayBaseInfo.HomeId)
+                                        {
+                                            for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
+                                            {
+                                                var gw = ZbGateway.GateWayList[i];
+                                                //缃戝叧ID涓嶆槸褰撳墠鐨勭綉鍏筹紝鍒欐妸缃戝叧鍒楄〃涓叾浠栫綉鍏虫爣璁颁负涓嶆槸涓荤綉鍏�
+                                                if (gw.getGatewayBaseInfo.gwID != id && oldHomeID == gw.getGatewayBaseInfo.HomeId)
+                                                {
+                                                    gw.getGatewayBaseInfo.IsMainGateWay = false;
+                                                }
+                                            }
+                                            //鏍囪褰撳墠缃戝叧鏄富缃戝叧
+                                            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
+                            {
+                                //鍏抽棴Socket,涓嬫鍙戦�佷細鑷姩杩炴帴
+                                FindGateWaySocket.Stop();
+                            }
+                        }
+                        #endregion
+                    }
+                    catch { }
+                    System.Threading.Thread.Sleep(500);
+                }
+            })
+            { IsBackground = true }.Start();
+
+            ///杩滅▼涓荤綉鍏虫洿鏂�
+            new System.Threading.Thread(async () =>
+            {
+                while (true)
+                {
+                    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;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    catch { }
+                    System.Threading.Thread.Sleep(2000);
+                }
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <summary>
+        /// 閲嶆柊鎼滅储,娉ㄦ剰锛氳皟鐢ㄨ鏂规硶,鍒欎績浣垮叏閮ㄧ綉鍏崇殑mqtt鍏ㄩ儴鏂紑,鐒跺悗閲嶆柊鎼滅储(鍙兘浼氭湁1绉掑欢杩�)
+        /// </summary>
+        public static void ReSearch()
+        {
+            //涓轰簡閭d箞澶氬皯涓囧垎涔嬩竴鐨勫嚑鐜�,杩欓噷璁剧疆鎴愬埆鐨勫彟涓�绫荤殑鍊�
+            oldHomeID = "**";
+        }
+
+        /// <summary>
+        /// 鎺ユ敹澶勭悊UDP鏁版嵁鍖�
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        public static class FindGateWaySocket
+        {
+            //鏈湴Socket
+            public static System.Net.Sockets.Socket busSocket;
+
+            /// <summary>
+            /// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳�
+            /// </summary>
+            /// <param name="port"></param>
+            public static void Start(int port = 7624)
+            {
+                if (IsRunning)
+                {
+                    return;
+                }
+                //瀹氫箟缃戠粶绫诲瀷锛屾暟鎹繛鎺ョ被鍨嬪拰缃戠粶鍗忚UDP
+                busSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+                busSocket.EnableBroadcast = true;
+                busSocket.ReceiveTimeout = 1000;
+                busSocket.SendTimeout = 1000;
+                busSocket.Bind(new IPEndPoint(IPAddress.Any, port));
+            }
+
+            /// <summary>
+            /// 鍋滄Socket
+            /// </summary>
+            public static void Stop()
+            {
+                if (!IsRunning)
+                {
+                    return;
+                }
+                try
+                {
+                    busSocket.Close();
+                }
+                catch { }
+                busSocket = null;
+
+                Console.WriteLine("BusSocket鍏抽棴鎴愬姛!");
+            }
+
+            /// <summary>
+            /// 褰撳墠鐨凷ocket鏄惁杩愯
+            /// </summary>
+            public static bool IsRunning
+            {
+                get
+                {
+                    return null == busSocket ? false : true;
+                }
+            }
+
+            /// <summary>
+            /// 寮傛鍙戦�佹暟鎹�
+            /// </summary>
+            /// <param name="tempPacket"></param>
+            public static void BeginSend(System.Net.IPEndPoint iPEndPoint, byte[] bytes)
+            {
+                try
+                {
+                    Start(7624);
+                    busSocket.BeginSendTo(bytes, 0, bytes.Length, SocketFlags.None, iPEndPoint, new AsyncCallback(asyncEndSend), null);
+                }
+                catch { }
+            }
+
+            /// <summary>
+            /// 寮傛鍙戦�佹暟鎹粨鏉�
+            /// </summary>
+            /// <param name="iar"></param>
+            private static void asyncEndSend(IAsyncResult iar)
+            {
+                try
+                {
+                    int bytesSent = busSocket.EndSendTo(iar);
+                }
+                catch { }
+            }
+        }
+    }
+}

--
Gitblit v1.8.0