xm
2020-07-10 acb2b278663952ce555b06a2e821f359225f15e0
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
New file
@@ -0,0 +1,361 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 固件升级的逻辑类
    /// </summary>
    public class HdlFirmwareUpdateLogic
    {
        #region ■ 执行固件更新_______________________
        /// <summary>
        /// 执行下一个固件的更新
        /// </summary>
        public static void DoUpdateNextFirmware()
        {
            //下一个要执行更新的网关
            HdlDeviceUpdateCommonLogic gwControl = null;
            //下一个要执行更新的设备
            HdlDeviceUpdateCommonLogic deviceControl = null;
            foreach (var contr in FirmwareUpdateResourse.dicUpdateList.Values)
            {
                //如果别的还在升级中,则不再处理
                if (contr.IsFinishUpdate == false)
                {
                    return;
                }
                //如果这个在等待列表的话
                if (contr.UpdateStatu == UpdateStatuMode.Wait && gwControl == null)
                {
                    if (contr.ClassDiv == 1 && gwControl == null)
                    {
                        //下一个升级的就是它了
                        gwControl = contr;
                    }
                    else if (contr.ClassDiv == 2 && deviceControl == null)
                    {
                        //下一个升级的就是它了
                        deviceControl = contr;
                    }
                }
            }
            HdlThreadLogic.Current.RunThread(() =>
            {
                if (gwControl != null)
                {
                    //开始执行更新操作
                    gwControl.DoStartUpdate();
                    return;
                }
                if (deviceControl != null)
                {
                    //开始执行更新操作
                    deviceControl.DoStartUpdate();
                }
            });
        }
        #endregion
        #region ■ 添加升级固件信息___________________
        /// <summary>
        /// 添加升级固件信息
        /// </summary>
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        public async static Task<bool> AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            //检测本地是否已经有这个缓存了
            if (IsEsixtFirmwareVersionInfo(levelType, HardwareVersion, imgType) == true)
            {
                return true;
            }
            var Pra = new GetFirmwareVersionPra();
            Pra.PageSetting.Page = 1;
            Pra.PageSetting.PageSize = 9999;
            if (levelType == FirmwareLevelType.Linux)
            {
                //获取网关Linux模块升级信息
                Pra.FirmwareManaFirstType = 1;
                Pra.FirmwareManaSecondType = 0;
                Pra.HardwareVersion = HardwareVersion;
                Pra.DeviceType = imgType;
                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.Linux, Pra);
                return result;
            }
            else if (levelType == FirmwareLevelType.Coordinator)
            {
                //协调器模块
                Pra.FirmwareManaFirstType = 1;
                Pra.FirmwareManaSecondType = 1;
                Pra.HardwareVersion = HardwareVersion;
                Pra.DeviceType = imgType;
                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.Coordinator, Pra);
                return result;
            }
            else if (levelType == FirmwareLevelType.VirtualDevice)
            {
                //虚拟设备模块
                Pra.FirmwareManaFirstType = 1;
                Pra.FirmwareManaSecondType = 2;
                Pra.HardwareVersion = HardwareVersion;
                Pra.DeviceType = imgType;
                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.VirtualDevice, Pra);
                return result;
            }
            else
            {
                //一般设备
                Pra.FirmwareManaFirstType = 2;
                Pra.FirmwareManaSecondType = null;
                Pra.HardwareVersion = HardwareVersion;
                Pra.DeviceType = imgType;
                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.ZigbeeDevice, Pra);
                return result;
            }
        }
        /// <summary>
        /// 获取云端的固件,然后存入缓存中
        /// </summary>
        /// <param name="levelType"></param>
        /// <param name="pra"></param>
        /// <returns></returns>
        private async static Task<bool> GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
        {
            var listNotShow = new List<string>() { "NotSetAgain" };
            string resultValue = await UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra, listNotShow);
            if (string.IsNullOrEmpty(resultValue) == true)
            {
                return false;
            }
            var verResult = Newtonsoft.Json.JsonConvert.DeserializeObject<FirmwareVersionResult>(resultValue);
            if (verResult.PageData.Count == 0)
            {
                return true;
            }
            //硬件版本
            Dictionary<string, FirmwareHardInfo> dicHardData = new Dictionary<string, FirmwareHardInfo>();
            FirmwareUpdateResourse.dicFirmwareInfo[levelType] = dicHardData;
            foreach (var data in verResult.PageData)
            {
                //固件版本显示:
                //10101 3个byte 显示为:ver.1.01.01
                if (data.FirmwareVersion.Length != 6 && data.FirmwareVersion.Length != 5)
                {
                    //非正规的固件版本,不再考虑范围内
                    continue;
                }
                //硬件分类
                FirmwareHardInfo hardInfo = null;
                string hardCode = data.HardwareVersion;
                if (dicHardData.ContainsKey(hardCode) == false)
                {
                    //添加
                    hardInfo = new FirmwareHardInfo();
                    dicHardData[hardCode] = hardInfo;
                }
                hardInfo = dicHardData[hardCode];
                //镜像分类
                string imgType = data.DeviceType;
                Dictionary<string, FirmwareImgTypeInfo> dicimgType = hardInfo.dicImgType;
                FirmwareImgTypeInfo imgTypeInfo = null;
                if (dicimgType.ContainsKey(imgType) == false)
                {
                    //添加
                    imgTypeInfo = new FirmwareImgTypeInfo();
                    dicimgType[imgType] = imgTypeInfo;
                }
                imgTypeInfo = dicimgType[imgType];
                try
                {
                    //固件版本
                    var info = new FirmwareVersionInfo();
                    info.DistributedMark = data.DistributedMark;
                    info.FirmwareVersion = Convert.ToInt32(data.FirmwareVersion);
                    info.ShowName = data.Name;
                    info.Name = data.Name;
                    info.HardwareVersion = hardCode;
                    info.ImagType = imgType;
                    info.CreatedOnUtc = data.CreatedOnUtc;
                    imgTypeInfo.listVeison.Add(info);
                    //固件的信息处理
                    DoAdjustFirmwareInformation(info, data.Remarks);
                }
                catch { continue; }
            }
            return true;
        }
        #endregion
        #region ■ 获取最新固件版本信息_______________
        /// <summary>
        /// 获取固件的最新版本信息(如果返回Null,则表示没有最新版本,或者当前已经是最新版本)
        /// </summary>
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <param name="nowVersion">现在的版本</param>
        /// <returns></returns>
        public static FirmwareVersionInfo GetFirmwareMostVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        {
            //镜像类型
            var listdata = GetFirmwareVersionListInfo(levelType, HardwareVersion, imgType);
            FirmwareVersionInfo newFirInfo = null;
            foreach (var verInfo in listdata)
            {
                if (verInfo.Name.EndsWith(".bin") == true)
                {
                    //它不是升级固件,  .bin是特殊的
                    continue;
                }
                int testVersion = Convert.ToInt32(verInfo.FirmwareVersion.ToString().PadLeft(6, '0').Substring(2, 2));
                if (testVersion % 2 != 0)
                {
                    //中间那个byte为奇数时,代表是测试版本,在显示最新版本时,不需要显示,但是在历史版本那里可以显示
                    //中间那个byte为偶数时,代表是正式版本
                    continue;
                }
                if (verInfo.FirmwareVersion > nowVersion)
                {
                    nowVersion = verInfo.FirmwareVersion;
                    newFirInfo = verInfo;
                }
            }
            return newFirInfo;
        }
        /// <summary>
        /// 获取固件列表的固件版本信息
        /// </summary>
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        public static List<FirmwareVersionInfo> GetFirmwareVersionListInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return new List<FirmwareVersionInfo>();
            }
            //硬件版本号级别
            var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            //硬件版本
            if (dicHard.ContainsKey(HardwareVersion) == false)
            {
                return new List<FirmwareVersionInfo>();
            }
            //镜像类型
            var dicImgInfo = GetImageVersionListInfo(levelType, HardwareVersion);
            if (dicImgInfo.ContainsKey(imgType) == false)
            {
                return new List<FirmwareVersionInfo>();
            }
            var listData = new List<FirmwareVersionInfo>();
            var imgInfo = dicImgInfo[imgType];
            foreach (var verInfo in imgInfo.listVeison)
            {
                listData.Add(verInfo);
            }
            return listData;
        }
        /// <summary>
        /// 获取固件列表的镜像版本信息
        /// </summary>
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <returns></returns>
        public static Dictionary<string, FirmwareImgTypeInfo> GetImageVersionListInfo(FirmwareLevelType levelType, string HardwareVersion)
        {
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return new Dictionary<string, FirmwareImgTypeInfo>();
            }
            //硬件版本号级别
            var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            //硬件版本
            if (dicHard.ContainsKey(HardwareVersion) == false)
            {
                return new Dictionary<string, FirmwareImgTypeInfo>();
            }
            //镜像类型
            return dicHard[HardwareVersion].dicImgType;
        }
        #endregion
        #region ■ 固件存在检测_______________________
        /// <summary>
        /// 固件缓存存在检测
        /// </summary>
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        private static bool IsEsixtFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            //第一大类
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return false;
            }
            //硬件
            if (FirmwareUpdateResourse.dicFirmwareInfo[levelType].ContainsKey(HardwareVersion) == false)
            {
                return false;
            }
            //镜像
            if (FirmwareUpdateResourse.dicFirmwareInfo[levelType][HardwareVersion].dicImgType.ContainsKey(imgType) == false)
            {
                return false;
            }
            return true;
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 固件的信息处理
        /// </summary>
        /// <param name="Info"></param>
        /// <param name="remark"></param>
        private static void DoAdjustFirmwareInformation(FirmwareVersionInfo Info, string remark)
        {
            if (string.IsNullOrEmpty(remark) == true)
            {
                return;
            }
            //更新内容
            string[] Arry = remark.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
            Info.UpdateContent.AddRange(Arry);
        }
        #endregion
    }
}