From 7e863a33397f317ffc3ffd9288496d0e4f16aa66 Mon Sep 17 00:00:00 2001 From: 黄学彪 <hxb@hdlchina.com.cn> Date: 星期四, 12 十二月 2019 14:58:20 +0800 Subject: [PATCH] 合并了新代码 --- ZigbeeApp/Shared/Common/Device.cs | 334 +++++++++++++++++++++++++++---------------------------- 1 files changed, 166 insertions(+), 168 deletions(-) diff --git a/ZigbeeApp/Shared/Common/Device.cs b/ZigbeeApp/Shared/Common/Device.cs index 15b7c71..409b460 100755 --- a/ZigbeeApp/Shared/Common/Device.cs +++ b/ZigbeeApp/Shared/Common/Device.cs @@ -37,22 +37,21 @@ } } /// <summary> - /// 鏈湴鎵�鏈夎澶囩殑缂撳瓨 + /// 鏈湴鎵�鏈夎澶囩殑缂撳瓨(鎺掑簭) /// </summary> public List<CommonDevice> listAllDevice { get { - var list = new List<CommonDevice>(); - foreach (var listMac in this.dicDeviceSort.Values) + lock (dicAllDevice) { - foreach (var strMac in listMac) + var list = new List<CommonDevice>(); + foreach (var device in dicAllDevice.Values) { - var listTemp = this.GetDevicesByMac(strMac); - list.AddRange(listTemp); + list.Add(device); } + return list; } - return list; } } @@ -85,13 +84,9 @@ /// </summary> private Dictionary<string, HashSet<int>> dicDeviceEpoint = new Dictionary<string, HashSet<int>>(); /// <summary> - /// 璁惧Mac椤哄簭(閲岄潰鏄疢ac鍦板潃) + /// 鐗╃悊璁惧灞炰簬鍝釜鎴块棿鐨勮褰� /// </summary> - private Dictionary<string, List<string>> dicDeviceSort = null; - /// <summary> - /// 璁惧鏂囦欢鐨勫墠缂�鍚嶅瓧 - /// </summary> - public const string deviceFirstName = "Device_"; + private Dictionary<string, string> dicDeviceRoomId = null; #endregion @@ -112,8 +107,14 @@ List<string> listFile = this.GetAllDeviceFile(); foreach (string file in listFile) { + CommonDevice device = null; //鍙嶅簭鍒楀寲涓烘寚瀹氱殑绫伙紝涓嶇劧鏁版嵁浼氫涪澶辫�屽鑷存棤娉曞己杞� - var device = ZigBee.Device.CommonDevice.CommonDeviceByFilePath(file); + try + { + device = CommonDevice.CommonDeviceByFilePath(file); + } + catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); } + if (device == null || device.CurrentGateWayId == null) { #if DEBUG @@ -175,9 +176,9 @@ } } //鎴愬憳韬唤鐨勬椂鍊�,鍒犻櫎鎺夐潪娉曠殑缃戝叧鏂囦欢 - this.DeleteGatewayFileByMemberModel(); - //鍒濆鍖栬澶囬『搴� - this.InitDeviceSort(); + this.DeleteGatewayFileByMemberModel(); + //鍒濆鍖栫墿鐞嗚澶囨墍灞炴埧闂寸殑璁板綍 + this.InitRealDeviceRoomId(); } /// <summary> @@ -312,16 +313,6 @@ /// <param name="device">璁惧瀵硅薄(杩欎釜涓滆タ鏈夊彲鑳戒細琚洿鏀�)</param> public void AddDeviceToMemory(ref CommonDevice device) { - if (dicDeviceSort.ContainsKey(device.CurrentGateWayId) == false) - { - dicDeviceSort[device.CurrentGateWayId] = new List<string>(); - } - if (dicDeviceSort[device.CurrentGateWayId].Contains(device.DeviceAddr) == false) - { - //淇濆瓨椤哄簭 - dicDeviceSort[device.CurrentGateWayId].Add(device.DeviceAddr); - UserCenterLogic.SaveFileContent(UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DeviceSortFile), dicDeviceSort); - } string mainKeys = this.GetDeviceMainKeys(device); //濡傛灉瀹冩槸鍗囩骇鐨勯《绔鐐�,鍒欎笉鑳借瀹冨姞鍏ュ埌缂撳瓨锛屼絾鏄彲浠ヨ浠栫敓鎴愭枃浠� if (device is OTADevice) @@ -469,6 +460,11 @@ } //澶囦唤鏁版嵁 await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(device, GatewayBackupEnum.AMac鍚嶇О, newMacName); + //濡傛灉瀹冨彧鏈変竴涓洖璺�,鍒欐洿鏀圭鐐瑰悕瀛� + if (this.dicDeviceEpoint.ContainsKey(device.DeviceAddr) == true && this.dicDeviceEpoint[device.DeviceAddr].Count == 1) + { + return await this.ReName(device, newMacName); + } } return true; } @@ -521,18 +517,17 @@ this.ShowErrorMsg(msg); return false; } - if (dicDeviceSort.ContainsKey(listdevice[0].CurrentGateWayId) == true && - dicDeviceSort[listdevice[0].CurrentGateWayId].Contains(info.DeviceAddr) == true) - { - //淇濆瓨椤哄簭 - dicDeviceSort[listdevice[0].CurrentGateWayId].Remove(info.DeviceAddr); - UserCenterLogic.SaveFileContent(UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DeviceSortFile), dicDeviceSort); - } //鍒犻櫎鏂囦欢 foreach (CommonDevice device in listdevice) { this.DeleteMemmoryDevice(device); + } + if (this.dicDeviceRoomId.ContainsKey(listdevice[0].DeviceAddr) == true) + { + //绉婚櫎鐪熷疄璁惧鐨勬埧闂寸储寮� + this.dicDeviceRoomId.Remove(listdevice[0].DeviceAddr); + this.SaveRealDeviceRoomId(null, null); } return true; } @@ -683,32 +678,14 @@ List<CommonDevice> list = new List<CommonDevice>(); lock (dicAllDevice) { - List<string> listSort = null; - if (dicDeviceSort.ContainsKey(gwId) == false) - { - dicDeviceSort[gwId] = new List<string>(); - } - listSort = dicDeviceSort[gwId]; - //鍚勭綉鍏崇殑鎵�鏈夎澶� foreach (CommonDevice device in this.dicAllDevice.Values) { if (gwId == device.CurrentGateWayId) { - if (listSort.Contains(device.DeviceAddr) == false) - { - listSort.Add(device.DeviceAddr); - } + list.Add(device); } } - //鎺掑簭 - foreach (var strMac in listSort) - { - var listTemp = this.GetDevicesByMac(strMac); - list.AddRange(listTemp); - } - //淇濆瓨椤哄簭 - UserCenterLogic.SaveFileContent(UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DeviceSortFile), dicDeviceSort); } return list; @@ -776,6 +753,20 @@ } /// <summary> + /// 鏍规嵁MAC鍦板潃,鑾峰彇鍏ㄩ儴鍥炶矾鐨勬暟閲� + /// </summary> + /// <param name="DeviceAddr">Mac鍦板潃</param> + /// <returns></returns> + public int GetDevicesCountByMac(string DeviceAddr) + { + if (dicDeviceEpoint.ContainsKey(DeviceAddr) == false) + { + return 0; + } + return dicDeviceEpoint[DeviceAddr].Count; + } + + /// <summary> /// 鑾峰彇鏈湴鍏ㄩ儴鐨勮澶囨枃浠� /// </summary> /// <returns></returns> @@ -783,9 +774,10 @@ { List<string> listDeviceFile = new List<string>(); List<string> listAllFile = Global.FileListByHomeId(); + foreach (string file in listAllFile) { - if (file.StartsWith(deviceFirstName) == false) + if (file.StartsWith("Device_") == false) { //濡傛灉涓嶆槸璁惧鏂囦欢 continue; @@ -1000,6 +992,11 @@ /// <returns></returns> public void SetDeviceIconToControl(Button btnIcon, CommonDevice device) { + if (device == null) + { + btnIcon.UnSelectedImagePath = "Device/ThirdPartyDevice.png"; + return; + } string unSelectFilePath = string.Empty; string selectFilePath = string.Empty; @@ -1163,14 +1160,14 @@ public DeviceUI GetDeviceUI(string filePath) { string[] arry = filePath.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); - if (arry.Length != 5) + if (arry.Length != 4) { return null; } //鍒涘缓涓�涓柊鐨勪笢瑗跨粰杩囧幓 var deviceUi = new DeviceUI(); - deviceUi.DeviceAddr = arry[3]; - deviceUi.DeviceEpoint = Convert.ToInt32(arry[4]); + deviceUi.DeviceAddr = arry[2]; + deviceUi.DeviceEpoint = Convert.ToInt32(arry[3]); return deviceUi; } @@ -1406,7 +1403,7 @@ temperatrue = true; } //婀垮害浼犳劅鍣� - else if(((TemperatureSensor)device).SensorDiv == 2) + else if (((TemperatureSensor)device).SensorDiv == 2) { humidity = true; } @@ -1512,89 +1509,82 @@ #endregion - #region 鈻� 璁惧鎺掑簭___________________________ + #region 鈻� 鐗╃悊璁惧鎵�灞炴埧闂確__________________ /// <summary> - /// 鍒濆鍖栬澶囬『搴� + /// 鍒濆鍖栫墿鐞嗚澶囨墍灞炴埧闂寸殑璁板綍 /// </summary> - private void InitDeviceSort() + private void InitRealDeviceRoomId() { - //璇诲彇璁惧椤哄簭 - this.dicDeviceSort = new Dictionary<string, List<string>>(); - string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DeviceSortFile); + this.dicDeviceRoomId = new Dictionary<string, string>(); + string fullName = UserCenterLogic.CombinePath(DirNameResourse.DeviceRoomIdFile); var strData = UserCenterLogic.LoadFileContent(fullName); if (strData != null) { - this.dicDeviceSort = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(strData); + this.dicDeviceRoomId = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(strData); } - foreach (var device in dicAllDevice.Values) - { - if (dicDeviceSort.ContainsKey(device.CurrentGateWayId) == false) - { - dicDeviceSort[device.CurrentGateWayId] = new List<string>(); - } - if (dicDeviceSort[device.CurrentGateWayId].Contains(device.DeviceAddr) == false) - { - //鏂版坊鍔犵殑璁惧 - dicDeviceSort[device.CurrentGateWayId].Add(device.DeviceAddr); - } - } - foreach (var keys in dicDeviceSort.Keys) - { - var list = dicDeviceSort[keys]; - for (int i = 0; i < list.Count; i++) - { - if (this.dicDeviceEpoint.ContainsKey(list[i]) == false) - { - //杩欎釜涓滆タ鑾悕鐨勪笉瑙佷簡锛熷拰璁惧鍒楄〃鍖归厤涓嶄笂? - list.RemoveAt(i); - i--; - } - } - } - - //淇濆瓨椤哄簭 - UserCenterLogic.SaveFileContent(fullName, dicDeviceEpoint); } /// <summary> - /// 璁惧鎺掑簭 + /// 淇濆瓨鐗╃悊璁惧鎵�灞炴埧闂寸殑璁板綍 /// </summary> - /// <param name="listDevice">闇�瑕佹帓搴忕殑璁惧鍒楄〃</param> - /// <returns></returns> - public List<CommonDevice> SortDevice(List<CommonDevice> listDevice) + /// <param name="listDevice">闇�瑕佷繚瀛樼殑璁惧瀵硅薄</param> + /// <param name="roomId">闇�瑕佷繚瀛樼殑鍝釜璁惧鐨勬埧闂碔D</param> + /// <param name="saveRoadDevice">濡傛灉鍙湁涓�涓洖璺�,鏄惁鎶婂洖璺殑鎴块棿涓�璧蜂慨鏀�</param> + public void SaveRealDeviceRoomId(List<CommonDevice> listDevice, string roomId, bool saveRoadDevice = true) { - var dic = new Dictionary<string, List<CommonDevice>>(); - for (int i = 0; i < listDevice.Count; i++) + if (listDevice != null) { - if (dic.ContainsKey(listDevice[i].DeviceAddr) == false) - { - dic[listDevice[i].DeviceAddr] = new List<CommonDevice>(); - } - dic[listDevice[i].DeviceAddr].Add(listDevice[i]); + this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId; } - var list = new List<CommonDevice>(); - var listCheck = new HashSet<string>(); - foreach (var listSort in this.dicDeviceSort.Values) + + //淇濆瓨璁板綍 + string fullName = UserCenterLogic.CombinePath(DirNameResourse.DeviceRoomIdFile); + UserCenterLogic.SaveFileContent(fullName, this.dicDeviceRoomId); + + //娣诲姞鑷姩澶囦唤 + HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile); + + //濡傛灉璁惧鍙湁涓�涓洖璺紝濡傛灉鏀瑰彉浜嗙湡瀹炶澶囧尯鍩燂紝鍒欏畠鐨勫洖璺殑鍖哄煙涔熶竴璧锋敼浜� + if (saveRoadDevice == true && listDevice != null && listDevice.Count == 1) { - for (int i = 0; i < listSort.Count; i++) - { - if (dic.ContainsKey(listSort[i]) == true && listCheck.Contains(listSort[i]) == false) - { - listCheck.Add(listSort[i]); - dic[listSort[i]].Sort((obj1, obj2) => - { - if (obj1.DeviceEpoint > obj2.DeviceEpoint) - { - return 1; - } - return -1; - }); - list.AddRange(dic[listSort[i]]); - } - } + Common.Room.CurrentRoom.ChangedRoom(listDevice[0], roomId, false); } - return list; + } + + /// <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 = Room.CurrentRoom.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]); + if (room != null) + { + return room.Name; + } + //鏈垎閰嶅尯鍩� + return Language.StringByID(R.MyInternationalizationString.uDeviceNotAssignedRoom); + } + + /// <summary> + /// 鑾峰彇鐪熷疄鐗╃悊璁惧灞炰簬鍝釜鎴块棿 + /// </summary> + /// <param name="device">璁惧鐨勬煇涓�涓洖璺�</param> + /// <returns></returns> + public Room GeteRealDeviceRoom(CommonDevice device) + { + if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false) + { + return null; + } + return Room.CurrentRoom.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]); } #endregion @@ -1655,16 +1645,16 @@ /// <returns></returns> public string AppendVersion(int versionValue) { - //杞负16杩涘埗 - string txt64 = Convert.ToString(versionValue, 16).PadLeft(4, '0'); + //鐩存帴鏄�10杩涘埗 + string txt10 = Convert.ToString(versionValue).PadLeft(4, '0'); //杩欎釜鏄皬鏁扮偣鍓嶉潰鐨勫�� - int value1 = Convert.ToInt32(txt64.Substring(0, 2), 16); + int value1 = Convert.ToInt32(txt10.Substring(0, txt10.Length - 2)); //杩欎釜鏄皬鏁扮偣鍚庨潰鐨勫�� - int value2 = Convert.ToInt32(txt64.Substring(2, 2), 16); + int value2 = Convert.ToInt32(txt10.Substring(txt10.Length - 2, 2)); //Ver. string ver = Language.StringByID(R.MyInternationalizationString.uVersionAbbreviation); - return ver + value1 + "." + value2.ToString().PadLeft(3, '0'); + return ver + value1 + "." + value2.ToString().PadLeft(2, '0'); } /// <summary> @@ -1761,53 +1751,61 @@ int receiveCount = 0; //璁惧鍒楄〃 var listDevice = new List<CommonDevice>(); - + //缃戝叧閲岄潰鏈夊彲鑳戒細鏈夐噸澶嶇殑鍥炶矾 + var listCheck = new HashSet<string>(); Action<string, string> getDeviceAction = (topic, message) => { - try + if (topic == gatewayID + "/" + "DeviceInfoRespon") { - if (topic == gatewayID + "/" + "DeviceInfoRespon") + try { - TimeOut = 0; - var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); - var totalNum = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(jobject["Data"]["TotalNum"].ToString()); - if (totalNum == 0) + lock (listDevice) { - //杩欎釜缃戝叧娌℃湁璁惧 - canBreak = true; - return; - } - if (deviceCount == -1) - { - //璁剧疆闇�瑕佹帴鏀跺灏戜釜璁惧 - deviceCount = totalNum; - } - //璁惧鎺ユ敹鏁� - receiveCount++; + //璁惧鎺ユ敹鏁� + receiveCount++; - var deviceID = (DeviceType)jobject.Value<int>("Device_ID"); - //鏍规嵁璁惧绫诲瀷鍒涘缓璁惧瀵硅薄鐨勫疄渚� - var device = this.NewDeviceObjectByDeviceId(deviceID, jobject, zbGateway); - if (device != null) - { - try + TimeOut = 0; + var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); + var totalNum = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(jobject["Data"]["TotalNum"].ToString()); + if (totalNum == 0) { - //鍥炶皟鍑芥暟 - deviceComingAction?.Invoke(device); + //杩欎釜缃戝叧娌℃湁璁惧 + canBreak = true; + return; } - //Log鍑哄姏 - catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); } + if (deviceCount == -1) + { + //璁剧疆闇�瑕佹帴鏀跺灏戜釜璁惧 + deviceCount = totalNum; + } - listDevice.Add(device); - } - if (deviceCount == receiveCount) - { - //璁惧鍏ㄩ儴鎺ユ敹瀹屾垚 - canBreak = true; + var deviceID = (DeviceType)jobject.Value<int>("Device_ID"); + //鏍规嵁璁惧绫诲瀷鍒涘缓璁惧瀵硅薄鐨勫疄渚� + var device = this.NewDeviceObjectByDeviceId(deviceID, jobject, zbGateway); + if (device != null) + { + string mainkeys = this.GetDeviceMainKeys(device); + //缃戝叧閲岄潰鏈夊彲鑳戒細鏈夐噸澶嶇殑鍥炶矾 + if (listCheck.Contains(mainkeys) == false) + { + //鍥炶皟鍑芥暟 + deviceComingAction?.Invoke(device); + listDevice.Add(device); + + listCheck.Add(mainkeys); + } + } } } + //Log鍑哄姏 + catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); } + + if (receiveCount == deviceCount && deviceCount != -1) + { + //璁惧鍏ㄩ儴鎺ユ敹瀹屾垚 + canBreak = true; + } } - catch { } }; realWay.Actions += getDeviceAction; @@ -1838,7 +1836,7 @@ string msg = Language.StringByID(R.MyInternationalizationString.uGetDeviceListFail); msg += "\r\n[" + HdlGatewayLogic.Current.GetGatewayName(zbGateway).ToString() + "]"; msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, null, "鍥炲瓒呮椂", false); - this.ShowErrorMsg(msg); + this.ShowTipMsg(msg); } return null; } @@ -1959,7 +1957,7 @@ } } //濡傛灉鏄皟鍏夊櫒 - else if (mainDevice.Type == DeviceType.DimmableLight ) + else if (mainDevice.Type == DeviceType.DimmableLight) { mainDevice.DfunctionType = DeviceFunctionType.A鐏厜; if (mainDevice.IsCustomizeImage == false) @@ -1968,7 +1966,7 @@ } } //濡傛灉鏄僵鐏殑璇� - else if ( mainDevice.Type == DeviceType.ColorDimmableLight) + else if (mainDevice.Type == DeviceType.ColorDimmableLight) { mainDevice.DfunctionType = DeviceFunctionType.A鐏厜; if (mainDevice.IsCustomizeImage == false) @@ -2274,7 +2272,7 @@ /// </summary> AirSwitch = -4100, /// <summary> - /// 寰柇浜戞帶鍒跺櫒 闀滃儚id锛�4100 + /// 鏅鸿兘绌哄紑 闀滃儚id锛�4100 /// </summary> AirSwitch_CloudContr = 4100, -- Gitblit v1.8.0