using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter.GatewayAdd { /// /// 搜索无线网关的界面 /// public class WirelessGatewaySearchForm : EditorCommonForm { #region ■ 变量声明___________________________ /// /// 动画线程 /// private bool animateThread = false; /// /// 超时时间(500毫秒每单位) /// private int timeOut = 360; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// public void ShowForm() { //设置标题信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddWirelessGateway)); //初始化中部控件 this.InitMiddleFrame(); } /// /// 初始化中部控件 /// private void InitMiddleFrame() { //图标 var btnGwImage = new PicViewControl(248, 230, true); btnGwImage.X = Application.GetRealWidth(107); btnGwImage.Y = Application.GetRealHeight(507); btnGwImage.UnSelectedImagePath = "Gateway/WirelessGatewayImage.png"; bodyFrameLayout.AddChidren(btnGwImage); //图标 var btnPhoneImage = new PicViewControl(236, 478, true); btnPhoneImage.X = Application.GetRealWidth(737); btnPhoneImage.Y = Application.GetRealHeight(438); btnPhoneImage.UnSelectedImagePath = "Gateway/PhoneImage.png"; bodyFrameLayout.AddChidren(btnPhoneImage); //智能网关正在配置网络中 var btnMsg1 = new NormalViewControl(bodyFrameLayout.Width, false); btnMsg1.TextID = R.MyInternationalizationString.uGatewaySetting; btnMsg1.Y = Application.GetRealHeight(1036); btnMsg1.TextAlignment = TextAlignment.Center; bodyFrameLayout.AddChidren(btnMsg1); //请稍候… var btnMsg2 = new NormalViewControl(bodyFrameLayout.Width, false); btnMsg2.TextID = R.MyInternationalizationString.uPleaseWait; btnMsg2.TextAlignment = TextAlignment.Center; btnMsg2.Y = btnMsg1.Bottom; bodyFrameLayout.AddChidren(btnMsg2); //初始化连接的假想动画效果 this.InitConcetionAnimete(); } #endregion #region ■ 假想动画___________________________ /// /// 初始化连接的假想动画效果 /// private void InitConcetionAnimete() { var frame = new FrameLayout(); frame.Width = Application.GetRealWidth(294); frame.Height = Application.GetRealHeight(30); frame.X = Application.GetRealWidth(403); frame.Y = Application.GetRealHeight(650 + 30 / 2); bodyFrameLayout.AddChidren(frame); //一格的宽度 int width = Application.GetRealWidth(22); //间距大小 int space = Application.GetRealWidth(9); //首格只是半格 var btnFirstPoint = new NormalViewControl(width / 2, 3, false); btnFirstPoint.Gravity = Gravity.CenterVertical; btnFirstPoint.BackgroundColor = UserCenterColor.Current.ButtomLine; frame.AddChidren(btnFirstPoint); NormalViewControl btnTemp = btnFirstPoint; //生成格子 var listPoint = new List(); for (int i = 0; i < 8; i++) { var btnPoint = new NormalViewControl(width, 3, false); btnPoint.BackgroundColor = UserCenterColor.Current.ButtomLine; btnPoint.Gravity = Gravity.CenterVertical; btnPoint.X = btnTemp.Right + space; frame.AddChidren(btnPoint); listPoint.Add(btnPoint.X); btnTemp = btnPoint; } //尾格只是半格 var btnLastPoint = new NormalViewControl(width / 2, 3, false); btnLastPoint.Gravity = Gravity.CenterVertical; btnLastPoint.X = btnTemp.Right + space; btnLastPoint.BackgroundColor = UserCenterColor.Current.ButtomLine; frame.AddChidren(btnLastPoint); btnTemp = null; //开启连接的假想动画效果线程 this.StartConcetionAnimeteThread(frame, listPoint, width); } /// /// 开启连接的假想动画效果线程 /// /// /// /// private void StartConcetionAnimeteThread(FrameLayout frame, List listPoint, int roundWidth) { var btnRound = new PicViewControl(roundWidth, roundWidth, false); btnRound.Radius = (uint)roundWidth / 2; btnRound.Gravity = Gravity.CenterVertical; btnRound.BackgroundColor = UserCenterColor.Current.ConcetionRoundColor; btnRound.X = listPoint[0]; frame.AddChidren(btnRound); animateThread = true; HdlThreadLogic.Current.RunThread(() => { int index = 1; int timeCount = 0; while (animateThread == true && this.Parent != null) { System.Threading.Thread.Sleep(500); timeOut--; if (timeCount == 10) { //5秒后清空网关列表 HdlGatewayLogic.Current.ClearAllRealGateway(); ZigBee.Common.Application.IsSearchingGateway = true; //检测搜索到的网关 this.CheckZbGatewayAndSetRow(); } timeCount++; Application.RunOnMainThread(() => { if (btnRound != null) { btnRound.X = listPoint[index]; index++; if (index == listPoint.Count) { index = 0; } } }); } }); } #endregion #region ■ 网关检测___________________________ /// /// 检测搜索到的网关 /// private void CheckZbGatewayAndSetRow() { HdlThreadLogic.Current.RunThread(async () => { while (animateThread == true && this.Parent != null) { await Task.Delay(1000); if (timeOut < 0) { this.animateThread = false; //先随便乱写点东西好了 string msg = "没有发现网关,建议使用XXX链接方式"; this.ShowMassage(ShowMsgType.Tip, msg); break; } var listCheck = new HashSet(); for (int i = 0; i < ZbGateway.GateWayList.Count; i++) { var realWay = ZbGateway.GateWayList[i]; string gwId = HdlGatewayLogic.Current.GetGatewayId(realWay); if (listCheck.Contains(gwId) == true || HdlGatewayLogic.Current.IsGatewayExist(realWay) == true || HdlGatewayLogic.Current.GetGatewayBaseInfoAttribute(realWay, "IpAddress").ToString() == string.Empty) { //如果处理成功了,则不再处理 //本地如果已经有这个网关了,则不再处理 //IP没有的网关,我也不知道它是干嘛的 continue; } //网关绑定模式 var mode = GatewayBindMode.BindAgain; if (realWay.getGatewayBaseInfo.HomeId == Common.Config.Instance.HomeId) { //已经绑定过了 mode = GatewayBindMode.Binded; } else if (HdlGatewayLogic.Current.HomeIdIsEmpty(realWay) == true) { //第一次绑定,也就是网关住宅ID为空 mode = GatewayBindMode.First; } if (mode != GatewayBindMode.Binded) { //发现新网关,正在处理中,请稍后 string msg = Language.StringByID(R.MyInternationalizationString.uFindNewGatewayPleaseWaitToBinding); this.ShowProgressBar(msg); } //执行绑定网关操作(无条件直接绑定,哪怕是住宅ID不一样) var result = await this.DoSaveGateway(realWay, ShowErrorMode.YES, mode); if (mode != GatewayBindMode.Binded) { //关闭进度条 this.CloseProgressBar(); } //虽然出错了,但是可以无限处理 if (result == -1) { continue; } //记录处理成功的网关 listCheck.Add(gwId); //网关绑定在当前账号下的其他住宅里\r\n请解除绑定后再试(IP地址) if (result == 0) { continue; } //我觉得这里需要获取一下新网关的设备列表 await Common.LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay); Application.RunOnMainThread(() => { if (this.Parent != null) { //搜索得到无线网关 if (mode != GatewayBindMode.Binded) { var form = new GatewayInfoAddForm(); this.AddFromAndRemoveNowForm(form, realWay); } } }); //搜索得到无线网关,则中断线程 if (mode != GatewayBindMode.Binded) { this.animateThread = false; return; } } } }); } #endregion #region ■ 执行网关保存_______________________ /// /// 执行网关保存(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面) /// /// 网关对象 /// 是否显示错误 /// 绑定方式 /// private async Task DoSaveGateway(ZbGateway zbGateway, ShowErrorMode mode, GatewayBindMode bindMode) { //添加搜索到的网关到缓存 //1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面 int result = 0; if (bindMode == GatewayBindMode.BindAgain) { result = await HdlGatewayLogic.Current.ReBindNewGateway(zbGateway); } else { result = await HdlGatewayLogic.Current.AddNewGateway(zbGateway, mode); } if (result == -1) { return result; } //前的网关绑定在了当前账号下的不同住宅里面 if (result == 0) { //网关绑定在当前账号下的其他住宅里\r\n请解除绑定后再试(IP地址) string msg = Language.StringByID(R.MyInternationalizationString.uTheGatewayInOtherResidenceMsg); if (msg.Contains("{0}") == true) { msg = string.Format(msg, "\r\n") + "(" + HdlGatewayLogic.Current.GetGatewayBaseInfoAttribute(zbGateway, "IpAddress").ToString() + ")"; } this.ShowMassage(ShowMsgType.Tip, msg); } return result; } #endregion #region ■ 界面关闭___________________________ /// /// 界面关闭 /// public override void CloseForm() { this.animateThread = false; ZigBee.Common.Application.IsSearchingGateway = false; //停止Wi-Fi配网 //Com.Mediatek.Elian.ElianNative.StopSmartConnection(); if (UserCenterResourse.listActionFormId.Contains("GatewayManagementForm") == false) { //刷新主页 UserView.UserPage.Instance.Fresh(); } base.CloseForm(); } #endregion } }