黄学彪
2020-09-18 c7df85937f73fb347ee0b19e9c052d2d00a6df6c
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlWifiLogic.cs
old mode 100644 new mode 100755
@@ -40,7 +40,24 @@
            {
                string myId = this.SSID;
                if (myId.StartsWith("hdlZigbeeGW") == true)
                if (myId != null && myId.StartsWith("hdlZigbeeGW") == true)
                {
                    return true;
                }
                return false;
            }
        }
        /// <summary>
        /// 当前是否是Mini网关热点
        /// </summary>
        public bool IsMiniGatewayHotspot
        {
            get
            {
                string myId = this.SSID;
                if (myId != null && myId.StartsWith("hdlZigbeeGW-") == true)
                {
                    return true;
                }
@@ -54,12 +71,12 @@
        public string SSID
        {
            get
            {
            {
#if iOS
                string ssiD = Shared.WiimuUPnP.SSID;
                if (string.IsNullOrEmpty(ssiD) == false && ssiD.StartsWith("\"") && ssiD.EndsWith("\""))
                {
                    ssiD = ssiD.Substring(1, ssiD.Length - 2);
                string ssiD = Shared.WiimuUPnP.SSID;
                if (string.IsNullOrEmpty(ssiD) == false && ssiD.StartsWith("\"") && ssiD.EndsWith("\""))
                {
                    ssiD = ssiD.Substring(1, ssiD.Length - 2);
                }
                return ssiD;
#endif
@@ -97,7 +114,6 @@
        /// </summary>
        private Com.Mediatek.Elian.ElianNative hdlWiFi = null;
#endif
        /// <summary>
        /// TCP协议
        /// </summary>
@@ -110,6 +126,48 @@
        /// Ap模式网关返回的秘钥
        /// </summary>
        private string randDesKey = null;
        /// <summary>
        /// 是否已经添加网络变化监听
        /// </summary>
        private bool hadAddListenNetWork = false;
        /// <summary>
        /// 能否访问http
        /// </summary>
        private bool m_CanAccessHttp = true;
        /// <summary>
        /// 上一次访问http的时间
        /// </summary>
        private DateTime oldAccessHttpTime = DateTime.Now;
        /// <summary>
        /// 能否访问http
        /// </summary>
        public bool CanAccessHttp
        {
            set
            {
                m_CanAccessHttp = value;
                oldAccessHttpTime = DateTime.Now;
            }
            get
            {
                //8秒后允许再次访问
                if (m_CanAccessHttp == true || (DateTime.Now - oldAccessHttpTime).TotalMilliseconds > 8 * 1000)
                {
                    oldAccessHttpTime = DateTime.Now;
                    return true;
                }
                return false;
            }
        }
        /// <summary>
        /// 变更网络时的事件
        /// </summary>
        private string changedNetworkTime = string.Empty;
        /// <summary>
        /// 当前 wifi 的
        /// </summary>
        private string oldSsid = string.Empty;
        #endregion
@@ -127,6 +185,7 @@
                tcpClient = new System.Net.Sockets.TcpClient();
                tcpClient.Connect("192.168.8.1", 5000);
                networkStream = tcpClient.GetStream();
                networkStream.ReadTimeout = 1000;
                //加密数据
                string sendDataMsg = "hdl1985.";
                string DefaultdesKey = "hdl1985.";
@@ -269,6 +328,165 @@
        #endregion
        #region ■ 监听网络变化_______________________
        /// <summary>
        /// 开启监听网络
        /// </summary>
        public void StartListenNetWork()
        {
            if (hadAddListenNetWork == true)
            {
                return;
            }
            hadAddListenNetWork = true;
#if Android
            //开启监听安卓网络变化
            BaseActivity.NetworkStateChanged += (value) =>
            {
                //网络变化
                this.NetworkStateChanged(value);
            };
#endif
#if iOS
            //开启监听IOS网络变化
            GateWay.Ios.Reachability.ReachabilityChanged += (sender, e) =>
            {
                var internetStatus = GateWay.Ios.Reachability.InternetConnectionStatus();
                if (internetStatus == GateWay.Ios.NetworkStatus.NotReachable)//没有网络连接 0
                {
                    //网络变化
                    this.NetworkStateChanged(0);
                }
                else if (internetStatus == GateWay.Ios.NetworkStatus.ReachableViaCarrierDataNetwork)//3,4G的网络连接 1
                {
                    //网络变化
                    this.NetworkStateChanged(1);
                }
                else if (internetStatus == GateWay.Ios.NetworkStatus.ReachableViaWiFiNetwork) //wifi的网络连接 2
                {
                    //网络变化
                    this.NetworkStateChanged(2);
                }
            };
#endif
        }
        /// <summary>
        /// 监听安卓网络变化
        /// </summary>
        /// <param name="value">0:没有网络 1:4G  2:wifi</param>
        public void NetworkStateChanged(int value)
        {
            if (Common.Config.Instance.HomeId == string.Empty)
            {
                //在登录界面不处理
                return;
            }
#if iOS
            var nowSsid = this.SSID;
            if (this.oldSsid == nowSsid)
            {
                //如果当前 wifi 的名字一样,则不处理
                ZigBee.Common.Application.FindGateWaySocket.Start();
                return;
            }
            this.oldSsid = nowSsid;
#endif
            //没有网络
            if (value == 0)
            {
                this.CanAccessHttp = false;
                //关闭Socket
                ZigBee.Common.Application.FindGateWaySocket.Stop();
            }
            //WIFI或者4G时
            if (value == 1 || value == 2)
            {
                //允许联网
                this.CanAccessHttp = true;
                this.changedNetworkTime = DateTime.Now.ToString("yyyyMMdd HH.mm.ss");
                //当前执行此线程的时间
                string thisThreadTime = this.changedNetworkTime;
                HdlThreadLogic.Current.RunThread(() =>
                {
                    //不管如何,都要显示转圈
                    ProgressBar.Show();
                    //检测是否已经完成账号信息初始化
                    if (UserCenterResourse.UserInfo.InitUserInfoSuccess == false
                       && Common.Config.Instance.HomeId != string.Empty)
                    {
                        //重新初始化账号信息
                        UserCenterLogic.ReInitUserAccoutInfo();
                        //因为上面这个东西耗时蛮久的,所以处理完之后进行判断
                        if (thisThreadTime != this.changedNetworkTime)
                        {
                            //在处理的过程中,切换了网络,把下面的处理交给另外的线程
                            return;
                        }
                    }
                    //重新初始化Socket
                    ZigBee.Common.Application.FindGateWaySocket.Stop();
                    System.Threading.Thread.Sleep(100);
                    //断掉本地连接
                    HdlGatewayLogic.Current.ClearAllRealGatewayConection(true);
                    //断掉远程
                    ZigBee.Device.ZbGateway.DisConnectRemoteMqttClient();
                    //如果是wifi
                    if (value == 2)
                    {
                        ZigBee.Common.Application.FindGateWaySocket.Start();
                        //借用一下这个变量(检测能否广播到网关)
                        UserCenterResourse.DicReceiveGatewayTest = new Dictionary<string, ZigBee.Device.ZbGateway>();
                        UserCenterResourse.HideOption.CheckCanReceiveGateway = 1;
                        //固定等个3秒吧
                        System.Threading.Thread.Sleep(2500);
                        if (thisThreadTime != this.changedNetworkTime)
                        {
                            //变更了网络,交由其他线程处理
                            return;
                        }
                        UserCenterResourse.HideOption.CheckCanReceiveGateway = 0;
                        System.Threading.Thread.Sleep(500);
                        bool canReceiveGw = false;
                        foreach (var gateway in UserCenterResourse.DicReceiveGatewayTest.Values)
                        {
                            if (gateway.HomeId == Common.Config.Instance.Home.Id)
                            {
                                //能够搜索得到网关
                                canReceiveGw = true;
                                break;
                            }
                        }
                        UserCenterResourse.DicReceiveGatewayTest = null;
                        //设置远程连接的初始值
                        ZigBee.Device.ZbGateway.IsRemote = canReceiveGw == false;
                        if (canReceiveGw == false)
                        {
                            //如果是远程的话,追加等待时间(总共5秒)
                            System.Threading.Thread.Sleep(2000);
                        }
                    }
                    else if (value == 1)
                    {
                        //如果是4G的话,直接等待
                        System.Threading.Thread.Sleep(4500);
                    }
                    ProgressBar.Close();
                }, ShowErrorMode.NO);
            }
        }
        #endregion
        #region ■ 一般方法___________________________
#if Android