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()
|
{
|
//下一个要执行更新的网关
|
GatewayFirmwareUpdateControl gwControl = null;
|
foreach (var contr in FirmwareUpdateResourse.dicGatewayUpdateList.Values)
|
{
|
//如果别的还在升级中,则不再处理
|
if (contr.IsFinishUpdate == false)
|
{
|
return;
|
}
|
//如果这个网关是在等待列表的话
|
if (contr.UpdateStatu == UpdateStatuMode.Wait && gwControl == null)
|
{
|
//下一个升级的就是它了
|
gwControl = contr;
|
}
|
}
|
|
HdlDeviceUpdateLogic deviceControl = null;
|
foreach (var contr in FirmwareUpdateResourse.dicDeviceUpdateList.Values)
|
{
|
//如果别的还在升级中,则不再处理
|
if (contr.IsFinishUpdate == false)
|
{
|
return;
|
}
|
//如果这个设备是在等待列表的话
|
if (contr.UpdateStatu == UpdateStatuMode.Wait && deviceControl == null)
|
{
|
//下一个升级的就是它了
|
deviceControl = contr;
|
}
|
}
|
|
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)
|
{
|
string resultValue = await UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra);
|
if (resultValue == null)
|
{
|
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)
|
{
|
//硬件分类
|
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;
|
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.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);
|
}
|
|
/// <summary>
|
/// 将十六进制转为十进制
|
/// </summary>
|
/// <param name="text"></param>
|
/// <returns></returns>
|
private static int ConvertHexToInt(string text)
|
{
|
if (text.StartsWith("0x"))
|
{
|
text = text.Substring(2);
|
}
|
try
|
{
|
return Convert.ToInt32(text, 16);
|
}
|
catch { return -1; }
|
}
|
#endregion
|
}
|
}
|