JLChen
2020-01-15 454ac814944cf956ff02b84b70ba2ec68e5e5ea1
Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -41,6 +41,73 @@
        //static bool thisShowTip = true;
        static string mqttRequestParToken = "";
        static MqttCommon ()
        {
            InitMqtt ();
        }
        public static async System.Threading.Tasks.Task InitMqtt ()
        {
            new System.Threading.Thread (async () => {
                while (true) {
                    System.Threading.Thread.Sleep (100);
                    if (!CommonPage.IsRemote) continue;
                    await StartCloudMqtt ();
                    await CheckingSubscribeTopics ();
                }
            }) { 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 topicFilters = new TopicFilter [] { topicFilterCommon, topicFilterGateWayInfoChange, topicFilterNotifySqueeze };
                    var result = await RemoteMqttClient.SubscribeAsync (topicFilters);
                    if (result.Items [0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS2) {
                        isSubscribeTopicSuccess = true;
                    }
                }
            } catch (Exception e) {
            }
        }
        /// <summary>
        /// 断开远程Mqtt的链接
        /// </summary>
@@ -92,16 +159,16 @@
            //追加:没有远程连接的权限
            if (remoteMqttIsConnecting
               || remoteIsConnected) {
                System.Console.WriteLine ($"============>MqttremoteMqttIsConnecting:{remoteMqttIsConnecting}  remoteIsConnected:{remoteIsConnected} ");
                //System.Console.WriteLine ($"============>MqttremoteMqttIsConnecting:{remoteMqttIsConnecting}  remoteIsConnected:{remoteIsConnected} ");
                return;
            }
            remoteMqttIsConnecting = true;
            await System.Threading.Tasks.Task.Factory.StartNew (async () => {
                try {
                    lock (RemoteMqttClient) {
                    //lock (RemoteMqttClient) {
                        //表示后面将进行连接
                        remoteMqttIsConnecting = true;
                        #region 初始化远程Mqtt
                        //(3)当[连接云端的Mqtt成功后]或者[以及后面App通过云端Mqtt转发数据给网关成功后],处理接收到云端数据包响应时在mqttServerClient_ApplicationMessageReceived这个方法处理
@@ -175,6 +242,7 @@
                        if (RemoteMqttClient.DisconnectedHandler == null) {
                            RemoteMqttClient.UseDisconnectedHandler (async (e) => {
                                System.Console.WriteLine ($"============>Mqtt远程连接断开");
                                isSubscribeTopicSuccess = false;
                                await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
                                //await StartRemoteMqtt();
                                //if (thisShowTip) {
@@ -211,8 +279,7 @@
                            });
                        }
                        #endregion
                    }
                    try {
                    //}
                        mqttRequestParToken = MainPage.LoginUser.LoginTokenString;
                        //--第一步:获取mqtt链接参数
@@ -271,11 +338,6 @@
                            }
                        }
                    } catch (Exception ex) {
                        Console.WriteLine (ex.Message);
                    }
                } catch (Exception ex) {
                    System.Console.WriteLine ($"============>Mqtt 远程连接通讯连接出异常:{ex.Message}");
                } finally {
@@ -310,22 +372,14 @@
                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);
                //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>
@@ -351,59 +405,14 @@
                    try {
                         RemoteMqttClient.PublishAsync (m);
                    } catch (Exception e) {
                        await DisConnectRemoteMqttClient (e.Message);
                        await StartCloudMqtt ();
                        if (remoteIsConnected) {
                            RemoteMqttClient.PublishAsync (m);
                        }
                        //await DisConnectRemoteMqttClient (e.Message);
                        //await StartCloudMqtt ();
                        //if (remoteIsConnected) {
                        //    RemoteMqttClient.PublishAsync (m);
                        //}
                    }
                    //}
                    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";
@@ -411,29 +420,12 @@
                    try {
                        Console.WriteLine ("CheckGateway");
                        await RemoteMqttClient.PublishAsync (m1);
                         RemoteMqttClient.PublishAsync (m1);
                    } catch (Exception e) {
                        Console.WriteLine ($"CheckGateway Fail:{e.Message}");
                        await DisConnectRemoteMqttClient (e.Message);
                        await StartCloudMqtt ();
                        //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);
                        }
                    }
                    //}
                    break;
                }