黄学彪
2020-12-16 0d9f64668fd7350d6a21fd157e32009a96d98134
ZigbeeApp/Shared/Phone/Common/Logic/HdlFirmwareUpdateLogic.cs
File was renamed from ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
@@ -3,25 +3,48 @@
using System.Text;
using ZigBee.Device;
namespace Shared.Phone.UserCenter
namespace Shared.Phone
{
    /// <summary>
    /// 固件升级的逻辑类
    /// </summary>
    public class HdlFirmwareUpdateLogic
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 固件升级的逻辑类
        /// </summary>
        private static HdlFirmwareUpdateLogic m_Current = null;
        /// <summary>
        /// 固件升级的逻辑类
        /// </summary>
        public static HdlFirmwareUpdateLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlFirmwareUpdateLogic();
                }
                return m_Current;
            }
        }
        #endregion
        #region ■ 执行固件更新_______________________
        /// <summary>
        /// 执行下一个固件的更新
        /// </summary>
        public static void DoUpdateNextFirmware()
        public void DoUpdateNextFirmware()
        {
            //下一个要执行更新的网关
            HdlDeviceUpdateCommonLogic gwControl = null;
            DeviceUpdateCommon gwControl = null;
            //下一个要执行更新的设备
            HdlDeviceUpdateCommonLogic deviceControl = null;
            foreach (var contr in FirmwareUpdateResourse.dicUpdateList.Values)
            DeviceUpdateCommon deviceControl = null;
            foreach (var contr in HdlFirmwareUpdateResourse.dicUpdateList.Values)
            {
                //如果别的还在升级中,则不再处理
                if (contr.IsFinishUpdate == false)
@@ -72,7 +95,7 @@
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        public static int AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        public int AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            //检测本地是否已经有这个缓存了
            if (IsEsixtFirmwareVersionInfo(levelType, HardwareVersion, imgType) == true)
@@ -131,14 +154,21 @@
        /// <param name="levelType"></param>
        /// <param name="pra"></param>
        /// <returns></returns>
        private static int GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
        private int GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
        {
            var listCheck = new List<string> { "NotCheck" };
            string resultValue = UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra, listCheck, false);
            if (string.IsNullOrEmpty(resultValue) == true)
            var result = this.RequestZigbeeHttps("FirmwareMana/DetectionPlatformUploadFirmware", pra, 4);
            if (result == null || result.Length == 0)
            {
                return -1;
            }
            var jobject = Newtonsoft.Json.Linq.JObject.Parse(Encoding.UTF8.GetString(result));
            if (jobject.Property("StateCode") == null || jobject["StateCode"].ToString().ToUpper() != "SUCCESS")
            {
                return -1;
            }
            string resultValue = jobject["ResponseData"].ToString();
            var verResult = Newtonsoft.Json.JsonConvert.DeserializeObject<FirmwareVersionResult>(resultValue);
            if (verResult.PageData.Count == 0)
            {
@@ -146,12 +176,11 @@
            }
            //硬件版本
            Dictionary<string, FirmwareHardInfo> dicHardData = null;
            if (FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                FirmwareUpdateResourse.dicFirmwareInfo[levelType] = new Dictionary<string, FirmwareHardInfo>();
                HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType] = new Dictionary<string, FirmwareHardInfo>();
            }
            dicHardData = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            var dicHardData = HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType];
            foreach (var data in verResult.PageData)
            {
@@ -218,7 +247,7 @@
        /// <param name="imgType">镜像类型</param>
        /// <param name="nowVersion">现在的版本</param>
        /// <returns></returns>
        public static FirmwareVersionInfo GetFirmwareMostVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        public FirmwareVersionInfo GetFirmwareMostVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        {
            //镜像类型
            var listdata = GetFirmwareVersionListInfo(levelType, HardwareVersion, imgType);
@@ -254,14 +283,14 @@
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        public static List<FirmwareVersionInfo> GetFirmwareVersionListInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        public List<FirmwareVersionInfo> GetFirmwareVersionListInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo == null || HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return new List<FirmwareVersionInfo>();
            }
            //硬件版本号级别
            var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            var dicHard = HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType];
            //硬件版本
            if (dicHard.ContainsKey(HardwareVersion) == false)
@@ -291,14 +320,14 @@
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <returns></returns>
        public static Dictionary<string, FirmwareImgTypeInfo> GetImageVersionListInfo(FirmwareLevelType levelType, string HardwareVersion)
        public Dictionary<string, FirmwareImgTypeInfo> GetImageVersionListInfo(FirmwareLevelType levelType, string HardwareVersion)
        {
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo == null || HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return new Dictionary<string, FirmwareImgTypeInfo>();
            }
            //硬件版本号级别
            var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            var dicHard = HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType];
            //硬件版本
            if (dicHard.ContainsKey(HardwareVersion) == false)
@@ -321,7 +350,7 @@
        /// <param name="imgType">镜像类型</param>
        /// <param name="nowVersion">现在的版本</param>
        /// <returns></returns>
        public static FirmwareVersionInfo GetFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        public FirmwareVersionInfo GetFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        {
            //镜像类型
            var listdata = GetFirmwareVersionListInfo(levelType, HardwareVersion, imgType);
@@ -351,20 +380,20 @@
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        private static bool IsEsixtFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        private bool IsEsixtFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            //第一大类
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo == null || HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return false;
            }
            //硬件
            if (FirmwareUpdateResourse.dicFirmwareInfo[levelType].ContainsKey(HardwareVersion) == false)
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType].ContainsKey(HardwareVersion) == false)
            {
                return false;
            }
            //镜像
            if (FirmwareUpdateResourse.dicFirmwareInfo[levelType][HardwareVersion].dicImgType.ContainsKey(imgType) == false)
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType][HardwareVersion].dicImgType.ContainsKey(imgType) == false)
            {
                return false;
            }
@@ -376,7 +405,7 @@
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <returns></returns>
        public static bool IsEsixtDeviceFirmwareFile(OTADevice device)
        public bool IsEsixtDeviceFirmwareFile(OTADevice device)
        {
            var fileFullName = GetDeviceFirmwareFile(device);
            return System.IO.File.Exists(fileFullName);
@@ -387,11 +416,11 @@
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <returns></returns>
        public static string GetDeviceFirmwareFile(OTADevice device)
        public string GetDeviceFirmwareFile(OTADevice device)
        {
            //硬件版本_镜像ID_固件版本
            string fileName = device.HwVersion + "_" + device.ImgTypeId + "_" + device.ImgVersion;
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Device_" + fileName + ".ota");
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "Device_" + fileName + ".ota");
        }
        /// <summary>
@@ -399,10 +428,10 @@
        /// </summary>
        /// <param name="zbGateway">网关对象</param>
        /// <returns></returns>
        public static string GetGatewayLinuxFirmwareFile(ZbGateway zbGateway)
        public string GetGatewayLinuxFirmwareFile(ZbGateway zbGateway)
        {
            string fileName = zbGateway.LinuxHardVersion + "_" + zbGateway.LinuxImageType + "_" + zbGateway.LinuxFirmwareVersion;
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Linux_" + fileName + ".ota");
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "Linux_" + fileName + ".ota");
        }
        /// <summary>
@@ -410,10 +439,10 @@
        /// </summary>
        /// <param name="zbGateway">网关对象</param>
        /// <returns></returns>
        public static string GetGatewayCoordinatorFirmwareFile(ZbGateway zbGateway)
        public string GetGatewayCoordinatorFirmwareFile(ZbGateway zbGateway)
        {
            string fileName = zbGateway.CoordinatorHardVersion + "_" + zbGateway.CoordinatorImageId + "_" + zbGateway.CoordinatorFirmwareVersion;
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Coordinator_" + fileName + ".ota");
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "Coordinator_" + fileName + ".ota");
        }
        /// <summary>
@@ -421,10 +450,10 @@
        /// </summary>
        /// <param name="codeObj">虚拟驱动数据</param>
        /// <returns></returns>
        public static string GetGatewayDriveCodeFirmwareFile(ZbGatewayData.DriveCodeObj codeObj)
        public string GetGatewayDriveCodeFirmwareFile(ZbGatewayData.DriveCodeObj codeObj)
        {
            string fileName = codeObj.DriveHwVersion + "_" + codeObj.DriveImageType + "_" + codeObj.DriveFwVersion;
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "DriveCode_" + fileName + ".ota");
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "DriveCode_" + fileName + ".ota");
        }
        #endregion
@@ -436,12 +465,12 @@
        /// </summary>
        /// <param name="fullFileName"></param>
        /// <param name="i_Msg"></param>
        public static int DownLoadTemplateDeviceFirmware(string fullFileName, string i_Msg)
        public int DownLoadTemplateDeviceFirmware(string fullFileName, string i_Msg)
        {
            //从模板当中获取设备和网关对象
            var listTempDevice = new List<OTADevice>();
            var listTempGateway = new List<ZbGateway>();
            TemplateData.TemplateCommonLogic.Current.GetDeviceObjectFromTemplate(fullFileName, ref listTempDevice, ref listTempGateway);
            HdlTemplateCommonLogic.Current.GetDeviceObjectFromTemplate(fullFileName, ref listTempDevice, ref listTempGateway);
            //获取需要下载的固件数据
            var listVersion = GetNeedToDownLoadVersionData(listTempDevice, listTempGateway);
@@ -461,7 +490,7 @@
            System.Threading.Thread.Sleep(1000);
            var dicFirmwareName = new Dictionary<string, string>();
            var fileData = HdlFileLogic.Current.ReadFileTextContent(DirNameResourse.FirmwareUpdateList);
            var fileData = HdlFileLogic.Current.ReadFileTextContent(HdlFileNameResourse.FirmwareUpdateList);
            if (fileData != null)
            {
                //本地存放的固件原来的名字(因为设备升级时,它需要识别文件名字里面包含的特殊字符)
@@ -470,7 +499,7 @@
            }
            //固件存储路径
            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
            string firmwareDir = HdlFileNameResourse.FirmwareUpdateDirectory;
            int nowCount = 0;
            int macCount = listVersion.Count + listAcUpdate.Count;
@@ -483,7 +512,7 @@
                {
                    ProgressFormBar.Current.Close();
                    //保存列表名字
                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
                    HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
                    return -1;
                }
                //获取当前这个版本的固件信息
@@ -495,13 +524,12 @@
                    continue;
                }
                //去下载这个固件
                var pra = new { RequestVersion = Common.CommonPage.RequestVersion, DistributedMark = versionFirmware.DistributedMark };
                var byteData = UserCenterLogic.GetByteResponseDataByRequestHttps("FirmwareMana/DownloadPlatformUploadFirmware", false, pra, new List<string> { "NotCheck" }, true);
                var byteData = this.DowLoadFirmware(versionData.levelType, versionFirmware.DistributedMark);
                if (byteData == null)
                {
                    ProgressFormBar.Current.Close();
                    //保存列表名字
                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
                    HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
                    return -1;
                }
                //保存固件
@@ -515,13 +543,12 @@
            for (int i = 0; i < listAcUpdate.Count; i++)
            {
                //下载空调模块
                var pra = new { RequestVersion = Common.CommonPage.RequestVersion, DistributedMark = listAcUpdate[i].DistributedMark };
                var deviceFirmwareByte = UserCenterLogic.GetByteResponseDataByRequestHttps("FirmwareMana/DownloadPlatformUploadFirmware", false, pra, new List<string> { "NotCheck" }, true);
                var deviceFirmwareByte = this.DowLoadFirmware(FirmwareLevelType.A设备, listAcUpdate[i].DistributedMark);
                if (deviceFirmwareByte == null)
                {
                    ProgressFormBar.Current.Close();
                    //保存列表名字
                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
                    HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
                    return -1;
                }
                //保存固件
@@ -534,7 +561,7 @@
            }
            //保存列表名字
            HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
            HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
            ProgressFormBar.Current.Close();
            return 1;
@@ -546,10 +573,10 @@
        /// <param name="listDevice">设备列表</param>
        /// <param name="listGateway">网关列表</param>
        /// <returns></returns>
        private static List<TemplateDeviceVersion> GetNeedToDownLoadVersionData(List<OTADevice> listDevice, List<ZbGateway> listGateway)
        private List<TemplateDeviceVersion> GetNeedToDownLoadVersionData(List<OTADevice> listDevice, List<ZbGateway> listGateway)
        {
            //存储路径
            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
            string firmwareDir = HdlFileNameResourse.FirmwareUpdateDirectory;
            HdlFileLogic.Current.CreateDirectory(firmwareDir);
            var listVersion = new List<TemplateDeviceVersion>();
@@ -636,16 +663,16 @@
        /// </summary>
        /// <param name="listDevice">设备列表</param>
        /// <param name="listTaget">与返回值对应的东西</param>
        private static List<FirmwareVersionInfo> GetNeedDownLoadAirConditionerModule(List<OTADevice> listDevice, ref List<OTADevice> listTaget)
        private List<FirmwareVersionInfo> GetNeedDownLoadAirConditionerModule(List<OTADevice> listDevice, ref List<OTADevice> listTaget)
        {
            var listUpdate = new List<FirmwareVersionInfo>();
            //固件存储路径
            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
            string firmwareDir = HdlFileNameResourse.FirmwareUpdateDirectory;
            foreach (var otaDevice in listDevice)
            {
                var myType = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice> { otaDevice });
                if (myType.ConcreteType != Common.DeviceConcreteType.AirConditioner_ZbGateway)
                var myType = HdlDeviceCommonLogic.Current.GetMyDeviceEnumInfo(new List<CommonDevice> { otaDevice });
                if (myType.ConcreteType != DeviceConcreteType.AirConditioner_ZbGateway)
                {
                    //只处理中央空调
                    continue;
@@ -662,6 +689,37 @@
                }
            }
            return listUpdate;
        }
        /// <summary>
        /// 下载固件
        /// </summary>
        /// <param name="levelType">下载的类型</param>
        /// <param name="i_Mainkey">主键</param>
        /// <returns></returns>
        public byte[] DowLoadFirmware(FirmwareLevelType levelType, string i_Mainkey)
        {
            var pra = new { RequestVersion = Common.CommonPage.RequestVersion, DistributedMark = i_Mainkey };
            //默认为10秒
            int waitTime = 10;
            if (levelType != FirmwareLevelType.A设备)
            {
                //网关的比较大,给多一点时间
                waitTime = 25;
            }
            int count = 3;
            while (count > 0)
            {
                var result = this.RequestZigbeeHttps("FirmwareMana/DownloadPlatformUploadFirmware", pra, waitTime);
                if (result != null)
                {
                    return result.Length == 0 ? null : result;
                }
                count--;
            }
            return null;
        }
        /// <summary>
@@ -693,6 +751,31 @@
        #endregion
        #region ■ 访问云端的方法_____________________
        /// <summary>
        /// 云端固件的网址
        /// </summary>
        public string RequestHttpsHost = "https://global.hdlcontrol.com/ProposedProductionApi";
        /// <summary>
        /// 访问云端固件的方法
        /// </summary>
        /// <param name="i_interfaceName">接口名字</param>
        /// <param name="i_body">body数据</param>
        /// <param name="i_waitTime">超时时间</param>
        /// <returns></returns>
        public byte[] RequestZigbeeHttps(string i_interfaceName, object i_body, int i_waitTime)
        {
            string fullUrl = this.RequestHttpsHost + "/" + i_interfaceName;
            var result = HdlHttpLogic.Current.DoRequestZigbeeHttps(fullUrl, null, RestSharp.Method.POST, i_body, null, null, CheckMode.A不检测, i_waitTime, false);
            return result;
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
@@ -700,7 +783,7 @@
        /// </summary>
        /// <param name="Info"></param>
        /// <param name="remark"></param>
        private static void DoAdjustFirmwareInformation(FirmwareVersionInfo Info, string remark)
        private void DoAdjustFirmwareInformation(FirmwareVersionInfo Info, string remark)
        {
            if (string.IsNullOrEmpty(remark) == true)
            {