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
}
}