| | |
| | | }
|
| | | //切换网关,保存缓存
|
| | | this.SaveGatewayIdToLocation(gatewayId);
|
| | | //切换网关的话,主页需要重新刷新
|
| | | UserView.UserPage.Instance.RefreshForm = true;
|
| | |
|
| | | return true;
|
| | | }
|
| | |
|
| | |
| | | /// 刷新网关的在线状态(注意,刷新的是缓存,请调用CheckGatewayOnlineByFlag来判断是否在线)
|
| | | /// </summary>
|
| | | /// <param name="listGateway"></param>
|
| | | /// <param name="waitTime">局域网的时候,时候等待3秒延迟</param>
|
| | | /// <returns></returns> |
| | | public void RefreshGatewayOnlineStatu(List<ZbGateway> listGateway, bool waitTime = true)
|
| | | public void RefreshGatewayOnlineStatu(List<ZbGateway> listGateway)
|
| | | {
|
| | | var listRealWay = new List<ZbGateway>();
|
| | | for (int i = 0; i < listGateway.Count; i++)
|
| | |
| | | {
|
| | | //虚拟物理网关
|
| | | listRealWay.Add(listGateway[i]);
|
| | | if (waitTime == false)
|
| | | {
|
| | | //不等待的话,标识指定网关为不在线
|
| | | this.SetGatewayNotOnLineFlag(listRealWay[i]);
|
| | | }
|
| | | }
|
| | | if (waitTime == true)
|
| | | {
|
| | | //只有等待的时候,才标识指定网关为不在线
|
| | | this.SetGatewayNotOnLineFlag(listRealWay[i]);
|
| | | }
|
| | | //标识指定网关为不在线
|
| | | listRealWay[i].GatewayOnlineFlage = false;
|
| | | }
|
| | |
|
| | | if (waitTime == true)
|
| | | //这是第一道坎,强制检查WIFI:等待2秒(因为wifi的时候,它会自动去刷新flage)
|
| | | System.Threading.Thread.Sleep(2000);
|
| | | //检查是否拥有网关存在于WIFi下
|
| | | if (this.CheckHadGatewayInWifi(listRealWay) == false)
|
| | | {
|
| | | //这是第一道坎,强制检查WIFI:等待2秒(因为wifi的时候,它会自动去刷新flage)
|
| | | System.Threading.Thread.Sleep(2000);
|
| | | //检查是否拥有网关存在于WIFi下
|
| | | if (this.CheckHadGatewayInWifi(listRealWay) == false)
|
| | | {
|
| | | //第二道坎:在远程的情况下刷新网关的在线状态
|
| | | this.RefreshGatewayOnlineOnRemode(listRealWay);
|
| | | }
|
| | | //第二道坎:在远程的情况下刷新网关的在线状态
|
| | | this.RefreshGatewayOnlineOnRemode(listRealWay);
|
| | | }
|
| | |
|
| | | //刷新缓存的在线标识
|
| | |
| | | continue;
|
| | | }
|
| | | this.dicGateway[gwID].GatewayOnlineFlage = zbway.GatewayOnlineFlage;
|
| | | this.dicGateway[gwID].ReSave();
|
| | | }
|
| | | } |
| | | |
| | |
| | | continue;
|
| | | }
|
| | | string strId = this.GetGatewayId(way);
|
| | | if (dicDbGateway.ContainsKey(strId) == true //如果云端上面有这个网关
|
| | | && dicDbGateway[strId].MqttOnlineStatus == true //如果云端上面这个网关是在线的
|
| | | )
|
| | | if (dicDbGateway.ContainsKey(strId) == true) //如果云端上面有这个网关
|
| | | {
|
| | | way.GatewayOnlineFlage = true;
|
| | | way.GatewayOnlineFlage = dicDbGateway[strId].MqttOnlineStatus;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 标识指定网关为不在线
|
| | | /// </summary>
|
| | | /// <param name="zbGateway"></param> |
| | | public void SetGatewayNotOnLineFlag(ZbGateway zbGateway)
|
| | | {
|
| | | if (zbGateway == null)
|
| | | {
|
| | | return;
|
| | | }
|
| | | zbGateway.GatewayOnlineFlage = false;
|
| | | } |
| | | |
| | | /// <summary>
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | #endregion |
| | |
|
| | | #region ■ 网关监视___________________________
|
| | |
|
| | | #region ■ 变量声明___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 当前的网络连接模式
|
| | | /// </summary>
|
| | | private GatewayConnectMode nowGwConnectMode = GatewayConnectMode.None;
|
| | | /// <summary>
|
| | | /// 是否存在网关正在升级
|
| | | /// </summary>
|
| | | private bool hadGatewayUpdate = false;
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 网关连接方式变更___________________
|
| | |
|
| | | /// <summary>
|
| | | /// 当网关的连接方式改变时,检测网关,然后显示特效
|
| | | /// </summary>
|
| | | /// <param name="connectMode">网关变更后的连接方式</param>
|
| | | public void CheckGatewayByConnectChanged(GatewayConnectMode connectMode)
|
| | | {
|
| | | if (this.nowGwConnectMode == connectMode || this.hadGatewayUpdate == true)
|
| | | {
|
| | | //相同的连接模式,或者有网关正在升级,则不需要操作
|
| | | return;
|
| | | }
|
| | |
|
| | | //没有网络
|
| | | if (connectMode == GatewayConnectMode.NoLine)
|
| | | {
|
| | | nowGwConnectMode = GatewayConnectMode.NoLine;
|
| | | //在远程的条件下,检查网关的在线状态(网络变更时触发)
|
| | | }
|
| | | //可以叫4G
|
| | | else if (connectMode == GatewayConnectMode.Remote)
|
| | | {
|
| | | nowGwConnectMode = GatewayConnectMode.Remote;
|
| | | //在远程的条件下,检查网关的在线状态(网络变更时触发)
|
| | | this.CheckGatewayStatuByRemote();
|
| | | }
|
| | | //WIFI
|
| | | else if (connectMode == GatewayConnectMode.WIFI)
|
| | | {
|
| | | nowGwConnectMode = GatewayConnectMode.WIFI;
|
| | | //在WIFI的条件下,检查网关的在线状态(网络变更时触发)
|
| | | this.CheckGatewayStatuByWIFI();
|
| | | }
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 检查网关(WIFI)_____________________
|
| | |
|
| | | /// <summary>
|
| | | /// 在WIFI的条件下,检查网关的在线状态(网络变更时触发)
|
| | | /// </summary>
|
| | | private void CheckGatewayStatuByWIFI()
|
| | | {
|
| | | if (this.dicGateway.Count == 0)
|
| | | {
|
| | | //如果本地都没有网关的话,不需要处理
|
| | | return;
|
| | | }
|
| | |
|
| | | HdlThreadLogic.Current.RunThread(() =>
|
| | | {
|
| | | var dicStatu = this.GetNowOnlineStatuBeforeCheck();
|
| | | //等个3秒,准备一下
|
| | | System.Threading.Thread.Sleep(3000);
|
| | | if (nowGwConnectMode != GatewayConnectMode.WIFI)
|
| | | {
|
| | | //网络临时变更??
|
| | | return;
|
| | | }
|
| | |
|
| | | //从网关获取全部的网关
|
| | | List<ZbGateway> list = this.GetAllGatewayFromGateway();
|
| | | foreach (var way in list)
|
| | | {
|
| | | string gwId = this.GetGatewayId(way);
|
| | | if (this.dicGateway.ContainsKey(gwId) == true)
|
| | | {
|
| | | //刷新一下缓存
|
| | | this.dicGateway[gwId].GatewayOnlineFlage = way.GatewayOnlineFlage;
|
| | | }
|
| | | if (this.CheckGatewayOnlineByFlag(way) == true)
|
| | | {
|
| | | //网关在线
|
| | | dicStatu[gwId] = true;
|
| | | }
|
| | | }
|
| | | //将变化的网关推送到界面上
|
| | | this.PushGatewayOnlineStatuToForm(dicStatu);
|
| | | });
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 检查网关(4G)_______________________
|
| | |
|
| | | /// <summary>
|
| | | /// 在远程的条件下,检查网关的在线状态(网络变更时触发)
|
| | | /// </summary>
|
| | | private void CheckGatewayStatuByRemote()
|
| | | {
|
| | | if (this.dicGateway.Count == 0)
|
| | | {
|
| | | //如果本地都没有网关的话,不需要处理
|
| | | return;
|
| | | }
|
| | |
|
| | | HdlThreadLogic.Current.RunThread(() =>
|
| | | {
|
| | | //先获取现在全部的网关,初期値设置为不在线
|
| | | var dicStatu = this.GetNowOnlineStatuBeforeCheck();
|
| | |
|
| | | //获取云端上面的网关
|
| | | Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
|
| | | if (nowGwConnectMode != GatewayConnectMode.Remote || dicDbGateway == null)
|
| | | {
|
| | | //网络临时变更??
|
| | | return;
|
| | | }
|
| | |
|
| | | bool hadOnline = false;
|
| | | lock (dicGateway)
|
| | | {
|
| | | foreach (var way in this.dicGateway.Values)
|
| | | {
|
| | | //循环处理本地全部的网关列表
|
| | | string gwId = this.GetGatewayId(way);
|
| | | if (dicDbGateway.ContainsKey(gwId) == true//如果云端上面有这个网关
|
| | | && dicDbGateway[gwId].MqttOnlineStatus == true//如果云端上面这个网关是在线的
|
| | | )
|
| | | {
|
| | | dicGateway[gwId].GatewayOnlineFlage = true;
|
| | | //它是在线的
|
| | | dicStatu[gwId] = true;
|
| | | hadOnline = true;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //将变化的网关推送到界面上
|
| | | this.PushGatewayOnlineStatuToForm(dicStatu);
|
| | |
|
| | | //如果没有网关在线
|
| | | if (hadOnline == false)
|
| | | {
|
| | | //远程连接超时,没有网关在线
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uRemoteTimeOutAndNotGatewaiOnline);
|
| | | //this.ShowTipMsg(msg);
|
| | | }
|
| | | });
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 检查网关(无网络)___________________
|
| | |
|
| | | /// <summary>
|
| | | /// 在远程的条件下,检查网关的在线状态(网络变更时触发)
|
| | | /// </summary>
|
| | | private void CheckGatewayStatuByNotNet()
|
| | | {
|
| | | //当前无网络连接,请确认网络
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uNowIsDonotNetworkAndCheckNetwork);
|
| | | this.ShowTipMsg(msg);
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 网关推送___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 将变化的网关推送到界面上
|
| | | /// </summary>
|
| | | /// <param name="dicStatu"></param>
|
| | | private void PushGatewayOnlineStatuToForm(Dictionary<string, bool> dicStatu)
|
| | | {
|
| | | List<ZbGateway> listChange = new List<ZbGateway>();
|
| | | List<bool> listChangeStatu = new List<bool>();
|
| | | foreach (string gwid in dicStatu.Keys)
|
| | | {
|
| | | //网关不多,直接推送,不判断是否改变了
|
| | | ZbGateway zbGateway = this.GetLocalGateway(gwid);
|
| | | if (zbGateway != null)
|
| | | {
|
| | | listChange.Add(zbGateway);
|
| | | listChangeStatu.Add(dicStatu[gwid]);
|
| | |
|
| | | zbGateway.GatewayOnlineFlage = dicStatu[gwid];
|
| | | }
|
| | | }
|
| | |
|
| | | if (listChange.Count == 0)
|
| | | {
|
| | | return;
|
| | | }
|
| | | //保存当前激活的界面ID
|
| | | var listId = new List<string>();
|
| | | listId.AddRange(UserCenterResourse.listActionFormId);
|
| | | for (int i = 0; i < listId.Count; i++)
|
| | | {
|
| | | if (UserCenterResourse.DicActionForm.ContainsKey(listId[i]) == false)
|
| | | {
|
| | | continue;
|
| | | }
|
| | | //网关在线推送
|
| | | for (int j = 0; j < listChange.Count; j++)
|
| | | {
|
| | | UserCenterResourse.DicActionForm[listId[i]]?.GatewayOnlinePush(listChange[j], listChangeStatu[j]);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 一般方法___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 设置存在网关正在升级的标识
|
| | | /// </summary>
|
| | | /// <param name="update">是否有网关在升级</param>
|
| | | public void SetHadGatewayUpdateFlage(bool update)
|
| | | {
|
| | | this.hadGatewayUpdate = update;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 在网络连接变更之后,网关连接检测之前,设置全部网关为离线状态(以本地网关为标准)
|
| | | /// </summary>
|
| | | /// <returns></returns>
|
| | | private Dictionary<string, bool> GetNowOnlineStatuBeforeCheck()
|
| | | {
|
| | | //先获取现在全部的网关
|
| | | List<ZbGateway> listOldGateway = this.GetAllGatewayFromGateway();
|
| | | var dicOldZb = new Dictionary<string, ZbGateway>();
|
| | | foreach (var zb in listOldGateway)
|
| | | {
|
| | | string gwID = this.GetGatewayId(zb);
|
| | | dicOldZb[gwID] = zb;
|
| | | }
|
| | |
|
| | | var dicStatu = new Dictionary<string, bool>();
|
| | | lock (dicGateway)
|
| | | {
|
| | | foreach (string gwId in this.dicGateway.Keys)
|
| | | {
|
| | | if (dicOldZb.ContainsKey(gwId) == true)
|
| | | {
|
| | | //标记为不在线
|
| | | this.SetGatewayNotOnLineFlag(dicOldZb[gwId]);
|
| | | }
|
| | | dicStatu[gwId] = false;
|
| | | }
|
| | | }
|
| | | return dicStatu;
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 从云端获取全部网关列表ID___________
|
| | |
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 恢复网关___________________________
|
| | | #region ■ 网关监视___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 恢复网关配置
|
| | | /// 当前的网络连接模式
|
| | | /// </summary>
|
| | | /// <param name="zbGateway">网关对象</param>
|
| | | /// <param name="listGatewayFile">网关里面拥有的文件</param>
|
| | | /// <param name="backDirectory">云端下载的备份数据的文件夹名字</param>
|
| | | /// <returns></returns>
|
| | | public async Task<bool> RecoverGatewaySettion(ZbGateway zbGateway, List<string> listGatewayFile, string backDirectory)
|
| | | private GatewayConnectMode nowGwConnectMode = GatewayConnectMode.None;
|
| | | /// <summary>
|
| | | /// 是否存在网关正在升级
|
| | | /// </summary>
|
| | | private bool hadGatewayUpdate = false;
|
| | |
|
| | | /// <summary>
|
| | | /// 当网关的连接方式改变时,记录当前的连接方式
|
| | | /// </summary>
|
| | | /// <param name="connectMode">网关变更后的连接方式</param>
|
| | | public void CheckGatewayByConnectChanged(GatewayConnectMode connectMode)
|
| | | {
|
| | | //获取从云端那里得来的全部文件
|
| | | var listBackFile = HdlAutoBackupLogic.GetFileFromDirectory(UserCenterLogic.CombinePath(backDirectory));
|
| | | listBackFile.Sort();
|
| | | //添加附加情报:还原设备配置
|
| | | ProgressBar.SetAppendText(Language.StringByID(R.MyInternationalizationString.uRecoverDeviceSettion));
|
| | | ProgressBar.SetMaxValue(listBackFile.Count);
|
| | | ProgressBar.Show();
|
| | |
|
| | | var listSaveFile = new HashSet<string>();
|
| | | foreach (string fileName in listBackFile)
|
| | | {
|
| | | if (fileName.Length < 10 || fileName.StartsWith("Device_") == false)
|
| | | {
|
| | | //不是设备备份文件
|
| | | continue;
|
| | | }
|
| | | //恢复设备配置
|
| | | var result = await this.RecoverDeviceSettion(backDirectory, fileName);
|
| | | if (result == -1)
|
| | | {
|
| | | ProgressBar.Close();
|
| | | return false;
|
| | | }
|
| | | if (result == 1 || result == 2)
|
| | | {
|
| | | listSaveFile.Add(fileName);
|
| | | }
|
| | |
|
| | | ProgressBar.SetValue(1);
|
| | | listGatewayFile.Remove(fileName);
|
| | | }
|
| | | //添加附加情报:覆盖网关备份中
|
| | | ProgressBar.SetAppendText(Language.StringByID(R.MyInternationalizationString.uGatewayBackupDataIsCovering));
|
| | | foreach (var file in listSaveFile)
|
| | | {
|
| | | //创建文件对象
|
| | | var result = await zbGateway.CreateFileAsync(file);
|
| | | if (result == null || result.Result != 0)
|
| | | {
|
| | | Application.RunOnMainThread(() =>
|
| | | {
|
| | | //覆盖网关备份失败
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uCoverGatewayBackupDataFail);
|
| | | var control = new ShowMsgControl(ShowMsgType.Tip, msg);
|
| | | control.Show();
|
| | | });
|
| | | ProgressBar.Close();
|
| | | return false;
|
| | | }
|
| | | //发送数据流
|
| | | var byteData = Shared.Common.Global.ReadFileByDirectory(backDirectory, file);
|
| | | var result2 = await zbGateway.SendFileAsync(byteData);
|
| | | if (result2 == null || result2.Result != 0)
|
| | | {
|
| | | Application.RunOnMainThread(() =>
|
| | | {
|
| | | //覆盖网关备份失败
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uCoverGatewayBackupDataFail);
|
| | | var control = new ShowMsgControl(ShowMsgType.Tip, msg);
|
| | | control.Show();
|
| | | });
|
| | | ProgressBar.Close();
|
| | | return false;
|
| | | }
|
| | | }
|
| | | //删除多余的文件
|
| | | foreach (var deleteFile in listGatewayFile)
|
| | | {
|
| | | if (deleteFile.Length > 12)
|
| | | {
|
| | | string deviceFileName = deleteFile.Substring(5);
|
| | | if (deviceFileName.StartsWith("Device_") == false)
|
| | | {
|
| | | //不是设备文件
|
| | | continue;
|
| | | }
|
| | | string[] strArry = deviceFileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
|
| | | if (strArry.Length < 4 || listSaveFile.Contains(deleteFile) == true)
|
| | | {
|
| | | //我也不知道它是什么文件,或者这个文件是覆盖的
|
| | | continue;
|
| | | }
|
| | | //这个或许可以不理他
|
| | | var result = await zbGateway.DelFileOrDirAsync("/etc/hdlDat/" + deleteFile);
|
| | | }
|
| | | }
|
| | | ProgressBar.Close();
|
| | |
|
| | | return true;
|
| | | this.nowGwConnectMode = connectMode;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 恢复设备配置
|
| | | /// 开启检测网关在线状态的线程(此方法是给设备列表界面用的)
|
| | | /// </summary>
|
| | | /// <param name="backDirectory">云端下载的备份数据的文件夹名字</param>
|
| | | /// <param name="backFileName">网关的设备备份名字</param>
|
| | | /// <returns></returns>
|
| | | private async Task<int> RecoverDeviceSettion(string backDirectory, string backFileName)
|
| | | /// <param name="frameLayout">界面对象</param>
|
| | | public void StartCheckGatewayOnlineThread(EditorCommonForm frameLayout)
|
| | | {
|
| | | string deviceFileName = backFileName.Substring(0, backFileName.Length - 5);
|
| | | string[] strArry = deviceFileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
|
| | | if (strArry.Length < 4)
|
| | | HdlThreadLogic.Current.RunThread(() =>
|
| | | {
|
| | | //我也不知道它是什么文件
|
| | | return 0;
|
| | | }
|
| | | var device = Common.LocalDevice.Current.GetDevice(strArry[2], Convert.ToInt32(strArry[3]));
|
| | | if (device == null)
|
| | | {
|
| | | //这个设备不见了
|
| | | return 2;
|
| | | }
|
| | |
|
| | | var byteData = Shared.Common.Global.ReadFileByDirectory(backDirectory, backFileName);
|
| | | var backType = (GatewayBackupEnum)Convert.ToInt32(backFileName.Substring(backFileName.Length - 5, 5));
|
| | |
|
| | | bool result = true;
|
| | | if (backType == GatewayBackupEnum.AMac名称)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await Common.LocalDevice.Current.ReMacName(new List<CommonDevice>() { device }, recoverData);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A端点名称)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await Common.LocalDevice.Current.ReName(device, recoverData);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.APir灯光配置)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<IASZone.ConfigureParamates>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await HdlDevicePirSensorLogic.Current.SetPirSensorSettion((IASZone)device, recoverData);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A干接点颜色调节)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Panel.KeyColorData>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await HdlDevicePanelLogic.Current.SetPanelEpointColorInfo((Panel)device, recoverData);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A干接点亮度调节)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | int directionsLevel = Convert.ToInt32(recoverData["directionsLevel"]);
|
| | | int backlightLevel = Convert.ToInt32(recoverData["backlightLevel"]);
|
| | | result = await HdlDevicePanelLogic.Current.SetDeviceLightSettion((Panel)device, directionsLevel, backlightLevel);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A干接点节能模式)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | bool modeEnable = Convert.ToBoolean(recoverData["modeEnable"]);
|
| | | int modeTime = Convert.ToInt32(recoverData["modeTime"]);
|
| | | int level = Convert.ToInt32(recoverData["level"]);
|
| | | result = await HdlDevicePanelLogic.Current.SetDeviceEnergyConservationMode((Panel)device, modeEnable, modeTime, level);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A干接点第三级别私有属性)
|
| | | {
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await HdlDevicePanelLogic.Current.EditorDryContactThirdFunction((Panel)device, recoverData);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A窗帘方向)
|
| | | {
|
| | | var statu = Newtonsoft.Json.JsonConvert.DeserializeObject<bool>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await HdlDeviceCurtainLogic.Current.SetCurtainDirection((Rollershade)device, statu);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A窗帘手拉控制)
|
| | | {
|
| | | var statu = Newtonsoft.Json.JsonConvert.DeserializeObject<bool>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await HdlDeviceCurtainLogic.Current.SetHandPullControl((Rollershade)device, statu);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A窗帘上下限位)
|
| | | {
|
| | | var curtainDevice = (Rollershade)device;
|
| | | var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | int upLimit = Convert.ToInt32(recoverData["upLimit"]);
|
| | | int downLimit = Convert.ToInt32(recoverData["downLimit"]);
|
| | | //先重置窗帘
|
| | | result = await HdlDeviceCurtainLogic.Current.RestoreCurtain(curtainDevice);
|
| | | if (result == false) { return -1; }
|
| | | await Task.Delay(5000);
|
| | | //重置上限位
|
| | | result = await HdlDeviceCurtainLogic.Current.DeleteCurtainLimitPoint(curtainDevice, Rollershade.LimiType.UpLimit);
|
| | | if (result == false) { return -1; }
|
| | | //将窗帘调整到指定百分比
|
| | | curtainDevice.WcdGoToTiltValue(upLimit);
|
| | | await Task.Delay(3000);
|
| | | //执行确认及覆盖窗帘限位点
|
| | | result = await HdlDeviceCurtainLogic.Current.CommitCurtainLimitPoint(curtainDevice, Rollershade.CurtainPrivateInstalledLimi.UpLimit, -1, -1);
|
| | | if (result == false) { return -1; }
|
| | |
|
| | | await Task.Delay(2000);
|
| | | //重置下限位
|
| | | result = await HdlDeviceCurtainLogic.Current.DeleteCurtainLimitPoint(curtainDevice, Rollershade.LimiType.DownLimit);
|
| | | if (result == false) { return -1; }
|
| | | //将窗帘调整到指定百分比
|
| | | curtainDevice.WcdGoToTiltValue(downLimit);
|
| | | await Task.Delay(3000);
|
| | | //执行确认及覆盖窗帘限位点
|
| | | result = await HdlDeviceCurtainLogic.Current.CommitCurtainLimitPoint(curtainDevice, Rollershade.CurtainPrivateInstalledLimi.DownLimit, -1, -1);
|
| | | }
|
| | | else if (backType == GatewayBackupEnum.A空调自定义模式)
|
| | | {
|
| | | var data = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(System.Text.Encoding.UTF8.GetString(byteData));
|
| | | result = await HdlDeviceAirConditionerLogic.Current.SetAcModeSupport((AC)device, data);
|
| | | if (result == true)
|
| | | int waitCount = 0;
|
| | | //如果住宅ID变更了,则不再处理
|
| | | while (frameLayout.Parent != null)
|
| | | {
|
| | | //转换为二进制
|
| | | var value = Convert.ToString(data, 2).PadLeft(16, '0');
|
| | | //这五个设置是放在后面的
|
| | | var fixValue = value.Substring(0, value.Length - 5);
|
| | | var reportValue = value.Substring(fixValue.Length);
|
| | | //更改缓存
|
| | | for (int i = 0; i < reportValue.Length; i++)
|
| | | System.Threading.Thread.Sleep(1000);
|
| | | if (this.hadGatewayUpdate == true)
|
| | | {
|
| | | ((AC)device).listSupportMode[i] = Convert.ToInt32(reportValue[i]);
|
| | | //网关正在升级,不需要操作
|
| | | continue;
|
| | | }
|
| | | device.ReSave();
|
| | |
|
| | | waitCount++;
|
| | | if (this.nowGwConnectMode == GatewayConnectMode.Remote)
|
| | | {
|
| | | //远程每10秒检测一次
|
| | | if (waitCount < 10) { continue; }
|
| | | }
|
| | | else if (this.nowGwConnectMode == GatewayConnectMode.WIFI)
|
| | | {
|
| | | //局域网每3秒检测一次
|
| | | if (waitCount < 3) { continue; }
|
| | | }
|
| | | waitCount = 0;
|
| | |
|
| | | //获取前回网关的在线状态
|
| | | Dictionary<string, bool> dicOldOnline = this.GetOldGatewayOnlineStatu();
|
| | | if (dicOldOnline == null)
|
| | | {
|
| | | //则不处理
|
| | | continue;
|
| | | }
|
| | | //可以叫4G
|
| | | if (this.nowGwConnectMode == GatewayConnectMode.Remote)
|
| | | {
|
| | | //在远程的条件下,检查网关的在线状态
|
| | | this.CheckGatewayStatuByRemote(dicOldOnline);
|
| | | }
|
| | | //WIFI
|
| | | else if (this.nowGwConnectMode == GatewayConnectMode.WIFI)
|
| | | {
|
| | | //在WIFI的条件下,检查网关的在线状态
|
| | | this.CheckGatewayStatuByWIFI(dicOldOnline);
|
| | | }
|
| | | }
|
| | | }, ShowErrorMode.NO);
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 在WIFI的条件下,检查网关的在线状态
|
| | | /// </summary>
|
| | | private void CheckGatewayStatuByWIFI(Dictionary<string, bool> dicOldOnline)
|
| | | {
|
| | | //从网关获取全部的网关
|
| | | List<ZbGateway> list = this.GetAllGatewayFromGateway();
|
| | | foreach (var way in list)
|
| | | {
|
| | | //将标识置为false
|
| | | way.GatewayOnlineFlage = false;
|
| | | }
|
| | | //等个2秒
|
| | | System.Threading.Thread.Sleep(2000);
|
| | |
|
| | | foreach (var way in list)
|
| | | {
|
| | | string gwId = this.GetGatewayId(way);
|
| | | if (dicOldOnline.ContainsKey(gwId) == true)
|
| | | {
|
| | | //网关也不多,直接推送吧
|
| | | this.PushGatewayOnlineStatuToForm(gwId, way.GatewayOnlineFlage);
|
| | | }
|
| | | else
|
| | | {
|
| | | //没有包含,默认为false
|
| | | this.PushGatewayOnlineStatuToForm(gwId, false);
|
| | | }
|
| | | }
|
| | | return result == true ? 1 : -1;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 在远程的条件下,检查网关的在线状态
|
| | | /// </summary>
|
| | | private void CheckGatewayStatuByRemote(Dictionary<string, bool> dicOldOnline)
|
| | | {
|
| | | //获取云端上面的网关
|
| | | Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
|
| | | if (dicDbGateway == null)
|
| | | {
|
| | | //如果网络不通,则也往下走
|
| | | dicDbGateway = new Dictionary<string, GatewayResult>();
|
| | | }
|
| | |
|
| | | foreach (var gwId in dicOldOnline.Keys)
|
| | | {
|
| | | //如果云端上面有这个网关
|
| | | if (dicDbGateway.ContainsKey(gwId) == true)
|
| | | {
|
| | | //网关也不多,直接推送
|
| | | this.PushGatewayOnlineStatuToForm(gwId, dicDbGateway[gwId].MqttOnlineStatus);
|
| | | }
|
| | | else
|
| | | {
|
| | | //云端不包含的,当不在线处理
|
| | | this.PushGatewayOnlineStatuToForm(gwId, false);
|
| | | }
|
| | | }
|
| | |
|
| | | |
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 获取前回网关的在线状态
|
| | | /// </summary>
|
| | | /// <returns></returns>
|
| | | private Dictionary<string, bool> GetOldGatewayOnlineStatu()
|
| | | {
|
| | | if (this.dicGateway.Count == 0)
|
| | | {
|
| | | //没有网关,则不处理
|
| | | return null;
|
| | | }
|
| | |
|
| | | try
|
| | | {
|
| | | var dicOldOnline = new Dictionary<string, bool>();
|
| | | //如果在循环的过程中,动了里面的东西,报错则不理它,下一回合
|
| | | foreach (var zbway in this.dicGateway.Values)
|
| | | {
|
| | | //获取前回的在线状态
|
| | | string gwId = this.GetGatewayId(zbway);
|
| | | dicOldOnline[gwId] = zbway.GatewayOnlineFlage;
|
| | | }
|
| | | return dicOldOnline;
|
| | | }
|
| | | catch { return null; }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 将变化的网关推送到界面上
|
| | | /// </summary>
|
| | | /// <param name="gwId"></param>
|
| | | /// <param name="online"></param>
|
| | | private void PushGatewayOnlineStatuToForm(string gwId, bool online)
|
| | | {
|
| | | try
|
| | | {
|
| | | for (int i = 0; i < UserCenterResourse.listActionFormId.Count; i++)
|
| | | {
|
| | | string formId = UserCenterResourse.listActionFormId[i];
|
| | | if (UserCenterResourse.DicActionForm.ContainsKey(formId) == false)
|
| | | {
|
| | | continue;
|
| | | }
|
| | | //网关在线推送
|
| | | var zbway = this.GetLocalGateway(gwId);
|
| | | zbway.GatewayOnlineFlage = online;
|
| | |
|
| | | UserCenterResourse.DicActionForm[formId]?.GatewayOnlinePush(zbway, online);
|
| | | }
|
| | | }
|
| | | catch { }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 设置存在网关正在升级的标识
|
| | | /// </summary>
|
| | | /// <param name="update">是否有网关在升级</param>
|
| | | public void SetHadGatewayUpdateFlage(bool update)
|
| | | {
|
| | | this.hadGatewayUpdate = update;
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 一般方法___________________________ |
| | |
|
| | | /// <summary>
|
| | | /// 弹出网关不在线的
|
| | | /// </summary> |
| | | private void ShowGatewayNotOnlineMsg()
|
| | | {
|
| | | Application.RunOnMainThread(() =>
|
| | | {
|
| | | //网关连接失败,请确认网络
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uGatewayIsNotLinkAndCheckNetwork);
|
| | | var control = new ShowMsgControl(ShowMsgType.Tip, msg);
|
| | | control.Show();
|
| | | });
|
| | | }
|
| | | #region ■ 一般方法___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 显示错误信息窗口
|