using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter.GatewayAdd { /// /// 网关搜索中 /// public class WiredGatewaySearchForm : EditorCommonForm { #region ■ 变量声明___________________________ /// /// 网关的主键(value:剩余检测次数,用于对应异常的网关) /// private Dictionary dicIdCheckCount = new Dictionary(); /// /// 搜索到的网关列表 /// private List listZbGateway = new List(); /// /// 搜索到的网关类别 0:第一次绑定 1:已经绑定 2:需要换绑 /// private Dictionary dicZbGatewayDiv = new Dictionary(); /// /// 获取得到了新网关 /// private bool newGatewayGetting = false; /// /// 网关搜索中 /// private bool isGatewaySearching = true; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// public void ShowForm() { //设置标题信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddWiredGateway)); //初始化初始中部控件 this.InitDefultMiddleFrame(); } /// /// 初始化初始中部控件 /// private void InitDefultMiddleFrame() { //清空bodyFrame this.ClearBodyFrame(); //图标 var picGwImage = new FrameLayout(); picGwImage.Width = this.GetPictrueRealSize(861); picGwImage.Height = this.GetPictrueRealSize(478); picGwImage.Y = Application.GetRealHeight(251); picGwImage.Gravity = Gravity.CenterHorizontal; picGwImage.BackgroundImagePath = "Gateway/WiredGatewaySearching.png"; bodyFrameLayout.AddChidren(picGwImage); //正在搜索网关… var btnMsg = new NormalViewControl(bodyFrameLayout.Width, false); btnMsg.TextID = R.MyInternationalizationString.uGatewaySearching; btnMsg.Y = Application.GetRealHeight(1008); btnMsg.TextColor = UserCenterColor.Current.TextGrayColor3; btnMsg.TextAlignment = TextAlignment.Center; bodyFrameLayout.AddChidren(btnMsg); //初始化连接的假想动画效果 this.InitConcetionAnimete(picGwImage, btnMsg); //开启网关检测的线程 this.StartCheckGatewayThread(); } /// /// 初始化失败模式的中部控件 /// private void InitFailMiddleFrame() { //清空bodyFrame this.ClearBodyFrame(); //图标 var picGwImage = new FrameLayout(); picGwImage.Width = this.GetPictrueRealSize(861); picGwImage.Height = this.GetPictrueRealSize(478); picGwImage.Y = Application.GetRealWidth(158); picGwImage.Gravity = Gravity.CenterHorizontal; picGwImage.BackgroundImagePath = "Gateway/WiredGatewaySearching.png"; bodyFrameLayout.AddChidren(picGwImage); var btnFailIcon = new PicViewControl(66, 66); btnFailIcon.UnSelectedImagePath = "Item/FailIcon.png"; btnFailIcon.Gravity = Gravity.CenterHorizontal; btnFailIcon.Y = this.GetPictrueRealSize(181); picGwImage.AddChidren(btnFailIcon); //搜索失败 var btnFailView = new NormalViewControl(300, 60, true); btnFailView.TextAlignment = TextAlignment.Center; btnFailView.Y = this.GetPictrueRealSize(305); btnFailView.Gravity = Gravity.CenterHorizontal; btnFailView.TextColor = UserCenterColor.Current.TextGrayColor3; btnFailView.TextID = R.MyInternationalizationString.uSearchFail; picGwImage.AddChidren(btnFailView); //解决方法,可选择执行以下任意一种方式: var btnMsg1 = new NormalViewControl(930, 60, true); btnMsg1.X = Application.GetRealWidth(75); btnMsg1.Y = picGwImage.Bottom + Application.GetRealHeight(112); btnMsg1.TextID = R.MyInternationalizationString.uSearchGatewayFailMsg1; bodyFrameLayout.AddChidren(btnMsg1); //1.短按HID/WCFG按键,系统指示灯快闪3秒,网关进入换绑模式,强制网关绑定到当前APP var btnMsg2 = new NormalViewControl(930, 100, true); btnMsg2.X = Application.GetRealWidth(75); btnMsg2.Y = btnMsg1.Bottom + Application.GetRealHeight(35); btnMsg2.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg2).Replace("{0}", "\r\n"); btnMsg2.TextSize = 12; btnMsg2.TextColor = UserCenterColor.Current.TextGrayColor1; btnMsg2.IsMoreLines = true; bodyFrameLayout.AddChidren(btnMsg2); //2.长按网关ZB/RST按键20秒以上,直到所有指示灯同时灭,即恢复出厂设置并重启 var btnMsg3 = new NormalViewControl(930, 100, true); btnMsg3.X = Application.GetRealWidth(75); btnMsg3.Y = btnMsg2.Bottom + Application.GetRealHeight(12); btnMsg3.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg3).Replace("{0}", "\r\n"); btnMsg3.TextSize = 12; btnMsg3.TextColor = UserCenterColor.Current.TextGrayColor1; btnMsg3.IsMoreLines = true; bodyFrameLayout.AddChidren(btnMsg3); //3.请重试,重新添加网关。 var btnMsg4 = new NormalViewControl(930, 50, true); btnMsg4.X = Application.GetRealWidth(75); btnMsg4.Y = btnMsg3.Bottom + Application.GetRealHeight(12); btnMsg4.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg4); btnMsg4.TextSize = 12; btnMsg4.TextColor = UserCenterColor.Current.TextGrayColor1; bodyFrameLayout.AddChidren(btnMsg4); //4.返回网关管理。 var btnMsg5 = new NormalViewControl(930, 50, true); btnMsg5.X = Application.GetRealWidth(75); btnMsg5.Y = btnMsg4.Bottom + Application.GetRealHeight(12); btnMsg5.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg5); btnMsg5.TextSize = 12; btnMsg5.TextColor = UserCenterColor.Current.TextGrayColor1; bodyFrameLayout.AddChidren(btnMsg5); //重试 var frameback = new FrameLayoutStatuControl(); frameback.UseClickStatu = false; frameback.Y = Application.GetRealHeight(1259); frameback.Gravity = Gravity.CenterHorizontal; frameback.Width = Application.GetRealWidth(746); frameback.Height = Application.GetRealHeight(184); 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.BindEvent); frameback.ButtonClickEvent += (sender, e) => { //初始化初始中部控件 this.InitDefultMiddleFrame(); }; //返回网关管理 var btnGoBack = new BottomClickButton(688); btnGoBack.Y = Application.GetRealHeight(1495); btnGoBack.TextID = R.MyInternationalizationString.uGobackGatewayManage; if (UserCenterResourse.DicActionForm.ContainsKey("GatewayListForm") == false) { //返回主页 btnGoBack.TextID = R.MyInternationalizationString.uGobackToHomePage; } bodyFrameLayout.AddChidren(btnGoBack); btnGoBack.ButtonClickEvent += (sender, e) => { this.CloseForm(); //关闭指定界面 this.CloseFormByFormName("NewGateWayMenuSelectForm"); }; } #endregion #region ■ 假想动画(网关检测)_________________ /// /// 初始化连接的假想动画效果 /// private void InitConcetionAnimete(FrameLayout picGwImage, NormalViewControl btnMsg) { //首格的X轴 int firstPoint = this.GetPictrueRealSize(288); //一格的宽度 int width = this.GetPictrueRealSize(22); //间距大小 int space = this.GetPictrueRealSize(12); //生成格子坐标 var listPoint = new List(); for (int i = 0; i < 9; i++) { listPoint.Add(firstPoint + (width + space) * i); } //开启连接的假想动画效果线程 var btnRound = new PicViewControl(width, width, false); btnRound.Radius = (uint)width / 2; btnRound.BackgroundColor = UserCenterColor.Current.ConcetionRoundColor; btnRound.Y = this.GetPictrueRealSize(202); btnRound.X = listPoint[0]; picGwImage.AddChidren(btnRound); string strMsg = btnMsg.Text; HdlThreadLogic.Current.RunThread(() => { int index = 1; int maxCount = 120 * 2; int timeCount = 120; while (picGwImage.Parent != null) { System.Threading.Thread.Sleep(500); maxCount--; if (maxCount % 2 == 0) { timeCount--; } if (maxCount <= 0 || this.newGatewayGetting == true) { //获取得到新网关,则中断线程 break; } Application.RunOnMainThread(() => { btnRound.X = listPoint[index]; index++; if (index == listPoint.Count) { index = 0; } //正在搜索网关…XXs btnMsg.Text = strMsg + timeCount + "s"; }); } //搜索结束 this.isGatewaySearching = false; if (maxCount <= 0) { HdlThreadLogic.Current.RunMain(() => { //初始化失败模式的中部控件 this.InitFailMiddleFrame(); }); } else if (newGatewayGetting == true) { HdlThreadLogic.Current.RunMain(() => { if (this.Parent != null) { var form = new GatewayManage.GatewaySearchListForm(); this.AddFromAndRemoveNowForm(form, listZbGateway, dicZbGatewayDiv); } }); } }); } #endregion #region ■ 网关检测___________________________ /// /// 开启网关检测的线程 /// private void StartCheckGatewayThread() { this.isGatewaySearching = true; HdlThreadLogic.Current.RunThread(async () => { //清空全部列表 HdlGatewayLogic.Current.ClearAllRealGateway(); ZigBee.Common.Application.IsSearchingGateway = true; int count = 0; while (this.Parent != null && this.isGatewaySearching == true) { //每2秒检测搜索到的网关 System.Threading.Thread.Sleep(500); count++; if (count < 4) { //主要为了快一点能够中断这个线程 continue; } count = 0; await this.CheckZbGatewayAndSetRow(); if (this.newGatewayGetting == true) { //获取得到新网关,则中断线程 break; } } }); } /// /// 检测搜索到的网关,然后添加到画面的行里面 /// private async Task CheckZbGatewayAndSetRow() { List listId = new List(); for (int i = 0; i < ZbGateway.GateWayList.Count; i++) { if (ZbGateway.GateWayList[i].GwIP == string.Empty) { //IP没有的网关,我也不知道它是干嘛的 continue; } string gwId = ZbGateway.GateWayList[i].GwId; //重复添加检测 if (this.dicIdCheckCount.ContainsKey(gwId) == false) { //允许五次检测 this.dicIdCheckCount[gwId] = 5; listId.Add(gwId); } else if (this.dicIdCheckCount[gwId] > 0) { //如果前一次检测失败了的话,它的次数-1 this.dicIdCheckCount[gwId] = this.dicIdCheckCount[gwId] - 1; listId.Add(gwId); } } if (listId.Count == 0) { //没有新的网关,或者次数已经用完 return true; } for (int i = 0; i < listId.Count; i++) { ZbGateway way = ZbGateway.GateWayList.Find((obj) => obj.GwId == listId[i]); if (way == null) { continue; } //网关绑定模式 GatewayBindMode mode = GatewayBindMode.BindAgain; //如果是第一次绑定,或者是以前已经绑定过了的 if (HdlGatewayLogic.Current.HomeIdIsEmpty(way) == true || way.HomeId == Common.Config.Instance.HomeId) { if (way.HomeId != Common.Config.Instance.HomeId) { //第一次绑定,也就是网关住宅ID为空 mode = GatewayBindMode.First; } else { //已经绑定过了 mode = GatewayBindMode.Binded; } //添加搜索到的网关到缓存(执行网关保存操作) ShowErrorMode showMode = this.dicIdCheckCount[listId[i]] == 0 ? ShowErrorMode.YES : ShowErrorMode.NO; var result = await HdlGatewayLogic.Current.AddNewGateway(way, ShowErrorMode.NO); if (result == false) { continue; } } //收集网关对象 this.listZbGateway.Add(way); //如果它已经完全成功了的话,则将它的剩余次数置零 this.dicIdCheckCount[listId[i]] = 0; //全部处理OK后,才能设置flage if (mode == GatewayBindMode.First) { //第一次绑定 this.dicZbGatewayDiv[listId[i]] = 0; //获取到了新网关 this.newGatewayGetting = true; } else if (mode == GatewayBindMode.Binded) { //已经绑定过 this.dicZbGatewayDiv[listId[i]] = 1; } else { //需要重新绑定 this.dicZbGatewayDiv[listId[i]] = 2; //获取到了新网关 this.newGatewayGetting = true; } if (mode == GatewayBindMode.First || mode == GatewayBindMode.Binded) { //我觉得这里需要获取一下新网关的设备列表 Common.LocalDevice.Current.SetDeviceToMemmoryByGateway(way); } } return true; } #endregion #region ■ 界面关闭___________________________ /// /// 画面关闭 /// public override void CloseFormBefore() { ZigBee.Common.Application.IsSearchingGateway = false; base.CloseFormBefore(); } #endregion } }