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