using Shared.Common; using System; using System.Collections.Generic; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 网关业务的逻辑类 /// public class HdlGatewayLogic { #region ■ 变量声明___________________________ /// /// 备份业务的逻辑 /// private static HdlGatewayLogic m_Current = null; /// /// 备份业务的逻辑 /// public static HdlGatewayLogic Current { get { if (m_Current == null) { m_Current = new HdlGatewayLogic(); } return m_Current; } } /// /// 备份用的网关ID /// private List listBackupGwId = new List(); #endregion #region ■ 从云端获取全部网关列表ID___________ /// /// 从云端获取全部网关列表ID /// /// 从云端获取全部网关列表ID public Dictionary GetGateWayListFromDataBase() { Dictionary dicDbGateway = null; if (UserCenterResourse.UserInfo.AuthorityNo == 3) { //成员 return dicDbGateway; } bool canBreak = false; new System.Threading.Thread(async () => { List list = new List() { "NotSetAgain" }; //这个接口非常特殊 bool nowfalge = Config.Instance.isAdministrator; if (UserCenterResourse.UserInfo.AuthorityNo == 2) { //必须启用管理员权限 Config.Instance.isAdministrator = true; } //设置访问接口的参数 var pra = new GetGatewayPra(); pra.ReqDto.PageSetting.Page = 1; pra.ReqDto.PageSetting.PageSize = 999; var result = await UserCenterLogic.GetResponseDataByRequestHttps("App/GetSingleHomeGatewayPagger", pra, list); //权限复原 Config.Instance.isAdministrator = nowfalge; if (string.IsNullOrEmpty(result) == true) { canBreak = true; return; } var infoResult = Newtonsoft.Json.JsonConvert.DeserializeObject(result); Dictionary dic = new Dictionary(); foreach (var data in infoResult.PageData) { dic[data.GatewayUniqueId] = data; } dicDbGateway = dic; canBreak = true; }) { IsBackground = true }.Start(); int count = 0; while (canBreak == false) { System.Threading.Thread.Sleep(200); count++; if (count == 25) { //如果5秒还不能获取得到数据,则中断此次操作 break; } } return dicDbGateway; } #endregion #region ■ 解绑云端网关_______________________ /// /// 解绑云端绑定的网关 /// /// public async Task DeleteDataBaseGateway(string strWayId) { var Pra = new DeleteGatewayPra(); Pra.BindGateways.Add(strWayId); List listNotShowError = new List() { "NoExist", "NoBind", "NoRecord" }; bool result = await UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", Pra, listNotShowError); if (result == false) { return false; } return true; } #endregion #region ■ 断网备份及绑定网关ID_______________ /// /// 在没网的情况下备份网关ID /// /// public void BackupGatewayIdOnNotNetwork(ZbGateway zbGateway) { var strId = Common.LocalGateway.Current.GetGatewayId(zbGateway); if (listBackupGwId.Contains(strId) == false) { listBackupGwId.Add(strId); //备份 var strData = Newtonsoft.Json.JsonConvert.SerializeObject(listBackupGwId); var byteData = System.Text.Encoding.UTF8.GetBytes(strData); Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile, byteData); } } /// /// 重新发送命令去绑定断网情况下备份的网关 /// public void ResetComandToBindBackupGateway() { new System.Threading.Thread(async () => { var fileData = Global.ReadFileByDirectory(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile); if (fileData == null) { return; } this.listBackupGwId = Newtonsoft.Json.JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(fileData)); var listTempId = new List(); listTempId.AddRange(this.listBackupGwId); //不显示已经被绑定过的信息,NotSetAgain:假如断网时,不二次发送 List listNotShow = new List() { "NotSetAgain" }; //调用接口,绑定网关 var bindGateway = new BindGatewayPra(); foreach (var gwId in listTempId) { bindGateway.BindGateways.Clear(); bindGateway.BindGateways.Add(gwId); var result = await UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", bindGateway, listNotShow); if (result == "Success") { this.listBackupGwId.Remove(gwId); } if (result == "Error" || result == "ErrorEx") { break; } } if (this.listBackupGwId.Count == 0) { //如果没有了内容,则删除文件 string file = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile); if (System.IO.File.Exists(file) == true) { System.IO.File.Delete(file); } } else { //备份 var strData = Newtonsoft.Json.JsonConvert.SerializeObject(listBackupGwId); var byteData = System.Text.Encoding.UTF8.GetBytes(strData); Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.BackupGatewayIdFile, byteData); } }) { IsBackground = true }.Start(); } #endregion #region ■ 上传设备备份到网关_________________ /// /// 上传设备备份到网关(最好不要去理它的返回结果) /// /// 设备对象 /// 备份类型 /// 备份的数据 /// public async Task UpLoadDeviceBackupDataToGateway(CommonDevice device, GatewayBackupEnum backupEnum, object upLaodData) { //ZbGateway realWay = null; //if (Common.LocalGateway.Current.GetRealGateway(ref realWay, device.CurrentGateWayId) == false) //{ // //没有找到真实物理网关 // return false; //} //string fileName = ((int)backupEnum).ToString().PadLeft(5, '0') + device.FilePath; ////创建文件对象 //var result = await realWay.CreateFileAsync(fileName); //if (result == null || result.Result != 0) //{ // return false; //} ////发送数据流 //var data = Newtonsoft.Json.JsonConvert.SerializeObject(upLaodData); //var byteData = System.Text.Encoding.UTF8.GetBytes(data); //var result2 = await realWay.SendFileAsync(byteData); //if (result2 == null || result2.Result != 0) //{ // return false; //} return true; } #endregion #region ■ 恢复网关___________________________ /// /// 恢复网关配置 /// /// 网关对象 /// 网关里面拥有的文件 /// 云端下载的备份数据的文件夹名字 /// public async Task RecoverGatewaySettion(ZbGateway zbGateway, List listGatewayFile, string backDirectory) { //获取从云端那里得来的全部文件 var listBackFile = HdlAutoBackupLogic.GetFileFromDirectory(UserCenterLogic.CombinePath(backDirectory)); //添加附加情报:还原设备配置 ProgressBar.SetAppendText(Language.StringByID(R.MyInternationalizationString.uRecoverDeviceSettion)); ProgressBar.SetMaxValue(listBackFile.Count); ProgressBar.Show(); var listSaveFile = new HashSet(); foreach (string fileName in listBackFile) { if (fileName.Length > 12) { //恢复设备配置 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 tipView = new TipViewControl(msg); tipView.ShowView(); }); 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 tipView = new TipViewControl(msg); tipView.ShowView(); }); ProgressBar.Close(); return false; } } //删除多余的文件 foreach (var deleteFile in listGatewayFile) { if (deleteFile.Length > 12) { string deviceFileName = deleteFile.Substring(5); if (deviceFileName.StartsWith(Common.LocalDevice.deviceFirstName) == 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; } /// /// 恢复设备配置 /// /// 云端下载的备份数据的文件夹名字 /// 网关的设备备份名字 /// private async Task RecoverDeviceSettion(string backDirectory, string backFileName) { string deviceFileName = backFileName.Substring(5); if (deviceFileName.StartsWith(Common.LocalDevice.deviceFirstName) == false) { //不是设备文件 return 0; } string[] strArry = deviceFileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); if (strArry.Length < 4) { //我也不知道它是什么文件 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(0, 5)); bool result = true; if (backType == GatewayBackupEnum.AMac名称) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteData)); result = await Common.LocalDevice.Current.ReMacName(new List() { device }, recoverData); } else if (backType == GatewayBackupEnum.A端点名称) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(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(System.Text.Encoding.UTF8.GetString(byteData)); result = await Common.LocalDevice.Current.SetPirSensorLightSettion((IASZone)device, recoverData); } else if (backType == GatewayBackupEnum.A按键面板亮度调节) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteData)); int directionsLevel = Convert.ToInt32(recoverData["directionsLevel"]); int backlightLevel = Convert.ToInt32(recoverData["backlightLevel"]); result = await Common.LocalDevice.Current.SetPanelSwitchLightSettion((Panel)device, directionsLevel, backlightLevel); } else if (backType == GatewayBackupEnum.A按键面板节能模式) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(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 Common.LocalDevice.Current.SetPanelEnergyConservationMode((Panel)device, modeEnable, modeTime, level); } else if (backType == GatewayBackupEnum.A按键面板颜色调节) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteData)); result = await Common.LocalDevice.Current.SetPanelEpointColorInfo((Panel)device, recoverData); } return result == true ? 1 : -1; } #endregion } }