From 30d5375178a275abd2019f2e5ce0eab1dfa51e0e Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期一, 16 三月 2020 09:50:03 +0800
Subject: [PATCH] 2020-03-16 1.Android 修改包名为com.hdl.crabtreenew.

---
 Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs |  556 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 372 insertions(+), 184 deletions(-)

diff --git a/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs b/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
index 7d6ebf0..8650a0b 100644
--- a/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
+++ b/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -21,6 +21,7 @@
         static string checkGatewayTopicBase64 = "";
         static RemoteMACInfo CurRemoteMACInfo = null;
         static MqttInfo mMqttInfo = null;
+        public static bool IsGatewayOnline = true;
 
         /// <summary>
         /// 鎵嬫満鏍囪瘑
@@ -41,21 +42,106 @@
         //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 ($"============>MqttRemote涓诲姩鏂紑_{s}");
-                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
-                    await RemoteMqttClient.DisconnectAsync ();
-                }
+        /// <returns></returns>
+        public static async System.Threading.Tasks.Task InitMqtt ()
+        {
+            new System.Threading.Thread (async () => {
+                while (true) {
+                    try {
+                        System.Threading.Thread.Sleep (100);
+                        if (!CommonPage.IsRemote) continue;
+
+                        await StartCloudMqtt ();
+                        await CheckingSubscribeTopics ();
+                    } catch { }
+
+                }
+            }) { IsBackground = true }.Start ();
+        }
+
+        /// <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;
+                    }
+                }
             } catch (Exception e) {
-                System.Console.WriteLine ($"============>MqttRemote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}");
-            }
+               
+            }
+        }
+
+
+
+        /// <summary>
+        /// 鏂紑杩滅▼Mqtt鐨勯摼鎺�
+        /// </summary>
+        public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
+        {
+            try {
+                if (remoteIsConnected) {
+                    remoteIsConnected = false;
+                    System.Console.WriteLine ($"============>MqttRemote涓诲姩鏂紑_{s}");
+                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
+                    await RemoteMqttClient.DisconnectAsync ();
+                    if (CommonPage.IsRemote) {
+                        Utlis.ShowAppLinkStatus (AppLinkStatus.CloudUnlink);
+                    }
+                    System.Console.WriteLine ($"============>MqttRemoteDisConnectRemoteMqttClient");
+
+                }
+            } catch (Exception e) {
+                System.Console.WriteLine ($"============>MqttRemote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}");
+            }
         }
         static DateTime dateTime = DateTime.MinValue;
 
@@ -79,29 +165,19 @@
         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) {
-                System.Console.WriteLine ($"============>MqttremoteMqttIsConnecting:{remoteMqttIsConnecting}  remoteIsConnected:{remoteIsConnected} ");
-
+            if (remoteMqttIsConnecting || remoteIsConnected) {
                 return;
             }
 
+            remoteMqttIsConnecting = true;
             await System.Threading.Tasks.Task.Factory.StartNew (async () => {
                 try {
-                    lock (RemoteMqttClient) {
+                    //lock (RemoteMqttClient) {
                         //琛ㄧず鍚庨潰灏嗚繘琛岃繛鎺�
-                        remoteMqttIsConnecting = true;
 
                         #region 鍒濆鍖栬繙绋婱qtt
                         //(3)褰揫杩炴帴浜戠鐨凪qtt鎴愬姛鍚嶿鎴栬�匸浠ュ強鍚庨潰App閫氳繃浜戠Mqtt杞彂鏁版嵁缁欑綉鍏虫垚鍔熷悗],澶勭悊鎺ユ敹鍒颁簯绔暟鎹寘鍝嶅簲鏃跺湪mqttServerClient_ApplicationMessageReceived杩欎釜鏂规硶澶勭悊
@@ -119,55 +195,26 @@
                                     //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") {
-                                        MainPage.WiFiStatus = "CrabtreeAdd/CloudUnlink.png";
-                                        // = $"/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.Name + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
-                                            MainPage.WiFiStatus = "CrabtreeAdd/CloudLink.png";
-                                            break;
-                                        default:
-                                            MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkLoser));
-                                            //Application.RunOnMainThread (() => {
-                                            //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
-                                            //});
-                                            break;
-                                        }
-                                        Application.RunOnMainThread (() => {
-                                            UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
-                                        });
+                                        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 packet = new Packet ();
-                                    packet.IsLocal = false;
-                                    packet.Bytes = aesDecryptPayload;
-                                    packet.Manager ();
+                                   
                                 } catch { }
                             });
                         }
@@ -175,6 +222,7 @@
                         if (RemoteMqttClient.DisconnectedHandler == null) {
                             RemoteMqttClient.UseDisconnectedHandler (async (e) => {
                                 System.Console.WriteLine ($"============>Mqtt杩滅▼杩炴帴鏂紑");
+                                isSubscribeTopicSuccess = false;
                                 await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
                                 //await StartRemoteMqtt();
                                 //if (thisShowTip) {
@@ -190,29 +238,43 @@
                         }
                         if (RemoteMqttClient.ConnectedHandler == null) {
                             RemoteMqttClient.UseConnectedHandler (async (e) => {
+                                IfNeedReadAllDeviceStatus = true;
 
-                                Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
                                 System.Console.WriteLine ($"============>Mqtt杩滅▼杩炴帴鎴愬姛");
                                 if (CommonPage.IsRemote) {
                                     Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
                                 }
 
                                 if (CurRemoteMACInfo != null) {
-                                    if (CurRemoteMACInfo.isValid == "InValid") {
+                                    IsGatewayOnline = CurRemoteMACInfo.isValid != "InValid";
+                                    if (!IsGatewayOnline) {
+                                        //缃戝叧涓嶅湪绾�
+                                        if (CommonPage.IsRemote) {
+                                            Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
+                                        }
                                         MainPage.AddTip ("Remote failed,gateway offline");
-                                        //Application.RunOnMainThread (() => {
-                                        //    MainPage.Loading.Hide ();
-                                        //});
                                     } else {
+                                        //缃戝叧鍦ㄧ嚎
+
+                                        //閲嶆柊涓�娆℃墍鏈夎澶囩姸鎬�
+                                        IfNeedReadAllDeviceStatus = false;
+                                        Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
+                                        //
                                         MqttRemoteSend (new byte [] { 0 }, 3);
                                     }
+
+                                    //if (CurRemoteMACInfo.isValid == "InValid") {
+                                    //    MainPage.AddTip ("Remote failed,gateway offline");
+                                    //} else {
+                                    //    MqttRemoteSend (new byte [] { 0 }, 3);
+                                    //}
                                 }
+
 
                             });
                         }
                         #endregion
-                    }
-                    try {
+                    //}
 
                         mqttRequestParToken = MainPage.LoginUser.LoginTokenString;
                         //--绗竴姝ワ細鑾峰彇mqtt閾炬帴鍙傛暟
@@ -271,11 +333,6 @@
                             }
                         }
 
-
-
-                    } catch (Exception ex) {
-                        Console.WriteLine (ex.Message);
-                    }
                 } catch (Exception ex) {
                     System.Console.WriteLine ($"============>Mqtt 杩滅▼杩炴帴閫氳杩炴帴鍑哄紓甯�:{ex.Message}");
                 } finally {
@@ -310,139 +367,120 @@
                 await DisConnectRemoteMqttClient ("StartRemoteMqtt");
                 await RemoteMqttClient.ConnectAsync (options1);
                 remoteIsConnected = true;
-                await MqttRemoteSend (new byte [] { 0 }, 1);
-                await MqttRemoteSend (new byte [] { 0 }, 2);
-                await MqttRemoteSend (new byte [] { 0 }, 4);
+                IsDisConnectingWithSendCatch = false;
+                //await MqttRemoteSend (new byte [] { 0 }, 1);
+                //await MqttRemoteSend (new byte [] { 0 }, 2);
+                //await MqttRemoteSend (new byte [] { 0 }, 4);
 
             }
         }
 
-        //public static async System.Threading.Tasks.Task InitMqtt () {
 
-        //    while (true) {
-        //        await StartCloudMqtt ();
-        //        System.Threading.Thread.Sleep (100);
+        ///// <summary>
+        ///// 
+        ///// </summary>
+        ///// <param name="message">闄勫姞鏁版嵁鍖�</param>
+        ///// <param name="optionType">鎿嶄綔绫诲瀷锛�0=缃戝叧鎺у埗锛�1=璁㈤槄缃戝叧鏁版嵁;2=璁㈤槄缃戝叧涓婄嚎鏁版嵁;3=璁㈤槄缃戝叧鏄惁鍦ㄧ嚎涓婚  4=璁㈤槄鎸や笅绾夸富棰� </param>
+        ///// <returns></returns>
+        //public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
+        //{
+        //    try {
+        //        if (!remoteIsConnected) {
+        //            System.Console.WriteLine ($"============>Mqtt 鏈繛鎺� 鍙栨秷鍙戦��");
+        //            return;
+        //        }
+
+        //        var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/" + UserConfig.Instance.GatewayMAC.Replace (".", "") + @"/" + currentGuid;
+        //        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);
+        //            }
+        //            //base64鍔犲瘑
+        //            var m = new MqttApplicationMessage { Topic = topicName, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
+        //            //if (remoteIsConnected) {
+        //            try {
+        //                RemoteMqttClient.PublishAsync (m);
+        //            } catch (Exception e) {
+        //                //await DisConnectRemoteMqttClient (e.Message);
+        //                //await StartCloudMqtt ();
+        //                //if (remoteIsConnected) {
+        //                //    RemoteMqttClient.PublishAsync (m);
+        //                //}
+        //            }
+        //            //}
+        //            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");
+        //                RemoteMqttClient.PublishAsync (m1);
+        //            } catch (Exception e) {
+        //                Console.WriteLine ($"CheckGateway Fail:{e.Message}");
+        //                //await DisConnectRemoteMqttClient (e.Message);
+        //                //await StartCloudMqtt ();
+        //            }
+        //            break;
+        //        }
+
+
+        //    } catch (Exception e) {
+
         //    }
         //}
-
 
         /// <summary>
         /// 
         /// </summary>
         /// <param name="message">闄勫姞鏁版嵁鍖�</param>
-        /// <param name="optionType">鎿嶄綔绫诲瀷锛�0=缃戝叧鎺у埗锛�1=璁㈤槄缃戝叧鏁版嵁;2=璁㈤槄缃戝叧涓婄嚎鏁版嵁;3=璁㈤槄缃戝叧鏄惁鍦ㄧ嚎涓婚  4=璁㈤槄鎸や笅绾夸富棰� </param>
+        /// <param name="optionType">鎿嶄綔绫诲瀷锛�0=缃戝叧鎺у埗锛�1=璁㈤槄缃戝叧鏁版嵁;2=璁㈤槄缃戝叧涓婄嚎鏁版嵁</param>
         /// <returns></returns>
         public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
         {
             try {
-                var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/" + UserConfig.Instance.GatewayMAC.Replace (".", "") + @"/" + currentGuid;
+                //if (!remoteIsConnected) {
+                //    System.Console.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 {
-                         RemoteMqttClient.PublishAsync (m);
-                    } catch (Exception e) {
-                        await DisConnectRemoteMqttClient (e.Message);
-                        await StartCloudMqtt ();
-                        if (remoteIsConnected) {
-                            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}";
-                    //2020-01-11 淇敼璁㈤槄涓婚鍦板潃
-                    topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyBusGateWayInfoChange";
-                    //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 ();
-                    }
-                    break;
-
-                case 4:
-                    //2020-01-13 淇敼鎸や笅绾夸富棰�
-                    topicName = $"/BusGateWayToClient/{mMqttInfo.connEmqClientId}/Push/NotifySqueeze";
-                    //if (remoteIsConnected) {
-                    try {
-                        await RemoteMqttClient.SubscribeAsync (topicName);
-                    } catch (Exception e) {
-                        await DisConnectRemoteMqttClient (e.Message);
-                        await StartCloudMqtt ();
-                        if (remoteIsConnected) {
-                            await RemoteMqttClient.SubscribeAsync (topicName);
-                        }
-                    }
-
-                    //}
+                    //Console.WriteLine ("CheckGateway");
+                    await RemoteMqttClient.PublishAsync (new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce });
                     break;
                 }
-
-
             } catch (Exception e) {
+                // System.Console.WriteLine ($"============>Mqtt MqttRemoteSend catch");
+                 if (!IsDisConnectingWithSendCatch) {
+                    IsDisConnectingWithSendCatch = true;
+                    await DisConnectRemoteMqttClient ("MqttRemoteSendCatch");
+                }
 
             }
         }
 
+        /// <summary>
+        /// SendCatch 鍚庢墽琛屼竴娆℃柇寮�鎿嶄綔
+        /// </summary>
+        static bool IsDisConnectingWithSendCatch = false;
+
+     
 
         /// <summary>
         /// 鍒嗕韩浣忓畢 鑾峰彇褰撳墠浣忓畢缃戝叧淇℃伅骞朵笖杩炴帴MQTT 鎴栬�呭埛鏂�  
@@ -502,12 +540,28 @@
 
            
         }
-
+        /// <summary>
+        /// 鏄惁闇�瑕佽鍙栦竴娆℃墍鏈夎澶囩姸鎬�
+        /// </summary>
+        static bool IfNeedReadAllDeviceStatus = true;
         /// <summary>
         /// 鏀跺埌缃戝叧涓婄嚎娑堟伅
         /// </summary>
         static async Task ReceiveNotifyBusGateWayInfoChange ()
         {
+            System.Console.WriteLine ("============>Mqtt 缃戝叧涓婄嚎");
+            SetGatewayOnlineResetCheck ();
+            if (CommonPage.IsRemote) {
+
+//#if DEBUG
+                MainPage.AddTip ("Gateway login online");
+//#endif
+                if (IfNeedReadAllDeviceStatus) {
+                    IfNeedReadAllDeviceStatus = false;
+                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
+                }
+            }
+
             //褰撳墠浣忓畢涓嶆槸鍒嗕韩鏉�
             if (!UserConfig.Instance.CurrentRegion.IsOthreShare) {
 
@@ -527,6 +581,139 @@
             }
 
         }
+        /// <summary>
+        /// 鏀跺埌缃戝叧鎺夌嚎淇℃伅
+        /// </summary>
+        static void ReceiveNotifyGateWayOffline ()
+        {
+            System.Console.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
+                                Console.WriteLine ("CheckGateway");
+#endif
+
+
+                            }
+                        }
+
+                        System.Threading.Thread.Sleep (5500);
+                    } catch { }
+
+                }
+            }) { IsBackground = true }.Start ();
+        }
+
+       
+        /// <summary>
+        /// 鏀跺埌CheckGateway涓婚
+        /// </summary>
+        static void ReceiveCheckGatewayTopic () {
+            //System.Console.WriteLine ("============>Mqtt CheckGateway缃戝叧鍥炲");
+            SetGatewayOnlineResetCheck ();
+          
+
+
+            //鏃х綉鍏虫柟娉�
+            //MainPage.WiFiStatus = "CrabtreeAdd/CloudUnlink.png";
+            //// = $"/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.Name + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
+            //    MainPage.WiFiStatus = "CrabtreeAdd/CloudLink.png";
+            //    break;
+            //default:
+            //    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkLoser));
+            //    //Application.RunOnMainThread (() => {
+            //    //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
+            //    //});
+            //    break;
+            //}
+            //Application.RunOnMainThread (() => {
+            //    UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
+            //});
+        }
+        
+
 
         /// <summary>
         /// 鏀跺埌鎸や笅绾挎帹閫�
@@ -549,11 +736,12 @@
             MainPage.LoginUser.LastTime = DateTime.Now.AddDays (-30);
             MainPage.LoginUser.SaveUserInfo ();
 
-            DisConnectRemoteMqttClient ("LoginOut");
+            DisConnectRemoteMqttClient ("鎸や笅绾�");
 
             MainPage.ShowAlertOnMainThread (ErrorCode.LoginInAnotherDevice);
 
             Application.RunOnMainThread (() => {
+               
                 MainPage.WiFiStatus = "CrabtreeAdd/WiFi.png";
                 UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
                 new AccountLogin ().Show ();

--
Gitblit v1.8.0