JLChen
2021-01-06 f60ce72c3c29c7d31a046795c88ec39a69e73d45
Crabtree/SmartHome/UI/SimpleControl/Phone/Guide/GuideAddGateway.cs
@@ -26,7 +26,7 @@
        /// <summary>
        /// 修改网关备注
        /// </summary>
        static void ResetGatewayName (GatewayBase gatewayBase,Button nameButton1)
        static void ResetGatewayName (GatewayBase gatewayBase, Button nameButton1)
        {
            Dialog dialog = new Dialog ();
@@ -62,7 +62,7 @@
                Height = Application.GetRealHeight (80),
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = SkinStyle.Current.TextColor,
                Text  = "Gateway Name : "
                Text = "Gateway Name : "
            };
            bodyView.AddChidren (btnZoneName);
@@ -83,10 +83,11 @@
            etRemark.EditorEnterAction += (obj) => {
                Application.HideSoftInput ();
            };
            if (MainPage.LoginUser.AccountType == 1) {
                etRemark.Enable = false;
                etRemark.BorderWidth = 0;
            }
            //if (MainPage.LoginUser.AccountType == 1) {
            //    etRemark.Enable = false;
            //    etRemark.BorderWidth = 0;
            //}
            var BottomView = new FrameLayout () {
                Y = Application.GetRealHeight (400 - 88),
@@ -136,6 +137,9 @@
        public void ShowPage (RegionInfoRes home)
        {
            ////2020-01-14 第一次进入页面默认
            //UserConfig.Instance.IsLocalEncrypt = false;
            addedList = new List<Common> ();
            inView = this;
            #region 标题
@@ -177,6 +181,8 @@
            };
            topView.AddChidren (back);
            back.MouseUpEventHandler += (sender, e) => {
                //重置为加密模式
                UserConfig.Instance.IsLocalEncrypt = true;
                (Parent as PageLayout).PageIndex -= 1;
            };
@@ -256,7 +262,7 @@
                    var delAlert = new Alert ("", "If you delete gateway, you will not able to control the devices. Still you want to delete the gateway?", "No", "Yes");
                    delAlert.Show ();
                    delAlert.ResultEventHandler += ( sender1,  e1) => {
                    delAlert.ResultEventHandler += (sender1, e1) => {
                        if (e1) {
                            var delFile = IO.FileUtils.ReadFiles ().FindAll ((w) => {
                                return (w.Split ('_') [0] == "Equipment") && (w.Split ('_') [2] == common.SubnetID.ToString ());
@@ -294,67 +300,11 @@
                    bool goNext = false;
                    System.Threading.Tasks.Task.Run (() => {
                        try {
                            if (common.Type == DeviceType.OnePortWirelessFR || common.Type == DeviceType.OnePortMqttFR) {
                                var backBytes = Control.ControlBytesSendHasReturn (Command.Read_APP_Data_STORE_1D5C_CMD, common.SubnetID, common.DeviceID, new byte [] { });
                                if (backBytes == null) {
                                    Application.RunOnMainThread (() => {
                                        new Alert ("", "No response from gateway. Please make sure the gateway is online and its firmware is up to date.", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                                    });
                                }
                                if (backBytes.Length >= 37) {
                                    //******************住宅ID string类型*************
                                    bool enable = backBytes [0] == 0 ? false : true;
                                    //返回住宅ID 转为string类型
                                    string backIDStr = CommonPage.MyEncodingGB2312.GetString (backBytes, 1, 36).Trim ('\0');
                                    //36FF"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"
                                    //32FF ÿÿÿÿÿÿÿÿÿÿ
                                    if (enable || backIDStr == UserConfig.Instance.CurrentRegion.Id || string.IsNullOrEmpty (backIDStr) || backIDStr.Equals("ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ")) {
                                        goNext = true;
                                    } else {
                                        //#if DEBUG
                                        //                                    Control.ControlBytesSendHasReturn (Command.Write_APP_Data_STORE_1D5E_CMD, common.SubnetID, common.DeviceID, new byte [] { 0, 0, 0, 0 });
                                        //#endif
                                        Application.RunOnMainThread (() => {
                                            //new Alert ("", "This gateway has been bound to a residence, please reset it before binding to another residence.", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                                            new Alert ("", ErrorCode.UnableToBindGateway, Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                                        });
                                    }
                                    //******************住宅ID int类型*************
                                    //bool enable = backBytes [32] == 0 ? false : true;
                                    //int bingResideceId = 0;
                                    ////返回住宅ID 转为string类型
                                    //string backIDStr = CommonPage.MyEncodingGB2312.GetString (backBytes, 0, 32).Trim ('\0');
                                    //bingResideceId = Utlis.StringToInt (backIDStr);
                                    //if (true ||  bingResideceId == UserConfig.Instance.CurrentRegion.RegionID || bingResideceId == 0) {
                                    //    goNext = true;
                                    //} else {
                                    //    //#if DEBUG
                                    //    //                                    Control.ControlBytesSendHasReturn (Command.Write_APP_Data_STORE_1D5E_CMD, common.SubnetID, common.DeviceID, new byte [] { 0, 0, 0, 0 });
                                    //    //#endif
                                    //    Application.RunOnMainThread (() => {
                                    //        new Alert ("", "This gateway has been bound to a residence, please reset it before binding to another residence.", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                                    //    });
                                    //}
                                } else {
                                    Application.RunOnMainThread (() => {
                                        new Alert ("", ErrorCode.GatewayVersionLow, Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                                    });
                                    //goNext = true;
                                }
                            } else {
                                goNext = true;
                            }
                            goNext = CheckIfGoNext (common);
                        } catch (Exception ex) {
                            Console.WriteLine (ex.Message);
                            Utlis.WriteLine (ex.Message);
                        } finally {
                            Application.RunOnMainThread (() => {
                                MainPage.Loading.Hide ();
@@ -363,18 +313,20 @@
                                    CommonPage.FindGatewayChilrenIPAddress = common.IPAddress;
                                    inThisView = false;
                                    if (inView != null) {
                                        Console.WriteLine ("inView != null");
                                        Utlis.WriteLine ("inView != null");
                                        var deviceListView = new GuideSettingGateway (common);
                                        (inView.Parent as PageLayout).AddChidren (deviceListView);
                                        deviceListView.ShowPage ();
                                        (inView.Parent as PageLayout).PageIndex = (inView.Parent as PageLayout).ChildrenCount - 1;
                                    } else {
                                        Console.WriteLine ("inView == null");
                                        Utlis.WriteLine ("inView == null");
                                        UserHomePage.FrameLayoutMain.AddChidren (UserMiddle.guidePageView);
                                        var guide = new GuideAddResidence ();
                                        UserMiddle.guidePageView.AddChidren (guide);
                                        guide.ShowHomeList ();
                                        guide.ShowHomeView ();
                                        UserMiddle.guidePageView.PageIndex = 0;
                                        //重置为加密模式
                                        UserConfig.Instance.IsLocalEncrypt = true;
                                    }
                                }
                            });
@@ -394,12 +346,16 @@
        static bool inThisView = false;
        Alert checkInternetAlert = new Alert ("", "Your phone in not connected to WIFI network, please connet", "Close", "Search again");
        Alert confirmAlert = new Alert ("", "Please make sure gateway is powered up and comect to WiFi router.", "Close", "Search again");
        Alert confirmAlert1 = new Alert ("", "If not all the gateways are in the list,you can search again.", "Close", "Search again");
        //Alert checkInternetAlert = new Alert ("", "Your phone in not connected to WIFI network, please connet", "Close", "Search again");
        //Alert confirmAlert = new Alert ("", "Please make sure gateway is powered up and comect to WiFi router.", "Close", "Search again");
        //Alert confirmAlert1 = new Alert ("", "If not all the gateways are in the list,you can search again.", "Close", "Search again");
        //Alert wrongPasswordAlert = new Alert ("", ErrorCode.GatewayPasswordError, "Close", "Search again");
        void SearchGatewayList ()
        {
            if (UserConfig.Instance.internetStatus == 0 || UserConfig.Instance.internetStatus == 1) {
                Alert checkInternetAlert = new Alert ("", ErrorCode.NotConnectedToWIFI, "Close", "Search again");
                checkInternetAlert.Show ();
                checkInternetAlert.ResultEventHandler += (dsss, eee) => {
@@ -417,13 +373,17 @@
                        MainPage.Loading.Start ("Searching for gateway...");
                    });
                    #region 搜索设备
                    ////2020-01-14 默认明文开始搜索
                    UserConfig.Instance.IsLocalEncrypt = false;
                    UserConfig.Instance.EncryptedPasswordCorrect = true;
                    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;
                    int readCount = 3;
                    while (0 < readCount) {
                        readCount--;
                        System.IO.MemoryStream ms = new System.IO.MemoryStream ();
@@ -444,7 +404,7 @@
                        }
                        Control control = new Control ();
                        Console.WriteLine ("组播搜索网关,搜索地址是:" + CommonPage.EndPoint.ToString () + "    " + CommonPage.GateWayList.Count);
                        Utlis.WriteLine ("组播搜索网关,搜索地址是:" + CommonPage.EndPoint.ToString () + "    " + CommonPage.GateWayList.Count);
                        control.Send (new Target () {
                            IPEndPoint = CommonPage.EndPoint,
                            Command = Command.ReadGateway,
@@ -453,7 +413,7 @@
                            AddData = ms.ToArray ()
                        }, SendCount.Zero, false);
                        Console.WriteLine ("广播搜索网关,搜索地址是:" + new Net.NetWiFi ().BroadcastIpAddress.ToString () + "    " + CommonPage.GateWayList.Count);
                        Utlis.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,
@@ -465,7 +425,7 @@
                        System.Threading.Thread.Sleep (800);
                        //如果数量不相等,就重置次数
                        if (tempCount != CommonPage.GateWayList.Count) {
                            readCount = 2;
                            readCount = 3;
                        }
                    }
                    CommonPage.FindGateway = false;
@@ -473,23 +433,21 @@
                    CommonPage.LocalPhoneFindDevice = false;
                    #endregion
                } catch (Exception ex) {
                    Console.WriteLine (ex.ToString ());
                    Utlis.WriteLine (ex.ToString ());
                } finally {
                    Application.RunOnMainThread (() => {
                        if (CommonPage.GateWayList.Count == 0) {
                            MainPage.Loading.Hide ();
                            if (this != null && this.Parent != null) {
                                confirmAlert.Show ();
                                confirmAlert.ResultEventHandler += (ddf, ddd) => {
                                    MainPage.Loading.Hide ();
                                    if (ddd) {
                                        SearchGatewayList ();
                                    }
                                };
                                ShowConfirmAlert ();
                            }
                        } else {
                            if (this != null && this.Parent != null) {
                                if (inThisView){// this.Parent.GetChildren (this.Parent.ChildrenCount - 1) == this) {
                                if (inThisView) {// this.Parent.GetChildren (this.Parent.ChildrenCount - 1) == this) {
                                    Alert confirmAlert1 = new Alert ("", ErrorCode.IfAllTheGatewaysAreNotInTheList, "Close", "Search again");
                                    confirmAlert1.Show ();
                                    confirmAlert1.ResultEventHandler += (ddf, ddd) => {
                                        MainPage.Loading.Hide ();
@@ -502,7 +460,212 @@
                        }
                    });
                }
            }) { IsBackground=true}.Start();
            }) { IsBackground = true }.Start ();
        }
        /// <summary>
        /// 提示
        /// Please make sure gateway is powered up and comect to WiFi router.
        /// 或者
        ///
        /// </summary>
        static void ShowConfirmAlert () {
            if (UserConfig.Instance.IsLocalEncrypt) {
                //密码检验正确
                if (UserConfig.Instance.EncryptedPasswordCorrect) {
                    Alert confirmAlert = new Alert ("", ErrorCode.MakeSureGatewayIsPoweredUp, "Close", "Search again");
                    confirmAlert.Show ();
                    confirmAlert.ResultEventHandler += (ddf, ddd) => {
                        MainPage.Loading.Hide ();
                        if (ddd) {
                            inView.SearchGatewayList ();
                        }
                    };
                } else {
                    Alert wrongPasswordAlert = new Alert ("", ErrorCode.GatewayPasswordError, "Close", "Search again");
                    wrongPasswordAlert.Show ();
                    wrongPasswordAlert.ResultEventHandler += (ddf, ddd) => {
                        MainPage.Loading.Hide ();
                        if (ddd) {
                            inView.SearchGatewayList ();
                        }
                    };
                }
            } else {
                Alert confirmAlert = new Alert ("", ErrorCode.MakeSureGatewayIsPoweredUp, "Close", "Search again");
                confirmAlert.Show ();
                confirmAlert.ResultEventHandler += (ddf, ddd) => {
                    MainPage.Loading.Hide ();
                    if (ddd) {
                        inView.SearchGatewayList ();
                    }
                };
            }
        }
        //static byte [] AseKeyBytes;
        /// <summary>
        /// 修改网关本地加密
        /// </summary>
        /// <param name="gatewayDeicve"></param>
        /// <param name="isEncrypt"></param>
        /// <returns></returns>
        static bool SetGateWayLocalEncryption (GatewayBase gatewayDeicve, bool isEncrypt = true)
        {
            if (UserConfig.Instance.CurrentRegion == null) return false;
            byte [] AseKeyBytes = UserConfig.Instance.GenerateLocalEncryptionKey ();
            byte [] sendBytes = new byte [17];
            sendBytes [0] = isEncrypt ? (byte)1 : (byte)0; //0:不加密 1:加密
            Array.Copy (AseKeyBytes, 0, sendBytes, 1, 16);
            byte [] backBytes = Control.ControlBytesSendHasReturn (Command.SetGateWayLocalEncryption, gatewayDeicve.SubnetID, gatewayDeicve.DeviceID, sendBytes);
            return CheckIsSuccessfulWithBytes (backBytes);
        }
        /// <summary>
        /// 判断是否修复成功 F8 = 成功; F5=失败
        /// </summary>
        /// <param name="backBytes"></param>
        /// <returns></returns>
        static bool CheckIsSuccessfulWithBytes (byte [] backBytes, string errorStr = "Modify gateway configuration failed,please try again!")
        {
            if (backBytes == null) {
                Application.RunOnMainThread (() => {
                    new Alert ("", ErrorCode.GatewayNoResponse,
                               Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                });
                return false;
            } else if (backBytes [0] == 0xF8) {//F8 = 成功; F5=失败
                return true;
            } else {
                Application.RunOnMainThread (() => {
                    new Alert ("", errorStr,
                               Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                });
                return false;
            }
        }
        /// <summary>
        /// CheckIfGoNext
        /// </summary>
        /// <returns></returns>
        static bool CheckIfGoNext (GatewayBase common)
        {
            bool goNext = false;
            if (common.Type == DeviceType.OnePortWirelessFR || common.Type == DeviceType.OnePortMqttFR) {
                goNext = CheckIfGoNextMqttGateway (common);
            } else {
                goNext = true;
            }
            return goNext;
        }
        /// <summary>
        /// CheckIfGoNextMqttGateway
        /// </summary>
        /// <returns></returns>
        static bool CheckIfGoNextMqttGateway (GatewayBase common)
        {
            Application.RunOnMainThread (() => {
                MainPage.Loading.Start ("Please wait...");
            });
            bool goNext = false;
            //if (!UserConfig.Instance.IsLocalEncrypt) {
            //    //如果没加密,走修改加密方法
            //    var result = SetGateWayLocalEncryption (common);
            //    if (!result) {
            //        MainPage.LoadingHide ();
            //        return result;//修改失败 返回goNext false
            //    }
            //    //修改成功,设置本地为加密方式
            //    UserConfig.Instance.IsLocalEncrypt = true;
            //    //string aseKeyStr = CommonPage.MyEncodingUTF8.GetString (AseKeyBytes);
            //    //UserConfig.Instance.LocalEncryptKey = aseKeyStr;
            //    Utlis.WriteLine ($"============>LocalEncryptKey 加密成功Key为:{UserConfig.Instance.LocalEncryptKey}");
            //}
            var backBytes = Control.ControlBytesSendHasReturn (Command.Read_APP_Data_STORE_1D5C_CMD, common.SubnetID, common.DeviceID, new byte [] { });
            if (backBytes == null) {
                Application.RunOnMainThread (() => {
                    new Alert ("", "No response from gateway. Please make sure the gateway is online and its firmware is up to date.", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                });
            }
            if (backBytes.Length >= 37) {
                //******************住宅ID string类型*************
                bool enable = backBytes [0] == 0 ? false : true;
                //返回住宅ID 转为string类型
                string backIDStr = CommonPage.MyEncodingGB2312.GetString (backBytes, 1, 36).Trim ('\0');
                backIDStr = backIDStr.Replace ("ÿ", "");
                //2020-01-12
                backIDStr = backIDStr.Replace ("\0", "");
                if (enable || backIDStr == UserConfig.Instance.CurrentRegion.Id || string.IsNullOrEmpty (backIDStr)) {
                    if (!UserConfig.Instance.IsLocalEncrypt) {
                        //如果没加密,走修改加密方法
                        var result = SetGateWayLocalEncryption (common);
                        if (!result) {
                            Application.RunOnMainThread (() => {
                                MainPage.Loading.Hide ();
                                new Alert ("", "Encryption gateway failed, please try again.", Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                            });
                            return result;//修改失败 返回goNext false
                        }
                        //修改成功,设置本地为加密方式
                        UserConfig.Instance.IsLocalEncrypt = true;
                        //Utlis.WriteLine ($"============>LocalEncryptKey 加密成功Key为:{UserConfig.Instance.LocalEncryptKey}");
                    }
                    goNext = true;
                } else {
                    UnableToBindGatewayAlertShow ();
                }
            } else {
                Application.RunOnMainThread (() => {
                    new Alert ("", ErrorCode.GatewayVersionLow, Language.StringByID (R.MyInternationalizationString.Close)).Show ();
                });
            }
            MainPage.LoadingHide ();
            return goNext;
        }
        static void UnableToBindGatewayAlertShow ()
        {
            if (inView == null)
                return;
            Application.RunOnMainThread (() => {
                //if (this != null && this.Parent != null) {
                var alter = new Alert ("", ErrorCode.UnableToBindGateway, Language.StringByID (R.MyInternationalizationString.Close));
                alter.ResultEventHandler += (sender1, e1) => {
                    if (e1) {
                        if (inView == null)
                            return;
                        //重置为加密模式
                        UserConfig.Instance.IsLocalEncrypt = true;
                        (inView.Parent as PageLayout).PageIndex -= 1;
                    }
                };
                alter.Show ();
                //}
            });
        }
    }
}