using System; using System.Collections.Generic; using System.Text; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 网关备份业务的逻辑 /// public class HdlGatewayBackupLogic { #region ■ 变量声明___________________________ /// /// 备份业务的逻辑 /// private static HdlGatewayBackupLogic m_Current = null; /// /// 备份业务的逻辑 /// public static HdlGatewayBackupLogic Current { get { if (m_Current == null) { m_Current = new HdlGatewayBackupLogic(); } return m_Current; } } #endregion #region ■ 网关备份___________________________ /// /// 网关执行备份 /// /// 真实物理网关对象 /// 需要创建的备份的名字 public void DoBackupGateway(ZbGateway realGateway, string backupName) { //展开进度条 ProgressFormBar.Current.Start(); //创建备份文件 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uCreatBackupFile)); System.Threading.Thread.Sleep(1000); //创建一个备份名字 string backupClassId = HdlBackupLogic.Current.CreatNewBackupNameToDB(backupName, 2, realGateway.GwId); if (backupClassId == null) { //关闭进度条 ProgressFormBar.Current.Close(); return; } //保存协调器的nv分区组网信息 //bool result = this.SaveNVFile(realGateway); //if (result == false) //{ // //如果上传失败的话,就把它删除 // await HdlBackupLogic.Current.DeleteDbBackupData(backupClassId); // //关闭进度条 // ProgressFormBar.Current.Close(); // return; //} //打开协调器串口发送功能 //result = this.OpenZbMsComSend(realGateway); //if (result == false) //{ // //如果上传失败的话,就把它删除 // await HdlBackupLogic.Current.DeleteDbBackupData(backupClassId); // //关闭进度条 // ProgressFormBar.Current.Close(); // return; //} //开始上传数据 bool result = this.StartUpLoadData(realGateway, backupClassId); if (result == false) { //如果上传失败的话,就把它删除 HdlBackupLogic.Current.DeleteDbBackupData(backupClassId); //关闭进度条 ProgressFormBar.Current.Close(); return; } //关闭进度条 ProgressFormBar.Current.Close(); } #endregion #region ■ 保存协调器的nv分区组网信息_________ /// /// 保存协调器的nv分区组网信息 /// /// /// private bool SaveNVFile(ZbGateway realGateway) { //正在保存协调器nv分区信息 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uGatewayNVFileSaving)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); int result = -1; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/" + "ZbGwOperation/SaveNVFile_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); result = Convert.ToInt32(jobject["Data"]["Flag"].ToString()); } }; realGateway.Actions += action; var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 500 } }; var data = new Newtonsoft.Json.Linq.JObject { { "ImageName", "NVImage.bin" }, { "ImagePath", "/etc/hdlDat/" } }; jObject.Add("Data", data); realGateway.Send("ZbGwOperation/SaveNVFile", jObject.ToString()); int TimeOut = 0; while (result == -1 && TimeOut < 60) { System.Threading.Thread.Sleep(1000); TimeOut++; ProgressFormBar.Current.SetValue(TimeOut, 60); } realGateway.Actions -= action; if (result != 0) { //保存协调器的nv分区组网信息失败 string msg = Language.StringByID(R.MyInternationalizationString.uSaveGatewayNVFileFail); if (result == -1) { msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时"); } this.ShowErrorMsg(msg); return false; } return true; } #endregion #region ■ 打开协调器串口发送功能_____________ /// /// 打开协调器串口发送功能 /// /// /// private bool OpenZbMsComSend(ZbGateway realGateway) { //正在打开协调器串口发送功能 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uZbMsComSendOpening)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); int result = -1; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/" + "OpenZbMsComSend_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); result = Convert.ToInt32(jobject["Data"]["Status"].ToString()); } }; realGateway.Actions += action; var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 6119 } }; realGateway.Send("OpenZbMsComSend", jObject.ToString()); int TimeOut = 0; while (result == -1 && TimeOut < 30) { System.Threading.Thread.Sleep(1000); TimeOut++; } realGateway.Actions -= action; if (result != 0) { //打开协调器串口发送功能失败 string msg = Language.StringByID(R.MyInternationalizationString.uOpenZbMsComSendFail); if (result == -1) { msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时"); } this.ShowErrorMsg(msg); return false; } return true; } #endregion #region ■ 开始网关数据备份___________________ /// /// 开始上传数据 /// /// /// private bool StartUpLoadData(ZbGateway realGateway, string backupClassId) { //开始备份网关数据 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uStartBackupgatewayData)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); bool threadAction = true; bool success = false; //等待时间 int waitime = 60; //计时时间 int TimeOut = 0; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/BackupGwDataFile_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); var statu = Convert.ToInt32(jobject["Data"]["Status"].ToString()); if (statu == 1) { threadAction = false; //网关数据备份失败 this.ShowErrorMsg(Language.StringByID(R.MyInternationalizationString.uBackupgatewayDataFail)); return; } if (statu == 2) { threadAction = false; success = true; //上传数据成功 string msg2 = Language.StringByID(R.MyInternationalizationString.uUploadDataSuccess); this.ShowTipMsg(msg2); } //将时间刷新,然后等待时间变更为30秒 TimeOut = 0; waitime = 300; } else if (topic == gatewayID + "/BackupGwDataFileProgress_Respon") { //刷新等待时间 TimeOut = 0; //上传进度百分比 var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); var statu = Convert.ToInt32(jobject["Data"]["Status"].ToString()); if (statu != 0) { threadAction = false; //网关数据备份失败 this.ShowErrorMsg(Language.StringByID(R.MyInternationalizationString.uBackupgatewayDataFail)); return; } //设置进度百分比 var persent = Convert.ToInt32(jobject["Data"]["BackupPercent"].ToString()); ProgressFormBar.Current.SetValue(persent, 100); } }; realGateway.Actions += action; //获取接口的连接模式 string fullUrl = string.Empty; var connectMode = UserCenterLogic.GetHttpConnectMode(true); if (connectMode == HttpConnectMode.Normal) { //普通访问 fullUrl = $"{Common.CommonPage.RequestHttpsHost}/{"App/UploadHomeAppGatewaySubFiles"}"; } else if (connectMode == HttpConnectMode.Admin) { //以管理员的身份访问,自身是成员 fullUrl = $"{Common.Config.Instance.AdminRequestBaseUrl}/{"App/UploadHomeAppGatewaySubFiles"}"; } var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 6200 } }; var data = new Newtonsoft.Json.Linq.JObject { { "url", fullUrl }, { "RequestVersion", Common.CommonPage.RequestVersion }, { "LoginAccessToken", UserCenterLogic.GetConnectMainToken() }, { "BackupClassId", backupClassId }, { "ManualBackupType", 2 },{ "IsOtherAccountCtrl",connectMode == HttpConnectMode.Admin?1:0} }; jObject.Add("Data", data); realGateway.Send("BackupGwDataFile", jObject.ToString()); while (threadAction == true && TimeOut < waitime) { System.Threading.Thread.Sleep(100); TimeOut++; } realGateway.Actions -= action; if (TimeOut >= waitime) { //响应超时,网关数据备份失败 string msg = Language.StringByID(R.MyInternationalizationString.uResponseTimeoutsAndBackupgatewayDataFail); this.ShowErrorMsg(msg); return false; } System.Threading.Thread.Sleep(1000); return success; } #endregion #region ■ 网关还原___________________________ /// /// 执行网关还原操作 /// /// 真实物理网关对象 /// 备份主键 /// 0:获取网关手动备份文件列表 1:获取网关自动备份文件列表 public bool RecoverGateway(ZbGateway realGateway, string backupId, int isAutoBack) { //展开进度条 ProgressFormBar.Current.Start(); //从云端获取备份文件列表 var result = this.GetGatewayFileList(realGateway, backupId, isAutoBack); if (result == false) { //关闭进度条 ProgressFormBar.Current.Close(); return false; } //从云端下载备份文件 result = this.DownloadGatewayFile(realGateway, backupId, isAutoBack); if (result == false) { //关闭进度条 ProgressFormBar.Current.Close(); return false; } ////恢复协调器nv分区的组网信息 //result = this.RestoreGatewayNV(realGateway); //if (result == false) //{ // //关闭进度条 // ProgressFormBar.Current.Close(); // return false; //} //打开协调器串口发送功能 //result = this.OpenZbMsComSend(realGateway); //if (result == false) //{ // //关闭进度条 // ProgressFormBar.Current.Close(); // return false; //} //重启网关系统 result = this.GatewayReboot(realGateway); //关闭进度条 ProgressFormBar.Current.Close(); return result; } #endregion #region ■ 从云端获取备份文件列表_____________ /// /// 从云端获取备份文件列表 /// /// /// /// private bool GetGatewayFileList(ZbGateway realGateway, string backupClassId, int isAutoBack) { //正在获取备份文件列表 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uBackupFileListGetting)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); int result = -1; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/GetDataFileList_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); result = Convert.ToInt32(jobject["Data"]["Status"].ToString()); if (result != 0) { //获取备份文件列表失败 this.ShowErrorMsg(Language.StringByID(R.MyInternationalizationString.uGetBackupFileListFail)); return; } } }; realGateway.Actions += action; //获取接口的连接模式 string fullUrl = string.Empty; var connectMode = UserCenterLogic.GetHttpConnectMode(true); if (connectMode == HttpConnectMode.Normal) { //普通访问 fullUrl = $"{Common.CommonPage.RequestHttpsHost}/{"App/GetHomeDataBackupUploadListPagger"}"; } else if (connectMode == HttpConnectMode.Admin) { //以管理员的身份访问,自身是成员 fullUrl = $"{Common.Config.Instance.AdminRequestBaseUrl}/{"App/GetHomeDataBackupUploadListPagger"}"; } var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 6202 } }; var data = new Newtonsoft.Json.Linq.JObject { { "url", fullUrl }, { "RequestVersion", Common.CommonPage.RequestVersion }, { "LoginAccessToken", UserCenterLogic.GetConnectMainToken() }, { "IsGatewayAutoBackup", isAutoBack }, { "BackupClassId", backupClassId },{ "GatewayUniqueId",realGateway.GwId}, { "IsOtherAccountCtrl",connectMode == HttpConnectMode.Admin?1:0} }; jObject.Add("Data", data); realGateway.Send("GetDataFileList", jObject.ToString()); int timeOut = 0; while (result == -1 && timeOut < 30) { System.Threading.Thread.Sleep(1000); timeOut++; } realGateway.Actions -= action; if (result != 0) { string msg = Language.StringByID(R.MyInternationalizationString.uGetBackupFileListFail); if (result == -1) { //响应超时,获取备份文件列表失败 msg = Language.StringByID(R.MyInternationalizationString.uResponseTimeoutsAndGetBackupFileListFail); } this.ShowErrorMsg(msg); return false; } return true; } #endregion #region ■ 从云端下载备份文件_________________ /// /// 从云端下载备份文件 /// /// /// /// private bool DownloadGatewayFile(ZbGateway realGateway, string backupClassId, int isAutoBack) { //正在下载备份文件 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uBackupFileDownloading)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); bool threadAction = true; bool success = false; int timeOut = 0; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/RestoreDataFileProgress_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); var result = Convert.ToInt32(jobject["Data"]["Status"].ToString()); if (result == 1 || result == 3) { //下载备份文件失败 this.ShowErrorMsg(Language.StringByID(R.MyInternationalizationString.uDownloadBackupFileFail)); threadAction = false; return; } else if (result == 2) { //下载成功 success = true; threadAction = false; return; } else if (result == 0) { //刷新等待时间 timeOut = 0; //设置进度百分比 var persent = Convert.ToInt32(jobject["Data"]["RestoreDataPercent"].ToString()); ProgressFormBar.Current.SetValue(persent, 100); } } }; realGateway.Actions += action; //获取接口的连接模式 string fullUrl = string.Empty; var connectMode = UserCenterLogic.GetHttpConnectMode(true); if (connectMode == HttpConnectMode.Normal) { //普通访问 fullUrl = $"{Common.CommonPage.RequestHttpsHost}/{"App/DownloadSomeDataBackup"}"; } else if (connectMode == HttpConnectMode.Admin) { //以管理员的身份访问,自身是成员 fullUrl = $"{Common.Config.Instance.AdminRequestBaseUrl}/{"App/DownloadSomeDataBackup"}"; } var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 6203 } }; var data = new Newtonsoft.Json.Linq.JObject { { "url", fullUrl }, { "RequestVersion", Common.CommonPage.RequestVersion }, { "LoginAccessToken", UserCenterLogic.GetConnectMainToken() }, { "IsGatewayAutoBackup", isAutoBack }, { "BackupClassId", backupClassId },{ "GatewayUniqueId",realGateway.GwId}, { "IsOtherAccountCtrl",connectMode == HttpConnectMode.Admin?1:0} }; jObject.Add("Data", data); realGateway.Send("GetDataFileList", jObject.ToString()); while (threadAction == true && timeOut < 30) { System.Threading.Thread.Sleep(1000); timeOut++; } realGateway.Actions -= action; if (timeOut >= 30) { //响应超时,下载备份文件失败 string msg = Language.StringByID(R.MyInternationalizationString.uResponseTimeoutsAndDownloadBackupFileFail); this.ShowErrorMsg(msg); return false; } return success; } #endregion #region ■ 恢复协调器nv分区的组网信息_________ /// /// 恢复协调器nv分区的组网信息 /// /// /// private bool RestoreGatewayNV(ZbGateway realGateway) { //正在恢复协调器nv分区 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uGatewayNVRestoring)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); int result = -1; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/" + "ZbGwOperation/RestoreNV_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); result = Convert.ToInt32(jobject["Data"]["Flag"].ToString()); } }; realGateway.Actions += action; var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 501 } }; var data = new Newtonsoft.Json.Linq.JObject { { "ImageName", "NVImage.bin" }, { "ImagePath", "/etc/hdlDat/" } }; jObject.Add("Data", data); realGateway.Send("ZbGwOperation/RestoreNV", jObject.ToString()); int TimeOut = 0; while (result == -1 && TimeOut < 60) { System.Threading.Thread.Sleep(1000); TimeOut++; ProgressFormBar.Current.SetValue(TimeOut, 60); } realGateway.Actions -= action; if (result != 0) { //恢复协调器nv分区失败 string msg = Language.StringByID(R.MyInternationalizationString.uRestoreGatewayNVFail); if (result == -1) { //响应超时,恢复协调器nv分区失败 msg = Language.StringByID(R.MyInternationalizationString.uResponseTimeoutsAndRestoreGatewayNVFail); } this.ShowErrorMsg(msg); return false; } return true; } #endregion #region ■ 重启网关系统_______________________ /// /// 重启网关系统 /// /// /// private bool GatewayReboot(ZbGateway realGateway) { //正在重启网关系统 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uGatewayRerooting)); ProgressFormBar.Current.SetValue(0); System.Threading.Thread.Sleep(1000); int result = -1; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; if (topic == gatewayID + "/" + "GwReboot_Respon") { var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); result = Convert.ToInt32(jobject["Data"]["Result"].ToString()); } }; realGateway.Actions += action; var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 83 } }; realGateway.Send("GwReboot", jObject.ToString()); int timeOut = 0; while (result == -1 && timeOut < 30) { System.Threading.Thread.Sleep(1000); timeOut++; } realGateway.Actions -= action; if (result != 0) { //重启网关系统失败 string msg = Language.StringByID(R.MyInternationalizationString.uGatewayRerootFail); if (result == -1) { msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时"); } this.ShowErrorMsg(msg); return false; } //网关已经接收到重启命令,接下来去判断网关是否重启完成 bool gatewatAction = false; bool threadAction = true; HdlThreadLogic.Current.RunThread(() => { timeOut = 0; while (gatewatAction == false) { //大概网关重启要60秒 if (timeOut >= 65 && timeOut % 5 == 0) { //5秒一次,去获取版本 var data = HdlGatewayLogic.Current.GetGatewayInfo(realGateway, ShowErrorMode.NO); if (data != null) { gatewatAction = true; threadAction = false; break; } } System.Threading.Thread.Sleep(1000); timeOut++; //设置进度值 ProgressFormBar.Current.SetValue(timeOut, 180); if (timeOut >= 180) { //180秒还等不到的话,网关应该出问题了 threadAction = false; break; } } }); while (threadAction == true) { System.Threading.Thread.Sleep(4000); } if (gatewatAction == true) { //设置进度值:100% ProgressFormBar.Current.SetValue(1, 1); System.Threading.Thread.Sleep(1000); //网关数据恢复成功! string msg = Language.StringByID(R.MyInternationalizationString.uRestoreGatewayDataSuccess); this.ShowTipMsg(msg); return true; } else { //响应超时,重启网关系统失败 string msg = Language.StringByID(R.MyInternationalizationString.uResponseTimeoutsAndGatewayRerootFail); this.ShowErrorMsg(msg); return false; } } #endregion #region ■ 一般方法___________________________ /// /// 显示错误信息窗口 /// /// private void ShowErrorMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Error, msg); contr.Show(); }); } /// /// 显示Tip信息窗口 /// /// private void ShowTipMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); }); } #endregion } }