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 async void DoBackupGateway(ZbGateway realGateway, string backupName) { //展开进度条 ProgressFormBar.Current.Start(); //创建备份文件 ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uCreatBackupFile)); await System.Threading.Tasks.Task.Delay(1000); //创建一个备份名字 string backupClassId = await HdlBackupLogic.Current.CreatNewBackupNameToDB(backupName, 2, HdlGatewayLogic.Current.GetGatewayId(realGateway)); 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; } //开始上传数据 result = this.StartUpLoadData(realGateway, backupClassId); if (result == false) { //如果上传失败的话,就把它删除 await 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.SetValue2(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(100); 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.SetValue2(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; } return success; } #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 } }