From 9ef48d7b2da7c408b53f73be0f6eef3cbac1c84a Mon Sep 17 00:00:00 2001 From: 黄学彪 <hxb@hdlchina.com.cn> Date: 星期四, 19 十一月 2020 10:23:45 +0800 Subject: [PATCH] Evoyo.Home1.1.0120111601_Release --- ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlRoomLogic.cs | 485 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 482 insertions(+), 3 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlRoomLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlRoomLogic.cs index 91c4949..e3836b1 100755 --- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlRoomLogic.cs +++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlRoomLogic.cs @@ -43,6 +43,10 @@ /// 鎵�鏈夌殑鎴块棿淇℃伅 /// </summary> private Dictionary<string, Room> dicRooms = new Dictionary<string, Room>(); + /// <summary> + /// 鐗╃悊璁惧灞炰簬鍝釜鎴块棿鐨勮褰� + /// </summary> + private Dictionary<string, string> dicDeviceRoomId = null; #endregion @@ -295,7 +299,7 @@ HdlAutoBackupLogic.DeleteFile(roomFilePath); //鏍规嵁鎴块棿ID,绉婚櫎鎸囧畾鐨勭湡瀹炵墿鐞嗚澶囩殑鎵�灞炴埧闂磋褰� - Common.LocalDevice.Current.DeleteRealDeviceByRoomId(roomId); + HdlRoomLogic.Current.DeleteRealDeviceByRoomId(roomId); if (refreshLeftView == true) { //鍒锋柊鎴块棿瑙嗗浘鍒楄〃 @@ -542,6 +546,219 @@ return listRoom; } + /// <summary> + /// 鑾峰彇缃戝叧鎵�鍦ㄧ殑鎴块棿 + /// </summary> + /// <param name="zbGateway">缃戝叧瀵硅薄</param> + /// <returns></returns> + public Room GetRoomByGateway(ZbGateway zbGateway) + { + return this.GetRoomByGateway(zbGateway.GwId); + } + + /// <summary> + /// 鑾峰彇缃戝叧鎵�鍦ㄧ殑鎴块棿 + /// </summary> + /// <param name="gatewayId">缃戝叧ID</param> + /// <returns></returns> + public Room GetRoomByGateway(string gatewayId) + { + var localGateway = HdlGatewayLogic.Current.GetLocalGateway(gatewayId); + if (localGateway == null) + { + return null; + } + return HdlRoomLogic.Current.GetRoomById(localGateway.RoomId); + } + + /// <summary> + /// 鍙樻洿缃戝叧鎴块棿 + /// </summary> + /// <param name="gwId">缃戝叧Id</param> + /// <param name="roomId">鎴块棿ID</param> + public void ChangedGatewayRoom(string gwId, string roomId) + { + var localGateway = HdlGatewayLogic.Current.GetLocalGateway(gwId); + if (localGateway != null) + { + localGateway.RoomId = roomId; + localGateway.ReSave(); + //娣诲姞澶囦唤 + HdlAutoBackupLogic.AddOrEditorFile(localGateway.FilePath); + } + } + + #endregion + + + #region 鈻� 鐗╃悊璁惧鎵�灞炴埧闂確__________________ + + /// <summary> + /// 鍒濆鍖栫墿鐞嗚澶囨墍灞炴埧闂寸殑璁板綍 + /// </summary> + public void InitRealDeviceRoomId() + { + this.dicDeviceRoomId = new Dictionary<string, string>(); + string fullName = DirNameResourse.DeviceRoomIdFile; + var strData = HdlFileLogic.Current.ReadFileTextContent(fullName); + if (strData != null) + { + this.dicDeviceRoomId = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(strData); + } + } + + /// <summary> + /// 鑾峰彇鍏ㄩ儴鐗╃悊璁惧鎵�灞炴埧闂寸殑璁板綍 + /// </summary> + /// <returns></returns> + public Dictionary<string, string> GetAllRealDeviceRoomData() + { + return this.dicDeviceRoomId; + } + + /// <summary> + /// 淇濆瓨鐗╃悊璁惧鎵�灞炴埧闂寸殑璁板綍 + /// </summary> + /// <param name="listDevice">闇�瑕佷繚瀛樼殑璁惧瀵硅薄</param> + /// <param name="roomId">闇�瑕佷繚瀛樼殑鍝釜璁惧鐨勬埧闂碔D</param> + /// <param name="saveRoadDevice">濡傛灉鍙湁涓�涓洖璺�,鏄惁鎶婂洖璺殑鎴块棿涓�璧蜂慨鏀�</param> + public void SaveRealDeviceRoomId(List<CommonDevice> listDevice, string roomId, bool saveRoadDevice = true) + { + if (listDevice == null || listDevice.Count == 0) + { + return; + } + //濡傛灉璁惧鍙湁涓�涓洖璺紝濡傛灉鏀瑰彉浜嗙湡瀹炶澶囧尯鍩燂紝鍒欏畠鐨勫洖璺殑鍖哄煙涔熶竴璧锋敼浜� + if (saveRoadDevice == true && listDevice.Count == 1) + { + if ((listDevice[0] is OTADevice) == false) + { + //ota璁惧涓嶉渶瑕佸鐞� + HdlRoomLogic.Current.ChangedRoom(listDevice[0], roomId, false); + } + } + bool save = false; + if (roomId == string.Empty) + { + //閫夋嫨鐨勬槸鏈垎閰� + this.dicDeviceRoomId.Remove(listDevice[0].DeviceAddr); + save = true; + } + else + { + if (this.dicDeviceRoomId.ContainsKey(listDevice[0].DeviceAddr) == false) + { + this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId; + save = true; + } + else + { + //2020.05.18杩藉姞:濡傛灉璁板綍鐨勬埧闂碔D鏄笉瀛樺湪鐨勮瘽,鍒欓噸鏂拌鐩� + var room = HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[listDevice[0].DeviceAddr]); + if (room == null || this.dicDeviceRoomId[listDevice[0].DeviceAddr] != roomId) + { + this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId; + save = true; + } + } + } + + if (save == true) + { + //淇濆瓨璁板綍 + HdlFileLogic.Current.SaveFileContent(DirNameResourse.DeviceRoomIdFile, this.dicDeviceRoomId); + + //娣诲姞鑷姩澶囦唤 + HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile); + } + } + + /// <summary> + /// 鑾峰彇鐪熷疄鐗╃悊璁惧鐨勬埧闂村悕瀛� + /// </summary> + /// <param name="device">璁惧鐨勬煇涓�涓洖璺�</param> + /// <returns></returns> + public string GeteRealDeviceRoomName(CommonDevice device) + { + if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false) + { + //鏈垎閰嶅尯鍩� + return Language.StringByID(R.MyInternationalizationString.uDeviceNotAssignedRoom); + } + var room = HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]); + return HdlRoomLogic.Current.GetRoomName(room); + } + + /// <summary> + /// 鑾峰彇鐪熷疄鐗╃悊璁惧灞炰簬鍝釜鎴块棿 + /// </summary> + /// <param name="device">璁惧鐨勬煇涓�涓洖璺�</param> + /// <returns></returns> + public Room GeteRealDeviceRoom(CommonDevice device) + { + if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false) + { + return null; + } + return HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]); + } + + /// <summary> + /// 灏嗙湡瀹炵墿鐞嗚澶囦粠鎴块棿涓Щ闄� + /// </summary> + /// <param name="device">闅忎究涓�涓洖璺�</param> + public void DeleteRealDeviceFromRoom(CommonDevice device) + { + //灏嗙湡瀹炵墿鐞嗚澶囦粠鎴块棿涓Щ闄� + this.DeleteRealDeviceFromRoom(new List<string>() { device.DeviceAddr }); + } + + /// <summary> + /// 灏嗙湡瀹炵墿鐞嗚澶囦粠鎴块棿涓Щ闄� + /// </summary> + /// <param name="listMac">璁惧Mac鍦板潃</param> + public void DeleteRealDeviceFromRoom(List<string> listMac) + { + bool save = false; + foreach (var deviceMacAddr in listMac) + { + if (this.dicDeviceRoomId.ContainsKey(deviceMacAddr) == true) + { + this.dicDeviceRoomId.Remove(deviceMacAddr); + save = true; + } + } + if (save == false) + { + //娌℃湁鏀瑰彉,涓嶉渶瑕佷繚瀛� + return; + } + //淇濆瓨璁板綍 + HdlFileLogic.Current.SaveFileContent(DirNameResourse.DeviceRoomIdFile, this.dicDeviceRoomId); + + //娣诲姞鑷姩澶囦唤 + HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile); + } + + /// <summary> + /// 鏍规嵁鎴块棿ID,绉婚櫎鎸囧畾鐨勭湡瀹炵墿鐞嗚澶囩殑鎵�灞炴埧闂磋褰� + /// </summary> + /// <param name="i_RoomId"></param> + public void DeleteRealDeviceByRoomId(string i_RoomId) + { + var listDeleteKey = new List<string>(); + foreach (var deviceAddr in this.dicDeviceRoomId.Keys) + { + if (this.dicDeviceRoomId[deviceAddr] == i_RoomId + && listDeleteKey.Contains(deviceAddr) == false) + { + listDeleteKey.Add(deviceAddr); + } + } + //灏嗙湡瀹炵墿鐞嗚澶囦粠鎴块棿涓Щ闄� + this.DeleteRealDeviceFromRoom(listDeleteKey); + } + #endregion #region 鈻� 鎴块棿鏂规硶___________________________ @@ -628,7 +845,7 @@ if (i_room.IsLove == false && saveRealRoom == true && LocalDevice.Current.GetDevicesCountByMac(device.DeviceAddr) == 1) { //濡傛灉鍙湁涓�涓洖璺�,鍒欎慨鏀圭湡瀹炵墿鐞嗚澶囩殑鎴块棿 - LocalDevice.Current.SaveRealDeviceRoomId(new List<CommonDevice>() { device }, i_room.Id, false); + this.SaveRealDeviceRoomId(new List<CommonDevice>() { device }, i_room.Id, false); } } } @@ -678,7 +895,7 @@ if (deleteReal == true && LocalDevice.Current.GetDevicesCountByMac(device.DeviceAddr) == 1) { //鍒犻櫎鎺夊畠鐨勭湡瀹炵墿鐞嗚澶囩殑鎵�鍦ㄤ綅缃� - LocalDevice.Current.DeleteRealDeviceFromRoom(device); + HdlRoomLogic.Current.DeleteRealDeviceFromRoom(device); } //鏍规嵁璁惧锛岃幏鍙栨墍鍦ㄧ殑鎴块棿 @@ -1061,6 +1278,268 @@ #endregion + #region 鈻� 鍙戦�佹埧闂翠俊鎭粰缃戝叧_________________ + + /// <summary> + /// 鍙戦�佹埧闂翠俊鎭粰缃戝叧 + /// </summary> + public void SetRoomInfoToGateway() + { + if (UserCenterResourse.UserInfo.AuthorityNo != 1 && UserCenterResourse.UserInfo.AuthorityNo != 2) + { + //涓嶆槸涓讳汉鍜岀鐞嗗憳,鍒欎笉澶勭悊 + return; + } + var realMain = ZbGateway.MainGateWay; + if (realMain == null || Common.Config.Instance.Home.IsVirtually == true) + { + //娌℃湁涓荤綉鍏�,鍒欎笉鐞� + return; + } + //鑾峰彇鎴块棿鍏ㄩ儴鐨勮澶囧璞� + string strSendDeviceRoomInfo = string.Empty; + foreach (var room in this.dicRooms.Values) + { + if (room.IsSharedRoom || room.IsLove) + { + continue; + } + var listDevice = this.GetRoomListDevice(room); + //鍙戦�佺粰缃戝叧鐨勮澶囨埧闂磈son + foreach (var device in listDevice) + { + if (strSendDeviceRoomInfo != string.Empty) + { + strSendDeviceRoomInfo += "\r\n"; + } + strSendDeviceRoomInfo += " " + this.SetDoublMark(device.DeviceAddr) + " "; + strSendDeviceRoomInfo += this.SetDoublMark("0x" + Convert.ToString(device.DeviceEpoint, 16).PadLeft(2, '0')) + " "; + strSendDeviceRoomInfo += this.SetDoublMark(LocalDevice.Current.GetDeviceEpointName(device).Replace(UserCenterResourse.douMarks, string.Empty)) + " "; + strSendDeviceRoomInfo += this.SetDoublMark(room.Id); + } + } + + var listAreaSpaceInfo = new List<AreaSpaceInfo>(); + //棣栧厛娣诲姞浣忓畢 + var houseInfo = new AreaSpaceInfo(); + houseInfo.name = Common.Config.Instance.Home.Name; + houseInfo.uid = Common.Config.Instance.Home.Id; + houseInfo.parentId = null; + listAreaSpaceInfo.Add(houseInfo); + //鐒跺悗娣诲姞妤煎眰 + foreach (var floorId in Common.Config.Instance.Home.FloorDics.Keys) + { + var floorInfo = new AreaSpaceInfo(); + floorInfo.name = Common.Config.Instance.Home.FloorDics[floorId]; + floorInfo.uid = floorId; + floorInfo.parentId = Common.Config.Instance.Home.Id; + listAreaSpaceInfo.Add(floorInfo); + } + //鐒跺悗娣诲姞鎴块棿 + var listRoom = this.GetAllListRooms(); + foreach (var room in listRoom) + { + if (room.IsLove == true) { continue; } + + var roomInfo = new AreaSpaceInfo(); + roomInfo.name = room.Name; + roomInfo.uid = room.Id; + if (Common.Config.Instance.Home.FloorDics.ContainsKey(room.FloorId) == true) + { + roomInfo.parentId = room.FloorId; + } + else + { + roomInfo.parentId = Common.Config.Instance.Home.Id; + } + listAreaSpaceInfo.Add(roomInfo); + } + //鐒跺悗娣诲姞缃戝叧鎴块棿淇℃伅 + var gatewayInfo = new GatewayAreaSpaceInfo(); + + var loaclGateway = HdlGatewayLogic.Current.GetLocalGateway(realMain.GwId); + if (loaclGateway == null || loaclGateway.GwMac == string.Empty) + { + //娌℃湁mac,鎴栬�呮壘涓嶅埌瀵硅薄,鍒欎笉涓婁紶 + return; + } + string gwMac = loaclGateway.GwMac.Replace(":", string.Empty); + gatewayInfo.uid = "000101" + gwMac.Substring(2) + "07"; + gatewayInfo.name = HdlGatewayLogic.Current.GetGatewayName(loaclGateway); + + var roomGateway = HdlRoomLogic.Current.GetRoomByGateway(loaclGateway); + if (roomGateway != null) + { + gatewayInfo.parentId = roomGateway.Id; + } + gatewayInfo.hwInfo = new GatewayHwInfo(); + gatewayInfo.pkgInfo = new GatewayPkgInfo { version = loaclGateway.LinuxFirmwareVersion.ToString() }; + gatewayInfo.swInfo = new List<GatewaySwInfo> { new GatewaySwInfo { ver = loaclGateway.LinuxFirmwareVersion.ToString() } }; + gatewayInfo.ip = loaclGateway.GwIP; + gatewayInfo.mac = loaclGateway.GwMac; + + var data = new { spaces = listAreaSpaceInfo, gateway = gatewayInfo }; + string strSendRoomInfo = Newtonsoft.Json.JsonConvert.SerializeObject(data); + + HdlThreadLogic.Current.RunThread(async () => + { + //鍙戦�佽澶囧尯鍩熶俊鎭� + if (strSendDeviceRoomInfo != string.Empty) + { + //鍒涘缓鏂囦欢瀵硅薄 + var result0 = await realMain.CreateFileAsync("DeviceRoomInfo.json"); + if (result0 == null) + { + return; + } + if (result0.Result != 0 && result0.Result != 2) + { + //濡傛灉鏄�2,鍏佽涓婁紶 + return; + } + //鍙戦�佹暟鎹祦 + var byteData = ASCIIEncoding.UTF8.GetBytes(strSendDeviceRoomInfo); + var result1 = await realMain.SendFileAsync(byteData); + if (result1 == null || result1.Result != 0) + { + return; + } + + } + + //鍒涘缓鏂囦欢瀵硅薄 + var result3 = await realMain.CreateFileAsync("space.json"); + if (result3 == null) + { + return; + } + if (result3.Result != 0 && result3.Result != 2) + { + //濡傛灉鏄�2,鍏佽涓婁紶 + return; + } + + //鍙戦�佸尯鍩熶俊鎭� + var byteData2 = ASCIIEncoding.UTF8.GetBytes(strSendRoomInfo); + var result4 = await realMain.SendFileAsync(byteData2); + }); + } + + /// <summary> + /// 璁剧疆鍙屽紩鍙� + /// </summary> + /// <param name="i_text"></param> + /// <returns></returns> + private string SetDoublMark(string i_text) + { + return UserCenterResourse.douMarks + i_text + UserCenterResourse.douMarks; + } + + /// <summary> + /// 绌洪棿鍖哄煙淇℃伅 + /// </summary> + private class AreaSpaceInfo + { + /// <summary> + /// 浣忓畢ID 鎴栬�� 妤煎眰ID 鎴栬�� 鎴块棿ID + /// </summary> + public string uid = string.Empty; + /// <summary> + /// 浣忓畢鍚嶇О 鎴栬�� 妤煎眰鍚嶇О 鎴栬�� 鎴块棿鍚嶇О + /// </summary> + public string name = string.Empty; + /// <summary> + /// 褰撳墠ID鐨勭埗ID,濡傛灉娌℃湁,鍒欎负甯﹀弻寮曞彿鐨�"null" 姣斿 妤煎眰ID灏卞~浣忓畢ID 鎴块棿ID灏卞~妤煎眰ID + /// </summary> + public string parentId = string.Empty; + } + + /// <summary> + /// 缃戝叧绌洪棿鍖哄煙淇℃伅 + /// </summary> + private class GatewayAreaSpaceInfo + { + /// <summary> + /// 銆�000101銆�+缁戝畾缃戝叧鐨勬椂闂存埑杞�16杩涘埗+銆�07銆� + /// </summary> + public string uid = string.Empty; + /// <summary> + /// 杩欎釜鍥哄畾 + /// </summary> + public string name = "hdl_bus_gatway"; + /// <summary> + /// 缃戝叧鎵�鍦ㄧ殑鎴块棿ID + /// </summary> + public string parentId = string.Empty; + /// <summary> + /// 杩欎釜鍥哄畾 + /// </summary> + public int deviceType = 61184; + /// <summary> + /// 缃戝叧纭欢淇℃伅 + /// </summary> + public GatewayHwInfo hwInfo = null; + /// <summary> + /// 缃戝叧鏍囧噯淇℃伅 + /// </summary> + public GatewayPkgInfo pkgInfo = null; + /// <summary> + /// 缃戝叧鍥轰欢鐗堟湰 + /// </summary> + public List<GatewaySwInfo> swInfo = null; + /// <summary> + /// 缃戝叧IP + /// </summary> + public string ip = string.Empty; + /// <summary> + /// 缃戝叧鐨凪ac + /// </summary> + public string mac = string.Empty; + } + + /// <summary> + /// 缃戝叧纭欢淇℃伅 + /// </summary> + private class GatewayHwInfo + { + /// <summary> + /// 杩欎釜鍥哄畾 + /// </summary> + public string brand = "MIPS"; + /// <summary> + /// 杩欎釜鍥哄畾 + /// </summary> + public string model = "MT7688"; + } + + /// <summary> + /// 缃戝叧鏍囧噯淇℃伅 + /// </summary> + private class GatewayPkgInfo + { + /// <summary> + /// 杩欎釜鏄疞inux鐨勫浐浠剁増鏈� + /// </summary> + public string version = string.Empty; + } + + /// <summary> + /// 缃戝叧鍥轰欢鐗堟湰 + /// </summary> + private class GatewaySwInfo + { + /// <summary> + /// 杩欎釜鍥哄畾 + /// </summary> + public string name = "HDL"; + /// <summary> + /// 杩欎釜鏄疞inux鐨勫浐浠剁増鏈� + /// </summary> + public string ver = string.Empty; + } + + #endregion + #region 鈻� 鍏嬮殕鎴块棿瀵硅薄_______________________ /// <summary> -- Gitblit v1.8.0