From dee21bf452a8979d0515d13e534fbb69ed9715dd Mon Sep 17 00:00:00 2001
From: 黄学彪 <hxb@hdlchina.com.cn>
Date: 星期二, 01 九月 2020 15:33:13 +0800
Subject: [PATCH] 上传一个版本

---
 ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs |  361 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 325 insertions(+), 36 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
index 75f38c3..45aed43 100755
--- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
@@ -1,7 +1,7 @@
 锘縰sing System;
 using System.Collections.Generic;
 using System.Text;
-using System.Threading.Tasks;
+using ZigBee.Device;
 
 namespace Shared.Phone.UserCenter
 {
@@ -66,18 +66,18 @@
         #region 鈻� 娣诲姞鍗囩骇鍥轰欢淇℃伅___________________
 
         /// <summary>
-        /// 娣诲姞鍗囩骇鍥轰欢淇℃伅
+        /// 娣诲姞鍗囩骇鍥轰欢淇℃伅 1:姝e父  -1:娌$綉,鑾峰彇涓嶅埌涓滆タ
         /// </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)
+        public static int AddFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType)
         {
             //妫�娴嬫湰鍦版槸鍚﹀凡缁忔湁杩欎釜缂撳瓨浜�
             if (IsEsixtFirmwareVersionInfo(levelType, HardwareVersion, imgType) == true)
             {
-                return true;
+                return 1;
             }
             var Pra = new GetFirmwareVersionPra();
             Pra.PageSetting.Page = 1;
@@ -90,27 +90,27 @@
                 Pra.FirmwareManaSecondType = 0;
                 Pra.HardwareVersion = HardwareVersion;
                 Pra.DeviceType = imgType;
-                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.Linux, Pra);
+                var result = GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.Linux, Pra);
                 return result;
             }
-            else if (levelType == FirmwareLevelType.Coordinator)
+            else if (levelType == FirmwareLevelType.A鍗忚皟鍣�)
             {
                 //鍗忚皟鍣ㄦā鍧�
                 Pra.FirmwareManaFirstType = 1;
                 Pra.FirmwareManaSecondType = 1;
                 Pra.HardwareVersion = HardwareVersion;
                 Pra.DeviceType = imgType;
-                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.Coordinator, Pra);
+                var result = GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.A鍗忚皟鍣�, Pra);
                 return result;
             }
-            else if (levelType == FirmwareLevelType.VirtualDevice)
+            else if (levelType == FirmwareLevelType.A铏氭嫙椹卞姩)
             {
                 //铏氭嫙璁惧妯″潡
                 Pra.FirmwareManaFirstType = 1;
                 Pra.FirmwareManaSecondType = 2;
                 Pra.HardwareVersion = HardwareVersion;
                 Pra.DeviceType = imgType;
-                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.VirtualDevice, Pra);
+                var result = GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.A铏氭嫙椹卞姩, Pra);
                 return result;
             }
             else
@@ -120,37 +120,48 @@
                 Pra.FirmwareManaSecondType = null;
                 Pra.HardwareVersion = HardwareVersion;
                 Pra.DeviceType = imgType;
-                var result = await GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.ZigbeeDevice, Pra);
+                var result = GetFirmwareVersionAndSetToMemmory(FirmwareLevelType.A璁惧, Pra);
                 return result;
             }
         }
 
         /// <summary>
-        /// 鑾峰彇浜戠鐨勫浐浠讹紝鐒跺悗瀛樺叆缂撳瓨涓�
+        /// 鑾峰彇浜戠鐨勫浐浠讹紝鐒跺悗瀛樺叆缂撳瓨涓� 1:姝e父  -1:娌$綉,鑾峰彇涓嶅埌涓滆タ
         /// </summary>
         /// <param name="levelType"></param>
         /// <param name="pra"></param>
         /// <returns></returns>
-        private async static Task<bool> GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
+        private static int GetFirmwareVersionAndSetToMemmory(FirmwareLevelType levelType, GetFirmwareVersionPra pra)
         {
-            var listNotShow = new List<string>() { "NotSetAgain" };
-            string resultValue = await UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra, listNotShow);
+            var listCheck = new List<string> { "NotCheck" };
+            string resultValue = UserCenterLogic.GetResponseDataByRequestHttps("FirmwareMana/DetectionPlatformUploadFirmware", false, pra, listCheck, false);
             if (string.IsNullOrEmpty(resultValue) == true)
             {
-                return false;
+                return -1;
             }
             var verResult = Newtonsoft.Json.JsonConvert.DeserializeObject<FirmwareVersionResult>(resultValue);
             if (verResult.PageData.Count == 0)
             {
-                return true;
+                return 1;
             }
 
             //纭欢鐗堟湰
-            Dictionary<string, FirmwareHardInfo> dicHardData = new Dictionary<string, FirmwareHardInfo>();
-            FirmwareUpdateResourse.dicFirmwareInfo[levelType] = dicHardData;
+            Dictionary<string, FirmwareHardInfo> dicHardData = null;
+            if (FirmwareUpdateResourse.dicFirmwareInfo.ContainsKey(levelType) == false)
+            {
+                FirmwareUpdateResourse.dicFirmwareInfo[levelType] = new Dictionary<string, FirmwareHardInfo>();
+            }
+            dicHardData = FirmwareUpdateResourse.dicFirmwareInfo[levelType];
 
             foreach (var data in verResult.PageData)
             {
+                //鍥轰欢鐗堟湰鏄剧ず锛�
+                //10101 3涓猙yte 鏄剧ず涓猴細ver.1.01.01
+                if (data.FirmwareVersion.Length != 6 && data.FirmwareVersion.Length != 5)
+                {
+                    //闈炴瑙勭殑鍥轰欢鐗堟湰,涓嶅啀鑰冭檻鑼冨洿鍐�
+                    continue;
+                }
                 //纭欢鍒嗙被
                 FirmwareHardInfo hardInfo = null;
                 string hardCode = data.HardwareVersion;
@@ -192,7 +203,7 @@
                 catch { continue; }
             }
 
-            return true;
+            return 1;
         }
 
         #endregion
@@ -219,6 +230,14 @@
                     //瀹冧笉鏄崌绾у浐浠�,  .bin鏄壒娈婄殑
                     continue;
                 }
+                int testVersion = Convert.ToInt32(verInfo.FirmwareVersion.ToString().PadLeft(6, '0').Substring(2, 2));
+                if (testVersion % 2 != 0)
+                {
+                    //涓棿閭d釜byte涓哄鏁版椂锛屼唬琛ㄦ槸娴嬭瘯鐗堟湰,鍦ㄦ樉绀烘渶鏂扮増鏈椂,涓嶉渶瑕佹樉绀猴紝浣嗘槸鍦ㄥ巻鍙茬増鏈偅閲屽彲浠ユ樉绀�
+                    //涓棿閭d釜byte涓哄伓鏁版椂,浠h〃鏄寮忕増鏈�
+                    continue;
+                }
+
                 if (verInfo.FirmwareVersion > nowVersion)
                 {
                     nowVersion = verInfo.FirmwareVersion;
@@ -292,6 +311,37 @@
 
         #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 GetFirmwareVersionInfo(FirmwareLevelType levelType, string HardwareVersion, string imgType, int nowVersion)
+        {
+            //闀滃儚绫诲瀷
+            var listdata = GetFirmwareVersionListInfo(levelType, HardwareVersion, imgType);
+            foreach (var verInfo in listdata)
+            {
+                if (verInfo.Name.EndsWith(".bin") == true)
+                {
+                    //瀹冧笉鏄崌绾у浐浠�,  .bin鏄壒娈婄殑
+                    continue;
+                }
+                if (verInfo.FirmwareVersion == nowVersion)
+                {
+                    return verInfo;
+                }
+            }
+            return null; ;
+        }
+
+        #endregion
+
         #region 鈻� 鍥轰欢瀛樺湪妫�娴媉______________________
 
         /// <summary>
@@ -321,6 +371,262 @@
             return true;
         }
 
+        /// <summary>
+        /// 妫�娴嬭Ota璁惧鐨勫崌绾у浐浠舵槸鍚﹀瓨鍦�
+        /// </summary>
+        /// <param name="device">璁惧瀵硅薄</param>
+        /// <returns></returns>
+        public static bool IsEsixtDeviceFirmwareFile(OTADevice device)
+        {
+            var fileFullName = GetDeviceFirmwareFile(device);
+            return System.IO.File.Exists(fileFullName);
+        }
+
+        /// <summary>
+        /// 鑾峰彇ota鎸囧畾鐨勫崌绾у浐浠跺悕瀛�(鍏ㄨ矾寰�)
+        /// </summary>
+        /// <param name="device">璁惧瀵硅薄</param>
+        /// <returns></returns>
+        public static string GetDeviceFirmwareFile(OTADevice device)
+        {
+            //纭欢鐗堟湰_闀滃儚ID_鍥轰欢鐗堟湰
+            string fileName = device.HwVersion + "_" + device.ImgTypeId + "_" + device.ImgVersion;
+            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Device_" + fileName + ".ota");
+        }
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧Linux鐨勫崌绾у浐浠跺悕瀛�(鍏ㄨ矾寰�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        public static string GetGatewayLinuxFirmwareFile(ZbGateway zbGateway)
+        {
+            string fileName = zbGateway.LinuxHardVersion + "_" + zbGateway.LinuxImageType + "_" + zbGateway.LinuxFirmwareVersion;
+            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Linux_" + fileName + ".ota");
+        }
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧鍗忚皟鍣ㄧ殑鍗囩骇鍥轰欢鍚嶅瓧(鍏ㄨ矾寰�)
+        /// </summary>
+        /// <param name="zbGateway">缃戝叧瀵硅薄</param>
+        /// <returns></returns>
+        public static string GetGatewayCoordinatorFirmwareFile(ZbGateway zbGateway)
+        {
+            string fileName = zbGateway.CoordinatorHardVersion + "_" + zbGateway.CoordinatorImageId + "_" + zbGateway.CoordinatorFirmwareVersion;
+            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "Coordinator_" + fileName + ".ota");
+        }
+
+        /// <summary>
+        /// 鑾峰彇缃戝叧铏氭嫙椹卞姩鐨勫崌绾у浐浠跺悕瀛�(鍏ㄨ矾寰�)
+        /// </summary>
+        /// <param name="codeObj">铏氭嫙椹卞姩鏁版嵁</param>
+        /// <returns></returns>
+        public static string GetGatewayDriveCodeFirmwareFile(ZbGatewayData.DriveCodeObj codeObj)
+        {
+            string fileName = codeObj.DriveHwVersion + "_" + codeObj.DriveImageType + "_" + codeObj.DriveFwVersion;
+            return System.IO.Path.Combine(DirNameResourse.FirmwareUpdateDirectory, "DriveCode_" + fileName + ".ota");
+        }
+
+        #endregion
+
+        #region 鈻� 涓嬭浇妯℃澘鍥轰欢_______________________
+
+        /// <summary>
+        /// 涓嬭浇妯℃澘涓綉鍏冲拰璁惧鐨勫浐浠�
+        /// </summary>
+        /// <param name="fullFileName"></param>
+        /// <param name="i_Msg"></param>
+        public static 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);
+
+            //鑾峰彇闇�瑕佷笅杞界殑鍥轰欢鏁版嵁
+            var listVersion = GetNeedToDownLoadVersionData(listTempDevice, listTempGateway);
+            if (listVersion.Count == 0)
+            {
+                return 0;
+            }
+            //鎵撳紑杩涘害鏉�
+            ProgressFormBar.Current.Start();
+            ProgressFormBar.Current.SetMsg(i_Msg);
+            ProgressFormBar.Current.SetValue(0, 1);
+
+            System.Threading.Thread.Sleep(1000);
+
+            var dicFirmwareName = new Dictionary<string, string>();
+            var fileData = HdlFileLogic.Current.ReadFileTextContent(DirNameResourse.FirmwareUpdateList);
+            if (fileData != null)
+            {
+                //鏈湴瀛樻斁鐨勫浐浠跺師鏉ョ殑鍚嶅瓧(鍥犱负璁惧鍗囩骇鏃�,瀹冮渶瑕佽瘑鍒枃浠跺悕瀛楅噷闈㈠寘鍚殑鐗规畩瀛楃)
+                //key:鍏ㄨ矾寰�,纭欢鐗堟湰_闀滃儚ID_鍥轰欢鐗堟湰  value:鍥轰欢鍘熸潵鐨勫悕瀛�
+                dicFirmwareName = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(fileData);
+            }
+
+            //鍥轰欢瀛樺偍璺緞
+            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
+            int nowCount = 0;
+            foreach (var versionData in listVersion)
+            {
+                nowCount++;
+                //鑾峰彇鍗囩骇鍥轰欢淇℃伅
+                var result = AddFirmwareVersionInfo(versionData.levelType, versionData.HwVersion, versionData.ImageType);
+                if (result == -1)
+                {
+                    ProgressFormBar.Current.Close();
+                    return -1;
+                }
+                //鑾峰彇褰撳墠杩欎釜鐗堟湰鐨勫浐浠朵俊鎭�
+                var versionFirmware = GetFirmwareVersionInfo(versionData.levelType, versionData.HwVersion, versionData.ImageType, versionData.FirmwareVersion);
+                if (versionFirmware == null)
+                {
+                    //浜戠娌℃湁杩欎釜鐗堟湰  杩涘害鍊�
+                    ProgressFormBar.Current.SetValue(nowCount, listVersion.Count);
+                    continue;
+                }
+                //鍘讳笅杞借繖涓浐浠�
+                var pra = new { RequestVersion = Common.CommonPage.RequestVersion, DistributedMark = versionFirmware.DistributedMark };
+                var byteData = UserCenterLogic.GetByteResponseDataByRequestHttps("FirmwareMana/DownloadPlatformUploadFirmware", false, pra, null, true);
+                if (byteData == null)
+                {
+                    ProgressFormBar.Current.Close();
+                    return -1;
+                }
+                //淇濆瓨鍥轰欢
+                var saveFile = System.IO.Path.Combine(firmwareDir, versionData.FileDiv + versionData.HwVersion + "_" + versionData.ImageType + "_" + versionData.FirmwareVersion + ".ota");
+                HdlFileLogic.Current.SaveByteToFile(saveFile, byteData);
+                dicFirmwareName[saveFile] = versionFirmware.Name;
+
+                //杩涘害鍊�
+                ProgressFormBar.Current.SetValue(nowCount, listVersion.Count);
+            }
+            //淇濆瓨鍒楄〃鍚嶅瓧
+            HdlFileLogic.Current.SaveFileContent(DirNameResourse.FirmwareUpdateList, dicFirmwareName);
+            ProgressFormBar.Current.Close();
+
+            return 1;
+        }
+
+        /// <summary>
+        /// 鑾峰彇闇�瑕佷笅杞界殑鍥轰欢鏁版嵁
+        /// </summary>
+        /// <param name="listDevice">璁惧鍒楄〃</param>
+        /// <param name="listGateway">缃戝叧鍒楄〃</param>
+        /// <returns></returns>
+        private static List<TemplateDeviceVersion> GetNeedToDownLoadVersionData(List<OTADevice> listDevice, List<ZbGateway> listGateway)
+        {
+            //瀛樺偍璺緞
+            string firmwareDir = DirNameResourse.FirmwareUpdateDirectory;
+            HdlFileLogic.Current.CreateDirectory(firmwareDir);
+
+            var listVersion = new List<TemplateDeviceVersion>();
+            var listCheck = new HashSet<string>();
+            foreach (var device in listDevice)
+            {
+                //璁惧鐨勫崌绾у浐浠跺悕瀛�
+                var fileFullName = GetDeviceFirmwareFile(device);
+                if (System.IO.File.Exists(fileFullName) == false && listCheck.Contains(fileFullName) == false)
+                {
+                    listCheck.Add(fileFullName);
+                    //璁惧
+                    listVersion.Add(new TemplateDeviceVersion
+                    {
+                        FileDiv = "Device_",
+                        levelType = FirmwareLevelType.A璁惧,
+                        HwVersion = device.HwVersion.ToString(),
+                        ImageType = device.ImgTypeId.ToString(),
+                        FirmwareVersion = device.ImgVersion
+                    });
+                }
+            }
+            foreach (var gateway in listGateway)
+            {
+                //Linux鐨勫崌绾у浐浠跺悕瀛�
+                var fileFullName = GetGatewayLinuxFirmwareFile(gateway);
+                if (System.IO.File.Exists(fileFullName) == false && listCheck.Contains(fileFullName) == false)
+                {
+                    listCheck.Add(fileFullName);
+                    //Linux
+                    listVersion.Add(new TemplateDeviceVersion
+                    {
+                        FileDiv = "Linux_",
+                        levelType = FirmwareLevelType.Linux,
+                        HwVersion = gateway.LinuxHardVersion.ToString(),
+                        ImageType = gateway.LinuxImageType.ToString(),
+                        FirmwareVersion = gateway.LinuxFirmwareVersion
+                    });
+                }
+                //鍗忚皟鍣ㄧ殑鍗囩骇鍥轰欢鍚嶅瓧
+                fileFullName = GetGatewayCoordinatorFirmwareFile(gateway);
+                if (System.IO.File.Exists(fileFullName) == false && listCheck.Contains(fileFullName) == false)
+                {
+                    listCheck.Add(fileFullName);
+                    //鍗忚皟鍣�
+                    listVersion.Add(new TemplateDeviceVersion
+                    {
+                        FileDiv = "Coordinator_",
+                        levelType = FirmwareLevelType.A鍗忚皟鍣�,
+                        HwVersion = gateway.CoordinatorHardVersion.ToString(),
+                        ImageType = gateway.CoordinatorImageId.ToString(),
+                        FirmwareVersion = gateway.CoordinatorFirmwareVersion
+                    });
+                }
+                //杩欎釜缃戝叧闇�瑕佹湁铏氭嫙椹卞姩杩欎釜涓滆タ鎵嶈
+                if (gateway.LinuxImageType != 6)
+                {
+                    //铏氭嫙椹卞姩鍙�
+                    foreach (var data in gateway.DriveCodeList)
+                    {
+                        //铏氭嫙椹卞姩鍙风殑鍗囩骇鍥轰欢鍚嶅瓧
+                        fileFullName = GetGatewayDriveCodeFirmwareFile(data);
+                        if (System.IO.File.Exists(fileFullName) == false && listCheck.Contains(fileFullName) == false)
+                        {
+                            listCheck.Add(fileFullName);
+                            //铏氭嫙椹卞姩鍙�
+                            listVersion.Add(new TemplateDeviceVersion
+                            {
+                                FileDiv = "DriveCode_",
+                                levelType = FirmwareLevelType.A铏氭嫙椹卞姩,
+                                HwVersion = data.DriveHwVersion.ToString(),
+                                ImageType = data.DriveImageType.ToString(),
+                                FirmwareVersion = data.DriveFwVersion
+                            });
+                        }
+                    }
+                }
+            }
+            return listVersion;
+        }
+
+        /// <summary>
+        /// 妯℃澘璁惧鐨勭増鏈俊鎭�
+        /// </summary>
+        private class TemplateDeviceVersion
+        {
+            /// <summary>
+            /// 鏂囦欢鍖哄垎
+            /// </summary>
+            public string FileDiv = string.Empty;
+            /// <summary>
+            /// 鍥轰欢闃剁骇鍖哄垎
+            /// </summary>
+            public FirmwareLevelType levelType;
+            /// <summary>
+            /// 纭欢鐗堟湰
+            /// </summary>
+            public string HwVersion = string.Empty;
+            /// <summary>
+            /// 闀滃儚ID
+            /// </summary>
+            public string ImageType = string.Empty;
+            /// <summary>
+            /// 鍥轰欢鐗堟湰
+            /// </summary>
+            public int FirmwareVersion = 0;
+        }
+
         #endregion
 
         #region 鈻� 涓�鑸柟娉昣__________________________
@@ -341,23 +647,6 @@
             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
     }
 }

--
Gitblit v1.8.0