From b71dfb3ca100340005d56e1298292807da82322d Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期一, 08 六月 2020 15:04:21 +0800 Subject: [PATCH] 20200608 --- HDL_ON/DAL/Net/MqttCommon.cs | 487 +++++++++++++++++------------------------------------ 1 files changed, 158 insertions(+), 329 deletions(-) diff --git a/HDL_ON/DAL/Net/MqttCommon.cs b/HDL_ON/DAL/Net/MqttCommon.cs index 5b097f1..279056c 100644 --- a/HDL_ON/DAL/Net/MqttCommon.cs +++ b/HDL_ON/DAL/Net/MqttCommon.cs @@ -1,331 +1,198 @@ 锘縰sing System.Collections.Generic; using System; using MQTTnet.Client; -using System.Threading.Tasks; using System.Text; using System.Security.Cryptography; using MQTTnet; +using MQTTnet.Client.Options; +using System.Net.Sockets; +using System.Threading.Tasks; +//using System.Net; +//using Newtonsoft.Json.Linq; +//using HDL_ON.DAL; +//using Newtonsoft.Json; namespace HDL_ON.DAL.Net { public static class MqttCommon { - static string mqttEncryptKey = ""; - static string checkGatewayTopicBase64 = ""; - static RemoteMACInfo CurRemoteMACInfo = null; - /// <summary> - /// 鎵嬫満鏍囪瘑 + /// MqttClient /// </summary> - static Guid currentGuid = Guid.NewGuid(); + public static IMqttClient mqttClient_A; + public static string mqttClientIP; + public static string mqttGatewayMAC; + static bool remoteIsConnected; - /// <summary> - /// 澶栫綉鐨凪QTT鏄惁姝e湪杩炴帴 - /// </summary> - static object isConnecting = false.ToString(); - /// <summary> - /// 杩滅▼MqttClient - /// </summary> - public static IMqttClient RemoteMqttClient; + static bool onConnection = false; - static bool thisShowTip = true; - - public static async System.Threading.Tasks.Task Close(bool RemoveRemoteMqttClient = false) + static MqttCommon() { - try - { - if (RemoteMqttClient != null) - { - //thisShowTip = true; - await RemoteMqttClient.DisconnectAsync(); - } - if (RemoveRemoteMqttClient) - { - RemoteMqttClient = null; - } - CommonPage.IsRemote = false; - } - catch { } + InitMqtt(); } - static DateTime dateTime = DateTime.MinValue; + /// <summary> + /// 鏂紑杩滅▼Mqtt鐨勯摼鎺� + /// </summary> + public static async Task DisConnectRemoteMqttClient(string s = "") + { + try + { + if (remoteIsConnected) + { + remoteIsConnected = false; + System.Console.WriteLine($"Remote涓诲姩鏂紑_{s}"); + //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None); + await mqttClient_A.DisconnectAsync(); + } + } + catch (Exception e) + { + Console.WriteLine($"Remote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}"); + } + } + + static bool isSubscribeSuccess; + static async Task SubscribeTopics() + { + if (remoteIsConnected && !isSubscribeSuccess) + { + try + { + var Topic1 = $"/BusGateWayToApp/{mqttGatewayMAC}/Common/Json"; + try + { + await mqttClient_A.SubscribeAsync(Topic1); + } + catch (Exception ex) + { + await DisConnectRemoteMqttClient(ex.Message); + await StartMqtt(); + if (remoteIsConnected) + { + await mqttClient_A.SubscribeAsync(Topic1); + } + } + } + catch { } + } + } + + static void InitMqtt() + { + new System.Threading.Thread(async () => { + while (true) + { + try + { + System.Threading.Thread.Sleep(1000); + //if (!CommonPage.IsRemote) + // continue; + if (remoteIsConnected) + continue; + await StartMqtt(); + await SubscribeTopics(); + } + catch { } + } + }) + { IsBackground = true }.Start(); + } /// <summary> - /// 鍚姩杩滅▼Mqtt + /// 鍚姩A鍗忚Mqtt /// </summary> - public static async Task StartCloudMqtt() + public static async Task StartMqtt() { - /* try { - Application.RunOnMainThread(() => - { - if (5 < (DateTime.Now - dateTime).TotalSeconds) - { - return; - } - dateTime = DateTime.Now; - }); - if (!MainPage.LoginUser.IsLogin) - { - isConnecting = false.ToString(); + if (remoteIsConnected) return; - } - while (isConnecting.ToString() == true.ToString()) + if (onConnection) + return; + onConnection = true; + new System.Threading.Thread(async () => { - if (5 < (DateTime.Now - dateTime).TotalSeconds) - { - break; - } - await System.Threading.Tasks.Task.Delay(500); - } - lock (isConnecting) - { - if (isConnecting.ToString() == true.ToString()) - { + if (remoteIsConnected) return; - } - isConnecting = true.ToString(); - if (RemoteMqttClient != null) + try { - MainPage.Log($"RemoteMqttClient.IsConnected: {RemoteMqttClient.IsConnected}"); - } - //if (RemoteMqttClient != null && RemoteMqttClient.IsConnected) { - // return; - //} + if (mqttClient_A == null) + { + mqttClient_A = new MqttFactory().CreateMqttClient(); + mqttClient_A.UseApplicationMessageReceivedHandler(async e => + { + var aesDecryptTopic = e.ApplicationMessage.Topic; + var aesDecryptPayload = e.ApplicationMessage.Payload; + MainPage.Log(aesDecryptTopic); + MainPage.Log($"Des Topic={aesDecryptTopic}"); + }); - new System.Threading.Thread(async () => - { + mqttClient_A.UseConnectedHandler(async (e) => { + MainPage.Log("mqtt connected !!"); + onConnection = false; + }); + } try { - //鏂紑鍚庨噸鏂伴摼鎺ラ渶瑕侀噸鏂扮櫥褰曡幏鍙栬繛鎺ョ殑瀵嗙爜 - var requestObj = new LoginObj() { Account = MainPage.LoginUser.AccountString.ToLower(), Password = MainPage.LoginUser.Password, Company = 1 }; - var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj); - var tempResult = HttpServerRequest.RequestHttps("Login", requestJson, ""); - if (tempResult == null) + int readCount = 0; + BusSocket.Stop(); + System.Threading.Thread.Sleep(1000); + BusSocket.Start(6688); + System.Threading.Thread.Sleep(1000); + Control.ReadGatewayIPAddress(); + while(true) { - //---------- - 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()); - //杩樻湁绉嶆儏鍐垫槸鍚屼竴涓狪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(); - - if (RemoteMqttClient == null) - { - var requestObj3 = new GatewayByRegionListObj() { RegionID = UserConfig.Instance.CurrentRegion.RegionID }; - MainPage.Log("Remote mqtt get Region MAC : " + UserConfig.Instance.CurrentRegion.RegionID); - var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj3); - var revertObj3 = HttpServerRequest.RequestHttps("GatewayByRegionList", requestJson3, true); - if (revertObj3.DB_ResidenceData.residenceData.residecenInfo + if (!string.IsNullOrEmpty(mqttClientIP)) { - 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(); - MainPage.Log("Remote mqtt get Region MAC : " + gatewayList[0].MAC); - } + break; + } + else if (readCount > 10) + { + onConnection = false; + return; } else { - MainPage.Log("Remote mqtt get Region MAC Erorr !!"); + Control.ReadGatewayIPAddress(); + System.Threading.Thread.Sleep(200); } - - //(2)鍒涘缓Mqtt瀹㈡埛绔� - RemoteMqttClient = new MqttFactory().CreateMqttClient(); - //(3)褰揫杩炴帴浜戠鐨凪qtt鎴愬姛鍚嶿鎴栬�匸浠ュ強鍚庨潰App閫氳繃浜戠Mqtt杞彂鏁版嵁缁欑綉鍏虫垚鍔熷悗],澶勭悊鎺ユ敹鍒颁簯绔暟鎹寘鍝嶅簲鏃跺湪mqttServerClient_ApplicationMessageReceived杩欎釜鏂规硶澶勭悊 - RemoteMqttClient.UseApplicationMessageReceivedHandler(async e => - { - if (isConnecting.ToString() == true.ToString()) - isConnecting = false.ToString(); - var aesDecryptTopic = e.ApplicationMessage.Topic; - var aesDecryptPayload = e.ApplicationMessage.Payload; - MainPage.Log(aesDecryptTopic); - - 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 = mqttRequestPar.Token, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 }; - var gatewayListRequestResult = HttpServerRequest.RequestHttps("", Newtonsoft.Json.JsonConvert.SerializeObject(gatewayListRequestPar), 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 == "YouIpAndPortNoRecord" || aesDecryptTopic == "DecryptFail") - {// --> 浣犲綋鍓嶇殑IP鍙婄鍙e湪浜戠涓嶅瓨鍦�,璇烽噸鏂扮櫥褰曡繛鎺ヤ笅! - await Close(true); - //await MqttCheckGateway (); - } - else if (aesDecryptTopic == @"/BeingSqueezedOffline") - { - try - { - - } - catch (Exception ex) - { - MainPage.Log(ex.Message); - } - finally - { - - } - } - 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; - } - } - MainPage.Log($"Des Topic={aesDecryptTopic}"); - - - var packet = new Packet(); - packet.Bytes = aesDecryptPayload; - packet.Manager(); - - }); - - RemoteMqttClient.UseDisconnectedHandler(e => - { - if (thisShowTip) - { - if (CommonPage.IsRemote) - { - //---------- - } - } - else - { - thisShowTip = true; - } - }); - RemoteMqttClient.UseConnectedHandler(async e => - { - if (CurRemoteMACInfo != null) - { - if (CurRemoteMACInfo.isValid == "InValid") - { - //---------- - } - else - { - CommonPage.IsRemote = true; - //---------- - } - } - }); } + BusSocket.Stop(); + System.Threading.Thread.Sleep(1000); + BusSocket.Start(6000); + System.Threading.Thread.Sleep(1000); - if (clientId == null || username == null || passwordRemote == null) - { - return; - } - - if (tempResult == null) - { - //---------- - return; - } - //--绗竴姝ワ細鑾峰彇mqtt閾炬帴鍙傛暟 - var mqttInfoUrl = @"https://developer.hdlcontrol.com/Center/Center/GetConnMqttInfo";//鑾峰彇杩炴帴杩滅▼浜戠Emq Mqtt 鏈嶅姟鍣ㄨ繛鎺ヤ俊鎭� - var mqttInfoRequestPar = new RemoteRequestParameters() { LoginAccessToken = mqttRequestPar.Token, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 }; - var mqttInfoRequestResult = HttpServerRequest.RequestHttps("", Newtonsoft.Json.JsonConvert.SerializeObject(mqttInfoRequestPar), 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 = mqttRequestPar.Token, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 }; - var gatewayListRequestResult = HttpServerRequest.RequestHttps("", Newtonsoft.Json.JsonConvert.SerializeObject(gatewayListRequestPar), 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, 10)) - .Build(); - await Close(); - await RemoteMqttClient.ConnectAsync(options1); - await MqttRemoteSend(new byte[] { 0 }, 1); - await MqttRemoteSend(new byte[] { 0 }, 2); - } - } - } - catch { } - } + var options = new MqttClientOptionsBuilder()//MQTT杩炴帴鍙傛暟濉厖 + .WithClientId(Guid.NewGuid().ToString().Substring(0, 5))//瀹㈡埛绔疘D + .WithTcpServer(mqttClientIP, 1883)//MQTTServerIP.Text, Int32.Parse(MQTTServerPort.Text.ToString()))//TCP鏈嶅姟绔� 1883 锛屽嵆MQTT鏈嶅姟绔� + .WithCredentials("", "")//"", "")//鍑瘉 甯愬彿 瀵嗙爜 + .WithCommunicationTimeout(new TimeSpan(0, 0, 60)) //閲嶈繛瓒呮椂鏃堕棿锛岄粯璁�5s + .WithKeepAlivePeriod(new TimeSpan(0, 0, 15)) //淇濇寔杩炴帴鏃堕棿锛岄粯璁�5s锛屽績璺冲寘 + .Build(); + await mqttClient_A.ConnectAsync(options); + remoteIsConnected = true; } - catch (Exception ex) - { - Application.RunOnMainThread(() => - { - if (MqttCommon.RemoteMqttClient != null) - { - MqttCommon.RemoteMqttClient.Dispose(); - } - if (MqttCommon.RemoteMqttClient != null) - { - MqttCommon.RemoteMqttClient = null; - } - }); - } - finally - { - isConnecting = false.ToString(); - //---------- - } - }) - { IsBackground = true }.Start(); - } + catch { } + } + catch (Exception ex) + { + } + finally + { + onConnection = false; + } + }) + { IsBackground = true }.Start(); } catch (Exception ex) { MainPage.Log("============>" + ex.Message); } - finally - { - isConnecting = false.ToString(); - } - - */ } + + + /// <summary> /// @@ -333,64 +200,24 @@ /// <param name="message">闄勫姞鏁版嵁鍖�</param> /// <param name="optionType">鎿嶄綔绫诲瀷锛�0=缃戝叧鎺у埗锛�1=璁㈤槄缃戝叧鏁版嵁;2=璁㈤槄缃戝叧涓婄嚎鏁版嵁</param> /// <returns></returns> - public static async Task MqttRemoteSend(byte[] message, int optionType = 0) + public static async Task MqttRemoteSend(byte[] message) { try { - if (RemoteMqttClient == null || !RemoteMqttClient.IsConnected) + if (mqttClient_A == null || !mqttClient_A.IsConnected) { - await StartCloudMqtt(); + await StartMqtt(); } - if (!RemoteMqttClient.IsConnected) + if (!mqttClient_A.IsConnected) { return; } - var topicName = "";//@"/" + MainPage.LoginUser.AccountString.ToLower() + @"/" + currentGuid;//+ @"/" + UserConfig.Instance.CurrentRegion.MAC.Replace(".", "") - switch (optionType) - { - case 0: - if (!string.IsNullOrEmpty(mqttEncryptKey)) - { - topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON"; - } - else - { - topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/NewON"; - } - //base64鍔犲瘑 - var messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload(message, mqttEncryptKey); - var m = new MqttApplicationMessage { Topic = topicName, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; - await RemoteMqttClient?.PublishAsync(m); - break; - case 1: - topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#"; - 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}"; - await RemoteMqttClient?.SubscribeAsync(topicName); - break; - } + var topicName = $"/AppToBusGateWay/{mqttGatewayMAC}/Common/Json"; + var m = new MqttApplicationMessage { Topic = topicName, Payload = message, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; + await mqttClient_A?.PublishAsync(m); } catch (Exception e) { - isConnecting = false.ToString(); } } } @@ -567,3 +394,5 @@ } } + + -- Gitblit v1.8.0