using Shared.Common;
|
using System;
|
using System.Collections.Generic;
|
using System.Threading.Tasks;
|
using ZigBee.Device;
|
|
namespace Shared.Phone.UserCenter
|
{
|
/// <summary>
|
/// 网关业务的逻辑类
|
/// </summary>
|
public class HdlGatewayLogic
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 备份业务的逻辑
|
/// </summary>
|
private static HdlGatewayLogic m_Current = null;
|
/// <summary>
|
/// 备份业务的逻辑
|
/// </summary>
|
public static HdlGatewayLogic Current
|
{
|
get
|
{
|
if (m_Current == null)
|
{
|
m_Current = new HdlGatewayLogic();
|
}
|
return m_Current;
|
}
|
}
|
/// <summary>
|
/// 备份用的网关ID
|
/// </summary>
|
private List<string> listBackupGwId = new List<string>();
|
|
#endregion
|
|
#region ■ 从云端获取全部网关列表ID___________
|
|
/// <summary>
|
/// 从云端获取全部网关列表ID
|
/// </summary>
|
/// <returns>从云端获取全部网关列表ID</returns>
|
public Dictionary<string, GatewayResult> GetGateWayListFromDataBase()
|
{
|
Dictionary<string, GatewayResult> dicDbGateway = null;
|
if (UserCenterResourse.UserInfo.AuthorityNo == 3)
|
{
|
//成员
|
return dicDbGateway;
|
}
|
|
bool canBreak = false;
|
new System.Threading.Thread(async () =>
|
{
|
List<string> list = new List<string>() { "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<GetGatewayResult>(result);
|
|
Dictionary<string, GatewayResult> dic = new Dictionary<string, GatewayResult>();
|
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 ■ 解绑云端网关_______________________
|
|
/// <summary>
|
/// 解绑云端绑定的网关
|
/// </summary>
|
/// <param name="strWayId"></param>
|
public async Task<bool> DeleteDataBaseGateway(string strWayId)
|
{
|
var Pra = new DeleteGatewayPra();
|
Pra.BindGateways.Add(strWayId);
|
|
List<string> listNotShowError = new List<string>() { "NoExist", "NoBind", "NoRecord" };
|
|
bool result = await UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", Pra, listNotShowError);
|
if (result == false)
|
{
|
return false;
|
}
|
return true;
|
}
|
|
#endregion
|
|
#region ■ 断网备份及绑定网关ID_______________
|
|
/// <summary>
|
/// 在没网的情况下备份网关ID
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 重新发送命令去绑定断网情况下备份的网关
|
/// </summary>
|
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<List<string>>(System.Text.Encoding.UTF8.GetString(fileData));
|
var listTempId = new List<string>();
|
listTempId.AddRange(this.listBackupGwId);
|
|
//不显示已经被绑定过的信息,NotSetAgain:假如断网时,不二次发送
|
List<string> listNotShow = new List<string>() { "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 ■ 上传设备备份到网关_________________
|
|
/// <summary>
|
/// 上传设备备份到网关(最好不要去理它的返回结果)
|
/// </summary>
|
/// <param name="device">设备对象</param>
|
/// <param name="backupEnum">备份类型</param>
|
/// <param name="upLaodData">备份的数据</param>
|
/// <returns></returns>
|
public async Task<bool> 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 ■ 恢复网关___________________________
|
|
/// <summary>
|
/// 恢复网关配置
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <param name="listGatewayFile">网关里面拥有的文件</param>
|
/// <param name="backDirectory">云端下载的备份数据的文件夹名字</param>
|
/// <returns></returns>
|
public async Task<bool> RecoverGatewaySettion(ZbGateway zbGateway, List<string> 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<string>();
|
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;
|
}
|
|
/// <summary>
|
/// 恢复设备配置
|
/// </summary>
|
/// <param name="backDirectory">云端下载的备份数据的文件夹名字</param>
|
/// <param name="backFileName">网关的设备备份名字</param>
|
/// <returns></returns>
|
private async Task<int> 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<string>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await Common.LocalDevice.Current.ReMacName(new List<CommonDevice>() { device }, recoverData);
|
}
|
else if (backType == GatewayBackupEnum.A端点名称)
|
{
|
var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(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<IASZone.ConfigureParamates>(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<Newtonsoft.Json.Linq.JObject>(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<Newtonsoft.Json.Linq.JObject>(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<Panel.KeyColorData>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await Common.LocalDevice.Current.SetPanelEpointColorInfo((Panel)device, recoverData);
|
}
|
return result == true ? 1 : -1;
|
}
|
|
|
|
#endregion
|
}
|
}
|