From f500e14c0a994487070380c50c85e0929cbc8e63 Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期二, 05 一月 2021 10:48:04 +0800
Subject: [PATCH] 2021-01-05 1.更新

---
 Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs | 1079 ++++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 736 insertions(+), 343 deletions(-)

diff --git a/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs b/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
index 41c2b3f..18c142a 100644
--- a/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
+++ b/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -17,9 +17,16 @@
 {
     public static class MqttCommon
     {
+        /// <summary>
+        /// 鏄惁鎻愮ず 杩滅▼杩炴帴鐨勯敊璇俊鎭� 
+        /// </summary>
+        public static bool IfDEBUG = false;
+
         static string mqttEncryptKey = "";
         static string checkGatewayTopicBase64 = "";
         static RemoteMACInfo CurRemoteMACInfo = null;
+        static MqttInfo mMqttInfo = null;
+        public static bool IsGatewayOnline = true;
 
         /// <summary>
         /// 鎵嬫満鏍囪瘑
@@ -37,30 +44,151 @@
         /// </summary>
         public static IMqttClient RemoteMqttClient = new MqttFactory ().CreateMqttClient ();
 
-        static bool thisShowTip = true;
-        static string mqttRequestParToken="";
+        //static bool thisShowTip = true;
+        static string mqttRequestParToken = "";
 
-        /// <summary>
-        /// 鏂紑杩滅▼Mqtt鐨勯摼鎺�
+        static MqttCommon ()
+        {
+            InitMqtt ();
+            //InitCheckGateway ();
+        }
+
+        /// <summary>
+        /// 淇濇椿閲嶈繛鍜岄噸璁㈤槄 绾跨▼
         /// </summary>
-        public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
-        {
-            try {
-                if (remoteIsConnected) {
-                    remoteIsConnected = false;
-                    System.Console.WriteLine ($"Remote涓诲姩鏂紑_{s}");
-                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
+        /// <returns></returns>
+        public static async System.Threading.Tasks.Task InitMqtt ()
+        {
+            new System.Threading.Thread (async () => {
+                while (true) {
+                    try {
+                        System.Threading.Thread.Sleep (200);
+                        if (!CommonPage.IsRemote) continue;
+
+                        if (Control.IsEnterBackground) continue;
+
+                        await StartCloudMqtt ();
+                        await CheckingSubscribeTopics ();
+                    } catch { }
+
+                }
+            }) { IsBackground = true }.Start ();
+        }
+
+        public static void InitState ()
+        {
+            IfNeedReadAllDeviceStatus = true;
+            bNeedStartTip = true;
+            IsGatewayOnline = false;
+            StartCloudMqtt ();
+        }
+
+
+        /// <summary>
+        /// 鏄惁璁㈤槄鎴愬姛
+        /// </summary>
+        static bool isSubscribeTopicSuccess = false;
+        /// <summary>
+        /// 妫�鏌ヤ富棰樻槸鍚﹁闃呭け璐�
+        /// </summary>
+        /// <returns></returns>
+        static async Task CheckingSubscribeTopics ()
+        {
+            if (!remoteIsConnected) {
+                return;
+            }
+            try {
+                if (!isSubscribeTopicSuccess) {
+
+
+                    var topicFilterCommon = new TopicFilter () {
+                        Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#",
+                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+                    };
+
+                    //缃戝叧閲嶆柊鐧诲綍涓婚
+                    var topicFilterGateWayInfoChange = new TopicFilter () {
+                        Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyBusGateWayInfoChange",
+                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+                    };
+
+                    //鎸や笅绾夸富棰�
+                    var topicFilterNotifySqueeze = new TopicFilter () {
+                        Topic = $"/BusGateWayToClient/{mMqttInfo.connEmqClientId}/Push/NotifySqueeze",
+                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+                    };
+
+                    //缃戝叧鎺夌嚎涓婚
+                    var topicFilterNotifyGateWayOffline = new TopicFilter () {
+                        Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyGateWayOffline",
+                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+                    };
+
+
+                    var topicFilters = new TopicFilter [] { topicFilterCommon, topicFilterGateWayInfoChange, topicFilterNotifySqueeze, topicFilterNotifyGateWayOffline };
+                    var result = await RemoteMqttClient.SubscribeAsync (topicFilters);
+                    if (result.Items [0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS2) {
+                        isSubscribeTopicSuccess = true;
+                    }
+
+                    ////2020-06-22 閫氱敤涓婚
+                    //var topicFilterMacMark = new TopicFilter () {
+                    //    Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/#",
+                    //    QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+                    //};
+
+                    ////鎸や笅绾夸富棰�
+                    //var topicFilterNotifySqueeze = new TopicFilter () {
+                    //    Topic = $"/BusGateWayToClient/{mMqttInfo.connEmqClientId}/Push/NotifySqueeze",
+                    //    QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+                    //};
+
+                    //var topicFilters = new TopicFilter [] { topicFilterMacMark, topicFilterNotifySqueeze };
+                    //var result = await RemoteMqttClient.SubscribeAsync (topicFilters);
+                    //if (result.Items [0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS2) {
+                    //    isSubscribeTopicSuccess = true;
+                    //}
+                }
+            } catch (Exception ex) {
+
+              
+            }
+        }
+
+
+        /// <summary>
+        /// 鏂紑杩滅▼Mqtt鐨勯摼鎺�
+        /// </summary>
+        public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
+        {
+            try {
+                if (remoteIsConnected) {
+                    remoteIsConnected = false;
+                    Utlis.WriteLine ($"============>MqttRemote涓诲姩鏂紑_{s}");
+                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
                     await RemoteMqttClient.DisconnectAsync ();
-                }
+                    if (CommonPage.IsRemote) {
+                        Utlis.ShowAppLinkStatus (AppLinkStatus.CloudUnlink);
+                    }
+                    //Utlis.WriteLine ($"============>MqttRemoteDisConnectRemoteMqttClient");
+
+                }
             } catch (Exception e) {
-                System.Console.WriteLine ($"Remote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}");
-            }
+                Utlis.WriteLine ($"============>MqttRemote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}");
+            }
         }
         static DateTime dateTime = DateTime.MinValue;
+
+        /// <summary>
+        /// 鎺ㄩ�佹爣璇�
+        /// </summary>
+        static string PushSignStr = System.DateTime.Now.Ticks.ToString ();
+
+
         /// <summary>
         /// 澶栫綉鐨凪QTT鏄惁姝e湪杩炴帴
         /// </summary>
-        static bool remoteMqttIsConnecting;
+        public static bool remoteMqttIsConnecting;
         static bool remoteIsConnected;
         /// <summary>
         /// 鍚姩杩滅▼Mqtt
@@ -68,263 +196,331 @@
         public static async System.Threading.Tasks.Task StartCloudMqtt ()
         {
 
-                Application.RunOnMainThread (() => {
-                    if (5 < (DateTime.Now - dateTime).TotalSeconds) {
-                        return;
-                    }
-                    //MainPage.Loading.Start (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Connecting));
-                    dateTime = DateTime.Now;
-                });
-                if (!MainPage.LoginUser.IsLogin) {
-                    return;
-                }
-                //杩藉姞锛氭病鏈夎繙绋嬭繛鎺ョ殑鏉冮檺
-                if (remoteMqttIsConnecting
-                   || remoteIsConnected) {
-                    return;
-                }
+            if (!MainPage.LoginUser.IsLogin) {
+                return;
+            }
+            //杩藉姞锛氭病鏈夎繙绋嬭繛鎺ョ殑鏉冮檺
+            if (remoteMqttIsConnecting || remoteIsConnected) {
+                return;
+            }
 
-                await System.Threading.Tasks.Task.Factory.StartNew (async () =>
-                {
-                    try {
-                        lock (RemoteMqttClient) {
-                            //琛ㄧず鍚庨潰灏嗚繘琛岃繛鎺�
-                            remoteMqttIsConnecting = true;
+            remoteMqttIsConnecting = true;
+            await System.Threading.Tasks.Task.Factory.StartNew (async () => {
+                try {
+                    //lock (RemoteMqttClient) {
+                    //琛ㄧず鍚庨潰灏嗚繘琛岃繛鎺�
 
-                            #region 鍒濆鍖栬繙绋婱qtt
-                            //(3)褰揫杩炴帴浜戠鐨凪qtt鎴愬姛鍚嶿鎴栬�匸浠ュ強鍚庨潰App閫氳繃浜戠Mqtt杞彂鏁版嵁缁欑綉鍏虫垚鍔熷悗],澶勭悊鎺ユ敹鍒颁簯绔暟鎹寘鍝嶅簲鏃跺湪mqttServerClient_ApplicationMessageReceived杩欎釜鏂规硶澶勭悊
-                            if (RemoteMqttClient.ApplicationMessageReceivedHandler == null) {
-                                RemoteMqttClient.UseApplicationMessageReceivedHandler ((e) => {
-                                    try {
-                                        if (!RemoteMqttClient.IsConnected || !CommonPage.IsRemote) {
-                                            return;
-                                        }
-                                        var aesDecryptTopic = e.ApplicationMessage.Topic;
-                                        var aesDecryptPayload = e.ApplicationMessage.Payload;
-                                        //Console.WriteLine ("Topic={0}", aesDecryptTopic);
+                    #region 鍒濆鍖栬繙绋婱qtt
+                    //2020-06-22 澧炲姞
+                    RemoteMqttClient = new MqttFactory ().CreateMqttClient ();
 
-                                        if (aesDecryptTopic == $"NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}") {//缃戝叧涓婄嚎锛岄渶瑕佹洿鏂癮eskey
-                                                                                                                                 //----绗簩姝ワ細璇诲彇璐﹀彿涓嬮潰鐨勭綉鍏冲垪琛�
-                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/Center/Center/GetGatewayPagger"; //App銆丅uspro杞欢鐧诲綍鍚庤幏鍙栫綉鍏冲垪琛� http 璇锋眰
-                                            var gatewayListRequestPar = new RemoteRequestParameters () { Mac = CurRemoteMACInfo.mac, LoginAccessToken = mqttRequestParToken, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
-                                            var gatewayListRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (gatewayListRequestPar), false, false, gatewayListUrl);
-                                            var gatewayListRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
-                                            if (gatewayListRequestResult_Obj != null && gatewayListRequestResult_Obj.pageData.Count > 0) {
-                                                CurRemoteMACInfo.aesKey = gatewayListRequestResult_Obj.pageData [0].aesKey;
-                                                mqttEncryptKey = CurRemoteMACInfo.aesKey;
-                                            }
-                                        }
-
-                                        if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/CheckGateway") {
-                                            // = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON";
-                                            var ss = CommonPage.MyEncodingUTF8.GetString (aesDecryptPayload);
-                                            var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack> (ss);
-                                            if (obj == null) {
-                                                return;
-                                            }
-                                            switch (obj.StateCode) {
-                                            case "HDLUdpDataForwardServerMqttClientNoOnLine":
-                                            case "NoOnline":
-                                            case "NetworkAnomaly"://涓嶅湪绾�
-                                                MainPage.AddTip ("Gateway offline");
-                                                Application.RunOnMainThread (() => {
-                                                    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                                });
-                                                break;
-                                            case "NoRecord"://MAC涓嶆纭�
-                                                MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.MACError));
-                                                Application.RunOnMainThread (() => {
-                                                    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                                });
-                                                break;
-                                            case "Success":
-                                                MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
-                                                break;
-                                            default:
-                                                MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkLoser));
-                                                Application.RunOnMainThread (() => {
-                                                    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                                });
-                                                break;
-                                            }
-                                        } else {
-                                            if (!string.IsNullOrEmpty (mqttEncryptKey)) {
-                                                aesDecryptTopic = Shared.Securitys.EncryptionService.AesDecryptTopic (e.ApplicationMessage.Topic, mqttEncryptKey);
-                                                aesDecryptPayload = Shared.Securitys.EncryptionService.AesDecryptPayload (e.ApplicationMessage.Payload, mqttEncryptKey);
-                                            } else {
-                                                aesDecryptTopic = e.ApplicationMessage.Topic;
-                                                aesDecryptPayload = e.ApplicationMessage.Payload;
-                                            }
-                                        }
-                                        var packet = new Packet ();
-                                        packet.Bytes = aesDecryptPayload;
-                                        packet.Manager ();
-                                    } catch { }
-                                });
-                            }
-
-                            if (RemoteMqttClient.DisconnectedHandler == null) {
-                                RemoteMqttClient.UseDisconnectedHandler (async (e) => {
-                                    System.Console.WriteLine ($"杩滅▼杩炴帴鏂紑");
-                                    await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
-                                    //await StartRemoteMqtt();
-                                    if (thisShowTip) {
-                                        if (CommonPage.IsRemote) {
-                                            Application.RunOnMainThread (() => {
-                                                MainPage.Loading.Hide ();
-                                                Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                            });
-                                        }
-                                    } else {
-                                        thisShowTip = true;
-                                    }
-                                });
-                            }
-                            if (RemoteMqttClient.ConnectedHandler == null) {
-                                RemoteMqttClient.UseConnectedHandler (async (e) => {
-                                    Shared.Application.RunOnMainThread (() => {
-                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
-                                    });
-                                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
-                                    System.Console.WriteLine ($"杩滅▼杩炴帴鎴愬姛");
-                                    MainPage.WiFiStatus = "CrabtreeAdd/CloudLink.png";
-                                    UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
-                                    if (CurRemoteMACInfo != null) {
-                                        if (CurRemoteMACInfo.isValid == "InValid") {
-                                            MainPage.AddTip ("Remote failed,gateway offline");
-                                            Application.RunOnMainThread (() => {
-                                                MainPage.Loading.Hide ();
-                                                Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                            });
-                                        } else {
-                                            MqttRemoteSend (new byte [] { 0 }, 3);
-                                            //Application.RunOnMainThread (() => {
-                                            //    MainPage.Loading.Hide ();
-                                            //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
-                                            //    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
-                                            //});
-                                            //MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
-                                        }
-                                    }
-
-                                });
-                            }
-                            #endregion
-                        }
-
-                        try {
+                    //(3)褰揫杩炴帴浜戠鐨凪qtt鎴愬姛鍚嶿鎴栬�匸浠ュ強鍚庨潰App閫氳繃浜戠Mqtt杞彂鏁版嵁缁欑綉鍏虫垚鍔熷悗],澶勭悊鎺ユ敹鍒颁簯绔暟鎹寘鍝嶅簲鏃跺湪mqttServerClient_ApplicationMessageReceived杩欎釜鏂规硶澶勭悊
+                    if (RemoteMqttClient.ApplicationMessageReceivedHandler == null) {
+                        RemoteMqttClient.UseApplicationMessageReceivedHandler (async (e) => {
                             try {
-                                //鏂紑鍚庨噸鏂伴摼鎺ラ渶瑕侀噸鏂扮櫥褰曡幏鍙栬繛鎺ョ殑瀵嗙爜
-                                var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password, Company = MainPage.SoftSmsType };
-                                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
-                                var tempResult = MainPage.RequestHttps ("Login", requestJson, false);
-                                if (tempResult == null) {
-                                    Application.RunOnMainThread (() => {
-                                        MainPage.Loading.Hide ();
-                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                    });
+                                if (!RemoteMqttClient.IsConnected || !CommonPage.IsRemote) {
                                     return;
                                 }
-                                var responsePack = tempResult.ResponseData;
-                                var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (tempResult.ResponseData.ToString ());
-                                var mqttRequestPar = Newtonsoft.Json.JsonConvert.DeserializeObject<UserLoginRes> (tempResult.ResponseData.ToString ());
-                                mqttRequestParToken = mqttRequestPar.Token;
-                                //杩樻湁绉嶆儏鍐垫槸鍚屼竴涓狪D 鏈夊涓澶囩敤杩欎釜id杩炴帴锛堜細瀵艰嚧涓柇锛�
-                                //mqttEncryptKey = dictrionaryResult ["HdlOnMqttKey"]?.ToString ();
-                                var url = dictrionaryResult ["ConnectMqttBrokerLoadSubDomain"]?.ToString ();
-                                var clientId = dictrionaryResult ["ConnectMqttClientId"]?.ToString ();
-                                var username = dictrionaryResult ["ConnectMqttBrokerUserName"]?.ToString ();
-                                var passwordRemote = dictrionaryResult ["ConnectMqttBrokerPwd"]?.ToString ();
+                                var aesDecryptTopic = e.ApplicationMessage.Topic;
+                                var aesDecryptPayload = e.ApplicationMessage.Payload;
+                                //Utlis.WriteLine ("Topic={0}", aesDecryptTopic);
 
-                                if (clientId == null || username == null || passwordRemote == null) {
-                                    return;
+                                //if (aesDecryptTopic == $"NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}") {//缃戝叧涓婄嚎锛岄渶瑕佹洿鏂癮eskey
+                                //2020-01-11 淇敼璁㈤槄涓婚鍦板潃
+                                if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyBusGateWayInfoChange") {//缃戝叧涓婄嚎锛岄渶瑕佹洿鏂癮eskey                                                                                                                     //----绗簩姝ワ細璇诲彇璐﹀彿涓嬮潰鐨勭綉鍏冲垪琛�
+                                    await ReceiveNotifyBusGateWayInfoChange ();
+                                } else if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyGateWayOffline") {//缃戝叧鎺夌嚎                                                                                                                    //----绗簩姝ワ細璇诲彇璐﹀彿涓嬮潰鐨勭綉鍏冲垪琛�
+                                    ReceiveNotifyGateWayOffline ();
+                                } else if (aesDecryptTopic == $"/BusGateWayToClient/{mMqttInfo.connEmqClientId}/Push/NotifySqueeze") {//璁㈤槄鎸や笅绾块棶棰�
+                                    await ReceiveNotifySqueezeAsync (aesDecryptPayload);
+                                } else if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/CheckGateway") {
+                                    ReceiveCheckGatewayTopic ();
+                                } else {
+                                    SetGatewayOnlineResetCheck ();
+
+                                    if (!string.IsNullOrEmpty (mqttEncryptKey)) {
+                                        aesDecryptPayload = Shared.Securitys.EncryptionService.AesDecryptPayload (e.ApplicationMessage.Payload, mqttEncryptKey);
+                                    }
+
+                                    var packet = new Packet ();
+                                    packet.IsLocal = false;
+                                    packet.Bytes = aesDecryptPayload;
+                                    packet.Manager ();
+
                                 }
 
-                                var requestObj3 = new GatewayByRegionListObj () { RegionID = UserConfig.Instance.CurrentRegion.RegionID };
-                                var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj3);
-                                var revertObj3 = MainPage.RequestHttps ("GatewayByRegionList", requestJson3, true, false);
-                                if (revertObj3.StateCode == "SUCCESS") {
-                                    var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GatewayRes>> (revertObj3.ResponseData.ToString ());
-                                    var gatewayList = responseDataObj;
-                                    if (gatewayList != null && gatewayList.Count > 0) {
-                                        UserConfig.Instance.CurrentRegion.MAC = gatewayList [0].MAC;
-                                        UserConfig.Instance.SaveUserConfig ();
-                                        Console.WriteLine ("Remote mqtt get Region MAC : " + gatewayList [0].MAC);
+                            } catch { }
+                        });
+                    }
+
+                    if (RemoteMqttClient.DisconnectedHandler == null) {
+                        RemoteMqttClient.UseDisconnectedHandler (async (e) => {
+                            Utlis.WriteLine ($"============>Mqtt杩滅▼杩炴帴鏂紑");
+                            isSubscribeTopicSuccess = false;
+                            await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
+                        });
+                    }
+                    if (RemoteMqttClient.ConnectedHandler == null) {
+                        RemoteMqttClient.UseConnectedHandler (async (e) => {
+                            //IfNeedReadAllDeviceStatus = true;
+                            mCheckGatewayTime = DateTime.Now;
+                            CheckGatewayCount = 0;
+                            bNeedStartTip = true;
+
+                            Utlis.WriteLine ($"============>Mqtt杩滅▼杩炴帴鎴愬姛");
+                            if (CommonPage.IsRemote) {
+                                Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
+                            }
+
+                            if (CurRemoteMACInfo != null) {
+                                IsGatewayOnline = CurRemoteMACInfo.isValid != "InValid";
+                                if (!IsGatewayOnline) {
+                                    //缃戝叧涓嶅湪绾�
+                                    if (CommonPage.IsRemote) {
+                                        Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
+                                    }
+                                    MainPage.AddTip ("Remote failed,gateway offline");
+                                } else {
+                                    //Remote Connection Succeeded
+                                    //缃戝叧鍦ㄧ嚎
+                                    //閲嶆柊涓�娆℃墍鏈夎澶囩姸鎬�
+                                    IfNeedReadAllDeviceStatus = false;
+                                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
+                                    //
+                                    MqttRemoteSend (new byte [] { 0 }, 3);
+
+                                    if (CommonPage.IsRemote) {
+                                        MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
                                     }
                                 }
-
-                                if (tempResult == null) {
-                                    Application.RunOnMainThread (() => {
-                                        MainPage.Loading.Hide ();
-                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                    });
-                                    return;
-                                }
-                                //--绗竴姝ワ細鑾峰彇mqtt閾炬帴鍙傛暟
-                                var mqttInfoUrl = @"https://developer.hdlcontrol.com/Center/Center/GetConnMqttInfo";//鑾峰彇杩炴帴杩滅▼浜戠Emq Mqtt 鏈嶅姟鍣ㄨ繛鎺ヤ俊鎭�
-                                var mqttInfoRequestPar = new RemoteRequestParameters () { LoginAccessToken = mqttRequestParToken, RequestVersion = MainPage.CodeIDString, RequestProtocolType = 0, RequestSource = 1 };
-                                var mqttInfoRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar), false, false, mqttInfoUrl);
-
-                                if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
-                                    try {
-                                        var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
-                                        if (mqttInfoRequestResult_Obj != null) {
-                                            url = mqttInfoRequestResult_Obj.connEmqDomainPort;
-                                            clientId = mqttInfoRequestResult_Obj.connEmqClientId;
-                                            username = mqttInfoRequestResult_Obj.connEmqUserName;
-                                            passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd;
-                                            //----绗簩姝ワ細璇诲彇璐﹀彿涓嬮潰鐨勭綉鍏冲垪琛�
-                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/Center/Center/GetGatewayPagger"; //App銆丅uspro杞欢鐧诲綍鍚庤幏鍙栫綉鍏冲垪琛� http 璇锋眰
-                                            var gatewayListRequestPar = new RemoteRequestParameters () { LoginAccessToken = mqttRequestParToken, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
-                                            var gatewayListRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (gatewayListRequestPar), false, false, gatewayListUrl);
-                                            var gatewayListRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
-                                            //--鎵惧嚭鏄惁瀛樺湪鍖归厤褰撳墠浣忓畢鐨刴ac锛屽瓨鍦ㄥ啀杩涜杩滅▼銆�
-                                            CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.MAC);
-                                            if (CurRemoteMACInfo != null) {
-                                                CurRemoteMACInfo.LoginAccessToken = mqttRequestPar.Token;
-                                                mqttEncryptKey = CurRemoteMACInfo.aesKey;
-                                                var options1 = new MQTTnet.Client.Options.MqttClientOptionsBuilder ()
-                                                                    .WithClientId (clientId)
-                                                                    .WithTcpServer (url.Split (':') [1].Substring ("//".Length), int.Parse (url.Split (':') [2]))
-                                                                    .WithCredentials (username, passwordRemote)
-                                                                    .WithCleanSession ()
-                                                                    .WithCommunicationTimeout (new TimeSpan (0, 0, 20))
-                                                                    .Build ();
-
-                                                await DisConnectRemoteMqttClient ("StartRemoteMqtt");
-                                                await RemoteMqttClient.ConnectAsync (options1);
-                                                remoteIsConnected = true;
-                                                await MqttRemoteSend (new byte [] { 0 }, 1);
-                                                await MqttRemoteSend (new byte [] { 0 }, 2);
-                                            }
-                                        }
-                                    } catch { }
-                                }
-                            } catch (Exception ex) {
-                                System.Console.WriteLine ("============>" + ex.Message);
-                                Application.RunOnMainThread (() => {
-                                    //MainPage.Loading.Hide ();
-                                    //isConnecting = false.ToString ();
-
-                                    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-#if DEBUG
-                                Alert a = new Alert (remoteMqttIsConnecting.ToString (), ex.Message, "Close");
-                                a.Show ();
-#endif
-                                });
-                            } finally {
-                                Application.RunOnMainThread (() => {
-                                    MainPage.Loading.Hide ();
-                                });
                             }
-                        } catch { } finally {
-                            //鏈�缁堣閲婃斁杩炴帴鐘舵��
-                            remoteMqttIsConnecting = false;
-                        }
-                    } catch (Exception ex) {
-                        System.Console.WriteLine ($"杩滅▼杩炴帴閫氳杩炴帴鍑哄紓甯�:{ex.Message}");
+                        });
                     }
-                });
+                    #endregion
+                    //}
+                    //鎻愮ず姝e湪鑾峰彇杩炴帴鍙傛暟..."
+                    ShowStartTip ();
+                    mqttRequestParToken = MainPage.LoginUser.LoginTokenString;
+                    //--鍒ゆ柇鏄綋鍓嶆槸鍚﹀垎浜殑浣忓畢
+                    if (!UserConfig.Instance.CurrentRegion.IsOthreShare) {
+                        //涓昏处鍙疯幏鍙朚QTT 杩滅▼閾炬帴淇℃伅锛屽苟杩炴帴
+                        await GetMqttInfoAndMQTTConnectAsync ();
+                    } else {
+                        //濡傛灉鏄垎浜繃鏉ョ殑浣忓畢 璧颁笅闈㈡祦绋�
+                        await GetShareMqttInfoAndMQTTConnectAsync ();
+                    }
+
+                } catch (Exception ex) {
+                    //Utlis.WriteLine ($"============>Mqtt 杩滅▼杩炴帴閫氳杩炴帴鍑哄紓甯�:{ex.Message}");
+
+                    MainPage.LoadingTipShow ("Connect error, trying to reconnect.");
+
+                    if (IfDEBUG) {
+                        MainPage.ShowAlertOnMainThread ("error: " + ex.Message);
+                    }
+
+                } finally {
+                    //鏈�缁堣閲婃斁杩炴帴鐘舵��
+                    remoteMqttIsConnecting = false;
+
+                    MainPage.LoadingTipHide ();
+
+                    //MainPage.LoadingHide ();
+                }
+            });
+        }
+
+        /// <summary>
+        /// 涓昏处鍙疯幏鍙朚QTT 杩滅▼閾炬帴淇℃伅锛屽苟杩炴帴
+        /// </summary>
+        /// <returns></returns>
+        static async Task GetMqttInfoAndMQTTConnectAsync ()
+        {
+            var mqttInfoRequestPar = new GetConnMqttInfoObj () {
+                LoginAccessToken = MainPage.LoginUser.LoginTokenString,
+                PlatformStr = "L1",
+                PublishPayloadJsonStr = PushSignStr,
+                Mac = UserConfig.Instance.GatewayMAC,
+            };
+            //----绗竴姝ワ細鑾峰彇mqtt閾炬帴鍙傛暟
+            var mqttInfoRequestResult = MainPage.RequestHttps (API.GetConnMqttInfo, Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar));
+
+            if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
+                try {
+                    var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
+
+                    if (mqttInfoRequestResult_Obj != null) {
+                        mMqttInfo = mqttInfoRequestResult_Obj;
+                        string url = mqttInfoRequestResult_Obj.connEmqDomainPort;
+                        string clientId = mqttInfoRequestResult_Obj.connEmqClientId;
+                        string username = mqttInfoRequestResult_Obj.connEmqUserName;
+                        string passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd;
+                        if (mqttInfoRequestResult_Obj.AccountAllGateways != null && mqttInfoRequestResult_Obj.AccountAllGateways.Count > 0) {
+                            //----绗簩姝ユ壘鍑烘槸鍚﹀瓨鍦ㄥ尮閰嶅綋鍓嶄綇瀹呯殑mac锛屽瓨鍦ㄥ啀杩涜杩滅▼銆�
+                            CurRemoteMACInfo = mqttInfoRequestResult_Obj.AccountAllGateways.Find ((obj) => obj.mac == UserConfig.Instance.GatewayMAC);
+                            if (CurRemoteMACInfo != null) {
+                                CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
+                                CurRemoteMACInfo.clientId = clientId;
+                                //----绗笁姝� 寮�濮嬭繛鎺�
+                                await MQTTConnectAsync ();
+                            } else {
+                                //Utlis.WriteLine ("============>Mqtt CurRemoteMACInfo null");
+
+                                MainPage.LoadingTipShow ("Please wait, failed to get gateway parameters.");
+                            }
+                        }
+
+                    } else {
+                        //Utlis.WriteLine ("============>Mqtt mqttInfoRequestResult_Obj null");
+
+                        MainPage.LoadingTipShow ("Please wait, failed to get user parameters.");
+                        //MainPage.LoadingTipShow ("Please wait, failed to get parameters.");
+                    }
+                } catch {
+
+                }
+            } else {
+                //Utlis.WriteLine ("============>Mqtt GetInfo 澶辫触");
+                MainPage.AddTip ("Please wait, failed to get parameters.");
+                //MainPage.LoadingTipShow ("Please wait, failed to get parameters.");
+            }
+
+        }
+
+        /// <summary>
+        /// 瀛愯处鍙疯幏鍙朚QTT 杩滅▼閾炬帴淇℃伅锛屽苟杩炴帴
+        /// </summary>
+        /// <returns></returns>
+        static async Task GetShareMqttInfoAndMQTTConnectAsync ()
+        {
+            var mqttInfoRequestPar = new ShareMemberConnMqttInfoObj () {
+                LoginAccessToken = mqttRequestParToken,
+                PlatformStr = "L1",
+                PublishPayloadJsonStr = PushSignStr,
+                MainUserDistributedMark = UserConfig.Instance.CurrentRegion.MainUserDistributedMark,
+                HomeId = UserConfig.Instance.CurrentRegion.Id
+            };
+            var mqttInfoRequestResult = MainPage.RequestHttps (API.ShareMemberConnMqttInfo, Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar));
+            //--绗竴姝ワ細鑾峰彇mqtt閾炬帴鍙傛暟
+            if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
+                var mqttInfoRequestResult_info = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
+                if (mqttInfoRequestResult_info != null) {
+                    mMqttInfo = mqttInfoRequestResult_info;
+                    //--绗簩姝ワ細鑾峰彇褰撳墠浣忓垎浜畢缃戝叧淇℃伅骞惰繛鎺QTT
+                    await GetSingleHomeGatewayPaggerAndMQTTConnectAsync ();
+                } else {
+                    MainPage.LoadingTipShow ("Please wait, failed to get user parameters.");
+                }
+            }
+        }
+
+        /// <summary>
+        /// 杩炴帴MQTT
+        /// </summary>
+        static async Task MQTTConnectAsync ()
+        {
+            if (CurRemoteMACInfo != null && mMqttInfo != null) {
+
+             
+                //鑾峰彇鍙傛暟鎴愬姛锛屽紑濮嬭繛鎺�...
+                //MainPage.AddTip ("Successfully obtained parameters, starting to connect...");
+
+                MainPage.LoadingTipShow ("Please wait, connecting remotely...");
+
+                //try {
+                //    var url = mMqttInfo.connEmqDomainPort;
+                //    var clientId = mMqttInfo.connEmqClientId;
+                //    var username = mMqttInfo.connEmqUserName;
+                //    var passwordRemote = mMqttInfo.connEmqPwd;
+                //    CurRemoteMACInfo.clientId = clientId;
+                //    CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
+                //    mqttEncryptKey = CurRemoteMACInfo.isNewBusproGateway ? CurRemoteMACInfo.aesKey : "";
+                //    //mqttEncryptKey = CurRemoteMACInfo.aesKey;
+                //    var options1 = new MQTTnet.Client.Options.MqttClientOptionsBuilder ()
+                //                        .WithClientId (clientId)
+                //                        .WithTcpServer (url.Split (':') [1].Substring ("//".Length), int.Parse (url.Split (':') [2]))
+                //                        .WithCredentials (username, passwordRemote)
+                //                        .WithCleanSession ()
+                //                        // .WithCommunicationTimeout (new TimeSpan (0, 0, 20))
+                //                        .Build ();
+
+                //    await DisConnectRemoteMqttClient ("StartRemoteMqtt");
+                //    await RemoteMqttClient.ConnectAsync (options1);
+                //    remoteIsConnected = true;
+                //    IsDisConnectingWithSendCatch = false;
+                //} catch (Exception ex) {
+                //    Console.WriteLine ("Connect error: " + ex.Message);
+                //}
+
+                //string mes = "";
+                try {
+
+                    var url = mMqttInfo.connEmqDomainPort;
+                    var clientId = mMqttInfo.connEmqClientId;
+                    var username = mMqttInfo.connEmqUserName;
+                    var passwordRemote = mMqttInfo.connEmqPwd;
+
+                    //mes = "step1.Set Data";
+                    CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
+                    mqttEncryptKey = CurRemoteMACInfo.aesKey;
+                    var options1 = new MQTTnet.Client.Options.MqttClientOptionsBuilder ()
+                                        .WithClientId (clientId)
+                                        .WithTcpServer (url.Split (':') [1].Substring ("//".Length), int.Parse (url.Split (':') [2]))
+                                        .WithCredentials (username, passwordRemote)
+                                        .WithCleanSession ()
+                                        // .WithCommunicationTimeout (new TimeSpan (0, 0, 20))
+                                        .Build ();
+
+                    //mes = "step2.DisConnect";
+                    await DisConnectRemoteMqttClient ("StartRemoteMqtt");
+                    //MainPage.AddTip ("Start to connect...");
+                    //mes = "step3.Start to connect";
+                    await RemoteMqttClient.ConnectAsync (options1);
+                    //mes = "step4.Connected Success";
+                    remoteIsConnected = true;
+                    IsDisConnectingWithSendCatch = false;
+
+                    MainPage.LoadingTipShow ("Remote connection succeeded.");
+
+                    //MainPage.AddTip ("Connection succeeded!");
+                    //await MqttRemoteSend (new byte [] { 0 }, 1);
+                    //await MqttRemoteSend (new byte [] { 0 }, 2);
+                    //await MqttRemoteSend (new byte [] { 0 }, 4);
+
+                } catch (Exception ex) {
+                    //mes = ex.Message;
+                    //options1 寮傚父鎻愮ず
+                    //Console.WriteLine ("Connect error: " + ex.Message);
+
+                    MainPage.LoadingTipShow ("Connect error.");
+
+                    if (IfDEBUG) {
+                        MainPage.ShowAlertOnMainThread ("Connect error: " + ex.Message);
+                    }
+                } finally {
+                    //MainPage.ShowAlertOnMainThread ("finally: " + mes);
+                    //MainPage.AddTip ("finally: " + mes);
+                }
+
+            }
+        }
+
+        /// <summary>
+        /// 浠庡紑濮嬪埌杩炴帴鎴愬姛锛屽彧鎻愮ず1娆�
+        /// </summary>
+        static bool bNeedStartTip = true;
+        /// <summary>
+        /// 姝e湪鑾峰彇杩炴帴鍙傛暟...
+        /// </summary>
+        static void ShowStartTip ()
+        {
+            if (bNeedStartTip) {
+                bNeedStartTip = false;
+                if (CommonPage.IsRemote) {
+                    //MainPage.AddTip ("Getting remote connection parameters...");
+                    MainPage.LoadingTipShow ("Please wait, getting connection parameters...");
+                }
+            }
         }
 
         /// <summary>
@@ -336,93 +532,284 @@
         public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
         {
             try {
-                var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/" + UserConfig.Instance.GatewayMAC.Replace (".", "") + @"/" + currentGuid;
+                //if (!remoteIsConnected) {
+                //    Utlis.WriteLine ($"============>Mqtt 鏈繛鎺� 鍙栨秷鍙戦��");
+                //    return;
+                //}
+
+                string topicName;
                 switch (optionType) {
                 case 0:
-                    var messageSend = message;
-                    if (string.IsNullOrEmpty (mqttEncryptKey)) {
-                        topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON";
-                    } else {
-                        topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/NewON";
-                        messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload (message, mqttEncryptKey);
+                    topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/ON";
+                    if (!string.IsNullOrEmpty (mqttEncryptKey)) {
+                        message = Shared.Securitys.EncryptionService.AesEncryptPayload (message, mqttEncryptKey);
                     }
-                    //base64鍔犲瘑
-                    var m = new MqttApplicationMessage { Topic = topicName, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
-                    if (remoteIsConnected) {
-                        try {
-                            await RemoteMqttClient.PublishAsync (m);
-                        } catch (Exception e) {
-                            await DisConnectRemoteMqttClient (e.Message);
-                            await StartCloudMqtt ();
-                            if (remoteIsConnected) {
-                                await RemoteMqttClient.PublishAsync (m);
-                            }
-                        }
-                    }
+                    await RemoteMqttClient.PublishAsync (new MqttApplicationMessage { Topic = topicName, Payload = message, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce });
                     break;
-                case 1:
-                    topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#";
-                    if (remoteIsConnected) {
-                        try {
-                            await RemoteMqttClient.SubscribeAsync (topicName);
-                        } catch (Exception e) {
-                            await DisConnectRemoteMqttClient (e.Message);
-                            await StartCloudMqtt ();
-                            if (remoteIsConnected) {
-                                await RemoteMqttClient.SubscribeAsync (topicName);
-                            }
-                        }
-                    }
-                    break;
-                case 2:
-                    var macStr = CurRemoteMACInfo.mac.ToUpper ();
-                    char [] cArrs = macStr.ToCharArray ();
-                    Array.Reverse (cArrs);
-                    var sss = string.Join (string.Empty, cArrs);
-
-                    using (var provider = new MD5CryptoServiceProvider ()) {
-                        byte [] buffer = provider.ComputeHash (Encoding.Default.GetBytes (sss));
-                        StringBuilder builder = new StringBuilder ();
-                        for (int i = 0; i < buffer.Length; i++) {
-                            builder.Append (buffer [i].ToString ("x2"));
-                        }
-                        CurRemoteMACInfo.md5_mac_string = builder.ToString ().ToUpper ();
-                    }
-
-                    topicName = $"/NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}";
-                    if (remoteIsConnected) {
-                        try {
-                            await RemoteMqttClient.SubscribeAsync (topicName);
-                        } catch (Exception e) {
-                            await DisConnectRemoteMqttClient (e.Message);
-                            await StartCloudMqtt ();
-                            if (remoteIsConnected) {
-                                await RemoteMqttClient.SubscribeAsync (topicName);
-                            }
-                        }
-                    }
-                    break;
-
                 case 3:
                     topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/CheckGateway";
-    
-                    var m1 = new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
-
-                    try {
-                        Console.WriteLine ("CheckGateway");
-                        await RemoteMqttClient.PublishAsync (m1);
-                    } catch (Exception e) {
-                        Console.WriteLine ($"CheckGateway Fail:{e.Message}");
-                        await DisConnectRemoteMqttClient (e.Message);
-                        await StartCloudMqtt ();
-                    }
+                    //Utlis.WriteLine ("CheckGateway");
+                    await RemoteMqttClient.PublishAsync (new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce });
                     break;
                 }
             } catch (Exception e) {
+                // Utlis.WriteLine ($"============>Mqtt MqttRemoteSend catch");
+                 if (!IsDisConnectingWithSendCatch) {
+                    IsDisConnectingWithSendCatch = true;
+                    await DisConnectRemoteMqttClient ("MqttRemoteSendCatch");
+                }
 
             }
         }
+
+        /// <summary>
+        /// SendCatch 鍚庢墽琛屼竴娆℃柇寮�鎿嶄綔
+        /// </summary>
+        static bool IsDisConnectingWithSendCatch = false;
+
+        /// <summary>
+        /// 鍒嗕韩浣忓畢 鑾峰彇褰撳墠浣忓畢缃戝叧淇℃伅骞朵笖杩炴帴MQTT 鎴栬�呭埛鏂�  
+        /// 2020-01-11
+        /// </summary>
+        static async Task GetSingleHomeGatewayPaggerAndMQTTConnectAsync (bool bNeedConnect = true)
+        {
+
+            var requestObj3 = new GetSingleHomeGatewayPaggerObj ();
+            requestObj3.ReqDto.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
+            requestObj3.ReqDto.HomeId = UserConfig.Instance.CurrentRegion.Id;
+            requestObj3.ReqDto.PageSetting.Page = 1;
+            requestObj3.ReqDto.PageSetting.PageSize = 10;
+            string urlHead = MainPage.RequestHttpsHost;
+            if (requestObj3.IsOtherAccountCtrl) {
+                urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
+                requestObj3.ReqDto.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
+            }
+
+            var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj3);
+            var revertObj3 = MainPage.RequestHttps (API.GetSingleHomeGatewayPagger, requestJson3, urlHead);
+            if (revertObj3.StateCode.ToUpper () == "SUCCESS") {
+                var infoResult = Newtonsoft.Json.JsonConvert.DeserializeObject<GetGatewayResult> (revertObj3.ResponseData.ToString ());
+                if (bNeedConnect) {
+                    //2020-01-11
+                    UserConfig.Instance.SetNowHomeGateways (infoResult.PageData);
+
+                    //var gatewayListRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (revertObj3.ResponseData.ToString ());
+                    //--鎵惧嚭鏄惁瀛樺湪鍖归厤褰撳墠浣忓畢鐨刴ac锛屽瓨鍦ㄥ啀杩涜杩滅▼銆�
+                    if (UserConfig.Instance.CheckHomeGatewaysNotEmpty ()) {
+                        var mGatewayRes = infoResult.PageData.Find ((obj) => obj.GatewayUniqueId == UserConfig.Instance.CurrentRegion.HomeGateways [0].GatewayUniqueId);
+                        if (mGatewayRes != null) {
+                            CurRemoteMACInfo = new RemoteMACInfo ();
+                            CurRemoteMACInfo.aesKey = mGatewayRes.AesKey;
+                            CurRemoteMACInfo.mac = mGatewayRes.GatewayUniqueId;
+                            CurRemoteMACInfo.macMark = mGatewayRes.MacMark;
+                            CurRemoteMACInfo.isValid = mGatewayRes.MqttOnlineStatus ? "Valid" : "InValid";
+
+                            await MQTTConnectAsync ();
+                        }
+
+
+                    } else {
+                        Utlis.WriteLine ("============>Mqtt 鍙栨秷杩炴帴锛屽綋鍓嶄綇瀹呮病缁戝畾缃戝叧");
+                    }
+                } else {
+                    var mGatewayRes = infoResult.PageData.Find ((obj) => obj.GatewayUniqueId == UserConfig.Instance.CurrentRegion.HomeGateways [0].GatewayUniqueId);
+                    if (mGatewayRes != null) {
+                        CurRemoteMACInfo.aesKey = mGatewayRes.AesKey;
+                        mqttEncryptKey = CurRemoteMACInfo.aesKey;
+                    } else {
+                        MainPage.LoadingTipShow ("Please wait, failed to get gateway parameters.");
+                    }
+
+                }
+
+
+            }
+
+           
+        }
+        /// <summary>
+        /// 鏄惁闇�瑕佽鍙栦竴娆℃墍鏈夎澶囩姸鎬�
+        /// </summary>
+        static bool IfNeedReadAllDeviceStatus = true;
+        /// <summary>
+        /// 鏀跺埌缃戝叧涓婄嚎娑堟伅
+        /// </summary>
+        static async Task ReceiveNotifyBusGateWayInfoChange ()
+        {
+            Utlis.WriteLine ("============>Mqtt 缃戝叧涓婄嚎");
+            SetGatewayOnlineResetCheck ();
+            if (CommonPage.IsRemote) {
+
+//#if DEBUG
+                MainPage.AddTip ("Gateway login online");
+//#endif
+                if (IfNeedReadAllDeviceStatus) {
+                    IfNeedReadAllDeviceStatus = false;
+                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
+                }
+            }
+            //璇锋眰鍒锋柊涓�娆� 缃戝叧鍔犲瘑Key
+            await GetSingleHomeGatewayPaggerAndMQTTConnectAsync (false);
+        }
+        /// <summary>
+        /// 鏀跺埌缃戝叧鎺夌嚎淇℃伅
+        /// </summary>
+        static void ReceiveNotifyGateWayOffline ()
+        {
+            Utlis.WriteLine ("============>Mqtt GateWayOffline");
+            IsGatewayOnline = false;
+            if (CommonPage.IsRemote) {
+                Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
+                MainPage.AddTip ("Remote failed,gateway offline");
+                //if (MainPage.WiFiStatus != "CrabtreeAdd/CloudUnlink.png") {
+                //    Utlis.ShowAppLinkStatus (AppLinkStatus.CloudUnlink);
+                //}
+
+            }
+        }
+
+      
+        static int CheckGatewayCount = 0;
+        static DateTime mCheckGatewayTime;
+
+        /// <summary>
+        /// 璁剧疆缃戝叧鍦ㄧ嚎鏍囧織锛屽苟閲嶇疆CheckGateway鍙傛暟
+        /// </summary>
+        static void SetGatewayOnlineResetCheck ()
+        {
+            IsGatewayOnline = true;
+            mCheckGatewayTime = DateTime.Now;
+            CheckGatewayCount = 0;
+            if (CommonPage.IsRemote) {
+                if (MainPage.WiFiStatus != "CrabtreeAdd/CloudLink.png") {
+                    Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
+                }
+            }
+        }
+
+        //static void TipGatewayOffline () {
+
+        //}
+
+//        /// <summary>
+//        /// 瀹氭椂妫�娴嬬綉鍏虫槸鍚﹀湪绾�
+//        /// 1.绾跨▼浼戠湢闂撮殧5s
+//        /// 2.鍙戦�丆heckGateway闂撮殧涓�9S锛屾敹鍒颁富棰樺埛鏂拌鏃堕棿锛岄噸缃彂閫佹鏁�
+//        /// 3.鍙戦�佹鏁板埌杈�3娆′互涓婏紝鍒欏垽瀹氱綉鍏充负绂荤嚎鐘舵��
+//        /// </summary>
+//        /// <returns></returns>
+//        static void InitCheckGateway ()
+//        {
+//            new System.Threading.Thread (async () => {
+//                while (true) {
+//                    try {
+
+//                        if (CommonPage.IsRemote && remoteIsConnected) {
+//                            if (CheckGatewayCount >= 3) {
+//                                //杩炵画3娆℃病鍥炲锛屽垽瀹氱綉鍏宠秴鏃�
+//                                if (MainPage.WiFiStatus == "CrabtreeAdd/CloudLink.png") {
+//                                    //IsGatewayOnline = false;
+//                                    Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
+//                                    MainPage.AddTip ("Gateway offline!");
+//                                }
+//                            }
+
+//                            if (mCheckGatewayTime.AddSeconds (10).Ticks <= System.DateTime.Now.Ticks) {
+//                                mCheckGatewayTime = DateTime.Now;
+//                                //CheckGateway
+//                                MqttRemoteSend (new byte [] { }, 3);
+//                                CheckGatewayCount++;
+//#if DEBUG
+//                                Utlis.WriteLine ("CheckGateway");
+//#endif
+
+
+//                            }
+//                        }
+
+//                        System.Threading.Thread.Sleep (5500);
+//                    } catch { }
+
+//                }
+//            }) { IsBackground = true }.Start ();
+//        }
+
+       
+        /// <summary>
+        /// 鏀跺埌CheckGateway涓婚
+        /// </summary>
+        static void ReceiveCheckGatewayTopic () {
+            //Utlis.WriteLine ("============>Mqtt CheckGateway缃戝叧鍥炲");
+            SetGatewayOnlineResetCheck ();
+        }
+        
+        /// <summary>
+        /// 鏀跺埌鎸や笅绾挎帹閫�
+        /// </summary>
+        static async Task ReceiveNotifySqueezeAsync (byte [] mes)
+        {
+            Utlis.WriteLine ($"============>MqttNotifySqueeze: {ErrorCode.LoginInAnotherDevice}");
+            var mMes = CommonPage.MyEncodingUTF8.GetString (mes);
+            if (mMes == PushSignStr) return;//鏄嚜宸辩殑鐧诲綍鎺ㄩ�佷笉澶勭悊
+
+            CommonPage.IsRemote = false;
+
+            //if (MainPage.IsOtherDevicesLogin) return;
+
+            if (!MainPage.LoginUser.IsLogin) {
+                return;
+            }
+
+            MainPage.LoginUser.LastTime = DateTime.Now.AddDays (-30);
+            MainPage.LoginUser.SaveUserInfo ();
+
+            DisConnectRemoteMqttClient ("鎸や笅绾�");
+
+            MainPage.ShowAlertOnMainThread (ErrorCode.LoginInAnotherDevice);
+
+            Application.RunOnMainThread (() => {
+                MainPage.WiFiStatus = "CrabtreeAdd/WiFi.png";
+                UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
+                new AccountLogin ().Show ();
+            });
+
+        }
+
     }
+}
+
+public class ShareMemberConnMqttInfoObj : GetConnMqttInfoObj
+{
+    /// <summary>
+    /// 涓讳汉鐢ㄦ埛Id 
+    /// </summary>
+    public string MainUserDistributedMark;
+
+    /// <summary>
+    /// 鍒嗕韩鑰呬綇瀹匢d
+    /// </summary>
+    public string HomeId;
+
+}
+
+public class GetConnMqttInfoObj : BaseRequestObj
+{
+    /// <summary>
+    /// HdlGatewayGatewayType 缃戝叧绫诲瀷(0:涓�绔彛銆�1:BusproLinux 缃戝叧銆�2:Zigbee 缃戝叧銆�3:Knx缃戝叧)
+    /// </summary>
+    public int HdlGatewayGatewayType = 0;
+    /// <summary>
+    /// 璁惧绫诲瀷瀛楁
+    /// </summary>
+    public string PlatformStr = "";
+    /// <summary>
+    /// 
+    /// </summary>
+    public string PublishPayloadJsonStr = "";
+    /// <summary>
+    /// Mac
+    /// </summary>
+    public string Mac = "";
 }
 
 public class RemoteRequestParameters
@@ -432,8 +819,10 @@
     public string LoginAccessToken;
     public int RequestProtocolType;
 
+  
     public string Mac = "";
     public string GroupName = "";
+
 }
 
 public class MqttRemoteInfo
@@ -454,6 +843,8 @@
     public string connEmqClientId;
     public string connEmqUserName;
     public string connEmqPwd;
+
+    public List<RemoteMACInfo> AccountAllGateways;
 }
 
 public class RemoteMACInfo
@@ -466,6 +857,8 @@
     public string groupName;
     public string projectName;
     public string userName;
+
+    public string clientId;
 
     //app鑷畾涔夋暟鎹�
     public string md5_mac_string;
@@ -638,7 +1031,7 @@
                     RemoteMqttClient = null;
                 }
                 CommonPage.IsRemote = false;
-                Console.WriteLine ("Close Mqtt!!!");
+                Utlis.WriteLine ("Close Mqtt!!!");
             } catch { }
         }
 
@@ -690,7 +1083,7 @@
                         var requestObj3 = new GatewayByRegionListObj () { RegionID = UserConfig.Instance.CurrentRegion.RegionID };
                         var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj3);
                         var revertObj3 = MainPage.RequestHttps ("GatewayByRegionList", requestJson3, true, false);
-                        if (revertObj3.StateCode == "SUCCESS") {
+                        if (revertObj3.StateCode.ToUpper() == "SUCCESS") {
                             var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GatewayRes>> (revertObj3.ResponseData.ToString ());
                             var gatewayList = responseDataObj;
                             if (gatewayList != null && gatewayList.Count > 0) {
@@ -728,7 +1121,7 @@
                                         webPush.DeleteToken_Push (UserConfig.Instance.tokenID);
                                     });
                                 } catch (Exception ex) {
-                                    Console.WriteLine (ex.Message);
+                                    Utlis.WriteLine (ex.Message);
                                 } finally {
                                     Application.RunOnMainThread (() => {
                                         Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.LinkStatusTipColor;
@@ -794,7 +1187,7 @@
                         });
 
                         RemoteMqttClient.UseDisconnectedHandler (e => {
-                            //Console.WriteLine ("RemoteMqttClient UseDisconnectedHandler");
+                            //Utlis.WriteLine ("RemoteMqttClient UseDisconnectedHandler");
                             if (thisShowTip) {
                                 if (CommonPage.IsRemote) {
                                     //MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.RemoteConnectionDisconnected));
@@ -808,7 +1201,7 @@
                             }
                         });
                         RemoteMqttClient.UseConnectedHandler (async e => {
-                            //Console.WriteLine ("RemoteMqttClient IsRemote");
+                            //Utlis.WriteLine ("RemoteMqttClient IsRemote");
                             await MqttCheckGateway ();
                         });
                     }
@@ -821,14 +1214,14 @@
                             MainPage.Loading.Hide ();
                             Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                         });
-                        System.Console.WriteLine ($"閲嶆柊杩炴帴杩滅▼閫氳澶辫触锛屽洜涓鸿幏鍙栨柊鐨凨EY澶辫触");
+                        Utlis.WriteLine ($"閲嶆柊杩炴帴杩滅▼閫氳澶辫触锛屽洜涓鸿幏鍙栨柊鐨凨EY澶辫触");
                         return;
                     }
                     //var messgae = System.Text.Encoding.UTF8.GetString (tempResult);
 
                     var responsePack = tempResult.ResponseData;// Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (messgae);
                     //if (responsePack == null || responsePack ["ResponseData"] == null) {
-                    //    Console.WriteLine ("鏂紑鍚庨噸鏂伴摼鎺ラ渶瑕侀噸鏂扮櫥褰曡幏鍙栬繛鎺ョ殑瀵嗙爜澶辫触");
+                    //    Utlis.WriteLine ("鏂紑鍚庨噸鏂伴摼鎺ラ渶瑕侀噸鏂扮櫥褰曡幏鍙栬繛鎺ョ殑瀵嗙爜澶辫触");
                     //    return;
                     //}
                     var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (tempResult.ResponseData.ToString ());
@@ -856,7 +1249,7 @@
                     await Close ();
                     await RemoteMqttClient.ConnectAsync (options);
                 } catch (Exception ex) {
-                    System.Console.WriteLine ("============>" + ex.Message);
+                    Utlis.WriteLine ("============>" + ex.Message);
                     Application.RunOnMainThread (() => {
                         MainPage.Loading.Hide ();
                         isConnecting = false.ToString ();
@@ -950,7 +1343,7 @@
                     return;
                 }
                 var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/CheckGateway/" + UserConfig.Instance.GatewayMAC.Replace (".", "");
-                Console.WriteLine ("MqttCheckGateway : " + topicName);
+                Utlis.WriteLine ("MqttCheckGateway : " + topicName);
                 //base64鍔犲瘑涓婚
                 var topicNameBase64 = Shared.Securitys.EncryptionService.AesEncryptTopic (topicName, mqttEncryptKey);
 
@@ -1089,4 +1482,4 @@
 
     }
 }
-*/
\ No newline at end of file
+*/

--
Gitblit v1.8.0