From b88b2a50839d963dc3e39c055817e8d1f9c7843d Mon Sep 17 00:00:00 2001 From: iioter <535915157@qq.com> Date: Sat, 1 Jun 2024 09:14:17 +0800 Subject: [PATCH] =?UTF-8?q?mqtt=E7=A6=BB=E7=BA=BF=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E3=80=81=E9=80=9A=E7=BD=91=E7=BB=AD=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Export_DeviceSettings_本地.xlsx | Bin 10883 -> 0 bytes .../BasicData/Controllers/DeviceController.cs | 3 +- IoTGateway/IoTGateway.csproj | 10 +-- Plugins/Plugin/MyMqttClient.cs | 79 ++++++++++-------- Plugins/Plugin/Plugin.csproj | 3 +- iotgateway.net_bakup_202406010912327657.xlsx | Bin 0 -> 11056 bytes 6 files changed, 50 insertions(+), 45 deletions(-) delete mode 100644 Export_DeviceSettings_本地.xlsx create mode 100644 iotgateway.net_bakup_202406010912327657.xlsx diff --git a/Export_DeviceSettings_本地.xlsx b/Export_DeviceSettings_本地.xlsx deleted file mode 100644 index d833c9922245616e1bbff45895a9be5ea659eac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10883 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 diff --git a/IoTGateway/Areas/BasicData/Controllers/DeviceController.cs b/IoTGateway/Areas/BasicData/Controllers/DeviceController.cs index 7fe64cc..f2a8550 100644 --- a/IoTGateway/Areas/BasicData/Controllers/DeviceController.cs +++ b/IoTGateway/Areas/BasicData/Controllers/DeviceController.cs @@ -259,8 +259,7 @@ namespace IoTGateway.Controllers var data = myExporter.Export(); string ContentType = "application/vnd.ms-excel"; - string exportName = "DeviceSettings"; - exportName = $"Export_{exportName}_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.xlsx"; + string exportName = $"iotgateway.net_bakup_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.xlsx"; FileContentResult Result = new FileContentResult(data, ContentType); Result.FileDownloadName = exportName; return Result; diff --git a/IoTGateway/IoTGateway.csproj b/IoTGateway/IoTGateway.csproj index 17e1757..2b5fed3 100644 --- a/IoTGateway/IoTGateway.csproj +++ b/IoTGateway/IoTGateway.csproj @@ -16,11 +16,11 @@ - - - - - + + + + + diff --git a/Plugins/Plugin/MyMqttClient.cs b/Plugins/Plugin/MyMqttClient.cs index ad372d3..93348e2 100644 --- a/Plugins/Plugin/MyMqttClient.cs +++ b/Plugins/Plugin/MyMqttClient.cs @@ -10,6 +10,7 @@ using PluginInterface.IoTSharp; using PluginInterface.HuaWeiRoma; using PluginInterface.ThingsBoard; using Microsoft.Extensions.Logging; +using MQTTnet.Extensions.ManagedClient; namespace Plugin { @@ -19,9 +20,9 @@ namespace Plugin //private readonly ReferenceNodeManager? _uaNodeManager; private SystemConfig _systemConfig; - private MqttClientOptions _options; + private ManagedMqttClientOptions _options; public bool IsConnected => (Client.IsConnected); - private IMqttClient? Client { get; set; } + private IManagedMqttClient? Client { get; set; } public event EventHandler OnExcRpc; public event EventHandler OnReceiveAttributes; private readonly string _tbRpcTopic = "v1/gateway/rpc"; @@ -43,33 +44,37 @@ namespace Plugin { Client.Dispose(); } - Client = new MqttFactory().CreateMqttClient(); + Client = new MqttFactory().CreateManagedMqttClient(); await using var dc = new DataContext(IoTBackgroundService.connnectSetting, IoTBackgroundService.DbType); _systemConfig = dc.Set().First(); #region ClientOptions - _options = new MqttClientOptionsBuilder() - .WithClientId(string.IsNullOrEmpty(_systemConfig.ClientId) - ? Guid.NewGuid().ToString() - : _systemConfig.ClientId) - .WithTcpServer(_systemConfig.MqttIp, _systemConfig.MqttPort) - .WithCredentials(_systemConfig.MqttUName, _systemConfig.MqttUPwd) - .WithTimeout(TimeSpan.FromSeconds(30)) - .WithKeepAlivePeriod(TimeSpan.FromSeconds(60)) - .WithProtocolVersion(MqttProtocolVersion.V311) - .WithCleanSession(true) + + _options = new ManagedMqttClientOptionsBuilder() + .WithAutoReconnectDelay(TimeSpan.FromSeconds(5)) + .WithMaxPendingMessages(100000) + .WithClientOptions(new MqttClientOptionsBuilder() + .WithClientId(string.IsNullOrEmpty(_systemConfig.ClientId) + ? Guid.NewGuid().ToString() + : _systemConfig.ClientId) + .WithTcpServer(_systemConfig.MqttIp, _systemConfig.MqttPort) + .WithCredentials(_systemConfig.MqttUName, _systemConfig.MqttUPwd) + .WithTimeout(TimeSpan.FromSeconds(30)) + .WithKeepAlivePeriod(TimeSpan.FromSeconds(60)) + .WithProtocolVersion(MqttProtocolVersion.V311) + .WithCleanSession(true) + .Build()) .Build(); #endregion + Client.ConnectedAsync += Client_ConnectedAsync; Client.DisconnectedAsync += Client_DisconnectedAsync; Client.ApplicationMessageReceivedAsync += Client_ApplicationMessageReceivedAsync; - if(Client.ConnectAsync(_options).IsCompletedSuccessfully) ; - { - _logger.LogInformation("MQTT WAITING FOR APPLICATION MESSAGES"); - } + await Client.StartAsync(_options); + + _logger.LogInformation("MQTT WAITING FOR APPLICATION MESSAGES"); - } catch (Exception ex) { @@ -129,7 +134,7 @@ namespace Plugin try { _logger.LogError($"MQTT DISCONNECTED WITH SERVER "); - await Client.ConnectAsync(_options); + //await Client.ConnectAsync(_options); } catch (Exception ex) { @@ -259,7 +264,7 @@ namespace Plugin private async Task ResponseTbRpcAsync(TBRpcResponse tBRpcResponse) { - await Client.PublishAsync(new MqttApplicationMessageBuilder() + await Client.EnqueueAsync(new MqttApplicationMessageBuilder() .WithTopic(_tbRpcTopic) .WithPayload(JsonConvert.SerializeObject(tBRpcResponse)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce).Build()); @@ -268,7 +273,7 @@ namespace Plugin private async Task ResponseTcRpcAsync(TCRpcRequest tCRpcResponse) { var topic = $"command/reply/{tCRpcResponse.RequestData.RequestId}"; - await Client.PublishAsync(new MqttApplicationMessageBuilder() + await Client.EnqueueAsync(new MqttApplicationMessageBuilder() .WithTopic(topic) .WithPayload(JsonConvert.SerializeObject(tCRpcResponse)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); @@ -278,7 +283,7 @@ namespace Plugin { //var responseTopic = $"/devices/{deviceid}/rpc/response/{methodName}/{rpcid}"; var topic = $"devices/{rpcResult.DeviceId}/rpc/response/{rpcResult.Method}/{rpcResult.ResponseId}"; - await Client.PublishAsync(new MqttApplicationMessageBuilder() + await Client.EnqueueAsync(new MqttApplicationMessageBuilder() .WithTopic(topic) .WithPayload(JsonConvert.SerializeObject(rpcResult)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); @@ -316,7 +321,7 @@ namespace Plugin //Message: {"Device A":{"attribute1":"value1", "attribute2": 42}, "Device B":{"attribute1":"value1", "attribute2": 42} try { - return Client.PublishAsync(new MqttApplicationMessageBuilder() + return Client.EnqueueAsync(new MqttApplicationMessageBuilder() .WithTopic($"devices/{deviceName}/attributes").WithPayload(JsonConvert.SerializeObject(obj)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce) .Build()); @@ -331,14 +336,14 @@ namespace Plugin public async Task UploadIsTelemetryDataAsync(string deviceName, object obj) { - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"devices/{deviceName}/telemetry") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"devices/{deviceName}/telemetry") .WithPayload(JsonConvert.SerializeObject(obj)).Build()); } public async Task UploadTcTelemetryDataAsync(string deviceName, object obj) { var toSend = new Dictionary { { deviceName, obj } }; - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"gateway/attributes") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"gateway/attributes") .WithPayload(JsonConvert.SerializeObject(toSend)).WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); } @@ -365,7 +370,7 @@ namespace Plugin Devices = hwTelemetry }; - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"/v1/devices/{_systemConfig.GatewayName}/datas") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"/v1/devices/{_systemConfig.GatewayName}/datas") .WithPayload(JsonConvert.SerializeObject(hwTelemetrys)).WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); } @@ -433,7 +438,7 @@ namespace Plugin { "client", true }, { "key", args[0] } }; - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"v1/gateway/attributes/request") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"v1/gateway/attributes/request") .WithPayload(JsonConvert.SerializeObject(tbRequestData)).WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); break; case IoTPlatformType.IoTSharp: @@ -443,7 +448,7 @@ namespace Plugin keys.Add(anySide ? "anySide" : "server", string.Join(",", args)); await Client.SubscribeAsync($"devices/{deviceName}/attributes/response/{id}", MqttQualityOfServiceLevel.ExactlyOnce); - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic) + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic(topic) .WithPayload(JsonConvert.SerializeObject(keys)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); break; @@ -520,7 +525,7 @@ namespace Plugin switch (_systemConfig.IoTPlatformType) { case IoTPlatformType.ThingsBoard: - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("v1/gateway/telemetry") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic("v1/gateway/telemetry") .WithPayload(JsonConvert.SerializeObject(sendModel)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce).Build()); break; @@ -591,7 +596,7 @@ namespace Plugin case IoTPlatformType.ThingsBoard: case IoTPlatformType.IoTSharp: case IoTPlatformType.IoTGateway: - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("v1/gateway/connect") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic("v1/gateway/connect") .WithPayload(JsonConvert.SerializeObject(new Dictionary { { "device", DeviceName } })) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce).Build()); @@ -605,7 +610,7 @@ namespace Plugin case IoTPlatformType.OneNET: break; case IoTPlatformType.ThingsCloud: - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("gateway/connect") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic("gateway/connect") .WithPayload(JsonConvert.SerializeObject(new Dictionary { { "device", DeviceName } })) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); @@ -625,7 +630,7 @@ namespace Plugin } } }; - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"/v1/devices/{_systemConfig.GatewayName}/topo/update") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"/v1/devices/{_systemConfig.GatewayName}/topo/update") .WithPayload(JsonConvert.SerializeObject(deviceOnLine)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); break; @@ -646,7 +651,7 @@ namespace Plugin case IoTPlatformType.ThingsBoard: case IoTPlatformType.IoTSharp: case IoTPlatformType.IoTGateway: - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"v1/gateway/disconnect") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"v1/gateway/disconnect") .WithPayload(JsonConvert.SerializeObject(new Dictionary { { "device", DeviceName } })) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce).Build()); @@ -660,7 +665,7 @@ namespace Plugin case IoTPlatformType.OneNET: break; case IoTPlatformType.ThingsCloud: - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"gateway/disconnect") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"gateway/disconnect") .WithPayload(JsonConvert.SerializeObject(new Dictionary { { "device", DeviceName } })) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); @@ -680,7 +685,7 @@ namespace Plugin } } }; - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic($"/v1/devices/{_systemConfig.GatewayName}/topo/update") + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic($"/v1/devices/{_systemConfig.GatewayName}/topo/update") .WithPayload(JsonConvert.SerializeObject(deviceOnLine)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); break; @@ -715,7 +720,7 @@ namespace Plugin ProductType = "A_n" } ); - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic) + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic(topic) .WithPayload(JsonConvert.SerializeObject(addDeviceDto)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); break; @@ -753,7 +758,7 @@ namespace Plugin ProductType = "A_n" } }; - await Client.PublishAsync(new MqttApplicationMessageBuilder().WithTopic(topic) + await Client.EnqueueAsync(new MqttApplicationMessageBuilder().WithTopic(topic) .WithPayload(JsonConvert.SerializeObject(deleteDeviceDto)) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build()); } diff --git a/Plugins/Plugin/Plugin.csproj b/Plugins/Plugin/Plugin.csproj index 479ba63..efb18a4 100644 --- a/Plugins/Plugin/Plugin.csproj +++ b/Plugins/Plugin/Plugin.csproj @@ -9,7 +9,8 @@ - + + diff --git a/iotgateway.net_bakup_202406010912327657.xlsx b/iotgateway.net_bakup_202406010912327657.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c5efd1027bc82e8d88a1f8583a765645263be98d GIT binary patch literal 11056 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 literal 0 HcmV?d00001