From 33c8fa62095d98285492cbec4fdbcba0dd8940cd Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Sun, 27 Apr 2025 16:32:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=BB=98=E8=AE=A4=E7=AB=AF?= =?UTF-8?q?=E5=88=B0=E4=BA=91=E5=8D=8F=E8=AE=AE=E6=8F=92=E4=BB=B6=E5=A4=84?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E6=94=B9=E7=94=A8=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../T1882018ProtocolPlugin.cs | 2 +- .../Services/ProtocolService.cs | 8 ++++-- .../Plugins/TcpMonitor.cs | 23 +++++++++++++----- .../Models/ServerApplicationOptions.cs | 9 +++++-- .../JiShe.CollectBus.Protocol.Test.dll | Bin 10752 -> 0 bytes .../JiShe.CollectBus.Protocol.dll | Bin 29696 -> 0 bytes .../Pages/Monitor.cshtml | 2 +- web/JiShe.CollectBus.Host/appsettings.json | 5 ++-- 8 files changed, 35 insertions(+), 14 deletions(-) delete mode 100644 web/JiShe.CollectBus.Host/JiShe.CollectBus.Protocol.Test.dll delete mode 100644 web/JiShe.CollectBus.Host/JiShe.CollectBus.Protocol.dll diff --git a/protocols/JiShe.CollectBus.Protocol.T1882018/T1882018ProtocolPlugin.cs b/protocols/JiShe.CollectBus.Protocol.T1882018/T1882018ProtocolPlugin.cs index 5aa1b1f..7e9f3a3 100644 --- a/protocols/JiShe.CollectBus.Protocol.T1882018/T1882018ProtocolPlugin.cs +++ b/protocols/JiShe.CollectBus.Protocol.T1882018/T1882018ProtocolPlugin.cs @@ -91,7 +91,7 @@ namespace JiShe.CollectBus.Protocol.T1882018 List dataUnit = new List(); //数据转发场景 10H_F1 - if (aFNStr == "10" && request.SubProtocolRequest != null && string.IsNullOrWhiteSpace(request.SubProtocolRequest.ItemCode) == false) + if (request.ItemCode == T37612012PacketItemCodeConst.AFN10HFN01H && request.SubProtocolRequest != null && string.IsNullOrWhiteSpace(request.SubProtocolRequest.ItemCode) == false) { var t188PacketHandlerName = $"{T1882018PacketItemCodeConst.BasicT1882018}_{request.SubProtocolRequest.ItemCode}_Send"; Telemetry1882018PacketResponse t645PacketResponse = null; diff --git a/protocols/JiShe.CollectBus.Protocol/Services/ProtocolService.cs b/protocols/JiShe.CollectBus.Protocol/Services/ProtocolService.cs index e391fcd..8a69307 100644 --- a/protocols/JiShe.CollectBus.Protocol/Services/ProtocolService.cs +++ b/protocols/JiShe.CollectBus.Protocol/Services/ProtocolService.cs @@ -1,10 +1,12 @@ using System.Text.RegularExpressions; +using JiShe.CollectBus.Common; using JiShe.CollectBus.Common.Consts; using JiShe.CollectBus.FreeRedis; using JiShe.CollectBus.IotSystems.Protocols; using JiShe.CollectBus.Protocol.Interfaces; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Volo.Abp; using Volo.Abp.DependencyInjection; @@ -15,12 +17,14 @@ namespace JiShe.CollectBus.Protocol.Services private readonly IFreeRedisProvider _freeRedisProvider; private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; + private readonly ServerApplicationOptions _serverApplicationOptions; - public ProtocolService(IFreeRedisProvider freeRedisProvider, IServiceProvider serviceProvider, ILogger logger) + public ProtocolService(IFreeRedisProvider freeRedisProvider, IServiceProvider serviceProvider, ILogger logger,IOptions serverApplicationOptions) { _freeRedisProvider = freeRedisProvider; _serviceProvider = serviceProvider; _logger= logger; + _serverApplicationOptions = serverApplicationOptions.Value; } /// @@ -36,7 +40,7 @@ namespace JiShe.CollectBus.Protocol.Services var keyValuePair = protocols.FirstOrDefault(a => ContainsExactPartRegex(deviceCode, a.Value.RegularExpression)); if (!keyValuePair.Key.IsNullOrWhiteSpace() || keyValuePair.Value != null) return keyValuePair.Value; if (isSpecial) throw new UserFriendlyException("The device protocol plugin does not exist!", ExceptionCode.NotFound); - var hasStandardProtocolPlugin = protocols.TryGetValue("T37612012ProtocolPlugin", out var protocolInfo); + var hasStandardProtocolPlugin = protocols.TryGetValue(_serverApplicationOptions.DefaultProtocolPlugin, out var protocolInfo); if (!hasStandardProtocolPlugin) throw new UserFriendlyException("Standard protocol plugin does not exist!", ExceptionCode.NotFound); return protocolInfo; } diff --git a/services/JiShe.CollectBus.Application/Plugins/TcpMonitor.cs b/services/JiShe.CollectBus.Application/Plugins/TcpMonitor.cs index ab813fc..03a1003 100644 --- a/services/JiShe.CollectBus.Application/Plugins/TcpMonitor.cs +++ b/services/JiShe.CollectBus.Application/Plugins/TcpMonitor.cs @@ -1,9 +1,11 @@ -using JiShe.CollectBus.IotSystems.Ammeters; +using JiShe.CollectBus.Common; +using JiShe.CollectBus.IotSystems.Ammeters; using JiShe.CollectBus.IotSystems.Devices; using JiShe.CollectBus.Kafka.Producer; using JiShe.CollectBus.Protocol.Interfaces; using JiShe.CollectBus.Protocol3761; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using System; using System.Threading.Tasks; using TouchSocket.Core; @@ -22,6 +24,7 @@ namespace JiShe.CollectBus.Plugins private readonly IDistributedCache _ammeterInfoCache; private readonly IServiceProvider _serviceProvider; private readonly IProtocolService _protocolService; + private readonly ServerApplicationOptions _serverApplicationOptions; /// /// @@ -31,10 +34,15 @@ namespace JiShe.CollectBus.Plugins /// /// /// + /// + /// public TcpMonitor(IProducerService producerService, ILogger logger, IRepository deviceRepository, - IDistributedCache ammeterInfoCache, IServiceProvider serviceProvider, IProtocolService protocolService) + IDistributedCache ammeterInfoCache, + IServiceProvider serviceProvider, + IOptions serverApplicationOptions, + IProtocolService protocolService) { _producerService = producerService; _logger = logger; @@ -42,17 +50,20 @@ namespace JiShe.CollectBus.Plugins _ammeterInfoCache = ammeterInfoCache; _serviceProvider= serviceProvider; _protocolService = protocolService; - - + _serverApplicationOptions = serverApplicationOptions.Value; } public async Task OnTcpReceived(ITcpSession client, ReceivedDataEventArgs e) { + if (string.IsNullOrWhiteSpace(_serverApplicationOptions.DefaultProtocolPlugin)) + { + _logger.LogError($"请配置默认的端到云协议插件!"); + } var messageHexString = Convert.ToHexString(e.ByteBlock.Span); - var protocolPlugin = await _protocolService.GetProtocolServiceAsync("376.1"); + var protocolPlugin = await _protocolService.GetProtocolServiceAsync(_serverApplicationOptions.DefaultProtocolPlugin); if (protocolPlugin == null) { - _logger.LogError("协议不存在!"); + _logger.LogError($"默认的端到云协议插件{_serverApplicationOptions.DefaultProtocolPlugin}不存在!"); } var tcpSessionClient = (ITcpSessionClient)client; diff --git a/shared/JiShe.CollectBus.Common/Models/ServerApplicationOptions.cs b/shared/JiShe.CollectBus.Common/Models/ServerApplicationOptions.cs index 8aed32b..228dec0 100644 --- a/shared/JiShe.CollectBus.Common/Models/ServerApplicationOptions.cs +++ b/shared/JiShe.CollectBus.Common/Models/ServerApplicationOptions.cs @@ -18,12 +18,12 @@ /// /// 首次采集时间 /// - public DateTime? FirstCollectionTime { get; set; } + public DateTime? FirstCollectionTime { get; set; } /// /// 自动验证时间 /// - public required string AutomaticVerificationTime { get; set;} + public required string AutomaticVerificationTime { get; set; } /// /// 自动获取终端版时间 @@ -34,5 +34,10 @@ /// 自动获取远程通信模块(SIM)版本时间 /// public required string AutomaticGetTelematicsModuleTime { get; set; } + + /// + /// 默认协议插件 + /// + public required string DefaultProtocolPlugin { get; set; } } } diff --git a/web/JiShe.CollectBus.Host/JiShe.CollectBus.Protocol.Test.dll b/web/JiShe.CollectBus.Host/JiShe.CollectBus.Protocol.Test.dll deleted file mode 100644 index 01d684251570f24bf60a69c6cb6c117bf328873d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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后端服务 - +