HDL Home App 第二版本 旧平台金堂用 正在使用
chenqiyang
2022-06-22 dc0309e64f02227d8e1468b7326c07955f804612
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlFirmwareUpdateLogic.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZigBee.Device;
@@ -693,6 +694,246 @@
        #endregion
        #region ■ 读取App最低版本____________________
        /// <summary>
        /// 读取App最低版本
        /// </summary>
        public static void ReadAppLestVersion()
        {
            if (FirmwareUpdateResourse.AppNeedUpdateUrl != null)
            {
                //已经读取过了,则不再读取
                return;
            }
            var pra = new Dictionary<string, string>();
            pra["version"] = Common.CommonPage.CodeIDString;
            pra["appName"] = "EvoyoHome";
            var bodyData = GetSignRequestJson(Newtonsoft.Json.JsonConvert.SerializeObject(pra));
            //var url = "https://china-gateway.hdlcontrol.com/smart-footstone/app/appVersion/check";
            var url = "https://test-gz.hdlcontrol.com/smart-footstone/app/appVersion/check";
            var byteData = Common.CommonPage.Instance.DoRequestZigbeeHttpsInterface(url, Encoding.UTF8.GetBytes(bodyData), null);
            if (byteData == null)
            {
                return;
            }
            try
            {
                var jobject = Newtonsoft.Json.Linq.JObject.Parse(Encoding.UTF8.GetString(byteData));
                if (jobject["code"].ToString() != "0")
                {
                    return;
                }
                var strData = jobject["data"].ToString();
                FirmwareUpdateResourse.AppNeedUpdateUrl = string.Empty;
                if (string.IsNullOrEmpty(strData) == true) { return; }
                var jobData = Newtonsoft.Json.Linq.JObject.Parse(strData);
                //如果是强制升级的话
                if (jobData["isEnforce"].ToString().ToLower() == "true")
                {
#if iOS
                    FirmwareUpdateResourse.AppNeedUpdateUrl = jobData["iosUrl"].ToString();
#endif
#if Android
                    FirmwareUpdateResourse.AppNeedUpdateUrl = jobData["androidUrl"].ToString();
#endif
                }
            }
            catch { }
        }
        #endregion
        #region ■ 读取网关最低版本___________________
        /// <summary>
        /// 读取网关最低版本
        /// </summary>
        public static void ReadGatewayLestVersion()
        {
            //每次切换住宅,都会去读取一次
            FirmwareUpdateResourse.ListGatewayNeedUpdate = new List<string>();
            var listGateway = HdlGatewayLogic.Current.GetAllLocalGateway();
            foreach (var gw in listGateway)
            {
                var pra = new Dictionary<string, string>();
                pra["hardwareId"] = gw.LinuxHardVersion.ToString();
                pra["imagesId"] = gw.LinuxImageType.ToString();
                pra["version"] = gw.LinuxFirmwareVersion.ToString();
                var bodyData = GetSignRequestJson(Newtonsoft.Json.JsonConvert.SerializeObject(pra));
                //var url = "https://china-gateway.hdlcontrol.com/smart-footstone/app/appVersion/check";
                var url = "https://test-gz.hdlcontrol.com/smart-footstone/app/gateway-hardware/check";
                var byteData = Common.CommonPage.Instance.DoRequestZigbeeHttpsInterface(url, Encoding.UTF8.GetBytes(bodyData), null);
                if (byteData == null)
                {
                    return;
                }
                try
                {
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(Encoding.UTF8.GetString(byteData));
                    if (jobject["code"].ToString() != "0")
                    {
                        continue;
                    }
                    var strData = jobject["data"].ToString();
                    if (string.IsNullOrEmpty(strData) == true) { return; }
                    var jobData = Newtonsoft.Json.Linq.JObject.Parse(strData);
                    //如果是强制升级的话
                    if (jobData["isEnforce"].ToString().ToLower() == "true")
                    {
                        FirmwareUpdateResourse.ListGatewayNeedUpdate.Add(gw.GwId);
                    }
                }
                catch { }
            }
        }
        #endregion
        #region ■ 检测能够显示公告___________________
        /// <summary>
        /// 检测能够显示公告
        /// </summary>
        public static bool CheckCanShowNotice()
        {
            //不管成不成功,读过一次之后就不再读取
            if (FirmwareUpdateResourse.ReadedNotice == true)
            {
                return false;
            }
            FirmwareUpdateResourse.ReadedNotice = true;
#if Android
            var url = "https://developer.hdlcontrol.com/AnnouncementAndriod.html";
#endif
#if iOS
            var url = "https://developer.hdlcontrol.com/AnnouncementIos.html";
#endif
            var byteData = Common.CommonPage.Instance.DoRequestZigbeeHttpsInterface(url, null, null, "GET");
            if (byteData == null)
            {
                //如果是404,则返回false
                return false;
            }
            //加载系统公告
            var fileData = HdlFileLogic.Current.ReadFileTextContent(DirNameResourse.AppNoticeFile);
            if (fileData == null) { fileData = string.Empty; }
            //加上当天日期
            var strNotice = DateTime.Now.ToString("yyyyMMdd") + "\r\n" + Encoding.UTF8.GetString(byteData);
            if (fileData == strNotice)
            {
                //公告内容一致,则不提示
                return false;
            }
            //如果公告不一致,或者已经过了一天,则显示
            HdlFileLogic.Current.SaveTextToFile(DirNameResourse.AppNoticeFile, strNotice);
            return true;
        }
        #endregion
        #region ■ 新云端访问密匙_____________________
        /// <summary>
        /// appKey(访问云端固定的东西)
        /// </summary>
        private const string APP_KEY = "HDL-HOME-APP-TEST";
        /// <summary>
        /// 我也不知道这是什么鬼东西
        /// </summary>
        private const string SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
        /// <summary>
        /// 获取当前时间戳值(访问云端使用)
        /// </summary>
        /// <returns></returns>
        private static string GetTimestamp()
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
            return ((long)(DateTime.Now - startTime).TotalSeconds).ToString(); // 相差秒数
        }
        /// <summary>
        /// MD5加密
        /// </summary>
        /// <param name="signstr"></param>
        /// <returns></returns>
        private static string SignMD5Encrypt(string s)
        {
            byte[] sign = System.Security.Cryptography.MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(s));
            string signstr = string.Empty;
            foreach (byte item in sign)
            {
                signstr += item.ToString("X2");
            }
            return signstr.ToLower();
        }
        /// <summary>
        /// 基础服务的接口都要校验sign,计算sign签名
        /// </summary>
        /// <param name="i_BodyData">body的数据</param>
        /// <returns></returns>
        private static string GetSignRequestJson(string i_BodyData)
        {
            try
            {
                //1. 将model实体转为Dictionary<string, object>
                var paramDictionary = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(i_BodyData);
                //2. 计算sign
                if (paramDictionary != null)
                {
                    paramDictionary.Add("appKey", APP_KEY);
                    paramDictionary.Add("timestamp", GetTimestamp());
                    //2.1 字典升序
                    paramDictionary = paramDictionary.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
                    //2.2 拼接按URL键值对
                    string str = string.Empty;
                    foreach (KeyValuePair<string, object> item in paramDictionary)
                    {
                        if (item.Value == null)
                        {
                            //不校验
                            continue;
                        }
                        string myValue = item.Value.ToString();
                        if (myValue == string.Empty)
                        {
                            //空字符也不校验
                            continue;
                        }
                        if (item.Value is bool)
                        {
                            //云端那帮沙雕说bool类型必须用小写
                            myValue = myValue.ToLower();
                        }
                        str += item.Key + "=" + myValue + "&";
                    }
                    //2.3 拼接SECRET_KEY
                    str = str.Substring(0, str.Length - 1) + SECRET_KEY;
                    //2.4 MD5转换+转小写
                    var signstr = SignMD5Encrypt(str);
                    paramDictionary.Add("sign", signstr);
                    return Newtonsoft.Json.JsonConvert.SerializeObject(paramDictionary);
                }
                else
                {
                    return "";
                }
            }
            catch
            {
                return "";
            }
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
@@ -711,6 +952,6 @@
            Info.UpdateContent.AddRange(Arry);
        }
        #endregion
#endregion
    }
}