using Newtonsoft.Json; 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(); /// /// 网关文件的前缀名字 /// private string gwFirstName = "Gateway_"; /// /// 全部网关(这里保存的是虚拟网关,而不是真实物理网关对象) /// private Dictionary dicGateway = new Dictionary(); #endregion #region ■ 刷新网关___________________________ /// /// 刷新本地网关信息 /// public void ReFreshByLocal() { lock (dicGateway) { this.dicGateway.Clear(); List 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; } } } /// /// 刷新APP前一次选择的网关ID /// 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(strvalue); } //如果本地没有这个网关的话 if (this.IsGatewayExist(GatewayResourse.AppOldSelectGatewayId) == false) { GatewayResourse.AppOldSelectGatewayId = string.Empty; lock (dicGateway) { //随便选一个网关 foreach (string wayId in this.dicGateway.Keys) { GatewayResourse.AppOldSelectGatewayId = wayId; break; } } } } /// /// 同步云端的网关id,如果本地拥有云端不存在的id,则表示应该被换绑了,直接删除(切换住宅后,重新刷新网关列表和设备之后使用) /// /// public void SynchronizeDbGateway() { //从云端获取网列表ID Dictionary result = HdlGatewayLogic.Current.GetGateWayListFromDataBase(); if (result == null) { return; } List listDelete = new List(); foreach (var gatewayId in this.dicGateway.Keys) { if (result.ContainsKey(gatewayId) == false) { //本地存在云端不存在的网关,则删除 listDelete.Add(gatewayId); } } foreach (var gatewayId in listDelete) { //删除本地这个网关所有的设备 List 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); } } /// /// 从文件中反序列化出网关对象 /// /// /// private ZbGateway GetGatewayFromFile(string file) { byte[] filebyte = Global.ReadFileByHomeId(file); string strvalue = System.Text.Encoding.UTF8.GetString(filebyte); var gateway = JsonConvert.DeserializeObject(strvalue); return gateway; } #endregion #region ■ 添加网关___________________________ /// /// 添加新网关(仅限追加新的网关 1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面) /// /// 网关 /// 是否显示错误 public async Task AddNewGateway(ZbGateway zbGateway, ShowErrorMode mode) { //执行添加网关到内存 var result = await this.DoAddGatewayToMemory(zbGateway, mode); if (result != 1) { return result; } return 1; } /// /// 创建一个虚拟的网关对象 /// /// 网关ID 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; } /// /// 执行添加网关到内存(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面) /// /// 网关对象 /// 是否显示错误 /// private async Task 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; } /// /// 设置住宅ID到网关(失败时,不弹出任何错误信息,网关断网除外) /// /// /// /// public async Task SetHomeIdToGateway(ZbGateway zbGateway, string HomeId) { var info = await zbGateway.GwSetHomeIdAsync(HomeId); if (info != null && info.gwSetHomeIdData != null) { return true; } return false; } /// /// 更新网关ID到云端数据库(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面) /// /// 网关对象 /// private async Task SetGatewayIdToDataBase(ZbGateway zbGateway) { //调用接口,绑定网关(即使失败,也返回true往下走) var bindGateway = new BindGatewayPra(); string gwID = this.GetGatewayId(zbGateway); bindGateway.BindGateways.Add(gwID); //获取控制主人账号的Token bindGateway.LoginAccessToken = UserCenterLogic.GetConnectMainToken(); //不显示已经被绑定过的信息,NotSetAgain:假如断网时,不二次发送 List listNotShow = new List() { "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; } /// /// 住宅ID是否为空 /// /// /// public bool HomeIdIsEmpty(ZbGateway zbGateway) { return this.HomeIdIsEmpty(zbGateway.getGatewayBaseInfo.HomeId); } /// /// 住宅ID是否为空 /// /// /// public bool HomeIdIsEmpty(string HomeId) { if (string.IsNullOrEmpty(HomeId) == true || HomeId[0] == '\0') { return true; } return false; } #endregion #region ■ 重新绑定网关_______________________ /// /// 重新绑定网关(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面) /// /// 网关 public async Task 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 ■ 修改网关___________________________ /// /// 修改本地网关名字(失败时会显示信息) /// /// 网关对象 /// 网关名 public async Task 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 ■ 删除网关___________________________ /// /// 删除网关,包括云端和本地(失败时不会显示信息,并且会返回true) /// /// public async Task DeleteGateway(ZbGateway zbGateway) { string gwID = this.GetGatewayId(zbGateway); //移除本地网关信息 return await this.DeleteGateway(gwID); } /// /// 删除网关,包括云端和本地(失败时不会显示信息,并且会返回true) /// /// public async Task 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; } /// /// 删除网关文件 /// /// 网关id 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 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 ■ 网关掉线___________________________ /// /// 刷新网关的在线状态(注意,刷新的是缓存,请调用CheckGatewayOnlineByFlag来判断是否在线) /// /// /// 局域网的时候,时候等待3秒延迟 /// public void RefreshGatewayOnlineStatu(List listGateway, bool waitTime = true) { var listRealWay = new List(); 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:等待3秒(因为wifi的时候,它会自动去刷新flage) System.Threading.Thread.Sleep(3000); //检查是否拥有网关存在于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(); } } /// /// 检查是否拥有网关存在于WIFi下 /// /// /// private bool CheckHadGatewayInWifi(List listGateway) { foreach (var zbway in listGateway) { //是否存在网关存在于WIFI下 if (zbway.GatewayOnlineFlage == true) { return true; } } return false; } /// /// 在远程的情况下刷新网关的在线状态 /// /// /// private void RefreshGatewayOnlineOnRemode(List listGateway) { //获取云端上面的网关 Dictionary 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; } } } /// /// 标识指定网关为不在线 /// /// public void SetGatewayNotOnLineFlag(ZbGateway zbGateway) { if (zbGateway == null) { return; } zbGateway.GatewayOnlineFlage = false; } /// /// 根据某种标识判断指定网关是否在线 /// /// /// 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 ■ 获取网关___________________________ /// /// 从网关获取全部的网关(以本地网关为标准) /// /// public List GetAllGatewayFromGateway() { //不要去Foreach 它的列表 List list = new List(); list.AddRange(ZbGateway.GateWayList); List newlist = new List(); 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; } /// /// 获取本地全部的网关 /// /// The all gateway. public List GetAllLocalGateway() { List listData = new List(); lock (dicGateway) { foreach (var way in dicGateway.Values) { listData.Add(way); } } return listData; } /// /// 获取本地的网关 /// /// 网关ID /// public ZbGateway GetLocalGateway(string gatewayId) { if (this.dicGateway.ContainsKey(gatewayId) == true) { return this.dicGateway[gatewayId]; } return null; } /// /// 获取本地所有的网关文件 /// /// public List GetAllGatewayFile() { List list = new List(); List listFile = Global.FileListByHomeId(); foreach (string file in listFile) { //只获取网关设备 if (file.StartsWith(gwFirstName) == false) { continue; } list.Add(file); } return list; } /// /// 获取系统内部的真实网关对象变量 /// /// 真实网关 /// 目标网关 /// public bool GetRealGateway(ref ZbGateway zbGateway, ZbGateway tagartWay) { if (tagartWay == null || tagartWay.getGatewayBaseInfo == null) { return false; } return this.GetRealGateway(ref zbGateway, this.GetGatewayId(tagartWay)); } /// /// 获取系统内部的真实网关对象变量 /// /// /// /// 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 ■ 获取网关GwInfo里面的属性___________ /// /// 获取网关GwInfo里面的属性 /// /// 网关对象 /// getGwInfo里面属性的名字 /// 如果获取不到时,设置的默认值 /// 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; } /// /// 获取网关GatewayBaseInfo里面的属性 /// /// 网关对象 /// GatewayBaseInfo里面属性的名字 /// 如果获取不到时,设置的默认值 /// public object GetGatewayBaseInfoAttribute(ZbGateway zbGateway, string attributeName, string defult = "") { string gwID = this.GetGatewayId(zbGateway); var localWay = this.GetLocalGateway(gwID); object objValue = null; if (localWay == null || localWay.getGatewayBaseInfo == null) { //本地没有记录有这个东西,则直接返回参数的数据 if (zbGateway.getGatewayBaseInfo != null) { objValue = zbGateway.getGatewayBaseInfo.GetType().InvokeMember(attributeName, System.Reflection.BindingFlags.GetField, null, zbGateway.getGatewayBaseInfo, null); } else { return defult; } } else { //获取本地属性 objValue = localWay.getGatewayBaseInfo.GetType().InvokeMember(attributeName, System.Reflection.BindingFlags.GetField, null, localWay.getGatewayBaseInfo, null); } if (objValue == null) { return defult; } return objValue; } #endregion #region ■ 获取网关ID(有特殊意义)_____________ /// /// 获取网关对象里面的网关ID(封装这个方法有特殊意义) /// /// 网关对象 /// public string GetGatewayId(ZbGateway zbGateway) { //这个东西不会为空 return zbGateway.getGatewayBaseInfo.gwID; } #endregion #region ■ 获取名称___________________________ /// /// 获取网关加特效的名称 /// /// /// /// 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; } /// /// 单纯获取网关名称 /// /// 网关对象 /// private string GetGatewaySimpleName(ZbGateway zbGateway) { if (zbGateway == null) { return string.Empty; } return zbGateway.getGatewayBaseInfo.GwName; } /// /// 设置网关镜像类型的翻译名字 /// /// /// /// 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 ■ 获取网关信息_______________________ /// /// 获取网关信息(版本信息,镜像类型,基本信息等。只刷新本地网关的缓存) /// /// /// /// public async Task 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; } /// /// 获取网关信息,非异步,会等待(版本信息,镜像类型,基本信息等。只刷新本地网关的缓存) /// /// /// /// 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 ■ 清空真实网关列表___________________ /// /// 清空全部的真实物理网关对象 /// public void ClearAllRealGateway() { //因为那一瞬间,有可能mqtt会加回来,所以先加缓存 var list = new List(); list.AddRange(ZbGateway.GateWayList); //然后清空掉 ZbGateway.GateWayList.Clear(); //最后再断开mqtt连接 for (int i = 0; i < list.Count; i++) { list[i].DisConnect("G"); } list.Clear(); } #endregion #region ■ 检测并获取网关各种固件新版本_______ /// /// 检测并获取网关各固件的新版本,没有新版本,则对应位置存的是null,直接返回null代表失败(0:Linux新版本 1:协调器新版本 2~X:都是虚拟驱动的) /// /// 网关对象 /// 错误时,是否显示错误 /// public async Task> 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(); list.Add(gatewayFirmware); list.Add(coordinatorFirmware); list.Add(virtualFirmware); return list; } /// /// 获取网关的虚拟驱动号(返回null时代表获取失败) /// /// /// public async Task> 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 ■ 主网关判定_________________________ /// /// 判断是否主网关(1:主网关 0:不在线 2:子网关) /// /// 网关对象 /// public int IsMainGateway(ZbGateway zbGateway) { string gwID = this.GetGatewayId(zbGateway); return this.IsMainGateway(gwID); } /// /// 判断是否主网关(1:主网关 0:不在线 2:子网关) /// /// 网关id /// 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 ■ 设置网关图片_______________________ /// /// 设置真实网关的图片 /// /// /// 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"; } } /// /// 设置网关图标 /// /// /// 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 ■ 网关存在检测_______________________ /// /// 网关是否已经存在 /// /// /// public bool IsGatewayExist(ZbGateway zbGateway) { string gwID = this.GetGatewayId(zbGateway); return this.IsGatewayExist(gwID); } /// /// 网关是否已经存在 /// /// 网关ID /// public bool IsGatewayExist(string gatewayId) { if (gatewayId == null) { return false; } return dicGateway.ContainsKey(gatewayId); } #endregion #region ■ 网关定位___________________________ /// /// 发送指令到网关进行定位(网关LED闪烁识别) /// /// 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 ■ 一般方法___________________________ /// /// 弹出网关不在线的 /// private void ShowGatewayNotOnlineMsg() { Application.RunOnMainThread(() => { //网关连接失败,请确认网络 string msg = Language.StringByID(R.MyInternationalizationString.uGatewayIsNotLinkAndCheckNetwork); var control = new ShowMsgControl(ShowMsgType.Tip, msg); control.Show(); }); } /// /// 显示错误信息窗口 /// /// private void ShowErrorMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Error, msg); contr.Show(); }); } /// /// 显示Tip信息窗口 /// /// private void ShowTipMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); }); } #endregion #region ■ 网关监视___________________________ #region ■ 变量声明___________________________ /// /// 当前的网络连接模式 /// private GatewayConnectMode nowGwConnectMode = GatewayConnectMode.None; /// /// 是否存在网关正在升级 /// private bool hadGatewayUpdate = false; #endregion #region ■ 网关连接方式变更___________________ /// /// 当网关的连接方式改变时,检测网关,然后显示特效 /// /// 网关变更后的连接方式 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)_____________________ /// /// 在WIFI的条件下,检查网关的在线状态(网络变更时触发) /// 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 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)_______________________ /// /// 在远程的条件下,检查网关的在线状态(网络变更时触发) /// private void CheckGatewayStatuByRemote() { if (this.dicGateway.Count == 0) { //如果本地都没有网关的话,不需要处理 return; } HdlThreadLogic.Current.RunThread(() => { //先获取现在全部的网关,初期値设置为不在线 var dicStatu = this.GetNowOnlineStatuBeforeCheck(); //获取云端上面的网关 Dictionary 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 ■ 检查网关(无网络)___________________ /// /// 在远程的条件下,检查网关的在线状态(网络变更时触发) /// private void CheckGatewayStatuByNotNet() { //当前无网络连接,请确认网络 string msg = Language.StringByID(R.MyInternationalizationString.uNowIsDonotNetworkAndCheckNetwork); this.ShowTipMsg(msg); } #endregion #region ■ 网关推送___________________________ /// /// 将变化的网关推送到界面上 /// /// private void PushGatewayOnlineStatuToForm(Dictionary dicStatu) { List listChange = new List(); List listChangeStatu = new List(); 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(); 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 ■ 一般方法___________________________ /// /// 设置存在网关正在升级的标识 /// /// 是否有网关在升级 public void SetHadGatewayUpdateFlage(bool update) { this.hadGatewayUpdate = update; } /// /// 在网络连接变更之后,网关连接检测之前,设置全部网关为离线状态(以本地网关为标准) /// /// private Dictionary GetNowOnlineStatuBeforeCheck() { //先获取现在全部的网关 List listOldGateway = this.GetAllGatewayFromGateway(); var dicOldZb = new Dictionary(); foreach (var zb in listOldGateway) { string gwID = this.GetGatewayId(zb); dicOldZb[gwID] = zb; } var dicStatu = new Dictionary(); 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___________ /// /// 从云端获取全部网关列表ID /// /// 从云端获取全部网关列表ID public Dictionary GetGateWayListFromDataBase() { Dictionary dicDbGateway = null; if (UserCenterResourse.UserInfo.AuthorityNo == 3) { //成员 return dicDbGateway; } bool canBreak = false; HdlThreadLogic.Current.RunThread(async () => { List list = new List() { "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(result); Dictionary dic = new Dictionary(); 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 ■ 解绑云端网关_______________________ /// /// 解绑云端绑定的网关 /// /// public async Task DeleteDataBaseGateway(string strWayId) { var Pra = new DeleteGatewayPra(); Pra.BindGateways.Add(strWayId); //获取控制主人账号的Token Pra.LoginAccessToken = UserCenterLogic.GetConnectMainToken(); List listNotShowError = new List() { "NoExist", "NoBind", "NoRecord" }; bool result = await UserCenterLogic.GetResultStatuByRequestHttps("App/ReleaseGatewayToHome", true, Pra, listNotShowError); if (result == false) { return false; } return true; } #endregion #region ■ 断网备份及绑定网关ID_______________ /// /// 在没网的情况下备份网关ID /// /// 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); } } /// /// 重新发送命令去绑定断网情况下备份的网关 /// 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>(System.Text.Encoding.UTF8.GetString(fileData)); var listTempId = new List(); listTempId.AddRange(this.listBackupGwId); //不显示已经被绑定过的信息,NotSetAgain:假如断网时,不二次发送 List listNotShow = new List() { "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 ■ 上传设备备份到网关_________________ /// /// 上传设备备份到网关(最好不要去理它的返回结果) /// /// 设备对象 /// 备份类型 /// 备份的数据 /// public async Task 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 ■ 恢复网关___________________________ /// /// 恢复网关配置 /// /// 网关对象 /// 网关里面拥有的文件 /// 云端下载的备份数据的文件夹名字 /// 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 < 10 || fileName.StartsWith(Common.LocalDevice.deviceFirstName) == 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(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(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(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 HdlPirSensorLogic.Current.SetPirSensorLightSettion((IASZone)device, recoverData); } else if (backType == GatewayBackupEnum.A干接点颜色调节) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteData)); result = await HdlPanelLogic.Current.SetPanelEpointColorInfo((Panel)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 HdlPanelLogic.Current.SetDeviceLightSettion((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 HdlPanelLogic.Current.SetDeviceEnergyConservationMode((Panel)device, modeEnable, modeTime, level); } else if (backType == GatewayBackupEnum.A干接点私有属性) { var recoverData = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteData)); result = await HdlPanelLogic.Current.EditorDryContactFunction((Panel)device, recoverData); } return result == true ? 1 : -1; } #endregion } }