using System; using System.Collections.Generic; using System.Text; namespace Shared.Phone.UserCenter { /// /// 固件升级的逻辑类 /// public class HdlFirmwareUpdateLogic { #region ■ 执行固件更新_______________________ /// /// 执行下一个固件的更新 /// 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 ■ 添加升级固件信息___________________ /// /// 添加升级固件信息 1:正常 -1:没网,获取不到东西 /// /// 固件阶级分类 /// 硬件版本 /// 镜像类型 /// public static int AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType) { //检测本地是否已经有这个缓存了 if (IsEsixtFirmwareVersionInfo(levelType, HardwareVersion, imgType) == true) { return 1; } 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 = 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 = 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 = GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.VirtualDevice, Pra); return result; } else { //一般设备 Pra.FirmwareManaFirstType = 2; Pra.FirmwareManaSecondType = null; Pra.HardwareVersion = HardwareVersion; Pra.DeviceType = imgType; var result = GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.ZigbeeDevice, Pra); return result; } } /// /// 获取云端的固件,然后存入缓存中 1:正常 -1:没网,获取不到东西 /// /// /// /// private static int GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra) { string resultValue = UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra); if (string.IsNullOrEmpty(resultValue) == true) { return -1; } var verResult = Newtonsoft.Json.JsonConvert.DeserializeObject(resultValue); if (verResult.PageData.Count == 0) { return 1; } //硬件版本 Dictionary dicHardData = new Dictionary(); 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 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 1; } #endregion #region ■ 获取最新固件版本信息_______________ /// /// 获取固件的最新版本信息(如果返回Null,则表示没有最新版本,或者当前已经是最新版本) /// /// 固件阶级分类 /// 硬件版本 /// 镜像类型 /// 现在的版本 /// 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; } /// /// 获取固件列表的固件版本信息 /// /// 固件阶级分类 /// 硬件版本 /// 镜像类型 /// public static List GetFirmwareVersionListInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType) { if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false) { return new List(); } //硬件版本号级别 var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType]; //硬件版本 if (dicHard.ContainsKey(HardwareVersion) == false) { return new List(); } //镜像类型 var dicImgInfo = GetImageVersionListInfo(levelType, HardwareVersion); if (dicImgInfo.ContainsKey(imgType) == false) { return new List(); } var listData = new List(); var imgInfo = dicImgInfo[imgType]; foreach (var verInfo in imgInfo.listVeison) { listData.Add(verInfo); } return listData; } /// /// 获取固件列表的镜像版本信息 /// /// 固件阶级分类 /// 硬件版本 /// public static Dictionary GetImageVersionListInfo(FirmwareLevelType levelType, string HardwareVersion) { if (FirmwareUpdateResourse.dicFirmwareInfo == null || FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false) { return new Dictionary(); } //硬件版本号级别 var dicHard = FirmwareUpdateResourse.dicFirmwareInfo[levelType]; //硬件版本 if (dicHard.ContainsKey(HardwareVersion) == false) { return new Dictionary(); } //镜像类型 return dicHard[HardwareVersion].dicImgType; } #endregion #region ■ 固件存在检测_______________________ /// /// 固件缓存存在检测 /// /// 固件阶级分类 /// 硬件版本 /// 镜像类型 /// 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 ■ 一般方法___________________________ /// /// 固件的信息处理 /// /// /// 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 } }