WJC
2019-12-30 f1c3921b08bb22ac6f5db22d620e01d7e8e5c49f
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顺序(里面是Mac地址)
        /// 物理设备属于哪个房间的记录
        /// </summary>
        private Dictionary<string, List<string>> dicDeviceSort = null;
        /// <summary>
        /// 设备文件的前缀名字
        /// </summary>
        public const string deviceFirstName = "Device_";
        private Dictionary<string, string> dicDeviceRoomId = null;
        #endregion
@@ -175,9 +170,9 @@
                }
            }
            //成员身份的时候,删除掉非法的网关文件
            this.DeleteGatewayFileByMemberModel();
            //初始化设备顺序
            this.InitDeviceSort();
            this.DeleteGatewayFileByMemberModel();
            //初始化物理设备所属房间的记录
            this.InitRealDeviceRoomId();
        }
        /// <summary>
@@ -223,11 +218,11 @@
        /// <param name="zbGateway">网关对象</param>
        /// <param name="deviceComingAction">接收到设备时的事件,设备对象为null时,代表接收完成</param>
        /// <returns>一直返回true</returns>
        public async Task<bool> SetDeviceToMemmoryByGateway(ZbGateway zbGateway, Action<CommonDevice> deviceComingAction = null)
        public bool SetDeviceToMemmoryByGateway(ZbGateway zbGateway, Action<CommonDevice> deviceComingAction = null)
        {
            //从网关获取全部的设备
            List<CommonDevice> listDevice = new List<CommonDevice>();
            List<CommonDevice> list = await this.GetDeviceListFromGateway(zbGateway, true, deviceComingAction);
            List<CommonDevice> list = this.GetDeviceListFromGateway(zbGateway, true, deviceComingAction);
            if (list == null)
            {
@@ -312,16 +307,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 +454,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 +511,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 +672,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 +747,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 +768,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 +986,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;
@@ -1007,6 +998,7 @@
            this.GetDeviceIcon(device, ref unSelectFilePath, ref selectFilePath);
            btnIcon.UnSelectedImagePath = unSelectFilePath;
            btnIcon.SelectedImagePath = selectFilePath;
        }
        /// <summary>
@@ -1162,14 +1154,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;
        }
@@ -1511,87 +1503,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">需要保存的哪个设备的房间ID</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>();
            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)
                    {
                        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
@@ -1704,7 +1691,7 @@
        /// <param name="deviceComingAction">接收到设备时的事件</param>
        /// <param name="mode">是否显示错误</param>
        /// <returns></returns>
        public async Task<List<CommonDevice>> GetDeviceListFromGateway(ZbGateway zbGateway, bool ignoreTime, Action<CommonDevice> deviceComingAction = null, ShowErrorMode mode = ShowErrorMode.YES)
        public List<CommonDevice> GetDeviceListFromGateway(ZbGateway zbGateway, bool ignoreTime, Action<CommonDevice> deviceComingAction = null, ShowErrorMode mode = ShowErrorMode.YES)
        {
            if (ignoreTime == false)
            {
@@ -1811,13 +1798,13 @@
            try
            {
                var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 93 } };
                await realWay.Send("GetDeviceInfo", jObject.ToString());
                realWay.Send("GetDeviceInfo", jObject.ToString());
            }
            catch { canBreak = true; }
            while (canBreak == false && TimeOut < 60)
            {
                await Task.Delay(100);
                System.Threading.Thread.Sleep(100);
                TimeOut++;
            }
@@ -1835,7 +1822,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;
                }
@@ -2072,7 +2059,7 @@
            this.dicDeviceModelIdEnum["H06C"] = "2800-2800";//智能门锁(H06C)
            //=========★★空调类(3600-3899)★★=========
            this.dicDeviceModelIdEnum["MAC/GW-ZB.431"] = "3600-3600";//zigbee空调网关模块
            this.dicDeviceModelIdEnum["MAC/GW-ZB.10"] = "3600-3600";//zigbee空调网关模块
            //=========★★中继器类(3900-3999)★★=========
            this.dicDeviceModelIdEnum["MSR-ZB.10"] = "3900-3900"; //zigbee中继器