| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using ZigBee.Device; |
| | | |
| | |
| | | |
| | | #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> |
| | |
| | | Info.UpdateContent.AddRange(Arry); |
| | | } |
| | | |
| | | #endregion |
| | | #endregion |
| | | } |
| | | } |