using System; using System.Collections.Generic; using System.Text; using Newtonsoft.Json.Linq; using Shared; namespace Shared.SimpleControl.Phone { public class DeviceSecret { public string deviceSecret; } public class MigrationServer { /// /// 标记完成迁移 /// private bool finish = false; #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; Button btnTipTitle; Button btnTipMsg; Loading loading; 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 (); tipLockedAction = () => { Application.RunOnMainThread (() => { if (!showedLockedTip) { sssAlert.Show (); showedLockedTip = true; sssAlert.ResultEventHandler += (sd, dd) => { showedLockedTip = false; }; } }); }; Packet.lockedAction = tipLockedAction; } public void ShowDialog() { #region 弹窗 Dialog dialog = new Dialog (); FrameLayout dialogBodyView = new FrameLayout () { Gravity = Gravity.Center, Width = Application.GetRealWidth (500), Height = Application.GetRealHeight (500), BackgroundColor = SkinStyle.Current.DialogColor, Radius = 5, BorderColor = SkinStyle.Current.Transparent, BorderWidth = 0, }; dialog.AddChidren (dialogBodyView); Button btnTitle = new Button () { Height = Application.GetRealHeight (80), BackgroundColor = SkinStyle.Current.DialogTitle, TextAlignment = TextAlignment.Center, TextID = R.MyInternationalizationString.Tip, TextColor = SkinStyle.Current.DialogTextColor }; dialogBodyView.AddChidren (btnTitle); contentView = new FrameLayout () { Y = Application.GetRealHeight (80), Height = Application.GetRealHeight (340), BackgroundColor = SkinStyle.Current.DialogColor, }; dialogBodyView.AddChidren (contentView); btnTipTitle = new Button () { Gravity = Gravity.CenterHorizontal, Y = Application.GetRealHeight (20), Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), Text = "Please enter the password to confirm the migration", TextAlignment = TextAlignment.CenterLeft, TextColor = SkinStyle.Current.TextColor, IsMoreLines = true, }; contentView.AddChidren (btnTipTitle); etPwd = new EditText () { Gravity = Gravity.CenterHorizontal, Y = btnTipTitle.Bottom, Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (80), TextAlignment = TextAlignment.Center, Radius = 5, BorderColor = SkinStyle.Current.BorderColor, BorderWidth = 1, TextColor = SkinStyle.Current.TextColor, SecureTextEntry = true }; contentView.AddChidren (etPwd); etPwd.EditorEnterAction += (obj) => { Application.HideSoftInput (); }; btnTipMsg = new Button () { Gravity = Gravity.CenterHorizontal, Y = etPwd.Bottom, Width = Application.GetRealWidth (400), Height = Application.GetRealHeight (120), TextAlignment = TextAlignment.CenterLeft, TextColor = SkinStyle.Current.DelColor, IsMoreLines = true, }; contentView.AddChidren (btnTipMsg); dialogBodyView.AddChidren (loading); FrameLayout bottomView = new FrameLayout () { Y = Application.GetRealHeight (420), Height = Application.GetRealHeight (85), BackgroundColor = SkinStyle.Current.DialogTitle }; dialogBodyView.AddChidren (bottomView); btnClose = new Button () { Width = Application.GetRealWidth (249), TextID = R.MyInternationalizationString.Close, TextAlignment = TextAlignment.Center }; bottomView.AddChidren (btnClose); btnClose.MouseUpEventHandler += (send2er, e2) => { dialog.Close (); Packet.lockedAction = null; }; Button btnBottomLine = new Button () { X = btnClose.Right, Width = 1, BackgroundColor = SkinStyle.Current.Black50Transparent, }; bottomView.AddChidren (btnBottomLine); btnSave = new Button () { X = btnBottomLine.Right, Width = Application.GetRealWidth (249), TextID = R.MyInternationalizationString.Confrim, TextAlignment = TextAlignment.Center }; bottomView.AddChidren (btnSave); etPwd.TextChangeEventHandler = (sender, e) => { btnTipMsg.Text = ""; }; btnSave.MouseUpEventHandler += (sender2, e2) => { if (finish) { dialog.Close (); Packet.lockedAction = null; return; } #if DEBUG //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 = "Please input a password"; return; } loading.Start (""); pwd = etPwd.Text.Trim (); //验证密码 new System.Threading.Thread (() => { try { var verResult = AcountVer (pwd); if (verResult) { Application.RunOnMainThread (() => { btnTipMsg.Text = "Verification passed, detecting gateway configuration"; btnTipMsg.TextColor = SkinStyle.Current.TextColor; CheckGateway (); }); } else { Application.RunOnMainThread (() => { btnTipMsg.Text = "Password error, verification failed, please try again."; loading.Hide (); }); } } catch { Application.RunOnMainThread (() => { loading.Hide (); }); } finally { } }) { IsBackground = true }.Start (); }; dialog.Show (); if (MainPage.WiFiStatus != "CrabtreeAdd/WiFi.png") { //status = btnSave.Text = "ReCheck"; btnTipMsg.Text = "Please connect the gateway device in the LAN."; etPwd.Visible = false; btnSave.MouseUpEventHandler = (sender2, e2) => { dialog.Close (); Packet.lockedAction = null; }; } else { } //2.进入网关升级模式 //3.接收升级文件获取请求 //迁移账号 #endregion } #region 云端 /// /// 账号登录验证 /// /// /// private bool AcountVer(string pwd) { var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString, Password = pwd, Company = MainPage.SoftSmsType }; var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj); var revertObj = MainPage.RequestHttps ("Login", requestJson, false); if (revertObj.StateCode == "SUCCESS") { return true; } else { return false; } } /// /// 账号迁移 /// /// /// public bool Account2New (string pwd) { Dictionary dicAccount = new Dictionary (); dicAccount.Add ("email", MainPage.LoginUser.AccountString); dicAccount.Add ("language", "ENGLISH"); dicAccount.Add ("appCode", "HDL-HOME-IND-APP"); dicAccount.Add ("pwd", pwd); dicAccount.Add ("tenantId", "202106"); var requestJson = HttpUtil.GetSignRequestJson (dicAccount);// Newtonsoft.Json.JsonConvert.SerializeObject (dicAccount); var revertObj2 = MainPage.RequestHttps ("/home-wisdom/data/move/user/save", requestJson, false, false, SeverAddr); if (revertObj2.code == "0") { var info = Newtonsoft.Json.JsonConvert.DeserializeObject (revertObj2.data.ToString ()); if (info != null) { newUserId = info.memberId; } return true; } else { return false; } } /// /// 住宅迁移 /// /// new homeId private string Home2New () { Dictionary dic = new Dictionary (); dic.Add ("homeName", UserConfig.Instance.CurrentRegion.RegionName); dic.Add ("userId", newUserId); dic.Add ("homeType", "BUSPRO"); dic.Add ("tenantId", "202106"); var requestJson = HttpUtil.GetSignRequestJson (dic);// Newtonsoft.Json.JsonConvert.SerializeObject (dic); var revertObj = MainPage.RequestHttps ("/home-wisdom/data/move/home/save", requestJson, false, false, SeverAddr); if (revertObj != null) { if (revertObj.data != null) { var newHomeInfo = Newtonsoft.Json.JsonConvert.DeserializeObject (revertObj.data.ToString ()); newHomeId = newHomeInfo.homeId; return newHomeInfo.homeId; } } return ""; } /// /// 迁移网关 /// /// /// 新平台的住宅id /// private bool Gateway2New (string mac,string newHomeId,int subnetId) { Dictionary dic = new Dictionary (); 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; } return false; } /// /// 获取上网密秘钥 /// /// private string GetInternetAccessKey (string mac) { Dictionary dic = new Dictionary (); dic.Add ("supplier", "HDL"); dic.Add ("mac", mac); dic.Add ("spk", "BUSUDPGATEWAY"); var requestJson = HttpUtil.GetSignRequestJson (dic); //var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (dic); 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 { } return ""; } /// /// 迁移备份 /// /// /// private string moveFolder2New (string newHomeId,string folderName = "") { try { Dictionary dic = new Dictionary (); 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 (revertObj.data.ToString ()); return resultObj.id; } } return ""; } catch { return ""; } } private string MoveFile2New(string backupId) { Dictionary dic = new Dictionary (); dic.Add ("backupId", backupId); dic.Add ("homeId", newHomeId); dic.Add ("userId", newUserId); dic.Add ("backupClassify", "USER_DEFINED_BACKUP"); dic.Add ("tenantId", "202106"); List fileObjs = new List (); var backuplist = IO.FileUtils.ReadFiles (); int index = 0; foreach (var fileName in backuplist) { index++; /// /// 如果是特殊的注册登陆文件,则不需要备份到服务器 /// if (fileName == UserInfo.GlobalRegisterFile) { continue; } BackupFileObj backupFileObj = new BackupFileObj () { fileName = fileName, content = IO.FileUtils.ReadFile (fileName) }; 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; } } } } if (!dic.ContainsKey ("list")) { dic.Add ("list", fileObjs); //} else { // dic ["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 ""; } /// /// 迁移旧云端备份列表到新云端 /// /// 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> (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> (revertObj2.ResponseData.ToString ()); MoveOldBackupFile2New (newFolderId, backupInfoRes); } } } catch { } } } } catch { } } /// /// 迁移旧服务器备份文件到新服务器 /// /// /// private string MoveOldBackupFile2New ( string backupId, List responseDataObj) { Dictionary dic = new Dictionary (); dic.Add ("backupId", backupId); dic.Add ("homeId", newHomeId); dic.Add ("userId", newUserId); dic.Add ("backupClassify", "USER_DEFINED_BACKUP"); dic.Add ("tenantId", "202106"); List fileObjs = new List (); 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 (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; } } } } } 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 ""; } /// 迁移服务器全部备份 /// private string MoveCloudBackup () { var dic = new Dictionary (); dic.Add ("oldPlatformToken", MainPage.LoginUser.LoginTokenString);//旧平台token dic.Add ("oldPlatformHomeId", UserConfig.Instance.CurrentRegion.RegionID);//旧平台住宅id dic.Add ("homeId", newHomeId);//新平台住宅id dic.Add ("userId", newUserId);//新平台用户id 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"; } /// /// 获取定时器列表 /// /// private List 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> (revertObj.ResponseData.ToString ()); if(timers.Count > 0) { List backups = new List (); 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 (); } /// /// 定时器备份 /// /// private string BackupSchedule (string newHomeId, List backups) { Dictionary dic = new Dictionary (); 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 (revertObj.data.ToString ()); var ddd = MoveTimerFileData (newHomeId,resultObj.id, backups); return ddd; } } return ""; } /// /// 保存定时器数据 /// /// /// /// /// private string MoveTimerFileData (string newHomeId, string backupId, List fileObjs) { Dictionary dic = new Dictionary (); 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 /// /// 检测一端口信息 /// /// /// public void CheckGateway() { Application.RunOnMainThread (() => { loading.Start (""); }); new System.Threading.Thread (() => { //1.检测一端口固件 var localFileList = IO.FileUtils.ReadFiles (); var gateWayList = localFileList.FindAll ((obj) => { return (obj.StartsWith ("Equipment_")) && ( obj.Split ('_') [1].ToString () == DeviceType.OnePortBus.ToString () || obj.Split ('_') [1].ToString () == DeviceType.RCU.ToString () || obj.Split ('_') [1].ToString () == DeviceType.OnePortWirelessFR.ToString ()); }); List linkList = new List (); GatewayBase common = null; string gateWayString = ""; if (gateWayList.Count > 0) { foreach (var gatewayFileName in gateWayList) { var tempStrings = gatewayFileName.Split ('_'); if (tempStrings [1].ToString () == DeviceType.OnePortBus.ToString () || tempStrings [1].ToString () == DeviceType.RCU.ToString () || tempStrings [1].ToString () == DeviceType.OnePortWirelessFR.ToString ()) { gateWayString = CommonPage.MyEncodingUTF8.GetString (IO.FileUtils.ReadFile (gatewayFileName)); common = Newtonsoft.Json.JsonConvert.DeserializeObject (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 = "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 = "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_C03.02U_2022/06/22")) { Application.RunOnMainThread (() => { 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 = "Upgrading gateway."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); //需要升级一端口 List> upgradeData = ReadUpgradeData (); for (int i = 0; i < 7; i++) { Control.ControlBytesSend (Command.enjoyUpgrade, common.SubnetID, common.DeviceID, new byte [] { }); } byte [] arrayTemp = new byte [4]; arrayTemp [0] = Convert.ToByte ((upgradeData.Count & 0xFF000000) >> 24); arrayTemp [1] = Convert.ToByte ((upgradeData.Count & 0xFF0000) >> 16); arrayTemp [2] = Convert.ToByte ((upgradeData.Count & 0xFF00) >> 8); arrayTemp [3] = Convert.ToByte (upgradeData.Count & 0xFF); while (true) { var ub = MainPage.GatewayStatus.Split ("_"); if (ub.Length > 1) { result = Convert.ToInt32 (ub [1]); //if (result < result0 && result0 < 100) { //result = result0; Application.RunOnMainThread (() => { btnTipMsg.Text = "Upgrading gateway " + result + "/" + upgradeData.Count; }); } } if (MainPage.GatewayStatus.Contains ("upgrading") && result == 0) { SendUpgradeData (common.SubnetID, common.DeviceID, arrayTemp); Application.RunOnMainThread (() => { 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 = "Gateway upgrade succeeded. Initializing gateway."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); //初始化标记 MainPage.GatewayStatus = ""; break; } else { if (upgradeData.Count >= result) { var listPack = upgradeData [result - 1];// byte [] packData = new byte [2 + listPack.Count]; packData [0] = Convert.ToByte (result / 256); packData [1] = Convert.ToByte (result % 256); Array.Copy (listPack.ToArray (), 0, packData, 2, listPack.Count); Console.WriteLine ("packId" + result); SendUpgradeData (common.SubnetID, common.DeviceID, packData); } } } } //重新设置一下子网号 SetSubnetId (common); System.Threading.Thread.Sleep (1000); if (result == 100) { //初始化网关 var initialBytes = new byte [12]; initialBytes [0] = 0x00; initialBytes [1] = 0x00; string [] mac = common.MAC.Split ('.'); for (int i = 0; i < mac.Length; i++) initialBytes [i + 2] = Convert.ToByte (mac [i], 16); initialBytes [10] = Convert.ToByte (common.SubnetID); 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 if (initiaIndex == 0) { //初始化标记 MainPage.GatewayStatus = ""; Application.RunOnMainThread (() => { btnTipMsg.Text = "Successfully initialized the gateway. Opening the gateway remote configuration."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); break; } initiaIndex++; if(initiaIndex > 200) { break; } } //开启网关远程 var setRemoteResult = SetGatewayRemote (common.SubnetID, common.DeviceID); if (setRemoteResult) { Application.RunOnMainThread (() => { 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 = "Gateway remote opening failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } //迁移账号 var moveAccontResult = Account2New (pwd); if (moveAccontResult) { Application.RunOnMainThread (() => { btnTipMsg.Text = "The account information is migrated successfully. The account is being migrated."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } else { Application.RunOnMainThread (() => { btnTipMsg.Text = "Account migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } //迁移住宅,获取新的homeid newHomeId = Home2New (); if (newHomeId == "") { Application.RunOnMainThread (() => { btnTipMsg.Text = "Home migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } else { btnTipMsg.Text = "Residence migration succeeded. Gateway residence information is being configured."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; } //写入homeId var writeHomeIdResult = SetGateWayAdminInfo (common.SubnetID, newHomeId); if (writeHomeIdResult) { Application.RunOnMainThread (() => { 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 = "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 = "The Internet access key was obtained successfully. It is being written."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); var deviceSecret = Newtonsoft.Json.JsonConvert.DeserializeObject (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 = "The Internet access key was written successfully. The gateway is being migrated."; }); } else { Application.RunOnMainThread (() => { 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 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 = "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, common.SubnetID); if (moveGatewayResult) { Application.RunOnMainThread (() => { btnTipMsg.Text = "Gateway migration succeeded. The backup data is being migrated."; btnTipMsg.TextColor = SkinStyle.Current.TextColor; }); } else { Application.RunOnMainThread (() => { 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); //迁移备份文件 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 = "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 = "Backup data migration failed. Please try again."; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); } //} } break;//只升级一个 } } } else { //没有网关 Application.RunOnMainThread (() => { btnTipMsg.Text = "No gateway detected, please check local data"; btnTipMsg.TextColor = SkinStyle.Current.DelColor; loading.Hide (); }); return; } }) { IsBackground = true }.Start (); //Control.ControlBytesSend (Command.enjoyUpgrade2, common.SubnetID, common.DeviceID, new byte [] { }); } /// /// 读取固件数据 /// /// private static List> ReadUpgradeData () { byte [] buffer = new byte [1024]; List> upgradeData = new List> (); 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) { List bbb = new List (); for (int i = 0; i < length; i++) { bbb.Add (buffer [i]); } upgradeData.Add (bbb); } } catch { } finally { stream.Close (); } return upgradeData; } /// /// 发送网关固件数据 /// /// /// /// /// public void SendUpgradeData (byte subnetId,byte deviceId,byte[] sendByets) { var resutl = Control.ControlBytesSendHasReturn (Command.enjoyUpgrade2, subnetId, deviceId, sendByets); //if(resutl == null) { // return -2; //} //if (resutl.Length == 0) { // return -1; //} //if (resutl [0] == 0xF8) { // return 999999; //} else { // if (resutl.Length > 1) { // var packId = resutl [0] * 256 + resutl [1]; // Console.WriteLine ("packId:"+packId); // return packId; // } // return 1; //} } /// /// 初始化网关 /// /// /// private void InitializationGateway(byte subnetId, byte deviceId, byte [] sendByets) { Control.ControlBytesSend (Command.InitializationGateway, subnetId, deviceId, sendByets); } /// /// 设置子网号 /// /// 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); } /// /// 设备网关开启远程 /// private bool SetGatewayRemote(byte subnetId, byte deviceId) { var sendByte = new byte [67]; sendByte [0] = 4; var result = Control.ControlBytesSendHasReturn (Command.SetGateWayModelInfo, subnetId, deviceId, sendByte); if (result != null) { return true; } return false; } ///// ///// 写入homeId ///// ///// ///// ///// //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); //} /// /// 写入上网秘钥 /// /// /// /// /// private bool WriteSecretKey (byte subnetId, byte deviceId, byte [] sendByets) { var result = Control.ControlBytesSendHasReturn (Command.WriteSecretKey, subnetId, deviceId, sendByets); if (result!= null ) { return true; //if (result.Length > 26) { // if (result [26] == 0xF8) { // return true; // } //} else { // if (result.Length > 3) { // if (result [1] == 0xF8) { // return true; // } // } //} } return false; } /// /// /// /// /// 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)); } /// /// 修改Mqtt域名地址 /// /// 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!"); } /// /// 修改管理员信息 /// /// /// 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; } } }