From 20f70e3446df19bf5d0faaae9f7bd58fd0fc4bcc Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期五, 04 八月 2023 12:06:51 +0800 Subject: [PATCH] 轮询备份 --- Crabtree/SmartHome/UI/SimpleControl/Phone/Register/MigrationServer.cs | 808 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 636 insertions(+), 172 deletions(-) diff --git a/Crabtree/SmartHome/UI/SimpleControl/Phone/Register/MigrationServer.cs b/Crabtree/SmartHome/UI/SimpleControl/Phone/Register/MigrationServer.cs index 16dd21d..10cf576 100644 --- a/Crabtree/SmartHome/UI/SimpleControl/Phone/Register/MigrationServer.cs +++ b/Crabtree/SmartHome/UI/SimpleControl/Phone/Register/MigrationServer.cs @@ -6,6 +6,11 @@ namespace Shared.SimpleControl.Phone { + public class DeviceSecret + { + public string deviceSecret; + } + public class MigrationServer { /// <summary> @@ -13,8 +18,12 @@ /// </summary> private bool finish = false; - private string SeverAddr = "https://bahrain-gateway.hdlcontrol.com"; +#if DEBUG //private string SeverAddr = "https://test-gz.hdlcontrol.com"; + private string SeverAddr = "https://bahrain-gateway.hdlcontrol.com"; +#else + private string SeverAddr = "https://bahrain-gateway.hdlcontrol.com"; +#endif FrameLayout contentView; @@ -26,13 +35,32 @@ EditText etPwd; string pwd; string newUserId; + string newHomeId; Button btnSave; + Button btnClose; + Alert sssAlert = new Alert ("", "Please press the PROG button on Gateway for 3 sec.", "Confirm"); + + Action tipLockedAction; + + bool showedLockedTip = false; public MigrationServer () { - loading = new Loading (); + loading = new Loading (); + tipLockedAction = () => { + Application.RunOnMainThread (() => { + if (!showedLockedTip) { + sssAlert.Show (); + showedLockedTip = true; + sssAlert.ResultEventHandler += (sd, dd) => { + showedLockedTip = false; + }; + } + }); + }; + Packet.lockedAction = tipLockedAction; } @@ -40,7 +68,7 @@ public void ShowDialog() { - #region 寮圭獥 +#region 寮圭獥 Dialog dialog = new Dialog (); FrameLayout dialogBodyView = new FrameLayout () { @@ -75,7 +103,7 @@ Y = Application.GetRealHeight (20), Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), - Text = "璇疯緭鍏ュ瘑鐮侊紝纭杩佺Щ", + Text = "Please enter the password to confirm the migration", TextAlignment = TextAlignment.CenterLeft, TextColor = SkinStyle.Current.TextColor, IsMoreLines = true, @@ -103,7 +131,7 @@ Gravity = Gravity.CenterHorizontal, Y = etPwd.Bottom, Width = Application.GetRealWidth (400), - Height = Application.GetRealHeight (80), + Height = Application.GetRealHeight (120), TextAlignment = TextAlignment.CenterLeft, TextColor = SkinStyle.Current.DelColor, IsMoreLines = true, @@ -120,7 +148,7 @@ }; dialogBodyView.AddChidren (bottomView); - Button btnClose = new Button () { + btnClose = new Button () { Width = Application.GetRealWidth (249), TextID = R.MyInternationalizationString.Close, TextAlignment = TextAlignment.Center @@ -128,6 +156,8 @@ bottomView.AddChidren (btnClose); btnClose.MouseUpEventHandler += (send2er, e2) => { dialog.Close (); + Packet.lockedAction = null; + }; Button btnBottomLine = new Button () { @@ -151,22 +181,28 @@ btnSave.MouseUpEventHandler += (sender2, e2) => { if (finish) { dialog.Close (); + Packet.lockedAction = null; return; } #if DEBUG - //WriteSecretKey (1, 0, new byte [] {1,1,2,3,2,3,4,5,2,3,5,6 }); - //CheckGateway (); - //var newHomeId = Home2New (); - //if (newHomeId == "") { } else { } - //Account2New (etPwd.Text.Trim()); + - //return; + //Account2New ("12345678"); + //Home2New (); + ////杩佺Щ浜戠鍏朵粬澶囦唤 + //var moveCloudDataResult = MoveCloudBackup (); + //Application.RunOnMainThread (() => { + // btnTipMsg.Text = $"Failed to migrate cloud backup list.{moveCloudDataResult}"; + // btnTipMsg.TextColor = SkinStyle.Current.DelColor; + // loading.Hide (); + // return; + //}); #endif if (etPwd.Text.Trim() == "") { - btnTipMsg.Text = "璇疯緭鍏ュ瘑鐮�"; + btnTipMsg.Text = "Please input a password"; return; } @@ -179,13 +215,13 @@ var verResult = AcountVer (pwd); if (verResult) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "楠岃瘉閫氳繃锛屾鍦ㄦ娴嬬綉鍏抽厤缃�"; + btnTipMsg.Text = "Verification passed, detecting gateway configuration"; btnTipMsg.TextColor = SkinStyle.Current.TextColor; CheckGateway (); }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "瀵嗙爜閿欒锛岄獙璇佸け璐ワ紝璇烽噸璇曘��"; + btnTipMsg.Text = "Password error, verification failed, please try again."; loading.Hide (); }); } @@ -206,10 +242,11 @@ if (MainPage.WiFiStatus != "CrabtreeAdd/WiFi.png") { //status = btnSave.Text = "ReCheck"; - btnTipMsg.Text = "璇峰湪灞�鍩熺綉鍐呰繛鎺ョ綉鍏宠澶�"; + btnTipMsg.Text = "Please connect the gateway device in the LAN."; etPwd.Visible = false; btnSave.MouseUpEventHandler = (sender2, e2) => { dialog.Close (); + Packet.lockedAction = null; }; } else { @@ -223,13 +260,13 @@ //3.鎺ユ敹鍗囩骇鏂囦欢鑾峰彇璇锋眰 //杩佺Щ璐﹀彿 - #endregion +#endregion } - #region 浜戠 +#region 浜戠 /// <summary> /// 璐﹀彿鐧诲綍楠岃瘉 /// </summary> @@ -287,6 +324,7 @@ if (revertObj != null) { if (revertObj.data != null) { var newHomeInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<Move_HomeInfo> (revertObj.data.ToString ()); + newHomeId = newHomeInfo.homeId; return newHomeInfo.homeId; } } @@ -298,18 +336,20 @@ /// <param name="mac"></param> /// <param name="newHomeId">鏂板钩鍙扮殑浣忓畢id</param> /// <returns></returns> - private bool Gateway2New (string mac,string newHomeId) + private bool Gateway2New (string mac,string newHomeId,int subnetId) { Dictionary<string, object> dic = new Dictionary<string, object> (); dic.Add ("mac", mac); dic.Add ("homeId", newHomeId); dic.Add ("userId", newUserId); + dic.Add ("subnetId",subnetId); dic.Add ("gatewayType", 0); dic.Add ("tenantId", "202106"); var requestJson = HttpUtil.GetSignRequestJson (dic); var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/gateway/save", requestJson, false, false, SeverAddr); + if (revertObj!= null && revertObj.code == "0") { return true; } @@ -328,7 +368,8 @@ var requestJson = HttpUtil.GetSignRequestJson (dic); //var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (dic); - var revertObj = MainPage.RequestHttps ("/smart-open/third/device/authByMac", requestJson, false, false, SeverAddr); + var revertObj = MainPage.RequestHttps ("/home-wisdom/program/device/secret/applyDeviceSecret", requestJson, false, false, SeverAddr); + //var revertObj = MainPage.RequestHttps ("/smart-open/third/device/authByMac", requestJson, false, false, SeverAddr); if (revertObj.code == "0") { return revertObj.data.ToString (); } else { } @@ -339,38 +380,37 @@ /// 杩佺Щ澶囦唤 /// </summary> /// <param name="newHomeId"></param> - /// <param name="newUserId"></param> /// <returns></returns> - private string moveFolder2New (string newHomeId,string newUserId) + private string moveFolder2New (string newHomeId,string folderName = "") { - Dictionary<string, object> dic = new Dictionary<string, object> (); - dic.Add ("backupDataType", "HDL_ON"); - dic.Add ("homeId",newHomeId); - dic.Add ("userId",newUserId); - dic.Add ("backupClassify", "USER_DEFINED_BACKUP"); - dic.Add ("folderName", "杩佺Щ澶囦唤" + DateTime.Now.ToString ()); - dic.Add ("tenantId", "202106"); - var requestJson = HttpUtil.GetSignRequestJson (dic); - var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/folder/save", requestJson, false, false, SeverAddr); - if(revertObj!= null) { - if(revertObj.code == "0") { - var resultObj = Newtonsoft.Json.JsonConvert.DeserializeObject<FolderObj> (revertObj.data.ToString ()); - - return resultObj.id; + try { + Dictionary<string, object> dic = new Dictionary<string, object> (); + dic.Add ("backupDataType", "HDL_ON"); + dic.Add ("homeId", newHomeId); + dic.Add ("userId", newUserId); + dic.Add ("backupClassify", "USER_DEFINED_BACKUP"); + dic.Add ("folderName", folderName == "" ? "MigrateBackup" + DateTime.Now.ToString () : folderName); + dic.Add ("tenantId", "202106"); + var requestJson = HttpUtil.GetSignRequestJson (dic); + var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/folder/save", requestJson, false, false, SeverAddr); + if (revertObj != null) { + if (revertObj.code == "0") { + var resultObj = Newtonsoft.Json.JsonConvert.DeserializeObject<FolderObj> (revertObj.data.ToString ()); + + return resultObj.id; + } } + return ""; + } catch { + return ""; } - Application.RunOnMainThread (() => { - btnTipTitle.Text = "澶囦唤杩佺Щ澶辫触."; - btnTipTitle.TextColor = SkinStyle.Current.DelColor; - }); - return ""; } - private string MoveFile2New(string newHomeId, string newUserId,string backupId) + private string MoveFile2New(string backupId) { Dictionary<string, object> dic = new Dictionary<string, object> (); - dic.Add ("backupId", backupId);//1534728347497418754//1534728860322385922 + dic.Add ("backupId", backupId); dic.Add ("homeId", newHomeId); dic.Add ("userId", newUserId); dic.Add ("backupClassify", "USER_DEFINED_BACKUP"); @@ -394,8 +434,6 @@ if(fileObjs.Count > 9) { if (!dic.ContainsKey ("list")) { dic.Add ("list", fileObjs); - //} else { - // dic ["list"] = fileObjs; } var json = HttpUtil.GetSignRequestJson (dic); var revertObj_foreach = MainPage.RequestHttps ("/home-wisdom/data/move/file/save", json, false, false, SeverAddr); @@ -405,7 +443,7 @@ continue; } } - } + } } if (!dic.ContainsKey ("list")) { dic.Add ("list", fileObjs); @@ -421,28 +459,212 @@ } return ""; } + /// <summary> - /// 鏍囪2.0骞冲彴鏁版嵁 + /// 杩佺Щ鏃т簯绔浠藉垪琛ㄥ埌鏂颁簯绔� /// </summary> /// <returns></returns> - private bool Mark(string newHomeId) + private void MoveOldBackupList () + { + try { + GetUserFolderObj requestObj = new GetUserFolderObj () { LevelID = UserConfig.Instance.CurrentRegion.RegionID }; + var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); + var revertObj = MainPage.RequestHttps ("GetUserFolder", requestJson, true, false);//鑾峰彇鏃ф湇鍔″櫒澶囦唤鍒楄〃 + if (revertObj.StateCode == "SUCCESS") { + var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<FolderRes>> (revertObj.ResponseData.ToString ()); + int index = 1; + foreach (var folder in responseDataObj) { + Application.RunOnMainThread (() => { + try { + btnTipMsg.Text = $"Migrating server backup {index} / {responseDataObj.Count + 1}."; + btnTipMsg.TextColor = SkinStyle.Current.TextColor; + } catch { } + }); + try { + var requestObj2 = new UserBackupListObj () { LevelID = folder.FolderID }; + var requestJson2 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj2); + var revertObj2 = MainPage.RequestHttps ("UserBackupList", requestJson2);//涓嬭浇鏃ф湇鍔″櫒鐨勫浠芥枃浠跺垪琛� + if (revertObj2.StateCode == "SUCCESS") { + var newFolderId = moveFolder2New (newHomeId, folder.FolderName);//鍦ㄦ柊鏈嶅姟鍣ㄥ垱寤烘柊鐨勫浠�,鑾峰彇澶囦唤ID + if (string.IsNullOrEmpty (newFolderId)) {//濡傛灉鏂版湇鍔″櫒澶囦唤ID涓虹┖锛屽彲鑳芥姤閿欎簡锛屾柊鏈嶅姟鍣ㄥ彲鑳藉凡缁忓瓨鍦ㄨ繖涓浠� + var backupInfoRes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<BackupInfoRes>> (revertObj2.ResponseData.ToString ()); + MoveOldBackupFile2New (newFolderId, backupInfoRes); + } + } + } catch { } + } + } + } catch { + } + } + + /// <summary> + /// 杩佺Щ鏃ф湇鍔″櫒澶囦唤鏂囦欢鍒版柊鏈嶅姟鍣� + /// </summary> + /// <param name="backupId"></param> + /// <returns></returns> + private string MoveOldBackupFile2New ( string backupId, List<BackupInfoRes> responseDataObj) { Dictionary<string, object> dic = new Dictionary<string, object> (); + dic.Add ("backupId", backupId); dic.Add ("homeId", newHomeId); - dic.Add ("mark", false); - var requestJson = HttpUtil.GetSignRequestJson (dic); - var revertObj = MainPage.RequestHttps ("/home-wisdom/app/home/markVoice", requestJson, false, false, SeverAddr); - if (revertObj != null) { - if(revertObj.code == "0") { - if(revertObj.data.ToString() == "true") { - return true; + dic.Add ("userId", newUserId); + dic.Add ("backupClassify", "USER_DEFINED_BACKUP"); + dic.Add ("tenantId", "202106"); + + List<BackupFileObj> fileObjs = new List<BackupFileObj> (); + + int index = 0; + foreach (var file in responseDataObj) { + var fileName = file.FileName; + if (fileName == "null" || "UserConfig" == fileName || fileName == UserInfo.GlobalRegisterFile) { + continue; + } + index++; + var requestObj3 = new BackupDetailObj () { Id = file.Id }; + var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj3); + var revertObj3 = MainPage.RequestHttps ("BackupDetail", requestJson3);//涓嬭浇鏃ф湇鍔″櫒鐨勫浠芥枃浠� + if (revertObj3.StateCode == "SUCCESS") { + var jsonBytes = Newtonsoft.Json.JsonConvert.SerializeObject (revertObj3.ResponseData); + var byresss = Newtonsoft.Json.JsonConvert.DeserializeObject<byte []> (jsonBytes); + BackupFileObj backupFileObj = new BackupFileObj () { fileName = fileName, content = byresss }; + fileObjs.Add (backupFileObj); + + if (fileObjs.Count > 9) { + if (!dic.ContainsKey ("list")) { + dic.Add ("list", fileObjs); + } + var json = HttpUtil.GetSignRequestJson (dic); + var revertObj_foreach = MainPage.RequestHttps ("/home-wisdom/data/move/file/save", json, false, false, SeverAddr); + if (revertObj_foreach != null) { + if (revertObj_foreach.code == "0") { + fileObjs.Clear (); + continue; + } + } } } } - return false; + if (!dic.ContainsKey ("list")) { + dic.Add ("list", fileObjs); + } + var requestJson = HttpUtil.GetSignRequestJson (dic); + var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/file/save", requestJson, false, false, SeverAddr); + if (revertObj != null) { + if (revertObj.code == "0") { + return "true"; + } + } + return ""; } - #endregion + + + /// 杩佺Щ鏈嶅姟鍣ㄥ叏閮ㄥ浠� + /// </summary> + private string MoveCloudBackup () + { + var dic = new Dictionary<string, object> (); + dic.Add ("oldPlatformToken", MainPage.LoginUser.LoginTokenString);//鏃у钩鍙皌oken + dic.Add ("oldPlatformHomeId", UserConfig.Instance.CurrentRegion.RegionID);//鏃у钩鍙颁綇瀹卛d + dic.Add ("homeId", newHomeId);//鏂板钩鍙颁綇瀹卛d + dic.Add ("userId", newUserId);//鏂板钩鍙扮敤鎴穒d + dic.Add ("tenantId", "202106");//绉熸埛id + var requestJson = HttpUtil.GetSignRequestJson (dic); + var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/backup/all", requestJson, false, false, SeverAddr); + if (revertObj != null) { + if (revertObj.code == "0") { + + } + return revertObj.code; + } + return "-99"; + } + + /// <summary> + /// 鑾峰彇瀹氭椂鍣ㄥ垪琛� + /// </summary> + /// <param name="newHomeId"></param> + private List<BackupFileObj> GetTimer (string newHomeId) + { + var requestObj = new Timer () { RegionID = UserConfig.Instance.CurrentRegion.RegionID }; + var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); + var revertObj = MainPage.RequestHttps ("GetTimerList", requestJson); + if (revertObj.StateCode == "SUCCESS") { + var timers = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Timer>> (revertObj.ResponseData.ToString ()); + if(timers.Count > 0) { + List<BackupFileObj> backups = new List<BackupFileObj> (); + foreach (var timer in timers) { + var timerContent = System.Text.Encoding.UTF8.GetBytes (Newtonsoft.Json.JsonConvert.SerializeObject (timer)); + BackupFileObj backupFileObj = new BackupFileObj () { + fileName = timer.TimerName, + content = timerContent + }; + backups.Add (backupFileObj); + } + return backups; + } + } else { + return null; + } + return new List<BackupFileObj> (); + } + + /// <summary> + /// 瀹氭椂鍣ㄥ浠� + /// </summary> + /// <returns></returns> + private string BackupSchedule (string newHomeId, List<BackupFileObj> backups) + { + Dictionary<string, object> dic = new Dictionary<string, object> (); + dic.Add ("backupDataType", "HDL_ON"); + dic.Add ("homeId", newHomeId); + dic.Add ("userId", newUserId); + dic.Add ("backupClassify", "CUSTOM_PROJECT_BACKUP"); + dic.Add ("folderName", "ScheduleBackup" + DateTime.Now.ToString ()); + dic.Add ("tenantId", "202106"); + var requestJson = HttpUtil.GetSignRequestJson (dic); + var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/folder/save", requestJson, false, false, SeverAddr); + if (revertObj != null) { + if (revertObj.code == "0") { + var resultObj = Newtonsoft.Json.JsonConvert.DeserializeObject<FolderObj> (revertObj.data.ToString ()); + var ddd = MoveTimerFileData (newHomeId,resultObj.id, backups); + return ddd; + } + } + return ""; + } + + /// <summary> + /// 淇濆瓨瀹氭椂鍣ㄦ暟鎹� + /// </summary> + /// <param name="newHomeId"></param> + /// <param name="backupId"></param> + /// <param name="fileObjs"></param> + /// <returns></returns> + private string MoveTimerFileData (string newHomeId, string backupId, List<BackupFileObj> fileObjs) + { + Dictionary<string, object> dic = new Dictionary<string, object> (); + dic.Add ("backupId", backupId); + dic.Add ("homeId", newHomeId); + dic.Add ("userId", newUserId); + dic.Add ("backupClassify", "CUSTOM_PROJECT_BACKUP"); + dic.Add ("tenantId", "202106"); + dic.Add ("list", fileObjs); + + var requestJson = HttpUtil.GetSignRequestJson (dic); + var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/file/save", requestJson, false, false, SeverAddr); + if (revertObj != null) { + if (revertObj.code == "0") { + return "true"; + } + } + return ""; + } + + + +#endregion /// <summary> /// 妫�娴嬩竴绔彛淇℃伅 @@ -474,36 +696,49 @@ gateWayString = CommonPage.MyEncodingUTF8.GetString (IO.FileUtils.ReadFile (gatewayFileName)); common = Newtonsoft.Json.JsonConvert.DeserializeObject<GatewayBase> (gateWayString); + //bool + CommonPage.IsRemote = false; + Control.ControlBytesSendHasReturn (Command.ReadGateway, common.SubnetID, common.DeviceID, new byte [] { CommonPage.RandomHigh, CommonPage.RandomLow }); var bytes = Control.ControlBytesSendHasReturn (Command.readGatewayVision, common.SubnetID, common.DeviceID, new byte [] { }); if(bytes == null) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "鏃犳硶鎼滅储鍒扮綉鍏筹紝璇风‘瀹氭槸鍚︿笌缃戝叧鍦ㄥ悓涓�缃戠粶銆�"; + btnTipMsg.Text = "The gateway cannot be searched. Please make sure it is on the same network as the gateway."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧杩炴帴鎴愬姛锛屾鍦ㄦ鏌ョ綉鍏冲浐浠躲��"; + btnTipMsg.Text = "Gateway connection succeeded. Checking gateway firmware."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } var visionString = Encoding.GetEncoding ("gb2312").GetString (bytes); - int result = -99; - - if (visionString.Contains( "Ind_V03.01U_2021/07/12")) {//FW_MCIP-L1_RF.01_V03.01_210712_STM32F107VCT6_U2_india_beta") { + if (visionString.Contains ("Ind_C03.02U_2022/06/22")) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧鍥轰欢宸插崌绾э紝姝e湪鍒濆鍖栫綉鍏�"; + btnTipMsg.Text = "Gateway firmware has been upgraded, initializing gateway."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); result = 100; + //} else if (!visionString.Contains ("Ind_V02.35U_2019/06/25")) {//鐩墠鍙厑璁稿崌绾ц繖涓浐浠剁殑缃戝叧 + // Application.RunOnMainThread (() => { + // btnTipTitle.Text = "The gateway does not support automatic migration. Please contact technical support."; + // btnTipTitle.Height = Application.GetRealHeight (150); + // btnTipTitle.TextColor = SkinStyle.Current.DelColor; + // btnTipMsg.Text = ""; + // etPwd.Visible = false; + // loading.Hide (); + // btnSave.Visible = false; + // btnClose.Width = Application.GetRealWidth (500); + // }); + // return; } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "姝e湪鍗囩骇缃戝叧"; + btnTipMsg.Text = "Upgrading gateway."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); //闇�瑕佸崌绾т竴绔彛 @@ -517,77 +752,52 @@ arrayTemp [1] = Convert.ToByte ((upgradeData.Count & 0xFF0000) >> 16); arrayTemp [2] = Convert.ToByte ((upgradeData.Count & 0xFF00) >> 8); arrayTemp [3] = Convert.ToByte (upgradeData.Count & 0xFF); - //涓㈠け娆℃暟 - int lostCount = 0; while (true) { var ub = MainPage.GatewayStatus.Split ("_"); if (ub.Length > 1) { - result = Convert.ToInt32 (ub [1]); + result = Convert.ToInt32 (ub [1]); //if (result < result0 && result0 < 100) { //result = result0; Application.RunOnMainThread (() => { - btnTipMsg.Text = "姝e湪鍗囩骇缃戝叧 " + result + "/" + upgradeData.Count; + btnTipMsg.Text = "Upgrading gateway " + result + "/" + upgradeData.Count; }); } } if (MainPage.GatewayStatus.Contains ("upgrading") && result == 0) { SendUpgradeData (common.SubnetID, common.DeviceID, arrayTemp); Application.RunOnMainThread (() => { - btnTipMsg.Text = "姝e湪鍗囩骇缃戝叧 " + result + "/" + upgradeData.Count; + btnTipMsg.Text = "Upgrading gateway " + result + "/" + upgradeData.Count; }); } else if (result == -99) { System.Threading.Thread.Sleep (100); continue; } else if (result == 100) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧鍗囩骇鎴愬姛.姝e湪鍒濆鍖栫綉鍏�"; + btnTipMsg.Text = "Gateway upgrade succeeded. Initializing gateway."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); + //鍒濆鍖栨爣璁� + MainPage.GatewayStatus = ""; break; - } - - - //if (result == -1) { - // if (lostCount > 3) { - // Application.RunOnMainThread (() => { - // btnTipMsg.Text = "缃戝叧鍗囩骇澶辫触锛岃閲嶈瘯."; - // loading.Hide (); - // }); - // return; - // } - //} else if (result == -2) { - // if (lostCount > 3) { - // Application.RunOnMainThread (() => { - // btnTipMsg.Text = "缃戝叧鏃犲搷搴斻��"; - // loading.Hide (); - // }); - // return; - // } - //} else if (result == 999999) { - // Application.RunOnMainThread (() => { - // btnTipMsg.Text = "缃戝叧鍗囩骇鎴愬姛.姝e湪鍒濆鍖栫綉鍏�"; - // btnTipMsg.TextColor = SkinStyle.Current.TextColor; - // }); - // break; - //} - else { + } else { if (upgradeData.Count >= result) { - var listPack = upgradeData [result-1];// + var listPack = upgradeData [result - 1];// byte [] packData = new byte [2 + listPack.Count]; packData [0] = Convert.ToByte (result / 256); - packData [1] = Convert.ToByte (result % 256 ); + packData [1] = Convert.ToByte (result % 256); Array.Copy (listPack.ToArray (), 0, packData, 2, listPack.Count); - Console.WriteLine ("packId"+result); + Console.WriteLine ("packId" + result); SendUpgradeData (common.SubnetID, common.DeviceID, packData); } } } } - - + //閲嶆柊璁剧疆涓�涓嬪瓙缃戝彿 + SetSubnetId (common); + System.Threading.Thread.Sleep (1000); if (result == 100) { @@ -605,14 +815,21 @@ initialBytes [11] = 0x00; //鍒濆鍖栫綉鍏冲懡浠ゅ彂閫� InitializationGateway (common.SubnetID, common.DeviceID, initialBytes); + int initiaIndex = 0; while (true) { if (MainPage.GatewayStatus != "Initialization_complete") { System.Threading.Thread.Sleep (100); - } else { + } else if (initiaIndex == 0) { + //鍒濆鍖栨爣璁� + MainPage.GatewayStatus = ""; Application.RunOnMainThread (() => { - btnTipMsg.Text = "鍒濆鍖栫綉鍏虫垚鍔�,姝e湪鎵撳紑缃戝叧杩滅▼閰嶇疆銆�"; + btnTipMsg.Text = "Successfully initialized the gateway. Opening the gateway remote configuration."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); + break; + } + initiaIndex++; + if(initiaIndex > 200) { break; } } @@ -620,13 +837,14 @@ var setRemoteResult = SetGatewayRemote (common.SubnetID, common.DeviceID); if (setRemoteResult) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧杩滅▼宸插紑鍚�,姝e湪杩佺Щ璐﹀彿淇℃伅銆�"; + btnTipMsg.Text = "The gateway remote has been enabled, and the account information is being migrated."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧杩滅▼寮�鍚け璐ャ��"; + btnTipMsg.Text = "Gateway remote opening failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); }); return; } @@ -635,117 +853,273 @@ var moveAccontResult = Account2New (pwd); if (moveAccontResult) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "璐﹀彿淇℃伅杩佺Щ鎴愬姛锛屾鍦ㄨ縼绉讳綇瀹呫��"; + btnTipMsg.Text = "The account information is migrated successfully. The account is being migrated."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "璐﹀彿杩佺Щ澶辫触銆�"; + btnTipMsg.Text = "Account migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); }); return; } //杩佺Щ浣忓畢锛岃幏鍙栨柊鐨刪omeid - var newHomeId = Home2New (); + newHomeId = Home2New (); if (newHomeId == "") { Application.RunOnMainThread (() => { - btnTipMsg.Text = "浣忓畢杩佺Щ澶辫触銆�"; + btnTipMsg.Text = "Home migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } else { - btnTipMsg.Text = "浣忓畢杩佺Щ鎴愬姛,姝e湪閰嶇疆缃戝叧浣忓畢淇℃伅銆�"; + btnTipMsg.Text = "Residence migration succeeded. Gateway residence information is being configured."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; } + //鍐欏叆homeId - var homeIdSendBytes = new byte [73]; - var homeIdByte = new byte [36]; - var homeStrs = newHomeId;// UserConfig.Instance.CurrentRegion.RegionID.ToString ();//闇�瑕佷娇鐢ㄦ柊骞冲彴鐢熸垚鐨刪omeId - for (int i = 0; i < UserConfig.Instance.CurrentRegion.RegionID.ToString ().Length; i++) { - homeIdByte [i] = Convert.ToByte (homeStrs [i].ToString (), 16); - } - Array.Copy (homeIdByte, homeIdSendBytes, homeIdByte.Length); - var writeHomeIdResult = WriteHomeId (common.SubnetID, common.DeviceID, homeIdSendBytes); + var writeHomeIdResult = SetGateWayAdminInfo (common.SubnetID, newHomeId); if (writeHomeIdResult) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧浣忓畢淇℃伅閰嶇疆鎴愬姛锛屾鍦ㄨ幏鍙栦笂缃戠閽ャ��"; + btnTipMsg.Text = "The gateway home information is configured successfully, and the Internet access key is being obtained."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧浣忓畢淇℃伅閰嶇疆澶辫触."; + btnTipMsg.Text = "Gateway home information configuration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); + return; }); } //鑾峰彇涓婄綉绉橀挜 var netKet = GetInternetAccessKey (common.MAC.Replace (".", "")); + + if (!string.IsNullOrEmpty (netKet)) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "鑾峰彇涓婄綉绉橀挜鎴愬姛銆傛鍦ㄥ啓鍏�"; + btnTipMsg.Text = "The Internet access key was obtained successfully. It is being written."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); - var secretkeySendBytes = new byte [netKet.Length + 1]; - var secretkeyByte = new byte [netKet.Length]; - for (int i = 0; i < netKet.Length; i++) { - secretkeyByte [i] = Convert.ToByte (netKet [i].ToString (), 16); - } - Array.Copy (secretkeyByte, 0, secretkeySendBytes, 1, secretkeyByte.Length); + var deviceSecret = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceSecret> (netKet); + var secretkeyByte = Encoding.UTF8.GetBytes (deviceSecret.deviceSecret); + var secretkeySendBytes = new byte [secretkeyByte.Length + 1]; secretkeySendBytes [0] = 1; + Array.Copy (secretkeyByte, 0, secretkeySendBytes, 1, secretkeyByte.Length); + //for (int i = 0; i < netKet.Length; i++) { + // secretkeyByte [i] = Convert.ToByte (netKet [i].ToString (), 16); + //} + //Array.Copy (secretkeyByte, 0, secretkeySendBytes, 1, secretkeyByte.Length); + //secretkeySendBytes [0] = 1; + System.Threading.Thread.Sleep (10000); //鍐欏叆涓婄綉绉橀挜 var writeSecretKeyResult = WriteSecretKey (common.SubnetID, common.DeviceID, secretkeySendBytes); if (writeSecretKeyResult) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "涓婄綉绉橀挜鍐欏叆鎴愬姛锛屾鍦ㄨ縼绉荤綉鍏炽��"; + btnTipMsg.Text = "The Internet access key was written successfully. The gateway is being migrated."; }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "涓婄綉绉橀挜鍐欏叆澶辫触銆�"; + btnTipMsg.Text = "Failed to write Internet secret key. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); return; }); } + +#if DEBUG + System.Threading.Thread.Sleep (5000); +#endif + + CommonPage.FindGateway = true; + try { + #region 鎼滅储璁惧 + CommonPage.LocalPhoneFindDevice = true; + CommonPage.RandomHigh = (byte)new Random ().Next (255); + CommonPage.RandomLow = (byte)new Random ().Next (255); + CommonPage.GateWayList.Clear (); + CommonPage.FindGateway = true; + //濡傛灉涓ゆ閮芥病鏈夋暟鎹弽棣堬紝灏变笉璇诲彇 + int readCount = 2; + while (0 < readCount) { + readCount--; + System.IO.MemoryStream ms = new System.IO.MemoryStream (); + ms.WriteByte (CommonPage.RandomHigh); + ms.WriteByte (CommonPage.RandomLow); + + List<Common> list = CommonPage.GateWayList; + + int tempCount = list.Count; + string s = ";"; + for (int i = 0; i < list.Count; i++) { + Common common2 = list [i]; + if (s.Contains (";" + common2.SubnetID.ToString () + ":" + common2.DeviceID.ToString ())) + continue; + s += common2.SubnetID.ToString () + ":" + common2.DeviceID.ToString () + ";"; + ms.WriteByte (common2.SubnetID); + ms.WriteByte (common2.DeviceID); + } + Control control = new Control (); + + Console.WriteLine ("缁勬挱鎼滅储缃戝叧锛屾悳绱㈠湴鍧�鏄�:" + CommonPage.EndPoint.ToString () + " " + CommonPage.GateWayList.Count); + control.Send (new Target () { + IPEndPoint = CommonPage.EndPoint, + Command = Command.ReadGateway, + SubnetID = 0xFF, + DeviceID = 0xFF, + AddData = ms.ToArray () + }, SendCount.Zero, false); + + Console.WriteLine ("骞挎挱鎼滅储缃戝叧锛屾悳绱㈠湴鍧�鏄�:" + new Net.NetWiFi ().BroadcastIpAddress.ToString () + " " + CommonPage.GateWayList.Count); + control.Send (new Target () { + IPEndPoint = new System.Net.IPEndPoint (new Net.NetWiFi ().BroadcastIpAddress, 6000), + Command = Command.ReadGateway, + SubnetID = 0xFF, + DeviceID = 0xFF, + AddData = ms.ToArray () + }, SendCount.Zero, false); + + System.Threading.Thread.Sleep (800); + //濡傛灉鏁伴噺涓嶇浉绛夛紝灏遍噸缃鏁� + if (tempCount != CommonPage.GateWayList.Count) { + readCount = 2; + } + } + CommonPage.FindGateway = false; + + CommonPage.LocalPhoneFindDevice = false; + #endregion + } catch (Exception ex) { + Console.WriteLine (ex.ToString ()); + } finally { + if (CommonPage.GateWayList.Count > 0) { + foreach (var gateway1 in CommonPage.GateWayList) { + var bingResidenceIdBytes = Control.ControlBytesSendHasReturn (Command.Read_APP_Data_STORE_1D5C_CMD, common.SubnetID, common.DeviceID, new byte [] { }); + if (bingResidenceIdBytes == null) { + continue; + } + int bingResideceId = 0; + for (int i = 0; i < bingResidenceIdBytes.Length; i++) { + bingResideceId += (int)(bingResidenceIdBytes [i] * Math.Pow (256, 3 - i)); + } + if (bingResideceId != UserConfig.Instance.CurrentRegion.RegionID && bingResideceId != 0) { + } else { + //鍐欏叆涓婄綉绉橀挜 + writeSecretKeyResult = WriteSecretKey (gateway1.SubnetID, gateway1.DeviceID, secretkeySendBytes); + if (writeSecretKeyResult) { + Application.RunOnMainThread (() => { + btnTipMsg.Text = "The Internet access key was written successfully."; + }); + } else { + Application.RunOnMainThread (() => { + btnTipMsg.Text = "Failed to write Internet secret key."; + btnTipMsg.TextColor = SkinStyle.Current.DelColor; + }); + } +#if DEBUG + System.Threading.Thread.Sleep (5000); +#endif + + } + } + } + } + + + + + + } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "涓婄綉绉橀挜鑾峰彇澶辫触銆�"; + btnTipMsg.Text = "Failed to obtain the Internet secret key. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; + return; }); } + //鍐欏叆mqtt鍩熷悕淇℃伅 + SetGateWayMqttUrlAddress (common.SubnetID, common.DeviceID); + //杩佺Щ缃戝叧 - var moveGatewayResult = Gateway2New (common.MAC.Replace (".", ""), newHomeId); + var moveGatewayResult = Gateway2New (common.MAC.Replace (".", ""), newHomeId, common.SubnetID); if (moveGatewayResult) { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧杩佺Щ鎴愬姛锛屾鍦ㄨ縼绉诲浠芥暟鎹��"; + btnTipMsg.Text = "Gateway migration succeeded. The backup data is being migrated."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "缃戝叧杩佺Щ澶辫触銆�"; + btnTipMsg.Text = "Gateway migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } + //杩佺Щ浜戠鍏朵粬澶囦唤 + var moveCloudDataResult = MoveCloudBackup (); + if (moveCloudDataResult != "0") { + Application.RunOnMainThread (() => { + btnTipMsg.Text = $"Failed to migrate cloud backup list.{moveCloudDataResult}"; + btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); + return; + }); + } //鍒涘缓杩佺Щ澶囦唤鏂囦欢澶� - var backId = moveFolder2New (newHomeId, newUserId); + var backId = moveFolder2New (newHomeId); //杩佺Щ澶囦唤鏂囦欢 - var moveFileResult = MoveFile2New (newHomeId, newUserId, backId); + var moveFileResult = MoveFile2New (backId); + // Application.RunOnMainThread (() => { + // btnTipMsg.Text = "Migrating server backup."; + // btnTipMsg.TextColor = SkinStyle.Current.TextColor; + // }); + // MoveOldBackupList (); if (moveFileResult == "true") { + Application.RunOnMainThread (() => { + btnTipMsg.Text = "Migration backup succeeded, migrating Schedule data."; + btnTipMsg.TextColor = SkinStyle.Current.TextColor; + }); + //杩佺Щ瀹氭椂鍣� + var timerList = GetTimer (newHomeId); + if (timerList == null) { + Application.RunOnMainThread (() => { + btnTipMsg.Text = "Schedule migration failed. Please try again."; + btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); + return; + }); + } else { + if (timerList.Count > 0) { + var backupTimerResult = BackupSchedule (newHomeId, timerList); + if (string.IsNullOrEmpty (backupTimerResult)) { + btnTipMsg.Text = "Schedule migration failed.. Please try again."; + btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); + return; + } + } + } + + //鏍囪娴佺▼瀹屾垚 //var markResult = Mark (newHomeId); //if (markResult) { Application.RunOnMainThread (() => { - btnTipTitle.Text = "澶囦唤鏁版嵁杩佺Щ鎴愬姛锛屽钩鍙拌縼绉诲畬鎴愩��"; + btnTipTitle.Text = "The backup data migration is successful, and the platform migration is completed."; + btnTipTitle.Height = Application.GetRealHeight (150); //btnTipMsg.TextColor = SkinStyle.Current.TextColor; btnTipMsg.Text = ""; etPwd.Visible = false; loading.Hide (); + btnSave.Visible = false; + btnClose.Width = Application.GetRealWidth (500); }); } else { Application.RunOnMainThread (() => { - btnTipMsg.Text = "澶囦唤鏁版嵁杩佺Щ澶辫触銆�"; + btnTipMsg.Text = "Backup data migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); @@ -755,16 +1129,15 @@ } - Application.RunOnMainThread (() => { - }); - break;//鍙崌绾т竴涓� } } } else { //娌℃湁缃戝叧 Application.RunOnMainThread (() => { - btnTipTitle.Text = "鏈娴嬪埌缃戝叧锛岃妫�鏌ユ湰鍦版暟鎹�."; + btnTipMsg.Text = "No gateway detected, please check local data"; + btnTipMsg.TextColor = SkinStyle.Current.DelColor; + loading.Hide (); }); return; } @@ -780,7 +1153,8 @@ { byte [] buffer = new byte [1024]; List<List<byte>> upgradeData = new List<List<byte>> (); - System.IO.Stream stream = Application.Activity.Assets.Open ("FW_MCIP-L1_RF.01_V03.01_210712_STM32F107VCT6_U2_india_beta.bin"); + System.IO.Stream stream = Application.Activity.Assets.Open ("india_beta.bin"); + //System.IO.Stream stream = Application.Activity.Assets.Open ("india_test.bin"); int length = 0; try { while ((length = stream.Read (buffer, 0, buffer.Length)) != 0) { @@ -837,6 +1211,28 @@ } /// <summary> + /// 璁剧疆瀛愮綉鍙� + /// </summary> + /// <param name="gatewayDevice"></param> + private void SetSubnetId (GatewayBase gatewayDevice) + { + string [] macAddress = gatewayDevice.MAC.Split ('.'); + byte [] Musics = new byte [10]; + for (int i = 0; i < macAddress.Length; i++) { + Musics [i] = Convert.ToByte (macAddress [i], 16); + } + try { + Musics [8] = Convert.ToByte (Convert.ToInt32 (gatewayDevice.SubnetID)); + if (Musics [8] < 0 || Musics [8] > 255) { + throw new Exception (); + } + } catch { + return; + } + Control.ControlBytesSend (Command.SetDeviceSubnetID, gatewayDevice.SubnetID, gatewayDevice.DeviceID, Musics); + } + + /// <summary> /// 璁惧缃戝叧寮�鍚繙绋� /// </summary> private bool SetGatewayRemote(byte subnetId, byte deviceId) @@ -844,38 +1240,37 @@ var sendByte = new byte [67]; sendByte [0] = 4; var result = Control.ControlBytesSendHasReturn (Command.SetGateWayModelInfo, subnetId, deviceId, sendByte); - if (result == null) { - - } else { - if(result.Length>0 && result[0] == 248) { - return true; - } + if (result != null) { + return true; } return false; } - /// <summary> - /// 鍐欏叆homeId - /// </summary> - /// <param name="subnetId"></param> - /// <param name="deviceId"></param> - /// <param name="sendByets"></param> - private bool WriteHomeId (byte subnetId, byte deviceId, byte [] sendByets) - { - var result = Control.ControlBytesSendHasReturn (Command.WriteHomeId, subnetId, deviceId, sendByets); - if (result == null) - return false; - if (result.Length == 3) { - if (result [2] == 0xF8) { - return true; - } - } else if (result.Length == 1) { - if (result [0] == 0xF8) { - return true; - } - } - return false; - } + ///// <summary> + ///// 鍐欏叆homeId + ///// </summary> + ///// <param name="subnetId"></param> + ///// <param name="deviceId"></param> + ///// <param name="sendByets"></param> + //private bool WriteHomeId (byte subnetId, byte deviceId, byte [] sendByets) + //{ + // //var result = Control.ControlBytesSendHasReturn (Command.WriteHomeId, subnetId, deviceId, sendByets); + // //if (result == null) + // // return false; + // //if (result.Length == 3) { + // // if (result [2] == 0xF8) { + // // return true; + // // } + // //} else if (result.Length == 1) { + // // if (result [0] == 0xF8) { + // // return true; + // // } + // //} + // //return false; + + // return SetGateWayAdminInfo (subnetId, homeId); + + //} /// <summary> @@ -905,6 +1300,75 @@ return false; } - + /// <summary> + /// + /// </summary> + /// <param name="bytes"></param> + /// <returns></returns> + private byte GetCheckSum (byte [] bytes) + { + //byte checksum = 0x00; + //foreach (byte bt in bytes) { + // checksum ^= bt; + //} + + int iSum = 0; + for (int i = 0; i < bytes.Length; i++) { + iSum += bytes [i]; + } + return (byte)(0xff & (0x100 - iSum)); + } + + + /// <summary> + /// 淇敼Mqtt鍩熷悕鍦板潃 + /// </summary> + /// <returns></returns> + void SetGateWayMqttUrlAddress (byte subnetId,byte deviceId) + { + byte [] utlBytes = new byte [65]; + var url = new Uri (SeverAddr); + var host = ""; + if (url != null) { + host = url.Host; + } + byte [] hostBytes = CommonPage.MyEncodingGB2312.GetBytes (host); + Array.Copy (hostBytes, 0, utlBytes, 0, 64 < hostBytes.Length ? 64 : hostBytes.Length); + var sum = GetCheckSum (hostBytes); + utlBytes [64] = sum;//鏍¢獙浣� + byte [] backBytes = Control.ControlBytesSendHasReturn (Command.SetGateWayMqttURLAddress, subnetId, deviceId, utlBytes); + + //return CheckIsSuccessfulWithBytes (backBytes, "Failed to modify gateway remote address!"); + } + + /// <summary> + /// 淇敼绠$悊鍛樹俊鎭� + /// </summary> + /// <param name="adminBytes"></param> + /// <returns></returns> + private bool SetGateWayAdminInfo (byte subnetId,string homeId) + { + //byte [] name = CommonPage.MyEncodingGB2312.GetBytes (MainPage.LoginUser.AccountString); + byte [] currentRegionIdBytes = CommonPage.MyEncodingGB2312.GetBytes (homeId); + byte [] adminBytes = new byte [73]; + adminBytes [36] = 1;//浣忓畢鏍囧織浣� + Array.Copy (currentRegionIdBytes, 0, adminBytes, 37, 36 < currentRegionIdBytes.Length ? 36 : currentRegionIdBytes.Length); + + byte [] result = Control.ControlBytesSendHasReturn (Command.WriteHomeId, subnetId, 0, adminBytes); + if (result == null) + return false; + if (result.Length == 3) { + if (result [2] == 0xF8) { + return true; + } + } else if (result.Length == 1) { + if (result [0] == 0xF8) { + return true; + } + } + return false; + } + } + } -- Gitblit v1.8.0