From 3a26f6025130dcaae4aa82ea19b16ad902450eb8 Mon Sep 17 00:00:00 2001 From: 黄学彪 <hxb@hdlchina.com.cn> Date: 星期四, 28 十一月 2019 11:43:47 +0800 Subject: [PATCH] 合并全部代码完成 --- ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs | 270 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 163 insertions(+), 107 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs index 48fbf24..8c1ef41 100755 --- a/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs +++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs @@ -3090,27 +3090,46 @@ /// </summary> IMqttClient localMqttClient = new MqttFactory().CreateMqttClient(); bool localMqttIsConnecting; + public bool localIsConnected; /// <summary> /// 鎵嬫満鏍囪瘑 /// </summary> static Guid currentGuid = Guid.NewGuid(); + public async System.Threading.Tasks.Task SendAesKey() + { + if (PubKey != null) + { + IsEncry = false; + var rsaString = ZigBee.Common.SecuritySet.RSAEncrypt(PubKey, Password); + var resultVerityfy = await SendAesKeyAsync(rsaString); + if (resultVerityfy == null) + { + resultVerityfy = await SendAesKeyAsync(rsaString); + } + + if (resultVerityfy != null && resultVerityfy.Result == 0) + { + IsEncry = true; + } + } + } + public async System.Threading.Tasks.Task StartLocalMqtt(string brokerName) - { + { + if (localMqttIsConnecting + || !Shared.Common.Config.Instance.IsLogin + || Shared.Common.Config.Instance.HomeId == "" + || localIsConnected) + { + return; + } await System.Threading.Tasks.Task.Factory.StartNew(async () => { try { lock (localMqttClient) { - if (localMqttIsConnecting - || !Shared.Common.Config.Instance.IsLogin - || Shared.Common.Config.Instance.HomeId == "" - || localMqttClient.IsConnected) - { - return; - } - //琛ㄧず鍚庨潰灏嗚繘琛岃繛鎺� localMqttIsConnecting = true; @@ -3129,10 +3148,11 @@ if (localMqttClient.DisconnectedHandler == null) { - localMqttClient.UseDisconnectedHandler((e) => - { - IsEncry = false; + localMqttClient.UseDisconnectedHandler(async (e) => + { DebugPrintLog($" 鏈湴杩炴帴鏂紑_缃戝叧IP:{brokerName}_缃戝叧鏄惁鍔�:{IsEncry}"); + await DisConnectLocalMqttClient("StartLocalMqtt.DisconnectedHandler"); + //await StartLocalMqtt("ReConnect"); }); } if (localMqttClient.ConnectedHandler == null) @@ -3141,33 +3161,44 @@ { DebugPrintLog($" 鏈湴杩炴帴鎴愬姛_缃戝叧IP:{brokerName}_缃戝叧鏄惁鍔�:{IsEncry}_褰撳墠瀵嗙爜:{Password}"); IsRemote = false; - if (PubKey != null) - { - var rsaString = ZigBee.Common.SecuritySet.RSAEncrypt(PubKey, Password); - var resultVerityfy = await SendAesKeyAsync(rsaString); - if (resultVerityfy == null) - { - resultVerityfy = await SendAesKeyAsync(rsaString); - } - if (resultVerityfy != null && resultVerityfy.Result == 0) - { - IsEncry = true; - } - } Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.WIFI); - System.Console.WriteLine($"褰撳墠鏄綉鍏砏i-Fi鍦ㄩ�氳_{System.DateTime.Now.ToString()}"); }); - } - } - - var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder() - .WithClientId(currentGuid.ToString()) - .WithTcpServer(brokerName, 1883) - .WithKeepAlivePeriod(TimeSpan.FromSeconds(20)) - .WithCleanSession() - .WithCredentials("", "") - .Build(); - await localMqttClient.ConnectAsync(options, CancellationToken.None); + } + + var dateTime = DateTime.Now; + + new System.Threading.Thread(async () => + { + try + { + if (localMqttClient.Options == null) + { + var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder().WithClientId(currentGuid.ToString()) + .WithTcpServer(brokerName, 1883) + .WithKeepAlivePeriod(TimeSpan.FromSeconds(20)) + .WithCleanSession() + .WithCommunicationTimeout(TimeSpan.FromSeconds(4)) + .WithCredentials("", "") + .Build(); + await localMqttClient.ConnectAsync(options, CancellationToken.None); + } + else + { + await DisConnectLocalMqttClient("StartLocalMqtt"); + await localMqttClient.ReconnectAsync(); + } + localIsConnected = true; + await SendAesKey(); + } + catch { } + dateTime = DateTime.MinValue; + }) + { IsBackground = true }.Start(); + while (dateTime != DateTime.MinValue) + { + System.Threading.Thread.Sleep(100); + } + } } catch (Exception ex) { @@ -3279,6 +3310,7 @@ /// 杩滅▼MqttClient /// </summary> public static IMqttClient RemoteMqttClient= new MqttFactory().CreateMqttClient(); + static bool remoteIsConnected; private int IsLogin = 0; [Newtonsoft.Json.JsonIgnore] static Action actionTemp; @@ -3288,22 +3320,21 @@ /// </summary> /// <returns>The start.</returns> /// <param name="brokerName">Broker name.</param> - public static async System.Threading.Tasks.Task StartCloudMqtt() - { + public static async System.Threading.Tasks.Task StartRemoteMqtt() + { + if (remoteMqttIsConnecting + || !Shared.Common.Config.Instance.IsLogin + || Shared.Common.Config.Instance.HomeId == "" + || remoteIsConnected) + { + return; + } await System.Threading.Tasks.Task.Factory.StartNew(async () => { try { lock (RemoteMqttClient) { - if (remoteMqttIsConnecting - || !Shared.Common.Config.Instance.IsLogin - || Shared.Common.Config.Instance.HomeId == "" - || RemoteMqttClient.IsConnected) - { - return; - } - //琛ㄧず鍚庨潰灏嗚繘琛岃繛鎺� remoteMqttIsConnecting = true; @@ -3323,9 +3354,11 @@ if (RemoteMqttClient.DisconnectedHandler == null) { - RemoteMqttClient.UseDisconnectedHandler((e) => + RemoteMqttClient.UseDisconnectedHandler(async (e) => { DebugPrintLog($"杩滅▼杩炴帴鏂紑"); + await DisConnectRemoteMqttClient("StartRemoteMqtt.DisconnectedHandler"); + await StartRemoteMqtt(); }); } if (RemoteMqttClient.ConnectedHandler == null) @@ -3406,18 +3439,20 @@ var connEmqDomainPorts = connEmqDomainPort.Replace("//", "").Split(':'); var domain = connEmqDomainPorts[1]; - var port = connEmqDomainPorts[2]; - - - var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder() - .WithClientId(connEmqClientId) - .WithTcpServer(domain, int.Parse(port)) - .WithCredentials(connEmqUserName, connEmqPwd) - .WithKeepAlivePeriod(TimeSpan.FromSeconds(20)) - .WithCleanSession() - .Build(); - await RemoteMqttClient.ConnectAsync(options); - + var port = connEmqDomainPorts[2]; + + var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder() + .WithClientId(connEmqClientId) + .WithTcpServer(domain, int.Parse(port)) + .WithCredentials(connEmqUserName, connEmqPwd) + .WithKeepAlivePeriod(TimeSpan.FromSeconds(20)) + .WithCleanSession() + .WithCommunicationTimeout(TimeSpan.FromSeconds(6)) + .Build(); + await DisConnectRemoteMqttClient("StartRemoteMqtt"); + await RemoteMqttClient.ConnectAsync(options, CancellationToken.None); + + remoteIsConnected = true; } } } @@ -3438,28 +3473,40 @@ /// <summary> /// 鏂紑鏈嶅姟鍣ㄨ繛鎺� /// </summary> - public async System.Threading.Tasks.Task DisConnect(string s) + public async System.Threading.Tasks.Task DisConnectLocalMqttClient(string s) { try { - DebugPrintLog($"涓诲姩鏂紑_{s}"); - if (localMqttClient.IsConnected == true) + if (localIsConnected) { - await localMqttClient.DisconnectAsync(); - } + localIsConnected = false; + DebugPrintLog($"Local涓诲姩鏂紑_{s}"); + await localMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None); + } } catch (Exception ex) { - DebugPrintLog($"鏂紑閫氳杩炴帴鍑哄紓甯�:{ex.Message}"); + DebugPrintLog($"Local鏂紑閫氳杩炴帴鍑哄紓甯�:{ex.Message}"); } } /// <summary> /// 鏂紑杩滅▼Mqtt鐨勯摼鎺� /// </summary> - public static void DisRemoteMqttClientConnect() + public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient(string s="") { - RemoteMqttClient.DisconnectAsync(); + try + { + if (remoteIsConnected) + { + remoteIsConnected = false; + DebugPrintLog($"Remote涓诲姩鏂紑_{s}"); + await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None); + } + } + catch(Exception e) { + DebugPrintLog($"Remote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}"); + } } #endregion @@ -3492,35 +3539,35 @@ /// </summary> async System.Threading.Tasks.Task SendRemoteMsg(string topicName, byte[] message, bool retain = false) { - if (this.getGatewayBaseInfo?.gwID == null || !GateWayBaseInfomations.ContainsKey(this.getGatewayBaseInfo?.gwID)) - { - return; - } - var gateWayBaseInfomation = GateWayBaseInfomations[this.getGatewayBaseInfo?.gwID]; - ////(1)鐢熸垚[鐢ㄦ埛鍚�:瀵嗙爜] - //var userNameAndPwdStr = string.Concat(Shared.Common.Config.Instance.Guid, RemoteOperatorConsts.CAP_NUMBER, Shared.Common.Config.Instance.MD5PWD); - //DebugPrintLog($"userNameAndPwdStr锛歿userNameAndPwdStr} "); - - ////(2)灏�(1)杞垚Base64瀛楃涓�,鐢熸垚鏍煎紡[Base64(鐢ㄦ埛鍚�:瀵嗙爜)] - //var userNameAndPwdStrBaseSexFour = Convert.ToBase64String(ZigBee.Common.CommonInfo.EncodingUTF8.GetBytes(userNameAndPwdStr)); - - ////(3)灏�(2)缁х画鐢熸垚鏍煎紡[Base64(鐢ㄦ埛鍚�:瀵嗙爜):Timestamp] - //var userNameAndPwdStrBaseSexFourAndTimestamp = string.Concat(userNameAndPwdStrBaseSexFour, RemoteOperatorConsts.CAP_NUMBER, CurrentTimeStamp.ToString()); - - ////[Zigbee.Buspro]App/id(甯愬彿Id)/Base64(DES[Base64(鐢ㄦ埛鍚�:瀵嗙爜):Timestamp ]/缃戝叧鍞竴Id/杞彂缁欑綉鍏崇殑涓婚/XX/XX - ////(4)鐢熸垚涓婃姤涓婚锛屼富棰樻ā寮忛渶瑕佷负 /ZigbeeApp/id(涓诲瓙璋冭瘯甯愬彿Id)/Base64(DES[Base64(鐢ㄦ埛鍚�:瀵嗙爜):Timestamp ]/缃戝叧鍞竴Id/topicName "000204022022" GateWayId 000204022022 - //var reportTopic = string.Format("/{0}/{1}/{2}/{3}/{4}", RemoteOperatorConsts.ZIGBEE_APP_STARTS_WITH, Shared.Common.Config.Instance.Guid, userNameAndPwdStrBaseSexFourAndTimestamp, this.getGatewayBaseInfo?.gwID, topicName); - - ////鏂囦欢娴佷笉鐢ㄥ姞瀵� - //var topicEncStr = ZigBee.Common.SecuritySet.AesEncrypt(System.Text.Encoding.UTF8.GetBytes(reportTopic), gateWayBaseInfomation.AesKey); - //topicEncStr = topicEncStr.Replace("/", "[[$-MQTT_TILT_SYMBOL_REPLACE-$]]").Replace("+", "[[$-MQTT_PLUS_SYMBOL_REPLACE-$]]"); - //message = System.Text.Encoding.UTF8.GetBytes(SecuritySet.AesEncrypt(message, gateWayBaseInfomation.AesKey)); - message = SecuritySet.AesEncryptBytes(message, gateWayBaseInfomation.AesKey); - var topicEncStr = $"/ClientToZigbeeGateWay/{gateWayBaseInfomation.MacMark}/Common/{topicName}"; - //(6)鏋勫缓Mqtt闇�瑕佸彂甯冪殑鏁版嵁鍖�,鍙戝竷缁欎簯绔殑MqttBroker - if (RemoteMqttClient.IsConnected) - { - await RemoteMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topicEncStr, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); + try + { + if (this.getGatewayBaseInfo?.gwID == null || !GateWayBaseInfomations.ContainsKey(this.getGatewayBaseInfo?.gwID)) + { + return; + } + var gateWayBaseInfomation = GateWayBaseInfomations[this.getGatewayBaseInfo?.gwID]; + message = SecuritySet.AesEncryptBytes(message, gateWayBaseInfomation.AesKey); + var topicEncStr = $"/ClientToZigbeeGateWay/{gateWayBaseInfomation.MacMark}/Common/{topicName}"; + //(6)鏋勫缓Mqtt闇�瑕佸彂甯冪殑鏁版嵁鍖�,鍙戝竷缁欎簯绔殑MqttBroker + if (remoteIsConnected) + { + try + { + await RemoteMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topicEncStr, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); + } + catch (Exception e) + { + await DisConnectRemoteMqttClient(e.Message); + await StartRemoteMqtt(); + if (remoteIsConnected) + { + await RemoteMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topicEncStr, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); + } + } + } + } + catch + { } } @@ -3547,12 +3594,8 @@ } else { - DebugPrintLog($"灞�鍩熺綉鈥斺�斿彂閫佸埌缃戝叧鐨勪富棰�:{topic}_鍙戦�佸埌缃戝叧鐨勬暟鎹�:{System.Text.Encoding.UTF8.GetString(message)}_褰撳墠缃戝叧{CurrentGateWayId}"); - if (!localMqttClient.IsConnected) - { - await StartLocalMqtt(getGatewayBaseInfo.IpAddress); - } - + DebugPrintLog($"灞�鍩熺綉鈥斺�斿彂閫佸埌缃戝叧鐨勪富棰�:{topic}_鍙戦�佸埌缃戝叧鐨勬暟鎹�:{System.Text.Encoding.UTF8.GetString(message)}_褰撳墠缃戝叧{CurrentGateWayId} 鏄惁鍔犲瘑:{IsEncry}"); + if (IsEncry) { //鏂囦欢娴佷笉鐢ㄥ姞瀵� @@ -3561,11 +3604,24 @@ topic = ZigBee.Common.SecuritySet.AesEncrypt(System.Text.Encoding.UTF8.GetBytes(topic), Password); topic = topic.Replace("/", "[[$-MQTT_TILT_SYMBOL_REPLACE-$]]").Replace("+", "[[$-MQTT_PLUS_SYMBOL_REPLACE-$]]"); message = System.Text.Encoding.UTF8.GetBytes(SecuritySet.AesEncrypt(message, password)); - DebugPrintLog($"灞�鍩熺綉鈥斺�斿彂閫佸埌缃戝叧鐨勪富棰橈紙绉樻枃锛�:{topic}_褰撳墠绉橀挜{Password}_鍙戦�佸埌缃戝叧鐨勬暟鎹紙绉樻枃锛�:{System.Text.Encoding.UTF8.GetString(message)}_褰撳墠缃戝叧{CurrentGateWayId}_{System.DateTime.Now.ToString()}"); } - } - - await localMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topic, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Retain = retain }); + } + if (localIsConnected) + { + try + { + await localMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topic, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Retain = retain }); + } + catch(Exception e) + { + await DisConnectLocalMqttClient(e.Message); + await StartLocalMqtt("ReConnect"); + if (localIsConnected) + { + await localMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topic, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Retain = retain }); + } + } + } } } catch (Exception ex) -- Gitblit v1.8.0