黄学彪
2020-12-17 9f326f4000847e6167d8166fa2f6a66f53cb3734
ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WirelessApSearchForm.cs
@@ -26,9 +26,9 @@
        /// </summary>
        private bool newGatewayGetting = false;
        /// <summary>
        /// 网关检测中
        /// 网关搜索中
        /// </summary>
        private string isGatewayChecking = "0";
        private bool isGatewaySearching = true;
        #endregion
@@ -54,8 +54,7 @@
            //清空bodyFrame
            this.ClearBodyFrame();
            //系统灯每秒闪烁一次
            //则连接成功
            //网关如果正常连接路由器{0}系统指示灯会1秒闪烁
            string[] ArryMsg = Language.StringByID(R.MyInternationalizationString.uAddApWirelessGatewayMsg4).Split(new string[] { "{0}" }, StringSplitOptions.RemoveEmptyEntries);
            int yy = Application.GetRealHeight(1066);
            foreach (var msg in ArryMsg)
@@ -71,6 +70,8 @@
            //初始化连接的假想动画效果
            this.InitConcetionAnimete();
            //开启网关检测的线程
            this.StartCheckGatewayThread();
        }
        /// <summary>
@@ -83,8 +84,8 @@
            //图标
            var picGwImage = new FrameLayout();
            picGwImage.Width = Application.GetMinRealAverage(861);
            picGwImage.Height = Application.GetMinRealAverage(245);
            picGwImage.Width = this.GetPictrueRealSize(861);
            picGwImage.Height = this.GetPictrueRealSize(245);
            picGwImage.Y = Application.GetRealWidth(223);
            picGwImage.Gravity = Gravity.CenterHorizontal;
            picGwImage.BackgroundImagePath = "Gateway/WirelessApGatewaySearching.png";
@@ -92,7 +93,7 @@
            var btnFailIcon = new PicViewControl(66, 66);
            btnFailIcon.UnSelectedImagePath = "Item/FailIcon.png";
            btnFailIcon.Gravity = Gravity.CenterHorizontal;
            btnFailIcon.Y = Application.GetMinRealAverage(110);
            btnFailIcon.Y = this.GetPictrueRealSize(110);
            picGwImage.AddChidren(btnFailIcon);
            //搜索失败
            var btnFailView = new NormalViewControl(300, 60, true);
@@ -109,7 +110,7 @@
            btnMsg1.Y = picGwImage.Bottom + Application.GetRealHeight(112);
            btnMsg1.TextID = R.MyInternationalizationString.uSearchGatewayFailMsg1;
            bodyFrameLayout.AddChidren(btnMsg1);
            //1.长按ZB/RST键20秒,网关恢复出厂设置,指示灯全部熄灭后,重新入网。
            //1.短按HID/WCFG按键,系统指示灯快闪3秒,网关进入换绑模式,强制网关绑定到当前APP
            var btnMsg2 = new NormalViewControl(930, 100, true);
            btnMsg2.X = Application.GetRealWidth(75);
            btnMsg2.Y = btnMsg1.Bottom + Application.GetRealHeight(35);
@@ -118,7 +119,7 @@
            btnMsg2.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnMsg2.IsMoreLines = true;
            bodyFrameLayout.AddChidren(btnMsg2);
            //2.点按HID/WCFG键,进入网关换绑模式,系统指示灯快闪5秒。
            //2.长按网关ZB/RST按键20秒以上,直到所有指示灯同时灭,即恢复出厂设置并重启
            var btnMsg3 = new NormalViewControl(930, 100, true);
            btnMsg3.X = Application.GetRealWidth(75);
            btnMsg3.Y = btnMsg2.Bottom + Application.GetRealHeight(12);
@@ -145,7 +146,7 @@
            bodyFrameLayout.AddChidren(btnMsg5);
            //重试
            var frameback = new FrameLayoutControl();
            var frameback = new FrameLayoutStatuControl();
            frameback.UseClickStatu = false;
            frameback.Y = Application.GetRealHeight(1259);
            frameback.Gravity = Gravity.CenterHorizontal;
@@ -154,13 +155,14 @@
            frameback.BackgroundImagePath = "Item/BottomButtonGround.png";
            bodyFrameLayout.AddChidren(frameback);
            var btnReDo = new NormalViewControl(300, 65, true);
            btnReDo.IsBold = true;
            btnReDo.TextColor = UserCenterColor.Current.White;
            btnReDo.TextSize = 16;
            btnReDo.Y = Application.GetRealHeight(49);
            btnReDo.Gravity = Gravity.CenterHorizontal;
            btnReDo.TextAlignment = TextAlignment.Center;
            btnReDo.TextID = R.MyInternationalizationString.uReDoAgain;
            frameback.AddChidren(btnReDo, ChidrenBindMode.BindEventOnly);
            frameback.AddChidren(btnReDo, ChidrenBindMode.BindEvent);
            frameback.ButtonClickEvent += (sender, e) =>
            {
                //初始化初始中部控件
@@ -171,7 +173,7 @@
            var btnGoBack = new BottomClickButton(688);
            btnGoBack.Y = Application.GetRealHeight(1495);
            btnGoBack.TextID = R.MyInternationalizationString.uGobackGatewayManage;
            if (UserCenterResourse.DicActionForm.ContainsKey("GatewayListForm") == false)
            if (HdlFormLogic.Current.IsFormOpen("GatewayListForm") == false)
            {
                //返回主页
                btnGoBack.TextID = R.MyInternationalizationString.uGobackToHomePage;
@@ -181,7 +183,7 @@
            {
                this.CloseForm();
                //关闭指定界面
                this.CloseFormByFormName("NewGateWayMenuSelectForm");
                HdlFormLogic.Current.CloseFormByFormName("NewGateWayMenuSelectForm");
            };
        }
@@ -196,8 +198,8 @@
        {
            //图标
            var btnGwImage = new FrameLayout();
            btnGwImage.Width = Application.GetMinRealAverage(861);
            btnGwImage.Height = Application.GetMinRealAverage(245);
            btnGwImage.Width = this.GetPictrueRealSize(861);
            btnGwImage.Height = this.GetPictrueRealSize(245);
            btnGwImage.Y = Application.GetRealHeight(360);
            btnGwImage.Gravity = Gravity.CenterHorizontal;
            btnGwImage.BackgroundImagePath = "Gateway/WirelessApGatewaySearching.png";
@@ -212,11 +214,11 @@
            bodyFrameLayout.AddChidren(btnMsg);
            //首格的X轴
            int firstPoint = Application.GetMinRealAverage(275);
            int firstPoint = this.GetPictrueRealSize(275);
            //一格的宽度
            int width = Application.GetMinRealAverage(22);
            int width = this.GetPictrueRealSize(22);
            //间距大小
            int space = Application.GetMinRealAverage(12);
            int space = this.GetPictrueRealSize(12);
            //生成格子坐标
            var listPoint = new List<int>();
@@ -229,49 +231,26 @@
            var btnRound = new PicViewControl(width, width, false);
            btnRound.Radius = (uint)width / 2;
            btnRound.BackgroundColor = UserCenterColor.Current.ConcetionRoundColor;
            btnRound.Y = Application.GetMinRealAverage(135);
            btnRound.Y = this.GetPictrueRealSize(135);
            btnRound.X = listPoint[0];
            btnGwImage.AddChidren(btnRound);
            string strMsg = btnMsg.Text;
            HdlThreadLogic.Current.RunThread(() =>
            {
                //清空全部列表
                HdlGatewayLogic.Current.ClearAllRealGateway();
                ZigBee.Common.Application.IsSearchingGateway = true;
                int index = 1;
                //计时时间
                int timeCount = 0;
                //超时时间
                int timeOut = 120;
                int timeOut = 240;
                while (btnGwImage.Parent != null)
                {
                    timeCount++;
                    if (timeCount == 10)
                    {
                        //5秒后清空网关列表
                        HdlGatewayLogic.Current.ClearAllRealGateway();
                        HdlGatewayLogic.Current.ClearAllRealGatewayConection(true);
                        ZigBee.Common.Application.IsSearchingGateway = true;
                    }
                    if (timeCount % 4 == 0 && timeCount >= 10)
                    {
                        lock (isGatewayChecking)
                        {
                            if (isGatewayChecking != "1")
                            {
                                isGatewayChecking = "1";
                                HdlThreadLogic.Current.RunThread(async () =>
                                {
                                    //每2秒检测搜索到的网关
                                    await this.CheckZbGatewayAndSetRow();
                                    lock (isGatewayChecking)
                                    {
                                        isGatewayChecking = "0";
                                    }
                                });
                            }
                        }
                    }
                    if (timeCount % 2 == 0)
                    {
@@ -283,7 +262,7 @@
                        break;
                    }
                    Application.RunOnMainThread(() =>
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        btnRound.X = listPoint[index];
                        index++;
@@ -293,11 +272,15 @@
                        }
                        //正在搜索网关…XXs
                        btnMsg.Text = strMsg + timeOut + "s";
                    });
                    }, ShowErrorMode.NO);
                    System.Threading.Thread.Sleep(500);
                }
                if (timeOut <= 0)
                //搜索结束
                this.isGatewaySearching = false;
                //2020.07.14追加:倒计时结束时,哪怕是已经绑定了的网关,也显示出来
                if (timeOut <= 0 && listZbGateway.Count == 0)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
@@ -305,14 +288,14 @@
                        this.InitFailMiddleFrame();
                    });
                }
                else if (newGatewayGetting == true)
                else if (newGatewayGetting == true || listZbGateway.Count > 0)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        if (this.Parent != null)
                        {
                            var form = new GatewayManage.GatewaySearchListForm();
                            this.AddFromAndRemoveNowForm(form, listZbGateway, dicZbGatewayDiv);
                            this.AddFormAndCloseNowForm(form, listZbGateway, dicZbGatewayDiv);
                        }
                    });
                }
@@ -324,39 +307,88 @@
        #region ■ 网关检测___________________________
        /// <summary>
        /// 开启网关检测的线程
        /// </summary>
        private void StartCheckGatewayThread()
        {
            this.isGatewaySearching = true;
            this.dicZbGatewayDiv = new Dictionary<string, int>();
            HdlThreadLogic.Current.RunThread(() =>
            {
                int count = 0;
                while (this.Parent != null && this.isGatewaySearching == true)
                {
                    //每2秒检测搜索到的网关
                    System.Threading.Thread.Sleep(500);
                    count++;
                    if (count < 4)
                    {
                        //主要为了快一点能够中断这个线程
                        continue;
                    }
                    count = 0;
                    this.CheckZbGatewayAndSetRow();
                    if (this.newGatewayGetting == true)
                    {
                        //获取得到新网关,则中断线程
                        break;
                    }
                }
            });
        }
        /// <summary>
        /// 检测搜索到的网关
        /// </summary>
        private async Task<bool> CheckZbGatewayAndSetRow()
        private bool CheckZbGatewayAndSetRow()
        {
            var listCheck = new HashSet<string>();
            for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
            {
                var way = ZbGateway.GateWayList[i];
                var wayId = HdlGatewayLogic.Current.GetGatewayId(way);
                var wayId = way.GwId;
                if (dicZbGatewayDiv.ContainsKey(wayId) == true)
                {
                    //已经处理了
                    continue;
                }
                //2020.09.18 本地连接没有连接上,则不处理
                if (way.LocalIsConnected == false)
                {
                    string strMsg = "搜索到了网关,但是本地链接不上  ID:" + way.GwId + " IP:" + way.GwIP + " 名称:" + way.GwName;
                    HdlLogLogic.Current.WriteLog(-1, strMsg);
                    continue;
                }
                //网关绑定模式
                GatewayBindMode mode = GatewayBindMode.BindAgain;
                //如果是第一次绑定,或者是以前已经绑定过了的
                if (HdlGatewayLogic.Current.HomeIdIsEmpty(way) == true
                    || way.getGatewayBaseInfo.HomeId == Common.Config.Instance.HomeId)
                var mode = GatewayBindMode.BindAgain;
                //住宅ID为空 第一次绑定
                if (HdlGatewayLogic.Current.HomeIdIsEmpty(way) == true)
                {
                    if (way.getGatewayBaseInfo.HomeId != Common.Config.Instance.HomeId)
                    {
                        //第一次绑定,也就是网关住宅ID为空
                        mode = GatewayBindMode.First;
                    }
                    else
                    {
                        //已经绑定过了
                        mode = GatewayBindMode.Binded;
                    }
                    mode = GatewayBindMode.First;
                }
                //住宅ID不相等 需要重新绑定
                else if (way.HomeId != Common.Config.Instance.HomeId)
                {
                    mode = GatewayBindMode.BindAgain;
                }
                //如果本地不存在的话,当做第一次绑定处理
                else if (HdlGatewayLogic.Current.IsGatewayExist(way) == false)
                {
                    mode = GatewayBindMode.First;
                }
                //住宅ID一样,则是已经绑定过了
                else
                {
                    mode = GatewayBindMode.Binded;
                }
                //这两种情况都是需要重新添加(已经绑定过了的,有可能住宅ID没写进去,它有可能是人为的清空住宅ID)
                if (mode == GatewayBindMode.First || mode == GatewayBindMode.Binded)
                {
                    //添加搜索到的网关到缓存(执行网关保存操作)
                    var result = await HdlGatewayLogic.Current.AddNewGateway(way, ShowErrorMode.NO);
                    var result = HdlGatewayLogic.Current.AddNewGateway(way, ShowErrorMode.NO, WriteLogMode.YES);
                    if (result == false)
                    {
                        continue;
@@ -382,12 +414,19 @@
                {
                    //需要重新绑定
                    this.dicZbGatewayDiv[wayId] = 2;
                    //获取到了新网关
                    this.newGatewayGetting = true;
                }
                if (mode == GatewayBindMode.First)
                if (mode == GatewayBindMode.First || mode == GatewayBindMode.Binded)
                {
                    //我觉得这里需要获取一下新网关的设备列表
                    Common.LocalDevice.Current.SetDeviceToMemmoryByGateway(way);
                    HdlDeviceCommonLogic.Current.SetDeviceToMemmoryByGateway(way.GwId, true);
                    if (way.IsMainGateWay == true)
                    {
                        //如果它是主网关,则刷新场景列表
                        HdlSceneLogic.Current.RefreshSceneUIList(true);
                    }
                }
            }
            return true;
@@ -400,18 +439,11 @@
        /// <summary>
        /// 界面关闭
        /// </summary>
        public override void CloseForm()
        public override void CloseFormBefore()
        {
            ZigBee.Common.Application.IsSearchingGateway = false;
            //停止Wi-Fi配网
            HdlWifiLogic.Current.StopSmartConnection();
            if (UserCenterResourse.listActionFormId.Contains("UserMainForm") == false)
            {
                //刷新主页
                UserView.UserPage.Instance.Fresh();
            }
            base.CloseForm();
            base.CloseFormBefore();
        }
        #endregion