HDL Home App 第二版本 旧平台金堂用 正在使用
黄学彪
2020-12-14 e90209beae6a4e822cecb18e6889f8bda23f630e
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
File was renamed from ZigbeeApp/Shared/Phone/Common/Logic/HdlFirmwareUpdateLogic.cs
@@ -3,48 +3,25 @@
using System.Text;
using ZigBee.Device;
namespace Shared.Phone
namespace Shared.Phone.UserCenter
{
    /// <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 void DoUpdateNextFirmware()
        public static void DoUpdateNextFirmware()
        {
            //下一个要执行更新的网关
            DeviceUpdateCommon gwControl = null;
            HdlDeviceUpdateCommonLogic gwControl = null;
            //下一个要执行更新的设备
            DeviceUpdateCommon deviceControl = null;
            foreach (var contr in HdlFirmwareUpdateResourse.dicUpdateList.Values)
            HdlDeviceUpdateCommonLogic deviceControl = null;
            foreach (var contr in FirmwareUpdateResourse.dicUpdateList.Values)
            {
                //如果别的还在升级中,则不再处理
                if (contr.IsFinishUpdate == false)
@@ -95,7 +72,7 @@
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        public int AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        public static int AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            //检测本地是否已经有这个缓存了
            if (IsEsixtFirmwareVersionInfo(levelType, HardwareVersion, imgType) == true)
@@ -154,21 +131,14 @@
        /// <param name="levelType"></param>
        /// <param name="pra"></param>
        /// <returns></returns>
        private int GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
        private static int GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
        {
            var result = this.RequestZigbeeHttps("FirmwareMana/DetectionPlatformUploadFirmware", pra, 4);
            if (result == null || result.Length == 0)
            var listCheck = new List<string> { "NotCheck" };
            string resultValue = UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra, listCheck, false);
            if (string.IsNullOrEmpty(resultValue) == true)
            {
                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)
            {
@@ -176,11 +146,12 @@
            }
            //硬件版本
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            Dictionary<string, FirmwareHardInfo> dicHardData = null;
            if (FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType] = new Dictionary<string, FirmwareHardInfo>();
                FirmwareUpdateResourse.dicFirmwareInfo[levelType] = new Dictionary<string, FirmwareHardInfo>();
            }
            var dicHardData = HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType];
            dicHardData = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            foreach (var data in verResult.PageData)
            {
@@ -247,7 +218,7 @@
        /// <param name="imgType">镜像类型</param>
        /// <param name="nowVersion">现在的版本</param>
        /// <returns></returns>
        public FirmwareVersionInfo GetFirmwareMostVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        public static FirmwareVersionInfo GetFirmwareMostVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        {
            //镜像类型
            var listdata = GetFirmwareVersionListInfo(levelType, HardwareVersion, imgType);
@@ -283,14 +254,14 @@
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        public List<FirmwareVersionInfo> GetFirmwareVersionListInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        public static List<FirmwareVersionInfo> GetFirmwareVersionListInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo == null || HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return new List<FirmwareVersionInfo>();
            }
            //硬件版本号级别
            var dicHard = HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType];
            var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            //硬件版本
            if (dicHard.ContainsKey(HardwareVersion) == false)
@@ -320,14 +291,14 @@
        /// <param name="levelType">固件阶级分类</param>
        /// <param name="HardwareVersion">硬件版本</param>
        /// <returns></returns>
        public Dictionary<string, FirmwareImgTypeInfo> GetImageVersionListInfo(FirmwareLevelType levelType, string HardwareVersion)
        public static Dictionary<string, FirmwareImgTypeInfo> GetImageVersionListInfo(FirmwareLevelType levelType, string HardwareVersion)
        {
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo == null || HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return new Dictionary<string, FirmwareImgTypeInfo>();
            }
            //硬件版本号级别
            var dicHard = HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType];
            var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
            //硬件版本
            if (dicHard.ContainsKey(HardwareVersion) == false)
@@ -350,7 +321,7 @@
        /// <param name="imgType">镜像类型</param>
        /// <param name="nowVersion">现在的版本</param>
        /// <returns></returns>
        public FirmwareVersionInfo GetFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        public static FirmwareVersionInfo GetFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
        {
            //镜像类型
            var listdata = GetFirmwareVersionListInfo(levelType, HardwareVersion, imgType);
@@ -380,20 +351,20 @@
        /// <param name="HardwareVersion">硬件版本</param>
        /// <param name="imgType">镜像类型</param>
        /// <returns></returns>
        private bool IsEsixtFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        private static bool IsEsixtFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
        {
            //第一大类
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo == null || HdlFirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
            {
                return false;
            }
            //硬件
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType].ContainsKey(HardwareVersion) == false)
            if (FirmwareUpdateResourse.dicFirmwareInfo[levelType].ContainsKey(HardwareVersion) == false)
            {
                return false;
            }
            //镜像
            if (HdlFirmwareUpdateResourse.dicFirmwareInfo[levelType][HardwareVersion].dicImgType.ContainsKey(imgType) == false)
            if (FirmwareUpdateResourse.dicFirmwareInfo[levelType][HardwareVersion].dicImgType.ContainsKey(imgType) == false)
            {
                return false;
            }
@@ -405,7 +376,7 @@
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <returns></returns>
        public bool IsEsixtDeviceFirmwareFile(OTADevice device)
        public static bool IsEsixtDeviceFirmwareFile(OTADevice device)
        {
            var fileFullName = GetDeviceFirmwareFile(device);
            return System.IO.File.Exists(fileFullName);
@@ -416,11 +387,11 @@
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <returns></returns>
        public string GetDeviceFirmwareFile(OTADevice device)
        public static string GetDeviceFirmwareFile(OTADevice device)
        {
            //硬件版本_镜像ID_固件版本
            string fileName = device.HwVersion + "_" + device.ImgTypeId + "_" + device.ImgVersion;
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "Device_" + fileName + ".ota");
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Device_" + fileName + ".ota");
        }
        /// <summary>
@@ -428,10 +399,10 @@
        /// </summary>
        /// <param name="zbGateway">网关对象</param>
        /// <returns></returns>
        public string GetGatewayLinuxFirmwareFile(ZbGateway zbGateway)
        public static string GetGatewayLinuxFirmwareFile(ZbGateway zbGateway)
        {
            string fileName = zbGateway.LinuxHardVersion + "_" + zbGateway.LinuxImageType + "_" + zbGateway.LinuxFirmwareVersion;
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "Linux_" + fileName + ".ota");
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Linux_" + fileName + ".ota");
        }
        /// <summary>
@@ -439,10 +410,10 @@
        /// </summary>
        /// <param name="zbGateway">网关对象</param>
        /// <returns></returns>
        public string GetGatewayCoordinatorFirmwareFile(ZbGateway zbGateway)
        public static string GetGatewayCoordinatorFirmwareFile(ZbGateway zbGateway)
        {
            string fileName = zbGateway.CoordinatorHardVersion + "_" + zbGateway.CoordinatorImageId + "_" + zbGateway.CoordinatorFirmwareVersion;
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "Coordinator_" + fileName + ".ota");
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Coordinator_" + fileName + ".ota");
        }
        /// <summary>
@@ -450,10 +421,10 @@
        /// </summary>
        /// <param name="codeObj">虚拟驱动数据</param>
        /// <returns></returns>
        public string GetGatewayDriveCodeFirmwareFile(ZbGatewayData.DriveCodeObj codeObj)
        public static string GetGatewayDriveCodeFirmwareFile(ZbGatewayData.DriveCodeObj codeObj)
        {
            string fileName = codeObj.DriveHwVersion + "_" + codeObj.DriveImageType + "_" + codeObj.DriveFwVersion;
            return System.IO.Path.Combine(HdlFileNameResourse.FirmwareUpdateDirectory, "DriveCode_" + fileName + ".ota");
            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "DriveCode_" + fileName + ".ota");
        }
        #endregion
@@ -465,7 +436,7 @@
        /// </summary>
        /// <param name="fullFileName"></param>
        /// <param name="i_Msg"></param>
        public int DownLoadTemplateDeviceFirmware(string fullFileName, string i_Msg)
        public static int DownLoadTemplateDeviceFirmware(string fullFileName, string i_Msg)
        {
            //从模板当中获取设备和网关对象
            var listTempDevice = new List<OTADevice>();
@@ -490,7 +461,7 @@
            System.Threading.Thread.Sleep(1000);
            var dicFirmwareName = new Dictionary<string, string>();
            var fileData = HdlFileLogic.Current.ReadFileTextContent(HdlFileNameResourse.FirmwareUpdateList);
            var fileData = HdlFileLogic.Current.ReadFileTextContent(DirNameResourse.FirmwareUpdateList);
            if (fileData != null)
            {
                //本地存放的固件原来的名字(因为设备升级时,它需要识别文件名字里面包含的特殊字符)
@@ -499,7 +470,7 @@
            }
            //固件存储路径
            string firmwareDir = HdlFileNameResourse.FirmwareUpdateDirectory;
            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
            int nowCount = 0;
            int macCount = listVersion.Count + listAcUpdate.Count;
@@ -512,7 +483,7 @@
                {
                    ProgressFormBar.Current.Close();
                    //保存列表名字
                    HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
                    return -1;
                }
                //获取当前这个版本的固件信息
@@ -524,12 +495,13 @@
                    continue;
                }
                //去下载这个固件
                var byteData = this.DowLoadFirmware(versionData.levelType, versionFirmware.DistributedMark);
                var pra = new { RequestVersion = Common.CommonPage.RequestVersion, DistributedMark = versionFirmware.DistributedMark };
                var byteData = UserCenterLogic.GetByteResponseDataByRequestHttps("FirmwareMana/DownloadPlatformUploadFirmware", false, pra, new List<string> { "NotCheck" }, true);
                if (byteData == null)
                {
                    ProgressFormBar.Current.Close();
                    //保存列表名字
                    HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
                    return -1;
                }
                //保存固件
@@ -543,12 +515,13 @@
            for (int i = 0; i < listAcUpdate.Count; i++)
            {
                //下载空调模块
                var deviceFirmwareByte = this.DowLoadFirmware(FirmwareLevelType.A设备, listAcUpdate[i].DistributedMark);
                var pra = new { RequestVersion = Common.CommonPage.RequestVersion, DistributedMark = listAcUpdate[i].DistributedMark };
                var deviceFirmwareByte = UserCenterLogic.GetByteResponseDataByRequestHttps("FirmwareMana/DownloadPlatformUploadFirmware", false, pra, new List<string> { "NotCheck" }, true);
                if (deviceFirmwareByte == null)
                {
                    ProgressFormBar.Current.Close();
                    //保存列表名字
                    HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
                    HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
                    return -1;
                }
                //保存固件
@@ -561,7 +534,7 @@
            }
            //保存列表名字
            HdlFileLogic.Current.SaveFileContent(HdlFileNameResourse.FirmwareUpdateList, dicFirmwareName);
            HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
            ProgressFormBar.Current.Close();
            return 1;
@@ -573,10 +546,10 @@
        /// <param name="listDevice">设备列表</param>
        /// <param name="listGateway">网关列表</param>
        /// <returns></returns>
        private List<TemplateDeviceVersion> GetNeedToDownLoadVersionData(List<OTADevice> listDevice, List<ZbGateway> listGateway)
        private static List<TemplateDeviceVersion> GetNeedToDownLoadVersionData(List<OTADevice> listDevice, List<ZbGateway> listGateway)
        {
            //存储路径
            string firmwareDir = HdlFileNameResourse.FirmwareUpdateDirectory;
            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
            HdlFileLogic.Current.CreateDirectory(firmwareDir);
            var listVersion = new List<TemplateDeviceVersion>();
@@ -632,7 +605,7 @@
                    });
                }
                //这个网关需要有虚拟驱动这个东西才行
                if (gateway.LinuxImageType != 6)
                if (HdlGatewayLogic.Current.CheckGatewayHadDriveCode(gateway) == true)
                {
                    //虚拟驱动号
                    foreach (var data in gateway.DriveCodeList)
@@ -663,16 +636,16 @@
        /// </summary>
        /// <param name="listDevice">设备列表</param>
        /// <param name="listTaget">与返回值对应的东西</param>
        private List<FirmwareVersionInfo> GetNeedDownLoadAirConditionerModule(List<OTADevice> listDevice, ref List<OTADevice> listTaget)
        private static List<FirmwareVersionInfo> GetNeedDownLoadAirConditionerModule(List<OTADevice> listDevice, ref List<OTADevice> listTaget)
        {
            var listUpdate = new List<FirmwareVersionInfo>();
            //固件存储路径
            string firmwareDir = HdlFileNameResourse.FirmwareUpdateDirectory;
            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
            foreach (var otaDevice in listDevice)
            {
                var myType = HdlDeviceCommonLogic.Current.GetMyDeviceEnumInfo(new List<CommonDevice> { otaDevice });
                if (myType.ConcreteType != DeviceConcreteType.AirConditioner_ZbGateway)
                var myType = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice> { otaDevice });
                if (myType.ConcreteType != Common.DeviceConcreteType.AirConditioner_ZbGateway)
                {
                    //只处理中央空调
                    continue;
@@ -689,37 +662,6 @@
                }
            }
            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>
@@ -751,31 +693,6 @@
        #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>
@@ -783,7 +700,7 @@
        /// </summary>
        /// <param name="Info"></param>
        /// <param name="remark"></param>
        private void DoAdjustFirmwareInformation(FirmwareVersionInfo Info, string remark)
        private static void DoAdjustFirmwareInformation(FirmwareVersionInfo Info, string remark)
        {
            if (string.IsNullOrEmpty(remark) == true)
            {