using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using System.Threading.Tasks;
|
using ZigBee.Device;
|
|
namespace Shared.Phone.UserCenter.GatewayAdd
|
{
|
/// <summary>
|
/// 无线网关UDP模式的搜索界面
|
/// </summary>
|
public class WirelessUdpSearchForm : EditorCommonForm
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 搜索到的网关列表
|
/// </summary>
|
private List<ZbGateway> listZbGateway = new List<ZbGateway>();
|
/// <summary>
|
/// 搜索到的网关类别 0:第一次绑定 1:已经绑定 2:需要换绑
|
/// </summary>
|
private Dictionary<string, int> dicZbGatewayDiv = new Dictionary<string, int>();
|
/// <summary>
|
/// 获取得到了新网关
|
/// </summary>
|
private bool newGatewayGetting = false;
|
/// <summary>
|
/// 网关搜索中
|
/// </summary>
|
private bool isGatewaySearching = true;
|
|
#endregion
|
|
#region ■ 初始化_____________________________
|
|
/// <summary>
|
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
|
/// </summary>
|
public void ShowForm()
|
{
|
//设置标题信息
|
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddWirelessGateway));
|
|
//初始化中部控件
|
this.InitDefultMiddleFrame();
|
}
|
|
/// <summary>
|
/// 初始化中部控件
|
/// </summary>
|
private void InitDefultMiddleFrame()
|
{
|
//清空bodyFrame
|
this.ClearBodyFrame();
|
|
//网关如果正常连接路由器{0}系统指示灯会1秒闪烁
|
string[] ArryMsg = Language.StringByID(R.MyInternationalizationString.uAddUdpWirelessGatewayMsg1).Split(new string[] { "{0}" }, StringSplitOptions.RemoveEmptyEntries);
|
int yy = Application.GetRealHeight(1037);
|
foreach (var msg in ArryMsg)
|
{
|
var btnMsg = new NormalViewControl(bodyFrameLayout.Width, Application.GetRealHeight(60), false);
|
btnMsg.Text = msg;
|
btnMsg.Y = yy;
|
btnMsg.TextAlignment = TextAlignment.Center;
|
btnMsg.TextColor = UserCenterColor.Current.TextGrayColor1;
|
bodyFrameLayout.AddChidren(btnMsg);
|
yy = btnMsg.Bottom;
|
}
|
|
//初始化连接的假想动画效果
|
this.InitConcetionAnimete();
|
//开启网关检测的线程
|
this.StartCheckGatewayThread();
|
}
|
|
/// <summary>
|
/// 初始化失败模式的中部控件
|
/// </summary>
|
private void InitFailMiddleFrame()
|
{
|
//清空bodyFrame
|
this.ClearBodyFrame();
|
|
//图标
|
var picGwImage = new FrameLayout();
|
picGwImage.Width = this.GetPictrueRealSize(852);
|
picGwImage.Height = this.GetPictrueRealSize(478);
|
picGwImage.Y = Application.GetRealWidth(158);
|
picGwImage.Gravity = Gravity.CenterHorizontal;
|
picGwImage.BackgroundImagePath = "Gateway/WirelessGatewaySearching.png";
|
bodyFrameLayout.AddChidren(picGwImage);
|
var btnFailIcon = new PicViewControl(66, 66);
|
btnFailIcon.UnSelectedImagePath = "Item/FailIcon.png";
|
btnFailIcon.Gravity = Gravity.CenterHorizontal;
|
btnFailIcon.Y = this.GetPictrueRealSize(200);
|
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 (HdlFormLogic.Current.IsFormOpen("GatewayListForm") == false)
|
{
|
//返回主页
|
btnGoBack.TextID = R.MyInternationalizationString.uGobackToHomePage;
|
}
|
bodyFrameLayout.AddChidren(btnGoBack);
|
btnGoBack.ButtonClickEvent += (sender, e) =>
|
{
|
this.CloseForm();
|
//关闭指定界面
|
HdlFormLogic.Current.CloseFormByFormName("NewGateWayMenuSelectForm");
|
};
|
}
|
|
#endregion
|
|
#region ■ 假想动画___________________________
|
|
/// <summary>
|
/// 初始化连接的假想动画效果
|
/// </summary>
|
private void InitConcetionAnimete()
|
{
|
//图标
|
var btnGwImage = new FrameLayout();
|
btnGwImage.Width = this.GetPictrueRealSize(852);
|
btnGwImage.Height = this.GetPictrueRealSize(478);
|
btnGwImage.Y = Application.GetRealHeight(193);
|
btnGwImage.Gravity = Gravity.CenterHorizontal;
|
btnGwImage.BackgroundImagePath = "Gateway/WirelessGatewaySearching.png";
|
bodyFrameLayout.AddChidren(btnGwImage);
|
|
//正在搜索网关…
|
var btnMsg = new NormalViewControl(bodyFrameLayout.Width, Application.GetRealHeight(60), false);
|
btnMsg.TextID = R.MyInternationalizationString.uGatewaySearching;
|
btnMsg.Y = Application.GetRealHeight(821);
|
btnMsg.TextColor = UserCenterColor.Current.TextGrayColor3;
|
btnMsg.TextAlignment = TextAlignment.Center;
|
bodyFrameLayout.AddChidren(btnMsg);
|
|
//首格的X轴
|
int firstPoint = this.GetPictrueRealSize(280);
|
//一格的宽度
|
int width = this.GetPictrueRealSize(22);
|
//间距大小
|
int space = this.GetPictrueRealSize(12);
|
|
//生成格子坐标
|
var listPoint = new List<int>();
|
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(225);
|
btnRound.X = listPoint[0];
|
btnGwImage.AddChidren(btnRound);
|
|
string strMsg = btnMsg.Text;
|
HdlThreadLogic.Current.RunThread(() =>
|
{
|
int index = 1;
|
//计时时间
|
int timeCount = 0;
|
//超时时间
|
int timeOut = 240;
|
while (btnGwImage.Parent != null)
|
{
|
timeCount++;
|
if (timeCount == 10)
|
{
|
//5秒后清空网关列表
|
HdlGatewayLogic.Current.ClearAllRealGatewayConection(true);
|
ZigBee.Common.Application.IsSearchingGateway = true;
|
}
|
if (timeCount % 2 == 0)
|
{
|
timeOut--;
|
}
|
if (this.newGatewayGetting == true || timeOut <= 0)
|
{
|
//获取得到新网关,则中断线程
|
break;
|
}
|
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
btnRound.X = listPoint[index];
|
index++;
|
if (index == listPoint.Count)
|
{
|
index = 0;
|
}
|
//正在搜索网关…XXs
|
btnMsg.Text = strMsg + timeOut + "s";
|
}, ShowErrorMode.NO);
|
|
System.Threading.Thread.Sleep(500);
|
}
|
//搜索结束
|
this.isGatewaySearching = false;
|
|
//2020.07.14追加:倒计时结束时,哪怕是已经绑定了的网关,也显示出来
|
if (timeOut <= 0 && listZbGateway.Count == 0)
|
{
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
//初始化失败模式的中部控件
|
this.InitFailMiddleFrame();
|
});
|
}
|
else if (newGatewayGetting == true || listZbGateway.Count > 0)
|
{
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
if (this.Parent != null)
|
{
|
var form = new GatewayManage.GatewaySearchListForm();
|
this.AddFormAndCloseNowForm(form, listZbGateway, dicZbGatewayDiv);
|
}
|
});
|
}
|
});
|
}
|
|
#endregion
|
|
#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 bool CheckZbGatewayAndSetRow()
|
{
|
for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
|
{
|
var way = ZbGateway.GateWayList[i];
|
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;
|
}
|
|
//网关绑定模式
|
var mode = GatewayBindMode.BindAgain;
|
//住宅ID为空 第一次绑定
|
if (HdlGatewayLogic.Current.HomeIdIsEmpty(way) == true)
|
{
|
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 = HdlGatewayLogic.Current.AddNewGateway(way, ShowErrorMode.NO, WriteLogMode.YES);
|
if (result == false)
|
{
|
continue;
|
}
|
}
|
//收集网关对象
|
this.listZbGateway.Add(way);
|
|
//全部处理OK后,才能设置flage
|
if (mode == GatewayBindMode.First)
|
{
|
//第一次绑定
|
this.dicZbGatewayDiv[wayId] = 0;
|
//获取到了新网关
|
this.newGatewayGetting = true;
|
}
|
else if (mode == GatewayBindMode.Binded)
|
{
|
//已经绑定过
|
this.dicZbGatewayDiv[wayId] = 1;
|
}
|
else
|
{
|
//需要重新绑定
|
this.dicZbGatewayDiv[wayId] = 2;
|
//获取到了新网关
|
this.newGatewayGetting = true;
|
}
|
|
if (mode == GatewayBindMode.First || mode == GatewayBindMode.Binded)
|
{
|
//我觉得这里需要获取一下新网关的设备列表
|
HdlDeviceCommonLogic.Current.SetDeviceToMemmoryByGateway(way.GwId, true);
|
if (way.IsMainGateWay == true)
|
{
|
//如果它是主网关,则刷新场景列表
|
HdlSceneLogic.Current.RefreshSceneUIList(true);
|
}
|
}
|
}
|
return true;
|
}
|
|
#endregion
|
|
#region ■ 界面关闭___________________________
|
|
/// <summary>
|
/// 界面关闭
|
/// </summary>
|
public override void CloseFormBefore()
|
{
|
ZigBee.Common.Application.IsSearchingGateway = false;
|
//停止Wi-Fi配网
|
HdlWifiLogic.Current.StopSmartConnection();
|
|
base.CloseFormBefore();
|
}
|
|
#endregion
|
}
|
}
|