using Newtonsoft.Json;
|
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>();
|
/// <summary>
|
/// 网关文件的前缀名字
|
/// </summary>
|
private string gwFirstName = "Gateway_";
|
/// <summary>
|
/// 全部网关(这里保存的是虚拟网关,而不是真实物理网关对象)
|
/// </summary>
|
private Dictionary<string, ZbGateway> dicGateway = new Dictionary<string, ZbGateway>();
|
|
#endregion
|
|
#region ■ 刷新网关___________________________
|
|
/// <summary>
|
/// 刷新本地网关信息
|
/// </summary>
|
public void ReFreshByLocal()
|
{
|
lock (dicGateway)
|
{
|
this.dicGateway.Clear();
|
|
List<string> listFile = this.GetAllGatewayFile();
|
//反序列化添加到缓存
|
foreach (string file in listFile)
|
{
|
//从文件中反序列化出网关对象
|
var gateway = this.GetGatewayFromFile(file);
|
if (gateway == null)
|
{
|
continue;
|
}
|
//添加缓存
|
string gwID = HdlGatewayLogic.Current.GetGatewayId(gateway);
|
dicGateway[gwID] = gateway;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 刷新APP前一次选择的网关ID
|
/// </summary>
|
public void RefreshAppOldSelectGatewayId()
|
{
|
GatewayResourse.AppOldSelectGatewayId = string.Empty;
|
|
//从文件中获取上一次选择的网关id
|
byte[] data = Global.ReadFileByDirectory(DirNameResourse.LocalMemoryDirectory, DirNameResourse.AppOldSelectGatewayFile);
|
if (data != null)
|
{
|
string strvalue = System.Text.Encoding.UTF8.GetString(data);
|
GatewayResourse.AppOldSelectGatewayId = JsonConvert.DeserializeObject<string>(strvalue);
|
}
|
//如果本地没有这个网关的话
|
if (this.IsGatewayExist(GatewayResourse.AppOldSelectGatewayId) == false)
|
{
|
GatewayResourse.AppOldSelectGatewayId = string.Empty;
|
lock (dicGateway)
|
{
|
//随便选一个网关
|
foreach (string wayId in this.dicGateway.Keys)
|
{
|
GatewayResourse.AppOldSelectGatewayId = wayId;
|
break;
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 同步云端的网关id,如果本地拥有云端不存在的id,则表示应该被换绑了,直接删除(切换住宅后,重新刷新网关列表和设备之后使用)
|
/// </summary>
|
/// <returns></returns>
|
public void SynchronizeDbGateway()
|
{
|
//从云端获取网列表ID
|
Dictionary<string, GatewayResult> result = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
|
if (result == null)
|
{
|
return;
|
}
|
List<string> listDelete = new List<string>();
|
foreach (var gatewayId in this.dicGateway.Keys)
|
{
|
if (result.ContainsKey(gatewayId) == false)
|
{
|
//本地存在云端不存在的网关,则删除
|
listDelete.Add(gatewayId);
|
}
|
}
|
foreach (var gatewayId in listDelete)
|
{
|
//删除本地这个网关所有的设备
|
List<CommonDevice> list = Common.LocalDevice.Current.GetDeviceByGatewayID(gatewayId);
|
foreach (var device in list)
|
{
|
//删除设备,不删除房间信息
|
Common.LocalDevice.Current.DeleteMemmoryDevice(device, false);
|
}
|
//删除网关文件
|
this.DeleteGatewayFile(gatewayId);
|
}
|
//LOG输出
|
if (listDelete.Count > 0)
|
{
|
string msg = "本地拥有的网关:";
|
foreach (var gatewayId in this.dicGateway.Keys)
|
{
|
msg += gatewayId + ",";
|
}
|
msg += "\r\n被删除的网关:";
|
foreach (var gatewayId in listDelete)
|
{
|
msg += gatewayId + ",";
|
}
|
msg += "\r\n此时云端返回当前账号所绑定有的网关:";
|
foreach (var gatewayId in result.Keys)
|
{
|
msg += gatewayId + ",";
|
}
|
var bytes = System.Text.Encoding.UTF8.GetBytes(msg);
|
Common.Global.WriteFileByBytesByHomeId("GatewayDeleteLog.txt", bytes);
|
}
|
}
|
|
/// <summary>
|
/// 从文件中反序列化出网关对象
|
/// </summary>
|
/// <param name="file"></param>
|
/// <returns></returns>
|
private ZbGateway GetGatewayFromFile(string file)
|
{
|
byte[] filebyte = Global.ReadFileByHomeId(file);
|
string strvalue = System.Text.Encoding.UTF8.GetString(filebyte);
|
var gateway = JsonConvert.DeserializeObject<ZbGateway>(strvalue);
|
return gateway;
|
}
|
|
#endregion
|
|
#region ■ 添加网关___________________________
|
|
/// <summary>
|
/// 添加新网关(仅限追加新的网关)
|
/// </summary>
|
/// <param name="zbGateway">网关</param>
|
/// <param name="mode">是否显示错误</param>
|
public async Task<bool> AddNewGateway(ZbGateway zbGateway, ShowErrorMode mode)
|
{
|
//执行添加网关到内存
|
var result = await this.DoAddGatewayToMemory(zbGateway, mode);
|
//前的网关绑定在了当前账号下的不同住宅里面
|
if (result == 0)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
//网关绑定在当前账号下的其他住宅里\r\n请解除绑定后再试
|
string msg = Language.StringByID(R.MyInternationalizationString.uTheGatewayInOtherResidenceMsg);
|
if (msg.Contains("{0}") == true)
|
{
|
msg = string.Format(msg, "\r\n");
|
}
|
this.ShowTipMsg(msg);
|
}
|
return false;
|
}
|
if (result != 1)
|
{
|
return false;
|
}
|
return true;
|
}
|
|
/// <summary>
|
/// 创建一个虚拟的网关对象
|
/// </summary>
|
/// <param name="gatewayId">网关ID</param>
|
public void AddVirtualGateway(string gatewayId)
|
{
|
var gateWay = new ZbGateway { IsVirtual = true };
|
gateWay.getGatewayBaseInfo.gwID = gatewayId;
|
gateWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId;
|
gateWay.ReSave();
|
this.dicGateway[gatewayId] = gateWay;
|
}
|
|
/// <summary>
|
/// 执行添加网关到内存(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面)
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <param name="mode">是否显示错误</param>
|
/// <returns></returns>
|
private async Task<int> DoAddGatewayToMemory(ZbGateway zbGateway, ShowErrorMode mode)
|
{
|
if (zbGateway == null)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
//错误:网关对象丢失
|
string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
|
this.ShowTipMsg(msg);
|
}
|
return -1;
|
}
|
//获取网关的信息
|
var result = await zbGateway.GetZbGwInfoAsync();
|
//检测网关返回的共通错误状态码
|
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
|
if (error != null)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
this.ShowTipMsg(error);
|
}
|
return -1;
|
}
|
|
if (result == null)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
//获取网关信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
|
this.ShowTipMsg(msg);
|
}
|
return -1;
|
}
|
|
if (result.getGwData == null)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
//获取网关信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
|
this.ShowTipMsg(msg);
|
}
|
return -1;
|
}
|
|
//设置住宅ID到网关
|
bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId);
|
if (flage2 == false)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
//向网关设置住宅ID失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
|
this.ShowTipMsg(msg);
|
}
|
return -1;
|
}
|
|
//更新云端数据库
|
int flage1 = await this.SetGatewayIdToDataBase(zbGateway);
|
//异常也不鸟它,0是特殊含义
|
if (flage1 == 0)
|
{
|
return flage1;
|
}
|
if (flage1 == -1)
|
{
|
//备份失败的网关ID
|
HdlGatewayLogic.Current.BackupGatewayIdOnNotNetwork(zbGateway);
|
}
|
|
//是否已经存在
|
string gwID = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
|
bool isEsist = HdlGatewayLogic.Current.IsGatewayExist(zbGateway);
|
if (isEsist == false)
|
{
|
//新建一个虚拟的网关出来
|
zbGateway.ReSave();
|
var way = this.GetGatewayFromFile(zbGateway.FilePath);
|
this.dicGateway[gwID] = way;
|
}
|
|
//刷新的是缓存,不刷新真实物理网关
|
this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
|
this.dicGateway[gwID].getGwInfo = result.getGwData;
|
this.dicGateway[gwID].getGatewayBaseInfo.GwName = result.getGwData.GwName;
|
this.dicGateway[gwID].getGatewayBaseInfo.IpAddress = result.getGwData.GwIP;
|
this.dicGateway[gwID].getGatewayBaseInfo.HomeId = Common.Config.Instance.HomeId;
|
this.dicGateway[gwID].ReSave();
|
if (isEsist == false)
|
{
|
//添加备份
|
HdlAutoBackupLogic.AddOrEditorFile(this.dicGateway[gwID].FilePath);
|
}
|
|
return 1;
|
}
|
|
/// <summary>
|
/// 设置住宅ID到网关(失败时,不弹出任何错误信息,网关断网除外)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <param name="HomeId"></param>
|
/// <returns></returns>
|
public async Task<bool> SetHomeIdToGateway(ZbGateway zbGateway, string HomeId)
|
{
|
var info = await zbGateway.GwSetHomeIdAsync(HomeId);
|
if (info != null && info.gwSetHomeIdData != null)
|
{
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 更新网关ID到云端数据库(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面)
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <returns></returns>
|
private async Task<int> SetGatewayIdToDataBase(ZbGateway zbGateway)
|
{
|
//调用接口,绑定网关(即使失败,也返回true往下走)
|
var bindGateway = new BindGatewayPra();
|
string gwID = this.GetGatewayId(zbGateway);
|
bindGateway.BindGateways.Add(gwID);
|
//获取控制主人账号的Token
|
bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
|
|
//不显示已经被绑定过的信息,NotSetAgain:假如断网时,不二次发送
|
List<string> listNotShow = new List<string>() { "NotSetAgain" };
|
var result = await UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, bindGateway, listNotShow);
|
if (result == "Error" || result == "ErrorEx")
|
{
|
return -1;
|
}
|
if (result == "BindGatewaysExists")
|
{
|
return 0;
|
}
|
|
return result == "Success" ? 1 : -1;
|
}
|
|
/// <summary>
|
/// 住宅ID是否为空
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public bool HomeIdIsEmpty(ZbGateway zbGateway)
|
{
|
return this.HomeIdIsEmpty(zbGateway.getGatewayBaseInfo.HomeId);
|
}
|
|
/// <summary>
|
/// 住宅ID是否为空
|
/// </summary>
|
/// <param name="HomeId"></param>
|
/// <returns></returns>
|
public bool HomeIdIsEmpty(string HomeId)
|
{
|
if (string.IsNullOrEmpty(HomeId) == true || HomeId[0] == '\0')
|
{
|
return true;
|
}
|
return false;
|
}
|
|
#endregion
|
|
#region ■ 重新绑定网关_______________________
|
|
/// <summary>
|
/// 重新绑定网关(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面)
|
/// </summary>
|
/// <param name="zbGateway">网关</param>
|
public async Task<int> ReBindNewGateway(ZbGateway zbGateway, NormalViewControl btnMsg = null)
|
{
|
if (zbGateway == null)
|
{
|
//错误:网关对象丢失
|
string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
|
this.ShowTipMsg(msg);
|
return -1;
|
}
|
|
//设置住宅ID到网关
|
bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId);
|
if (flage2 == false)
|
{
|
//向网关设置住宅ID失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
|
this.ShowTipMsg(msg);
|
return -1;
|
}
|
|
//更新云端数据库
|
int flage1 = await this.SetGatewayIdToDataBase(zbGateway);
|
//异常也不鸟它,0是特殊含义
|
if (flage1 == 0)
|
{
|
return flage1;
|
}
|
if (flage1 == -1)
|
{
|
//备份失败的网关ID
|
HdlGatewayLogic.Current.BackupGatewayIdOnNotNetwork(zbGateway);
|
}
|
|
if (btnMsg == null)
|
{
|
//网关内部数据变更中,请稍后
|
ProgressBar.SetValue(Language.StringByID(R.MyInternationalizationString.uGatewayDataIsChangingPleaseWhait));
|
}
|
else
|
{
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
//网关内部数据变更中,请稍后
|
btnMsg.TextID = R.MyInternationalizationString.uGatewayDataIsChangingPleaseWhait;
|
});
|
}
|
await System.Threading.Tasks.Task.Delay(8000);
|
|
//获取网关的信息
|
var result = await zbGateway.GetZbGwInfoAsync();
|
//检测网关返回的共通错误状态码
|
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
|
if (error != null)
|
{
|
this.ShowTipMsg(error);
|
return -1;
|
}
|
|
if (result == null)
|
{
|
//获取网关信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
|
this.ShowTipMsg(msg);
|
return -1;
|
}
|
|
if (result.getGwData == null)
|
{
|
//获取网关信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
|
this.ShowTipMsg(msg);
|
return -1;
|
}
|
|
//是否已经存在
|
string gwID = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
|
bool isEsist = HdlGatewayLogic.Current.IsGatewayExist(zbGateway);
|
if (isEsist == false)
|
{
|
//新建一个虚拟的网关出来
|
zbGateway.ReSave();
|
var way = this.GetGatewayFromFile(zbGateway.FilePath);
|
this.dicGateway[gwID] = way;
|
}
|
|
//刷新的是缓存,不刷新真实物理网关
|
this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
|
this.dicGateway[gwID].getGwInfo = result.getGwData;
|
this.dicGateway[gwID].getGatewayBaseInfo.GwName = result.getGwData.GwName;
|
this.dicGateway[gwID].getGatewayBaseInfo.IpAddress = result.getGwData.GwIP;
|
this.dicGateway[gwID].getGatewayBaseInfo.HomeId = Common.Config.Instance.HomeId;
|
this.dicGateway[gwID].ReSave();
|
if (isEsist == false)
|
{
|
//添加备份
|
HdlAutoBackupLogic.AddOrEditorFile(this.dicGateway[gwID].FilePath);
|
}
|
return 1;
|
}
|
|
#endregion
|
|
#region ■ 修改网关___________________________
|
|
/// <summary>
|
/// 修改本地网关名字(失败时会显示信息)
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <param name="gatewayName">网关名</param>
|
public async Task<bool> ReName(ZbGateway zbGateway, string gatewayName)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, zbGateway) == false)
|
{
|
//获取网关对象失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayTagartFail);
|
this.ShowErrorMsg(msg);
|
return false;
|
}
|
|
var result = await realWay.GwReNameAsync(gatewayName);
|
//检测网关返回的共通错误状态码
|
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
|
if (error != null)
|
{
|
this.ShowErrorMsg(error);
|
return false;
|
}
|
|
if (result == null)
|
{
|
//网关名称修改失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGatewayReNameFail);
|
|
this.ShowErrorMsg(msg);
|
return false;
|
}
|
|
//网关修改失败
|
if (result.gwReNameData == null)
|
{
|
//网关名称修改失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGatewayReNameFail);
|
|
this.ShowErrorMsg(msg);
|
return false;
|
}
|
|
//修改缓存
|
string gwID = this.GetGatewayId(zbGateway);
|
this.dicGateway[gwID].getGatewayBaseInfo.GwName = gatewayName;
|
this.dicGateway[gwID].ReSave();
|
|
//添加自动备份
|
HdlAutoBackupLogic.AddOrEditorFile(zbGateway.FilePath);
|
|
return true;
|
}
|
|
#endregion
|
|
#region ■ 网关切换___________________________
|
|
/// <summary>
|
/// 执行切换网关操作
|
/// </summary>
|
/// <param name="gatewayId"></param>
|
public async Task<bool> DoSwitchGateway(string gatewayId)
|
{
|
var zbGateway = this.GetLocalGateway(gatewayId);
|
if (this.CheckGatewayOnlineByFlag(zbGateway) == true)
|
{
|
//重新获取在线网关的信息
|
var result = await this.GetOnlineGatewayInfo(gatewayId);
|
if (result == false)
|
{
|
return false;
|
}
|
}
|
//切换网关,保存缓存
|
this.SaveGatewayIdToLocation(gatewayId);
|
return true;
|
}
|
|
/// <summary>
|
/// 获取在线网关信息
|
/// </summary>
|
/// <param name="gatewayId"></param>
|
/// <returns></returns>
|
private async Task<bool> GetOnlineGatewayInfo(string gatewayId)
|
{
|
//显示进度条
|
ProgressBar.Show();
|
|
//检测广播到的这个网关是否拥有住宅ID
|
ZbGateway realWay = null;
|
bool getGatewayInfo = true;
|
if (this.GetRealGateway(ref realWay, gatewayId) == true)
|
{
|
//重新设置住宅ID(这个应该是不经过APP,直接把网关恢复了出厂设置)
|
if (this.HomeIdIsEmpty(realWay.getGatewayBaseInfo.HomeId) == true)
|
{
|
int result2 = await this.ReBindNewGateway(realWay);
|
if (result2 == 0)
|
{
|
//出现未知错误,请稍后再试
|
this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uUnKnowErrorAndResetAgain));
|
//关闭进度条
|
ProgressBar.Close();
|
}
|
else if (result2 == -1)
|
{
|
//关闭进度条
|
ProgressBar.Close();
|
return false;
|
}
|
//重新绑定网关里面已经重新获取了网关信息
|
getGatewayInfo = false;
|
}
|
}
|
|
if (getGatewayInfo == true)
|
{
|
//获取网关信息
|
var info = await this.GetGatewayNewInfoAsync(realWay);
|
if (info == null)
|
{
|
//关闭进度条
|
ProgressBar.Close();
|
return false;
|
}
|
}
|
|
//获取全部设备
|
bool result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay);
|
//关闭进度条
|
ProgressBar.Close();
|
if (result == false)
|
{
|
return false;
|
}
|
return true;
|
}
|
|
/// <summary>
|
/// 保存选择的网关ID到本地
|
/// </summary>
|
/// <param name="gatewayId"></param>
|
public void SaveGatewayIdToLocation(string gatewayId)
|
{
|
GatewayResourse.AppOldSelectGatewayId = gatewayId;
|
byte[] data = System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(GatewayResourse.AppOldSelectGatewayId));
|
Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.AppOldSelectGatewayFile, data);
|
}
|
|
#endregion
|
|
#region ■ 删除网关___________________________
|
|
/// <summary>
|
/// 删除网关,包括云端和本地(失败时不会显示信息,并且会返回true)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
public async Task<bool> DeleteGateway(ZbGateway zbGateway)
|
{
|
string gwID = this.GetGatewayId(zbGateway);
|
//移除本地网关信息
|
return await this.DeleteGateway(gwID);
|
}
|
|
/// <summary>
|
/// 删除网关,包括云端和本地(失败时不会显示信息,并且会返回true)
|
/// </summary>
|
/// <param name="zbGatewayID"></param>
|
public async Task<bool> DeleteGateway(string zbGatewayID)
|
{
|
ZbGateway realWay = null;
|
bool hadReal = this.GetRealGateway(ref realWay, zbGatewayID);
|
|
//暂不支持分享
|
if (hadReal == true && realWay.GatewayOnlineFlage == true)
|
{
|
//清空网关的住宅ID
|
bool result = await this.SetHomeIdToGateway(realWay, string.Empty);
|
if (result == false)
|
{
|
//网关解绑失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGatewayUnBindFail);
|
this.ShowErrorMsg(msg);
|
return false;
|
}
|
}
|
|
//删除云端的网关
|
await Phone.UserCenter.HdlGatewayLogic.Current.DeleteDataBaseGateway(zbGatewayID);
|
|
//删除网关文件
|
this.DeleteGatewayFile(zbGatewayID);
|
|
//移除
|
ZbGateway.GateWayList.RemoveAll((obj) => this.GetGatewayId(obj) == zbGatewayID);
|
//断开mqtt连接
|
realWay.DisConnect("GD");
|
|
return true;
|
}
|
|
/// <summary>
|
/// 删除网关文件
|
/// </summary>
|
/// <param name="zbGatewayID">网关id</param>
|
public void DeleteGatewayFile(string zbGatewayID)
|
{
|
if (dicGateway.ContainsKey(zbGatewayID) == false)
|
{
|
return;
|
}
|
//删除文件
|
string file = dicGateway[zbGatewayID].FilePath;
|
if (Global.IsExistsByHomeId(file) == true)
|
{
|
Global.DeleteFilebyHomeId(file);
|
}
|
|
//移除缓存
|
dicGateway.Remove(zbGatewayID);
|
//删除自动备份
|
HdlAutoBackupLogic.DeleteFile(file);
|
|
//删除设备文件
|
List<CommonDevice> list = Common.LocalDevice.Current.GetDeviceByGatewayID(zbGatewayID);
|
foreach (var device in list)
|
{
|
//删除设备文件
|
Common.LocalDevice.Current.DeleteMemmoryDevice(device, true);
|
}
|
//如果是主网关
|
if (this.IsMainGateway(zbGatewayID) == 1)
|
{
|
foreach (var room in Shared.Common.Room.Lists)
|
{
|
//删除场景文件
|
foreach (var scene in room.SceneUIFilePathList)
|
{
|
if (Global.IsExistsByHomeId(scene) == true)
|
{
|
Global.DeleteFilebyHomeId(scene);
|
}
|
}
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 网关掉线___________________________
|
|
/// <summary>
|
/// 刷新网关的在线状态(注意,刷新的是缓存,请调用CheckGatewayOnlineByFlag来判断是否在线)
|
/// </summary>
|
/// <param name="listGateway"></param>
|
/// <param name="waitTime">局域网的时候,时候等待3秒延迟</param>
|
/// <returns></returns>
|
public void RefreshGatewayOnlineStatu(List<ZbGateway> listGateway, bool waitTime = true)
|
{
|
var listRealWay = new List<ZbGateway>();
|
for (int i = 0; i < listGateway.Count; i++)
|
{
|
ZbGateway zbTemp = null;
|
if (this.GetRealGateway(ref zbTemp, listGateway[i]) == true)
|
{
|
//真实物理网关
|
listRealWay.Add(zbTemp);
|
}
|
else
|
{
|
//虚拟物理网关
|
listRealWay.Add(listGateway[i]);
|
if (waitTime == false)
|
{
|
//不等待的话,标识指定网关为不在线
|
this.SetGatewayNotOnLineFlag(listRealWay[i]);
|
}
|
}
|
if (waitTime == true)
|
{
|
//只有等待的时候,才标识指定网关为不在线
|
this.SetGatewayNotOnLineFlag(listRealWay[i]);
|
}
|
}
|
|
if (waitTime == true)
|
{
|
//这是第一道坎,强制检查WIFI:等待2秒(因为wifi的时候,它会自动去刷新flage)
|
System.Threading.Thread.Sleep(2000);
|
//检查是否拥有网关存在于WIFi下
|
if (this.CheckHadGatewayInWifi(listRealWay) == false)
|
{
|
//第二道坎:在远程的情况下刷新网关的在线状态
|
this.RefreshGatewayOnlineOnRemode(listRealWay);
|
}
|
}
|
|
//刷新缓存的在线标识
|
foreach (var zbway in listRealWay)
|
{
|
string gwID = this.GetGatewayId(zbway);
|
if (this.dicGateway.ContainsKey(gwID) == false)
|
{
|
continue;
|
}
|
this.dicGateway[gwID].GatewayOnlineFlage = zbway.GatewayOnlineFlage;
|
this.dicGateway[gwID].ReSave();
|
}
|
}
|
|
/// <summary>
|
/// 检查是否拥有网关存在于WIFi下
|
/// </summary>
|
/// <param name="listGateway"></param>
|
/// <returns></returns>
|
private bool CheckHadGatewayInWifi(List<ZbGateway> listGateway)
|
{
|
foreach (var zbway in listGateway)
|
{
|
//是否存在网关存在于WIFI下
|
if (zbway.GatewayOnlineFlage == true)
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 在远程的情况下刷新网关的在线状态
|
/// </summary>
|
/// <param name="listGateway"></param>
|
/// <returns></returns>
|
private void RefreshGatewayOnlineOnRemode(List<ZbGateway> listGateway)
|
{
|
//获取云端上面的网关
|
Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
|
if (dicDbGateway == null)
|
{
|
return;
|
}
|
foreach (var way in listGateway)
|
{
|
if (way == null || way.getGatewayBaseInfo == null)
|
{
|
continue;
|
}
|
string strId = this.GetGatewayId(way);
|
if (dicDbGateway.ContainsKey(strId) == true //如果云端上面有这个网关
|
&& dicDbGateway[strId].MqttOnlineStatus == true //如果云端上面这个网关是在线的
|
)
|
{
|
way.GatewayOnlineFlage = true;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 标识指定网关为不在线
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
public void SetGatewayNotOnLineFlag(ZbGateway zbGateway)
|
{
|
if (zbGateway == null)
|
{
|
return;
|
}
|
zbGateway.GatewayOnlineFlage = false;
|
}
|
|
/// <summary>
|
/// 根据某种标识判断指定网关是否在线
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public bool CheckGatewayOnlineByFlag(ZbGateway zbGateway)
|
{
|
if (zbGateway == null)
|
{
|
return false;
|
}
|
//使用缓存的,因为刷新在线状态的时候,刷新的就是缓存,而不是真实物理网关
|
string gwID = this.GetGatewayId(zbGateway);
|
if (this.dicGateway.ContainsKey(gwID) == true)
|
{
|
return this.dicGateway[gwID].GatewayOnlineFlage;
|
}
|
|
return zbGateway.GatewayOnlineFlage;
|
}
|
|
#endregion
|
|
#region ■ 获取网关___________________________
|
|
/// <summary>
|
/// 从网关获取全部的网关(以本地网关为标准)
|
/// </summary>
|
/// <returns></returns>
|
public List<ZbGateway> GetAllGatewayFromGateway()
|
{
|
//不要去Foreach 它的列表
|
List<ZbGateway> list = new List<ZbGateway>();
|
list.AddRange(ZbGateway.GateWayList);
|
|
List<ZbGateway> newlist = new List<ZbGateway>();
|
foreach (var way in list)
|
{
|
if (Config.Instance.HomeId != way.getGatewayBaseInfo.HomeId)
|
{
|
//如果不是当前住宅
|
continue;
|
}
|
string gwID = this.GetGatewayId(way);
|
if (this.dicGateway.ContainsKey(gwID) == false)
|
{
|
//如果本地并没有这个网关
|
continue;
|
}
|
newlist.Add(way);
|
}
|
return newlist;
|
}
|
|
/// <summary>
|
/// 获取本地全部的网关
|
/// </summary>
|
/// <returns>The all gateway.</returns>
|
public List<ZbGateway> GetAllLocalGateway()
|
{
|
List<ZbGateway> listData = new List<ZbGateway>();
|
lock (dicGateway)
|
{
|
foreach (var way in dicGateway.Values)
|
{
|
listData.Add(way);
|
}
|
}
|
return listData;
|
}
|
|
/// <summary>
|
/// 获取本地的网关
|
/// </summary>
|
/// <param name="gatewayId">网关ID</param>
|
/// <returns></returns>
|
public ZbGateway GetLocalGateway(string gatewayId)
|
{
|
if (this.dicGateway.ContainsKey(gatewayId) == true)
|
{
|
return this.dicGateway[gatewayId];
|
}
|
return null;
|
}
|
|
/// <summary>
|
/// 获取本地所有的网关文件
|
/// </summary>
|
/// <returns></returns>
|
public List<string> GetAllGatewayFile()
|
{
|
List<string> list = new List<string>();
|
List<string> listFile = Global.FileListByHomeId();
|
foreach (string file in listFile)
|
{
|
//只获取网关设备
|
if (file.StartsWith(gwFirstName) == false)
|
{
|
continue;
|
}
|
list.Add(file);
|
}
|
return list;
|
}
|
|
/// <summary>
|
/// 获取系统内部的真实网关对象变量
|
/// </summary>
|
/// <param name="zbGateway">真实网关</param>
|
/// <param name="tagartWay">目标网关</param>
|
/// <returns></returns>
|
public bool GetRealGateway(ref ZbGateway zbGateway, ZbGateway tagartWay)
|
{
|
if (tagartWay == null || tagartWay.getGatewayBaseInfo == null)
|
{
|
return false;
|
}
|
return this.GetRealGateway(ref zbGateway, this.GetGatewayId(tagartWay));
|
}
|
|
/// <summary>
|
/// 获取系统内部的真实网关对象变量
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <param name="gwId"></param>
|
/// <returns></returns>
|
public bool GetRealGateway(ref ZbGateway zbGateway, string gwId)
|
{
|
var realWay = ZbGateway.GateWayList.Find((obj) =>
|
{
|
return this.GetGatewayId(obj) == gwId;
|
});
|
if (realWay == null)
|
{
|
//如果网关对象丢失了,则创建个新的
|
realWay = new ZbGateway { IsVirtual = true, };
|
realWay.getGatewayBaseInfo.gwID = gwId;
|
realWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId;
|
ZbGateway.GateWayList.Add(realWay);
|
}
|
zbGateway = realWay;
|
return true;
|
}
|
|
#endregion
|
|
#region ■ 获取协调器当前信道_________________
|
|
/// <summary>
|
/// 获取协调器当前信道(会有等待延迟,返回-1代表错误)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public int GetGatewayChannelId(ZbGateway zbGateway)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, zbGateway) == false)
|
{
|
//错误:网关对象丢失
|
this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
|
return -1;
|
}
|
ChannelIdInfo data = null;
|
Action<string, string> action = (topic, message) =>
|
{
|
var gatewayID = topic.Split('/')[0];
|
if (topic == gatewayID + "/" + "ZbGw/GetChannel_Respon")
|
{
|
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
|
data = Newtonsoft.Json.JsonConvert.DeserializeObject<ChannelIdInfo>(jobject["Data"].ToString());
|
}
|
};
|
realWay.Actions += action;
|
|
var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 64512 }, { "Command", 8 } };
|
realWay.Send("ZbGw/GetChannel", jObject.ToString());
|
|
int TimeOut = 0;
|
while (data == null && TimeOut < 30)
|
{
|
System.Threading.Thread.Sleep(100);
|
TimeOut++;
|
}
|
|
realWay.Actions -= action;
|
if (data == null)
|
{
|
//获取协调器信道失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayChannelIdFail);
|
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时");
|
this.ShowTipMsg(msg);
|
return -1;
|
}
|
|
return data.Channel;
|
}
|
|
/// <summary>
|
/// 网关信道信息
|
/// </summary>
|
private class ChannelIdInfo
|
{
|
/// <summary>
|
/// 网关信道
|
/// </summary>
|
public int Channel = -1;
|
}
|
|
#endregion
|
|
#region ■ 获取协调器MAC______________________
|
|
/// <summary>
|
/// 获取协调器MAC地址(会有等待延迟,返回null代表错误)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public string GetGatewayCoordinatorMac(ZbGateway zbGateway)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, zbGateway) == false)
|
{
|
//错误:网关对象丢失
|
this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
|
return null;
|
}
|
CoordinatorMacInfo data = null;
|
Action<string, string> action = (topic, message) =>
|
{
|
var gatewayID = topic.Split('/')[0];
|
if (topic == gatewayID + "/" + "ZbGw/GetMac_Respon")
|
{
|
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
|
data = Newtonsoft.Json.JsonConvert.DeserializeObject<CoordinatorMacInfo>(jobject["Data"].ToString());
|
}
|
};
|
realWay.Actions += action;
|
|
var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 64512 }, { "Command", 13 } };
|
realWay.Send("ZbGw/GetMac", jObject.ToString());
|
|
int TimeOut = 0;
|
while (data == null && TimeOut < 30)
|
{
|
System.Threading.Thread.Sleep(100);
|
TimeOut++;
|
}
|
|
realWay.Actions -= action;
|
if (data == null)
|
{
|
//获取协调器Mac失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayCoordinatorMacFail);
|
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时");
|
this.ShowTipMsg(msg);
|
return null;
|
}
|
|
return data.MacAddr;
|
}
|
|
/// <summary>
|
/// 网关协调器Mac信息
|
/// </summary>
|
private class CoordinatorMacInfo
|
{
|
/// <summary>
|
/// 调器Mac
|
/// </summary>
|
public string MacAddr = string.Empty;
|
}
|
|
#endregion
|
|
#region ■ 获取协调器PanID____________________
|
|
/// <summary>
|
/// 获取协调器PanID(会有等待延迟,返回-1代表错误)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public int GetGatewayPanId(ZbGateway zbGateway)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, zbGateway) == false)
|
{
|
//错误:网关对象丢失
|
this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
|
return -1;
|
}
|
PanIdInfo data = null;
|
Action<string, string> action = (topic, message) =>
|
{
|
var gatewayID = topic.Split('/')[0];
|
if (topic == gatewayID + "/" + "ZbGw/GetPanId_Respon")
|
{
|
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
|
data = Newtonsoft.Json.JsonConvert.DeserializeObject<PanIdInfo>(jobject["Data"].ToString());
|
}
|
};
|
realWay.Actions += action;
|
|
var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 64512 }, { "Command", 12 } };
|
realWay.Send("ZbGw/GetPanId", jObject.ToString());
|
|
int TimeOut = 0;
|
while (data == null && TimeOut < 30)
|
{
|
System.Threading.Thread.Sleep(100);
|
TimeOut++;
|
}
|
|
realWay.Actions -= action;
|
if (data == null)
|
{
|
//获取协调器PanID失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayPanIDFail);
|
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时");
|
this.ShowTipMsg(msg);
|
return -1;
|
}
|
|
return data.PANID;
|
}
|
|
/// <summary>
|
/// 网关PanId信息
|
/// </summary>
|
private class PanIdInfo
|
{
|
/// <summary>
|
/// PanId
|
/// </summary>
|
public int PANID = -1;
|
}
|
|
#endregion
|
|
#region ■ 获取网关GwInfo里面的属性___________
|
|
/// <summary>
|
/// 获取网关GwInfo里面的属性
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <param name="attributeName">getGwInfo里面属性的名字</param>
|
/// <param name="defult">如果获取不到时,设置的默认值</param>
|
/// <returns></returns>
|
public object GetGwInfoAttribute(ZbGateway zbGateway, string attributeName, string defult = "")
|
{
|
string gwID = this.GetGatewayId(zbGateway);
|
var localWay = this.GetLocalGateway(gwID);
|
|
object objValue = null;
|
if (localWay == null || localWay.getGwInfo == null)
|
{
|
//本地没有记录有这个东西,则直接返回参数的数据
|
if (zbGateway.getGwInfo != null)
|
{
|
objValue = zbGateway.getGwInfo.GetType().InvokeMember(attributeName, System.Reflection.BindingFlags.GetField, null, zbGateway.getGwInfo, null);
|
}
|
else
|
{
|
return defult;
|
}
|
}
|
else
|
{
|
//获取本地的属性
|
objValue = localWay.getGwInfo.GetType().InvokeMember(attributeName, System.Reflection.BindingFlags.GetField, null, localWay.getGwInfo, null);
|
}
|
|
if (objValue == null)
|
{
|
return defult;
|
}
|
return objValue;
|
}
|
|
#endregion
|
|
#region ■ 获取网关ID(有特殊意义)_____________
|
|
/// <summary>
|
/// 获取网关对象里面的网关ID(封装这个方法有特殊意义)
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <returns></returns>
|
public string GetGatewayId(ZbGateway zbGateway)
|
{
|
//这个东西不会为空
|
return zbGateway.getGatewayBaseInfo.gwID;
|
}
|
|
#endregion
|
|
#region ■ 获取名称___________________________
|
|
/// <summary>
|
/// 获取网关加特效的名称
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <param name="mode"></param>
|
/// <returns></returns>
|
public string GetGatewayName(ZbGateway zbGateway, GetNameMode mode = GetNameMode.SpecialGateway)
|
{
|
string gwId = this.GetGatewayId(zbGateway);
|
if (this.dicGateway.ContainsKey(gwId) == false)
|
{
|
return zbGateway.getGatewayBaseInfo.GwName == null ? string.Empty : zbGateway.getGatewayBaseInfo.GwName;
|
}
|
var localWay = this.dicGateway[gwId];
|
|
string name = this.GetGatewaySimpleName(localWay);
|
if (string.IsNullOrEmpty(name) == false)
|
{
|
return name;
|
}
|
|
if (mode == GetNameMode.SpecialGateway && localWay.getGwInfo != null)
|
{
|
string keyName = Common.LocalDevice.deviceModelIdName + this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString();
|
if (Common.LocalDevice.Current.dicDeviceDefultNameID.ContainsKey(keyName) == true)
|
{
|
//没有名称时,则使用R文件里面设置的东西
|
return Language.StringByID(Common.LocalDevice.Current.dicDeviceDefultNameID[keyName]);
|
}
|
}
|
|
return string.Empty;
|
}
|
|
/// <summary>
|
/// 单纯获取网关名称
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <returns></returns>
|
private string GetGatewaySimpleName(ZbGateway zbGateway)
|
{
|
if (zbGateway == null)
|
{
|
return string.Empty;
|
}
|
return zbGateway.getGatewayBaseInfo.GwName;
|
}
|
|
/// <summary>
|
/// 设置网关镜像类型的翻译名字
|
/// </summary>
|
/// <param name="button"></param>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public void SetGatewayImageText(Button button, ZbGateway zbGateway)
|
{
|
//初始值:无法识别的网关设备
|
button.TextID = R.MyInternationalizationString.uUnDistinguishTheGatewayDevice;
|
|
string gwId = this.GetGatewayId(zbGateway);
|
if (this.dicGateway.ContainsKey(gwId) == false || this.dicGateway[gwId].getGwInfo == null)
|
{
|
//如果这个网关没有信息,则从新获取
|
if (zbGateway.getGwInfo != null && zbGateway.getGwInfo.LinuxImageType != 0)
|
{
|
string keyName = Common.LocalDevice.deviceModelIdName + zbGateway.getGwInfo.LinuxImageType;
|
if (Common.LocalDevice.Current.dicDeviceDefultNameID.ContainsKey(keyName) == true)
|
{
|
//使用R文件里面设置的东西
|
button.TextID = LocalDevice.Current.dicDeviceDefultNameID[keyName];
|
}
|
}
|
else
|
{
|
//给一个线程去获取它的镜像类型
|
HdlThreadLogic.Current.RunThread(async () =>
|
{
|
var result = await this.GetGatewayNewInfoAsync(zbGateway, ShowErrorMode.NO);
|
if (result != null)
|
{
|
zbGateway.getGwInfo = result;
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
string keyName = Common.LocalDevice.deviceModelIdName + zbGateway.getGwInfo.LinuxImageType;
|
if (Common.LocalDevice.Current.dicDeviceDefultNameID.ContainsKey(keyName) == true)
|
{
|
//使用R文件里面设置的东西
|
button.TextID = LocalDevice.Current.dicDeviceDefultNameID[keyName];
|
}
|
});
|
}
|
});
|
}
|
}
|
else
|
{
|
string keyName = Common.LocalDevice.deviceModelIdName + this.dicGateway[gwId].getGwInfo.LinuxImageType;
|
if (Common.LocalDevice.Current.dicDeviceDefultNameID.ContainsKey(keyName) == true)
|
{
|
//使用R文件里面设置的东西
|
button.TextID = Common.LocalDevice.Current.dicDeviceDefultNameID[keyName];
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 获取网关信息_______________________
|
|
/// <summary>
|
/// 获取网关信息(版本信息,镜像类型,基本信息等。只刷新本地网关的缓存)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <param name="mode"></param>
|
/// <returns></returns>
|
public async Task<ZbGatewayData.GetGwData> GetGatewayNewInfoAsync(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, zbGateway) == false)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
|
this.ShowTipMsg(msg);
|
}
|
return null;
|
}
|
//获取网关版本信息
|
var imageTypeResult = await realWay.GetZbGwInfoAsync();
|
//检测网关返回的共通错误状态码
|
string error = HdlCheckLogic.Current.CheckCommonErrorCode(imageTypeResult);
|
if (error != null)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
this.ShowTipMsg(error);
|
}
|
return null;
|
}
|
|
if (imageTypeResult == null || imageTypeResult.getGwData == null)
|
{
|
if (mode == ShowErrorMode.YES)
|
{
|
//获取网关信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
|
//拼接上【网关回复超时】的Msg
|
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时");
|
this.ShowErrorMsg(msg);
|
}
|
return null;
|
}
|
|
string gwID = this.GetGatewayId(zbGateway);
|
if (this.dicGateway.ContainsKey(gwID) == true)
|
{
|
//刷新缓存
|
ZbGateway localWay = this.dicGateway[gwID];
|
localWay.getGwInfo = imageTypeResult.getGwData;
|
localWay.getGatewayBaseInfo.GwName = imageTypeResult.getGwData.GwName;
|
localWay.getGatewayBaseInfo.IpAddress = imageTypeResult.getGwData.GwIP;
|
|
localWay.ReSave();
|
}
|
|
return imageTypeResult.getGwData;
|
}
|
|
/// <summary>
|
/// 获取网关信息,非异步,会等待(版本信息,镜像类型,基本信息等。只刷新本地网关的缓存)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <param name="mode"></param>
|
/// <returns></returns>
|
public ZbGatewayData.GetGwData GetGatewayNewInfo(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
|
{
|
bool bolBreak = false;
|
ZbGatewayData.GetGwData result = null;
|
HdlThreadLogic.Current.RunThread(async () =>
|
{
|
result = await this.GetGatewayNewInfoAsync(zbGateway, mode);
|
bolBreak = true;
|
});
|
|
while (bolBreak == false)
|
{
|
System.Threading.Thread.Sleep(500);
|
}
|
return result;
|
}
|
|
#endregion
|
|
#region ■ 清空真实网关列表___________________
|
|
/// <summary>
|
/// 清空全部的真实物理网关对象
|
/// </summary>
|
public void ClearAllRealGateway()
|
{
|
//因为那一瞬间,有可能mqtt会加回来,所以先加缓存
|
var list = new List<ZbGateway>();
|
list.AddRange(ZbGateway.GateWayList);
|
//然后清空掉
|
ZbGateway.GateWayList.Clear();
|
//最后再断开mqtt连接
|
for (int i = 0; i < list.Count; i++)
|
{
|
list[i].DisConnect("G");
|
}
|
list.Clear();
|
}
|
|
#endregion
|
|
#region ■ 检测并获取网关各种固件新版本_______
|
|
/// <summary>
|
/// 检测并获取网关各固件的新版本,没有新版本,则对应位置存的是null,直接返回null代表失败(0:Linux新版本 1:协调器新版本 2~X:都是虚拟驱动的)
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <param name="mode">错误时,是否显示错误</param>
|
/// <returns></returns>
|
public async Task<List<FirmwareVersionInfo>> GetGatewayAllNewVersion(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
|
{
|
//获取网关版本信息
|
var result = await HdlGatewayLogic.Current.GetGatewayNewInfoAsync(zbGateway, mode);
|
if (result == null)
|
{
|
return null;
|
}
|
//使用本地缓存对象
|
string gwID = this.GetGatewayId(zbGateway);
|
var localWay = this.GetLocalGateway(gwID);
|
if (localWay == null)
|
{
|
return null;
|
}
|
|
//添加网关的升级固件(成不成功都无所谓)
|
var flage = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.Linux,
|
this.GetGwInfoAttribute(localWay, "LinuxHWVersion").ToString(),
|
this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString());
|
|
//添加协调器的升级固件(成不成功都无所谓)
|
flage = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.Coordinator,
|
this.GetGwInfoAttribute(localWay, "ZbHWVersion").ToString(),
|
this.GetGwInfoAttribute(localWay, "ZbImageType").ToString());
|
|
//网关的版本
|
var gatewayFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.Linux,
|
this.GetGwInfoAttribute(localWay, "LinuxHWVersion").ToString(),
|
this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString(),
|
Convert.ToInt32(this.GetGwInfoAttribute(localWay, "LinuxFWVersion")));
|
|
//协调器版本
|
var coordinatorFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.Coordinator,
|
this.GetGwInfoAttribute(localWay, "ZbHWVersion").ToString(),
|
this.GetGwInfoAttribute(localWay, "ZbImageType").ToString(),
|
Convert.ToInt32(this.GetGwInfoAttribute(localWay, "ZbFWVersion")));
|
|
//这个网关需要有虚拟驱动这个东西才行
|
FirmwareVersionInfo virtualFirmware = null;
|
string linImage = this.GetGwInfoAttribute(localWay, "LinuxImageType").ToString();
|
if (linImage != "6")
|
{
|
//虚拟驱动号
|
var listvVode = await HdlGatewayLogic.Current.GetListVDDriveCode(localWay);
|
if (listvVode != null && listvVode.Count > 0)
|
{
|
//添加虚拟驱动的升级固件(成不成功都无所谓)
|
flage = await HdlFirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.VirtualDevice,
|
listvVode[0].DriveHwVersion.ToString(),
|
listvVode[0].DriveImageType.ToString());
|
|
//虚拟驱动
|
virtualFirmware = HdlFirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.VirtualDevice,
|
listvVode[0].DriveHwVersion.ToString(),
|
listvVode[0].DriveImageType.ToString(),
|
listvVode[0].DriveFwVersion);
|
|
if (virtualFirmware != null)
|
{
|
virtualFirmware.VirtualCode = listvVode[0].DriveCode;
|
}
|
}
|
}
|
var list = new List<FirmwareVersionInfo>();
|
list.Add(gatewayFirmware);
|
list.Add(coordinatorFirmware);
|
list.Add(virtualFirmware);
|
|
return list;
|
}
|
|
/// <summary>
|
/// 获取网关的虚拟驱动号(返回null时代表获取失败)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public async Task<List<ZbGatewayData.DriveCodeObj>> GetListVDDriveCode(ZbGateway zbGateway)
|
{
|
ZbGateway zbTemp = null;
|
if (this.GetRealGateway(ref zbTemp, zbGateway) == false)
|
{
|
return null;
|
}
|
var result = await zbTemp.CheckVDDriveCodeAsync();
|
//检测网关返回的共通错误状态码
|
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
|
if (error != null)
|
{
|
this.ShowTipMsg(error);
|
return null;
|
}
|
|
if (result == null || result.vDriveDriveCodeResponData == null || result.vDriveDriveCodeResponData.DriveCodeList == null)
|
{
|
return null;
|
}
|
if (result.vDriveDriveCodeResponData.DriveCodeList.Count > 0)
|
{
|
return result.vDriveDriveCodeResponData.DriveCodeList;
|
}
|
return null;
|
}
|
|
#endregion
|
|
#region ■ 主网关判定_________________________
|
|
/// <summary>
|
/// 判断是否主网关(1:主网关 0:不在线 2:子网关)
|
/// </summary>
|
/// <param name="zbGateway">网关对象</param>
|
/// <returns></returns>
|
public int IsMainGateway(ZbGateway zbGateway)
|
{
|
string gwID = this.GetGatewayId(zbGateway);
|
return this.IsMainGateway(gwID);
|
}
|
|
/// <summary>
|
/// 判断是否主网关(1:主网关 0:不在线 2:子网关)
|
/// </summary>
|
/// <param name="waiID">网关id</param>
|
/// <returns></returns>
|
public int IsMainGateway(string waiID)
|
{
|
ZbGateway zbGateway = null;
|
if (this.GetRealGateway(ref zbGateway, waiID) == false)
|
{
|
return 0;
|
}
|
return zbGateway.IsMainGateWay == true ? 1 : 2;
|
}
|
|
#endregion
|
|
#region ■ 设置网关图片_______________________
|
|
/// <summary>
|
/// 设置真实网关的图片
|
/// </summary>
|
/// <param name="button"></param>
|
/// <param name="zbGateway"></param>
|
public void SetRealGatewayPictrue(Button button, ZbGateway zbGateway)
|
{
|
string gwID = this.GetGatewayId(zbGateway);
|
var localWay = this.GetLocalGateway(gwID);
|
if (localWay == null || localWay.getGwInfo == null)
|
{
|
if (zbGateway.getGwInfo != null && zbGateway.getGwInfo.LinuxImageType != 0)
|
{
|
button.UnSelectedImagePath = "Gateway/RealGateway" + zbGateway.getGwInfo.LinuxImageType + ".png";
|
}
|
else
|
{
|
//给一个线程去获取它的镜像类型
|
HdlThreadLogic.Current.RunThread(async () =>
|
{
|
var result = await this.GetGatewayNewInfoAsync(zbGateway, ShowErrorMode.NO);
|
if (result != null)
|
{
|
zbGateway.getGwInfo = result;
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
button.UnSelectedImagePath = "Gateway/RealGateway" + result.LinuxImageType + ".png";
|
});
|
}
|
});
|
}
|
}
|
else
|
{
|
button.UnSelectedImagePath = "Gateway/RealGateway" + localWay.getGwInfo.LinuxImageType + ".png";
|
}
|
}
|
|
/// <summary>
|
/// 设置网关图标
|
/// </summary>
|
/// <param name="button"></param>
|
/// <param name="zbGateway"></param>
|
public void SetGatewayIcon(Button button, ZbGateway zbGateway)
|
{
|
string gwID = this.GetGatewayId(zbGateway);
|
var localWay = this.GetLocalGateway(gwID);
|
if (localWay == null || localWay.getGwInfo == null)
|
{
|
if (zbGateway.getGwInfo != null && zbGateway.getGwInfo.LinuxImageType != 0)
|
{
|
button.UnSelectedImagePath = "Gateway/GatewayIcon" + zbGateway.getGwInfo.LinuxImageType + ".png";
|
}
|
else
|
{
|
//给一个线程去获取它的镜像类型
|
HdlThreadLogic.Current.RunThread(async () =>
|
{
|
var result = await this.GetGatewayNewInfoAsync(zbGateway, ShowErrorMode.NO);
|
if (result != null)
|
{
|
zbGateway.getGwInfo = result;
|
HdlThreadLogic.Current.RunMain(() =>
|
{
|
button.UnSelectedImagePath = "Gateway/GatewayIcon" + result.LinuxImageType + ".png";
|
});
|
}
|
});
|
}
|
}
|
else
|
{
|
button.UnSelectedImagePath = "Gateway/GatewayIcon" + localWay.getGwInfo.LinuxImageType + ".png";
|
}
|
}
|
|
#endregion
|
|
#region ■ 网关存在检测_______________________
|
|
/// <summary>
|
/// 网关是否已经存在
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
/// <returns></returns>
|
public bool IsGatewayExist(ZbGateway zbGateway)
|
{
|
string gwID = this.GetGatewayId(zbGateway);
|
return this.IsGatewayExist(gwID);
|
}
|
|
/// <summary>
|
/// 网关是否已经存在
|
/// </summary>
|
/// <param name="gatewayId">网关ID</param>
|
/// <returns></returns>
|
public bool IsGatewayExist(string gatewayId)
|
{
|
if (gatewayId == null)
|
{
|
return false;
|
}
|
return dicGateway.ContainsKey(gatewayId);
|
}
|
|
#endregion
|
|
#region ■ 网关定位___________________________
|
|
/// <summary>
|
/// 发送指令到网关进行定位(网关LED闪烁识别)
|
/// </summary>
|
/// <param name="zbGateway"></param>
|
public void SetFixedPositionCommand(ZbGateway zbGateway)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, zbGateway) == false)
|
{
|
return;
|
}
|
var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 85 } };
|
realWay.Send("GwLinuxLocate_Respon", jObject.ToString());
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 弹出网关不在线的
|
/// </summary>
|
private void ShowGatewayNotOnlineMsg()
|
{
|
Application.RunOnMainThread(() =>
|
{
|
//网关连接失败,请确认网络
|
string msg = Language.StringByID(R.MyInternationalizationString.uGatewayIsNotLinkAndCheckNetwork);
|
var control = new ShowMsgControl(ShowMsgType.Tip, msg);
|
control.Show();
|
});
|
}
|
|
/// <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
|
|
#region ■ 网关监视___________________________
|
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 当前的网络连接模式
|
/// </summary>
|
private GatewayConnectMode nowGwConnectMode = GatewayConnectMode.None;
|
/// <summary>
|
/// 是否存在网关正在升级
|
/// </summary>
|
private bool hadGatewayUpdate = false;
|
|
#endregion
|
|
#region ■ 网关连接方式变更___________________
|
|
/// <summary>
|
/// 当网关的连接方式改变时,检测网关,然后显示特效
|
/// </summary>
|
/// <param name="connectMode">网关变更后的连接方式</param>
|
public void CheckGatewayByConnectChanged(GatewayConnectMode connectMode)
|
{
|
if (this.nowGwConnectMode == connectMode || this.hadGatewayUpdate == true)
|
{
|
//相同的连接模式,或者有网关正在升级,则不需要操作
|
return;
|
}
|
|
//没有网络
|
if (connectMode == GatewayConnectMode.NoLine)
|
{
|
nowGwConnectMode = GatewayConnectMode.NoLine;
|
//在远程的条件下,检查网关的在线状态(网络变更时触发)
|
}
|
//可以叫4G
|
else if (connectMode == GatewayConnectMode.Remote)
|
{
|
nowGwConnectMode = GatewayConnectMode.Remote;
|
//在远程的条件下,检查网关的在线状态(网络变更时触发)
|
this.CheckGatewayStatuByRemote();
|
}
|
//WIFI
|
else if (connectMode == GatewayConnectMode.WIFI)
|
{
|
nowGwConnectMode = GatewayConnectMode.WIFI;
|
//在WIFI的条件下,检查网关的在线状态(网络变更时触发)
|
this.CheckGatewayStatuByWIFI();
|
}
|
}
|
|
#endregion
|
|
#region ■ 检查网关(WIFI)_____________________
|
|
/// <summary>
|
/// 在WIFI的条件下,检查网关的在线状态(网络变更时触发)
|
/// </summary>
|
private void CheckGatewayStatuByWIFI()
|
{
|
if (this.dicGateway.Count == 0)
|
{
|
//如果本地都没有网关的话,不需要处理
|
return;
|
}
|
|
HdlThreadLogic.Current.RunThread(() =>
|
{
|
var dicStatu = this.GetNowOnlineStatuBeforeCheck();
|
//等个3秒,准备一下
|
System.Threading.Thread.Sleep(3000);
|
if (nowGwConnectMode != GatewayConnectMode.WIFI)
|
{
|
//网络临时变更??
|
return;
|
}
|
|
//从网关获取全部的网关
|
List<ZbGateway> list = this.GetAllGatewayFromGateway();
|
foreach (var way in list)
|
{
|
string gwId = this.GetGatewayId(way);
|
if (this.dicGateway.ContainsKey(gwId) == true)
|
{
|
//刷新一下缓存
|
this.dicGateway[gwId].GatewayOnlineFlage = way.GatewayOnlineFlage;
|
}
|
if (this.CheckGatewayOnlineByFlag(way) == true)
|
{
|
//网关在线
|
dicStatu[gwId] = true;
|
}
|
}
|
//将变化的网关推送到界面上
|
this.PushGatewayOnlineStatuToForm(dicStatu);
|
});
|
}
|
|
#endregion
|
|
#region ■ 检查网关(4G)_______________________
|
|
/// <summary>
|
/// 在远程的条件下,检查网关的在线状态(网络变更时触发)
|
/// </summary>
|
private void CheckGatewayStatuByRemote()
|
{
|
if (this.dicGateway.Count == 0)
|
{
|
//如果本地都没有网关的话,不需要处理
|
return;
|
}
|
|
HdlThreadLogic.Current.RunThread(() =>
|
{
|
//先获取现在全部的网关,初期値设置为不在线
|
var dicStatu = this.GetNowOnlineStatuBeforeCheck();
|
|
//获取云端上面的网关
|
Dictionary<string, GatewayResult> dicDbGateway = HdlGatewayLogic.Current.GetGateWayListFromDataBase();
|
if (nowGwConnectMode != GatewayConnectMode.Remote || dicDbGateway == null)
|
{
|
//网络临时变更??
|
return;
|
}
|
|
bool hadOnline = false;
|
lock (dicGateway)
|
{
|
foreach (var way in this.dicGateway.Values)
|
{
|
//循环处理本地全部的网关列表
|
string gwId = this.GetGatewayId(way);
|
if (dicDbGateway.ContainsKey(gwId) == true//如果云端上面有这个网关
|
&& dicDbGateway[gwId].MqttOnlineStatus == true//如果云端上面这个网关是在线的
|
)
|
{
|
dicGateway[gwId].GatewayOnlineFlage = true;
|
//它是在线的
|
dicStatu[gwId] = true;
|
hadOnline = true;
|
}
|
}
|
}
|
|
//将变化的网关推送到界面上
|
this.PushGatewayOnlineStatuToForm(dicStatu);
|
|
//如果没有网关在线
|
if (hadOnline == false)
|
{
|
//远程连接超时,没有网关在线
|
string msg = Language.StringByID(R.MyInternationalizationString.uRemoteTimeOutAndNotGatewaiOnline);
|
//this.ShowTipMsg(msg);
|
}
|
});
|
}
|
|
#endregion
|
|
#region ■ 检查网关(无网络)___________________
|
|
/// <summary>
|
/// 在远程的条件下,检查网关的在线状态(网络变更时触发)
|
/// </summary>
|
private void CheckGatewayStatuByNotNet()
|
{
|
//当前无网络连接,请确认网络
|
string msg = Language.StringByID(R.MyInternationalizationString.uNowIsDonotNetworkAndCheckNetwork);
|
this.ShowTipMsg(msg);
|
}
|
|
#endregion
|
|
#region ■ 网关推送___________________________
|
|
/// <summary>
|
/// 将变化的网关推送到界面上
|
/// </summary>
|
/// <param name="dicStatu"></param>
|
private void PushGatewayOnlineStatuToForm(Dictionary<string, bool> dicStatu)
|
{
|
List<ZbGateway> listChange = new List<ZbGateway>();
|
List<bool> listChangeStatu = new List<bool>();
|
foreach (string gwid in dicStatu.Keys)
|
{
|
//网关不多,直接推送,不判断是否改变了
|
ZbGateway zbGateway = this.GetLocalGateway(gwid);
|
if (zbGateway != null)
|
{
|
listChange.Add(zbGateway);
|
listChangeStatu.Add(dicStatu[gwid]);
|
|
zbGateway.GatewayOnlineFlage = dicStatu[gwid];
|
}
|
}
|
|
if (listChange.Count == 0)
|
{
|
return;
|
}
|
//获取当前接受在线状态推送的界面
|
var listForm = new List<CommonFormBase>();
|
listForm.AddRange(UserCenterResourse.listGatewayOnlinePushForm);
|
if (listForm.Count > 0)
|
{
|
for (int i = 0; i < listChange.Count; i++)
|
{
|
foreach (var form in listForm)
|
{
|
form?.GatewayOnlinePush(listChange[i], listChangeStatu[i]);
|
}
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 设置存在网关正在升级的标识
|
/// </summary>
|
/// <param name="update">是否有网关在升级</param>
|
public void SetHadGatewayUpdateFlage(bool update)
|
{
|
this.hadGatewayUpdate = update;
|
}
|
|
/// <summary>
|
/// 在网络连接变更之后,网关连接检测之前,设置全部网关为离线状态(以本地网关为标准)
|
/// </summary>
|
/// <returns></returns>
|
private Dictionary<string, bool> GetNowOnlineStatuBeforeCheck()
|
{
|
//先获取现在全部的网关
|
List<ZbGateway> listOldGateway = this.GetAllGatewayFromGateway();
|
var dicOldZb = new Dictionary<string, ZbGateway>();
|
foreach (var zb in listOldGateway)
|
{
|
string gwID = this.GetGatewayId(zb);
|
dicOldZb[gwID] = zb;
|
}
|
|
var dicStatu = new Dictionary<string, bool>();
|
lock (dicGateway)
|
{
|
foreach (string gwId in this.dicGateway.Keys)
|
{
|
if (dicOldZb.ContainsKey(gwId) == true)
|
{
|
//标记为不在线
|
this.SetGatewayNotOnLineFlag(dicOldZb[gwId]);
|
}
|
dicStatu[gwId] = false;
|
}
|
}
|
return dicStatu;
|
}
|
|
#endregion
|
|
#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;
|
HdlThreadLogic.Current.RunThread(async () =>
|
{
|
List<string> list = new List<string>() { "NotSetAgain" };
|
|
//设置访问接口的参数
|
var pra = new GetGatewayPra();
|
pra.ReqDto.PageSetting.Page = 1;
|
pra.ReqDto.PageSetting.PageSize = 999;
|
//获取控制主人账号的Token
|
pra.ReqDto.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
|
|
var result = await UserCenterLogic.GetResponseDataByRequestHttps("App/GetSingleHomeGatewayPagger", true, pra, list);
|
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;
|
});
|
|
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="gateway">网关对象</param>
|
/// <param name="Longitude">经度</param>
|
/// <param name="Latitude">维度</param>
|
/// <returns></returns>
|
public bool SetGatewaySite(ZbGateway gateway, double Longitude, double Latitude)
|
{
|
ZbGateway realWay = null;
|
if (this.GetRealGateway(ref realWay, gateway) == false)
|
{
|
//错误:网关对象丢失
|
string msg = Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg);
|
this.ShowTipMsg(msg);
|
return false;
|
}
|
|
int result = -1;
|
Action<string, string> action = (topic, message) =>
|
{
|
var gatewayID = topic.Split('/')[0];
|
if (topic == gatewayID + "/" + "Logic/SetSite_Respon")
|
{
|
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
|
result = Convert.ToInt32(jobject["Data"]["Result"].ToString());
|
}
|
};
|
realWay.Actions += action;
|
//两位小数
|
Longitude = Math.Round(Longitude, 2);
|
Latitude = Math.Round(Latitude, 2);
|
|
int intLongitude = Convert.ToInt32(Longitude.ToString().Replace(".", string.Empty));
|
int intLatitude = Convert.ToInt32(Latitude.ToString().Replace(".", string.Empty));
|
|
var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 2013 } };
|
var data = new Newtonsoft.Json.Linq.JObject { { "Longitude", intLongitude }, { "Latitude", intLatitude } };
|
jObject.Add("Data", data);
|
realWay.Send("Logic/SetSite", jObject.ToString());
|
|
int TimeOut = 0;
|
while (result == -1 && TimeOut < 30)
|
{
|
System.Threading.Thread.Sleep(100);
|
TimeOut++;
|
}
|
|
realWay.Actions -= action;
|
if (result != 0)
|
{
|
//设置网关经纬度失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uSetGatewaySiteFail);
|
if (result == -1)
|
{
|
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "回复超时");
|
}
|
this.ShowTipMsg(msg);
|
return false;
|
}
|
|
return true;
|
}
|
|
#endregion
|
|
#region ■ 解绑云端网关_______________________
|
|
/// <summary>
|
/// 解绑云端绑定的网关
|
/// </summary>
|
/// <param name="strWayId"></param>
|
public async Task<bool> DeleteDataBaseGateway(string strWayId)
|
{
|
var Pra = new DeleteGatewayPra();
|
Pra.BindGateways.Add(strWayId);
|
//获取控制主人账号的Token
|
Pra.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
|
|
List<string> listNotShowError = new List<string>() { "NoExist", "NoBind", "NoRecord" };
|
|
bool result = await UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", true, 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 = HdlGatewayLogic.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()
|
{
|
HdlThreadLogic.Current.RunThread(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();
|
//获取控制主人账号的Token
|
bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
|
|
foreach (var gwId in listTempId)
|
{
|
bindGateway.BindGateways.Clear();
|
bindGateway.BindGateways.Add(gwId);
|
var result = await UserCenterLogic.GetResultCodeByRequestHttps("App/BindGatewayToHome", true, 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);
|
}
|
});
|
}
|
|
#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 (HdlGatewayLogic.Current.GetRealGateway(ref realWay, device.CurrentGateWayId) == false)
|
{
|
//没有找到真实物理网关
|
return false;
|
}
|
string fileName = device.FilePath + ((int)backupEnum).ToString().PadLeft(5, '0');
|
//创建文件对象
|
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));
|
listBackFile.Sort();
|
//添加附加情报:还原设备配置
|
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 < 10 || fileName.StartsWith("Device_") == false)
|
{
|
//不是设备备份文件
|
continue;
|
}
|
//恢复设备配置
|
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 control = new ShowMsgControl(ShowMsgType.Tip, msg);
|
control.Show();
|
});
|
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 control = new ShowMsgControl(ShowMsgType.Tip, msg);
|
control.Show();
|
});
|
ProgressBar.Close();
|
return false;
|
}
|
}
|
//删除多余的文件
|
foreach (var deleteFile in listGatewayFile)
|
{
|
if (deleteFile.Length > 12)
|
{
|
string deviceFileName = deleteFile.Substring(5);
|
if (deviceFileName.StartsWith("Device_") == 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(0, backFileName.Length - 5);
|
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(backFileName.Length - 5, 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 HdlDevicePirSensorLogic.Current.SetPirSensorLightSettion((IASZone)device, recoverData);
|
}
|
else if (backType == GatewayBackupEnum.A干接点颜色调节)
|
{
|
var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Panel.KeyColorData>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await HdlDevicePanelLogic.Current.SetPanelEpointColorInfo((Panel)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 HdlDevicePanelLogic.Current.SetDeviceLightSettion((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 HdlDevicePanelLogic.Current.SetDeviceEnergyConservationMode((Panel)device, modeEnable, modeTime, level);
|
}
|
else if (backType == GatewayBackupEnum.A干接点私有属性)
|
{
|
var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await HdlDevicePanelLogic.Current.EditorDryContactFunction((Panel)device, recoverData);
|
}
|
else if (backType == GatewayBackupEnum.A窗帘方向)
|
{
|
var statu = Newtonsoft.Json.JsonConvert.DeserializeObject<bool>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await HdlDeviceCurtainLogic.Current.SetCurtainDirection((Rollershade)device, statu);
|
}
|
else if (backType == GatewayBackupEnum.A窗帘手拉控制)
|
{
|
var statu = Newtonsoft.Json.JsonConvert.DeserializeObject<bool>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await HdlDeviceCurtainLogic.Current.SetHandPullControl((Rollershade)device, statu);
|
}
|
else if (backType == GatewayBackupEnum.A窗帘上下限位)
|
{
|
var curtainDevice = (Rollershade)device;
|
var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(System.Text.Encoding.UTF8.GetString(byteData));
|
int upLimit = Convert.ToInt32(recoverData["upLimit"]);
|
int downLimit = Convert.ToInt32(recoverData["downLimit"]);
|
//先重置窗帘
|
result = await HdlDeviceCurtainLogic.Current.RestoreCurtain(curtainDevice);
|
if (result == false) { return -1; }
|
await Task.Delay(5000);
|
//重置上限位
|
result = await HdlDeviceCurtainLogic.Current.DeleteCurtainLimitPoint(curtainDevice, Rollershade.LimiType.UpLimit);
|
if (result == false) { return -1; }
|
//将窗帘调整到指定百分比
|
curtainDevice.WcdGoToTiltValue(upLimit);
|
await Task.Delay(3000);
|
//执行确认及覆盖窗帘限位点
|
result = await HdlDeviceCurtainLogic.Current.CommitCurtainLimitPoint(curtainDevice, Rollershade.CurtainPrivateInstalledLimi.UpLimit, -1, -1);
|
if (result == false) { return -1; }
|
|
await Task.Delay(2000);
|
//重置下限位
|
result = await HdlDeviceCurtainLogic.Current.DeleteCurtainLimitPoint(curtainDevice, Rollershade.LimiType.DownLimit);
|
if (result == false) { return -1; }
|
//将窗帘调整到指定百分比
|
curtainDevice.WcdGoToTiltValue(downLimit);
|
await Task.Delay(3000);
|
//执行确认及覆盖窗帘限位点
|
result = await HdlDeviceCurtainLogic.Current.CommitCurtainLimitPoint(curtainDevice, Rollershade.CurtainPrivateInstalledLimi.DownLimit, -1, -1);
|
}
|
else if (backType == GatewayBackupEnum.A空调自定义模式)
|
{
|
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(System.Text.Encoding.UTF8.GetString(byteData));
|
result = await HdlDeviceAirConditionerLogic.Current.SetAcModeSupport((AC)device, data);
|
if (result == true)
|
{
|
//转换为二进制
|
var value = Convert.ToString(data, 2).PadLeft(16, '0');
|
//这五个设置是放在后面的
|
var fixValue = value.Substring(0, value.Length - 5);
|
var reportValue = value.Substring(fixValue.Length);
|
//更改缓存
|
for (int i = 0; i < reportValue.Length; i++)
|
{
|
((AC)device).listSupportMode[i] = Convert.ToInt32(reportValue[i]);
|
}
|
device.ReSave();
|
}
|
}
|
return result == true ? 1 : -1;
|
}
|
|
#endregion
|
}
|
}
|