using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using ZigBee.Device;
|
|
namespace Shared.Phone.UserCenter
|
{
|
/// <summary>
|
/// 网关备份业务的逻辑
|
/// </summary>
|
public class HdlGatewayBackupLogic
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 备份业务的逻辑
|
/// </summary>
|
private static HdlGatewayBackupLogic m_Current = null;
|
/// <summary>
|
/// 备份业务的逻辑
|
/// </summary>
|
public static HdlGatewayBackupLogic Current
|
{
|
get
|
{
|
if (m_Current == null)
|
{
|
m_Current = new HdlGatewayBackupLogic();
|
}
|
return m_Current;
|
}
|
}
|
|
#endregion
|
|
#region ■ 网关备份___________________________
|
|
/// <summary>
|
/// 网关执行备份
|
/// </summary>
|
/// <param name="realGateway">真实物理网关对象</param>
|
/// <param name="backupName">需要创建的备份的名字</param>
|
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分区组网信息_________
|
|
/// <summary>
|
/// 保存协调器的nv分区组网信息
|
/// </summary>
|
/// <param name="realGateway"></param>
|
/// <returns></returns>
|
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<string, string> 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 ■ 打开协调器串口发送功能_____________
|
|
/// <summary>
|
/// 打开协调器串口发送功能
|
/// </summary>
|
/// <param name="realGateway"></param>
|
/// <returns></returns>
|
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<string, string> 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 ■ 开始网关数据备份___________________
|
|
/// <summary>
|
/// 开始上传数据
|
/// </summary>
|
/// <param name="realGateway"></param>
|
/// <param name="backupClassId"></param>
|
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<string, string> 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 ■ 一般方法___________________________
|
|
/// <summary>
|
/// 显示错误信息窗口
|
/// </summary>
|
/// <param name="msg"></param>
|
private void ShowErrorMsg(string msg)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
var contr = new ShowMsgControl(ShowMsgType.Error, msg);
|
contr.Show();
|
});
|
}
|
|
/// <summary>
|
/// 显示Tip信息窗口
|
/// </summary>
|
/// <param name="msg"></param>
|
private void ShowTipMsg(string msg)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
|
contr.Show();
|
});
|
}
|
|
#endregion
|
}
|
}
|