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
}
}