diff --git a/doc/img/design_model.png b/doc/img/design_model.png index 207d690..d55b18a 100644 Binary files a/doc/img/design_model.png and b/doc/img/design_model.png differ diff --git a/simples/JT808.DotNetty.SimpleClient/Program.cs b/simples/JT808.DotNetty.SimpleClient/Program.cs index 2f549bb..f8cf3ca 100644 --- a/simples/JT808.DotNetty.SimpleClient/Program.cs +++ b/simples/JT808.DotNetty.SimpleClient/Program.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; +using JT808.Protocol; using JT808.Protocol.MessageBody; using System.Text; using System.Threading.Tasks; @@ -29,7 +30,8 @@ namespace JT808.DotNetty.SimpleClient options.AddConsole(); options.SetMinimumLevel(LogLevel.Trace); }); - services.AddJT808Client(); + services.AddJT808Configure() + .AddJT808Client(); services.AddHostedService(); }); await serverHostBuilder.RunConsoleAsync(); diff --git a/src/JT808.DotNetty.CleintBenchmark/Program.cs b/src/JT808.DotNetty.CleintBenchmark/Program.cs index de57c88..45d5d8f 100644 --- a/src/JT808.DotNetty.CleintBenchmark/Program.cs +++ b/src/JT808.DotNetty.CleintBenchmark/Program.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using System; using System.Threading.Tasks; +using JT808.Protocol; using JT808.DotNetty.Client; using JT808.DotNetty.CleintBenchmark.Configs; using JT808.DotNetty.CleintBenchmark.Services; @@ -39,7 +40,8 @@ namespace JT808.DotNetty.CleintBenchmark services.Configure(hostContext.Configuration.GetSection("ClientBenchmarkOptions")); services.AddSingleton(); services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); - services.AddJT808Client(); + services.AddJT808Configure() + .AddJT808Client(); services.AddHostedService(); services.AddHostedService(); }); diff --git a/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs b/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs index 9550e2f..aa22498 100644 --- a/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs +++ b/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs @@ -9,15 +9,14 @@ namespace JT808.DotNetty.Client { public static class JT808ClientDotnettyExtensions { - public static IServiceCollection AddJT808Client(this IServiceCollection serviceDescriptors) + public static IJT808Builder AddJT808Client(this IJT808Builder jT808Builder) { - serviceDescriptors.AddJT808Configure(); - serviceDescriptors.AddSingleton(); - serviceDescriptors.AddSingleton(); - serviceDescriptors.AddSingleton(); - serviceDescriptors.AddSingleton(); - serviceDescriptors.AddHostedService(); - return serviceDescriptors; + jT808Builder.Services.AddSingleton(); + jT808Builder.Services.AddSingleton(); + jT808Builder.Services.AddSingleton(); + jT808Builder.Services.AddSingleton(); + jT808Builder.Services.AddHostedService(); + return jT808Builder; } } } diff --git a/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs b/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs index f59f2e5..601958b 100644 --- a/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs +++ b/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs @@ -1,4 +1,5 @@ -using DotNetty.Transport.Channels; +using DotNetty.Buffers; +using DotNetty.Transport.Channels; using JT808.DotNetty.Abstractions; using JT808.DotNetty.Abstractions.Enums; using JT808.DotNetty.Core.Interfaces; @@ -96,7 +97,7 @@ namespace JT808.DotNetty.Core.Session { if(session.TransportProtocolType== JT808TransportProtocolType.tcp) { - session.Channel.WriteAndFlushAsync(new JT808Response(data)); + session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); isSuccessed = true; message = "ok"; } @@ -120,14 +121,14 @@ namespace JT808.DotNetty.Core.Session } return isSuccessed; } - public void Send(string terminalPhoneNo, byte[] data) + internal void Send(string terminalPhoneNo, byte[] data) { var session = GetSessionByTerminalPhoneNo(terminalPhoneNo); if (session != null) { if (session.TransportProtocolType == JT808TransportProtocolType.tcp) { - session.Channel.WriteAndFlushAsync(new JT808Response(data)); + session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); } else if (session.TransportProtocolType == JT808TransportProtocolType.udp) { diff --git a/src/JT808.DotNetty.Kafka/JT808ClientBuilderDefault.cs b/src/JT808.DotNetty.Kafka/JT808ClientBuilderDefault.cs new file mode 100644 index 0000000..245125c --- /dev/null +++ b/src/JT808.DotNetty.Kafka/JT808ClientBuilderDefault.cs @@ -0,0 +1,25 @@ +using JT808.DotNetty.Abstractions; +using JT808.Protocol; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Kafka +{ + internal class JT808ClientBuilderDefault : IJT808ClientBuilder + { + public IJT808Builder JT808Builder { get; } + + public JT808ClientBuilderDefault(IJT808Builder builder) + { + JT808Builder = builder; + } + + public IJT808Builder Builder() + { + return JT808Builder; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Kafka/JT808ClientKafkaExtensions.cs b/src/JT808.DotNetty.Kafka/JT808ClientKafkaExtensions.cs index b4d2faa..c03bcd9 100644 --- a/src/JT808.DotNetty.Kafka/JT808ClientKafkaExtensions.cs +++ b/src/JT808.DotNetty.Kafka/JT808ClientKafkaExtensions.cs @@ -1,4 +1,5 @@ using JT808.DotNetty.Abstractions; +using JT808.Protocol; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -7,17 +8,21 @@ namespace JT808.DotNetty.Kafka { public static class JT808ClientKafkaExtensions { + public static IJT808ClientBuilder AddJT808ClientKafka(this IJT808Builder builder) + { + return new JT808ClientBuilderDefault(builder); + } /// /// /// /// /// GetSection("JT808MsgConsumerConfig") /// - public static IServiceCollection AddJT808ClientKafkaMsgConsumer(this IServiceCollection serviceDescriptors, IConfiguration configuration) + public static IJT808ClientBuilder AddMsgConsumer(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) { - serviceDescriptors.Configure(configuration.GetSection("JT808MsgConsumerConfig")); - serviceDescriptors.TryAddSingleton(); - return serviceDescriptors; + jT808ClientBuilder.JT808Builder.Services.Configure(configuration.GetSection("JT808MsgConsumerConfig")); + jT808ClientBuilder.JT808Builder.Services.TryAddSingleton(); + return jT808ClientBuilder; } /// /// @@ -25,11 +30,11 @@ namespace JT808.DotNetty.Kafka /// /// GetSection("JT808MsgReplyProducerConfig") /// - public static IServiceCollection AddJT808ClientKafkaMsgReplyProducer(this IServiceCollection serviceDescriptors, IConfiguration configuration) + public static IJT808ClientBuilder AddMsgReplyProducer(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) { - serviceDescriptors.Configure(configuration.GetSection("JT808MsgReplyProducerConfig")); - serviceDescriptors.TryAddSingleton(); - return serviceDescriptors; + jT808ClientBuilder.JT808Builder.Services.Configure(configuration.GetSection("JT808MsgReplyProducerConfig")); + jT808ClientBuilder.JT808Builder.Services.TryAddSingleton(); + return jT808ClientBuilder; } /// /// @@ -37,11 +42,11 @@ namespace JT808.DotNetty.Kafka /// /// GetSection("JT808SessionConsumerConfig") /// - public static IServiceCollection AddJT808ClientKafkaSessionConsumer(this IServiceCollection serviceDescriptors, IConfiguration configuration) + public static IJT808ClientBuilder AddSessionConsumer(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) { - serviceDescriptors.Configure(configuration.GetSection("JT808SessionConsumerConfig")); - serviceDescriptors.TryAddSingleton(); - return serviceDescriptors; + jT808ClientBuilder.JT808Builder.Services.Configure(configuration.GetSection("JT808SessionConsumerConfig")); + jT808ClientBuilder.JT808Builder.Services.TryAddSingleton(); + return jT808ClientBuilder; } } } \ No newline at end of file diff --git a/src/JT808.DotNetty.Kafka/JT808MsgConsumer.cs b/src/JT808.DotNetty.Kafka/JT808MsgConsumer.cs index 7fea180..2545d45 100644 --- a/src/JT808.DotNetty.Kafka/JT808MsgConsumer.cs +++ b/src/JT808.DotNetty.Kafka/JT808MsgConsumer.cs @@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka catch (ConsumeException ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } catch (OperationCanceledException ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } catch (Exception ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } } }, Cts.Token); diff --git a/src/JT808.DotNetty.Kafka/JT808MsgReplyConsumer.cs b/src/JT808.DotNetty.Kafka/JT808MsgReplyConsumer.cs index 09c459c..9f3f49c 100644 --- a/src/JT808.DotNetty.Kafka/JT808MsgReplyConsumer.cs +++ b/src/JT808.DotNetty.Kafka/JT808MsgReplyConsumer.cs @@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka catch (ConsumeException ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } catch (OperationCanceledException ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } catch (Exception ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } } }, Cts.Token); diff --git a/src/JT808.DotNetty.Kafka/JT808SessionConsumer.cs b/src/JT808.DotNetty.Kafka/JT808SessionConsumer.cs index 6ddb83d..d4080d7 100644 --- a/src/JT808.DotNetty.Kafka/JT808SessionConsumer.cs +++ b/src/JT808.DotNetty.Kafka/JT808SessionConsumer.cs @@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka catch (ConsumeException ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } catch (OperationCanceledException ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } catch (Exception ex) { logger.LogError(ex, TopicName); - Thread.Sleep(1000); } } }, Cts.Token); diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/JT808.DotNetty.MsgIdHandler.Test.csproj b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/JT808.DotNetty.MsgIdHandler.Test.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/JT808.DotNetty.MsgIdHandler.Test.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/Program.cs b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/Program.cs new file mode 100644 index 0000000..fd94ecb --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace JT808.DotNetty.MsgIdHandler.Test +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/JT808.DotNetty.MsgLogging.Test.csproj b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/JT808.DotNetty.MsgLogging.Test.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/JT808.DotNetty.MsgLogging.Test.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/Program.cs b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/Program.cs new file mode 100644 index 0000000..7b71d69 --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace JT808.DotNetty.MsgLogging.Test +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/JT808.DotNetty.ReplyMessage.Test.csproj b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/JT808.DotNetty.ReplyMessage.Test.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/JT808.DotNetty.ReplyMessage.Test.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/Program.cs b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/Program.cs new file mode 100644 index 0000000..567bf0f --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace JT808.DotNetty.ReplyMessage.Test +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/JT808.DotNetty.SessionNotice.Test.csproj b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/JT808.DotNetty.SessionNotice.Test.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/JT808.DotNetty.SessionNotice.Test.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/Program.cs b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/Program.cs new file mode 100644 index 0000000..60385e5 --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace JT808.DotNetty.SessionNotice.Test +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/JT808.DotNetty.Traffic.Test.csproj b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/JT808.DotNetty.Traffic.Test.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/JT808.DotNetty.Traffic.Test.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/Program.cs b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/Program.cs new file mode 100644 index 0000000..89805f0 --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace JT808.DotNetty.Traffic.Test +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/JT808.DotNetty.Transmit.Test.csproj b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/JT808.DotNetty.Transmit.Test.csproj new file mode 100644 index 0000000..21dff5c --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/JT808.DotNetty.Transmit.Test.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.2 + + + diff --git a/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/Program.cs b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/Program.cs new file mode 100644 index 0000000..bc612c0 --- /dev/null +++ b/src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace JT808.DotNetty.Transmit.Test +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandler.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandler.cs new file mode 100644 index 0000000..1285d88 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandler.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.MsgIdHandler +{ + /// + /// JT808消息Id处理程序 + /// + public interface IJT808DotNettyMsgIdHandler + { + void Processor((string TerminalNo, byte[] Data) parameter); + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandlerExtensions.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandlerExtensions.cs new file mode 100644 index 0000000..2802021 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandlerExtensions.cs @@ -0,0 +1,19 @@ +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.MsgIdHandler +{ + public static class IJT808DotNettyMsgIdHandlerExtensions + { + public static IJT808ClientBuilder AddJT808MsgIdHandler(this IJT808ClientBuilder jT808ClientBuilder) + where TJT808DotNettyMsgIdHandler: IJT808DotNettyMsgIdHandler + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808DotNettyMsgIdHandler),typeof(TJT808DotNettyMsgIdHandler)); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj new file mode 100644 index 0000000..092f4c1 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj @@ -0,0 +1,25 @@ + + + + + JT808.DotNetty.MsgIdHandler + JT808.DotNetty.MsgIdHandler + 基于JT808消息业务处理程序服务 + 基于JT808消息业务处理程序服务 + LICENSE + + + + + + + + + + + + True + + + + diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808DotNettyMsgIdHandlerHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808DotNettyMsgIdHandlerHostedService.cs new file mode 100644 index 0000000..b2209e5 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808DotNettyMsgIdHandlerHostedService.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Hosting; +using System.Threading; + +namespace JT808.DotNetty.MsgIdHandler +{ + public class JT808DotNettyMsgIdHandlerHostedService : IHostedService + { + private readonly IJT808MsgConsumer jT808MsgConsumer; + + private readonly IJT808DotNettyMsgIdHandler jT808DotNettyMsgIdHandler; + public JT808DotNettyMsgIdHandlerHostedService( + IJT808DotNettyMsgIdHandler jT808DotNettyMsgIdHandler, + IJT808MsgConsumer jT808MsgConsumer) + { + this.jT808DotNettyMsgIdHandler = jT808DotNettyMsgIdHandler; + this.jT808MsgConsumer = jT808MsgConsumer; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Subscribe(); + jT808MsgConsumer.OnMessage(jT808DotNettyMsgIdHandler.Processor); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/IJT808MsgLogging.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/IJT808MsgLogging.cs new file mode 100644 index 0000000..948836e --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/IJT808MsgLogging.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.MsgLogging +{ + /// + /// 808数据上下行日志接口 + /// + public interface IJT808MsgLogging + { + void Processor((string TerminalNo, byte[] Data) parameter, JT808MsgLoggingType jT808MsgLoggingType); + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj new file mode 100644 index 0000000..c8e79bf --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj @@ -0,0 +1,25 @@ + + + + + JT808.DotNetty.MsgLogging + JT808.DotNetty.MsgLogging + 基于JT808消息上下行日志服务 + 基于JT808消息上下行日志服务 + LICENSE + + + + + + + + + True + + + + + + + diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgDownLoggingHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgDownLoggingHostedService.cs new file mode 100644 index 0000000..f7b9dd0 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgDownLoggingHostedService.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Hosting; +using System.Threading; + +namespace JT808.DotNetty.MsgLogging +{ + public class JT808DotNettyMsgDownLoggingHostedService : IHostedService + { + private readonly IJT808MsgReplyConsumer jT808MsgReplyConsumer; + private readonly IJT808MsgLogging jT808MsgLogging; + public JT808DotNettyMsgDownLoggingHostedService( + IJT808MsgLogging jT808MsgLogging, + IJT808MsgReplyConsumer jT808MsgReplyConsumer) + { + this.jT808MsgReplyConsumer = jT808MsgReplyConsumer; + this.jT808MsgLogging = jT808MsgLogging; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + jT808MsgReplyConsumer.Subscribe(); + jT808MsgReplyConsumer.OnMessage(item=> + { + jT808MsgLogging.Processor(item, JT808MsgLoggingType.down); + }); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + jT808MsgReplyConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgLoggingExtensions.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgLoggingExtensions.cs new file mode 100644 index 0000000..d5d7f7f --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgLoggingExtensions.cs @@ -0,0 +1,20 @@ +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.MsgLogging +{ + public static class JT808DotNettyMsgLoggingExtensions + { + public static IJT808ClientBuilder AddJT808MsgLogging(this IJT808ClientBuilder jT808ClientBuilder) + where TJT808MsgLogging: IJT808MsgLogging + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808MsgLogging),typeof(TJT808MsgLogging)); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgUpLoggingHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgUpLoggingHostedService.cs new file mode 100644 index 0000000..2dea945 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgUpLoggingHostedService.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Hosting; +using System.Threading; + +namespace JT808.DotNetty.MsgLogging +{ + public class JT808DotNettyMsgUpLoggingHostedService : IHostedService + { + private readonly IJT808MsgConsumer jT808MsgConsumer; + private readonly IJT808MsgLogging jT808MsgLogging; + public JT808DotNettyMsgUpLoggingHostedService( + IJT808MsgLogging jT808MsgLogging, + IJT808MsgConsumer jT808MsgConsumer) + { + this.jT808MsgConsumer = jT808MsgConsumer; + this.jT808MsgLogging = jT808MsgLogging; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Subscribe(); + jT808MsgConsumer.OnMessage(item=> + { + jT808MsgLogging.Processor(item, JT808MsgLoggingType.up); + }); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808MsgLoggingType.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808MsgLoggingType.cs new file mode 100644 index 0000000..ae911cf --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808MsgLoggingType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.MsgLogging +{ + public enum JT808MsgLoggingType + { + /// + /// 数据上行 + /// + up, + /// + /// 数据下行 + /// + down + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj new file mode 100644 index 0000000..dd0ad9b --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj @@ -0,0 +1,24 @@ + + + + JT808.DotNetty.ReplyMessage + JT808.DotNetty.ReplyMessage + 基于JT808消息应答服务 + 基于JT808消息应答服务 + LICENSE + + + + + + + + + + + + True + + + + diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageExtensions.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageExtensions.cs new file mode 100644 index 0000000..92f7208 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageExtensions.cs @@ -0,0 +1,58 @@ +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.ReplyMessage +{ + public static class JT808DotNettyReplyMessageExtensions + { + /// + /// 独享消息应答服务(不同的消费者实例) + /// + /// + /// + public static IJT808ClientBuilder AddInprocJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + /// + /// 独享消息应答服务(不同的消费者实例) + /// + /// 自定义消息回复服务 + /// + /// + public static IJT808ClientBuilder AddInprocJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) + where TReplyMessageService : JT808DotNettyReplyMessageService + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + /// + /// 共享消息应答服务(消费者单实例) + /// + /// 自定义消息回复服务 + /// + /// + public static IJT808ClientBuilder AddShareJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) + where TReplyMessageService : JT808DotNettyReplyMessageService + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + return jT808ClientBuilder; + } + /// + /// 共享消息应答服务(消费者单实例) + /// + /// + /// + public static IJT808ClientBuilder AddShareJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + return jT808ClientBuilder; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageHostedService.cs new file mode 100644 index 0000000..36acede --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageHostedService.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Hosting; +using System.Threading; + +namespace JT808.DotNetty.ReplyMessage +{ + public class JT808DotNettyReplyMessageHostedService : IHostedService + { + private readonly IJT808MsgConsumer jT808MsgConsumer; + private readonly JT808DotNettyReplyMessageService jT808DotNettyReplyMessageService; + + public JT808DotNettyReplyMessageHostedService( + JT808DotNettyReplyMessageService jT808DotNettyReplyMessageService, + IJT808MsgConsumer jT808MsgConsumer) + { + this.jT808MsgConsumer = jT808MsgConsumer; + this.jT808DotNettyReplyMessageService = jT808DotNettyReplyMessageService; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Subscribe(); + jT808MsgConsumer.OnMessage(jT808DotNettyReplyMessageService.Processor); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs new file mode 100644 index 0000000..66975ad --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs @@ -0,0 +1,165 @@ +using JT808.DotNetty.Abstractions; +using JT808.Protocol; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; +using JT808.Protocol.MessageBody; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.ReplyMessage +{ + public class JT808DotNettyReplyMessageService + { + protected Dictionary> HandlerDict { get; } + + protected JT808Serializer JT808Serializer { get; } + protected IJT808MsgReplyProducer JT808MsgReplyProducer { get; } + public JT808DotNettyReplyMessageService( + IJT808Config jT808Config, + IJT808MsgReplyProducer jT808MsgReplyProducer) + { + this.JT808Serializer = jT808Config.GetSerializer(); + this.JT808MsgReplyProducer = jT808MsgReplyProducer; + HandlerDict = new Dictionary> { + {JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, + {JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, + {JT808MsgId.终端心跳.ToUInt16Value(), Msg0x0002}, + {JT808MsgId.终端注销.ToUInt16Value(), Msg0x0003}, + {JT808MsgId.终端注册.ToUInt16Value(), Msg0x0100}, + {JT808MsgId.位置信息汇报.ToUInt16Value(),Msg0x0200 }, + {JT808MsgId.定位数据批量上传.ToUInt16Value(),Msg0x0704 }, + {JT808MsgId.数据上行透传.ToUInt16Value(),Msg0x0900 } + }; + } + + public virtual void Processor((string TerminalNo, byte[] Data) parameter) + { + try + { + var request = JT808Serializer.HeaderDeserialize(parameter.Data); + if (HandlerDict.TryGetValue(request.Header.MsgId, out var func)) + { + var buffer = func(request); + if (buffer != null) + { + JT808MsgReplyProducer.ProduceAsync(parameter.TerminalNo, buffer); + } + } + } + catch + { + } + } + + /// + /// 终端通用应答 + /// 平台无需回复 + /// 实现自己的业务 + /// + /// + /// + public virtual byte[] Msg0x0001(JT808HeaderPackage request) + { + return null; + } + /// + /// 终端心跳 + /// + /// + /// + public virtual byte[] Msg0x0002(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 终端注销 + /// + /// + /// + public virtual byte[] Msg0x0003(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 终端注册 + /// + /// + /// + public virtual byte[] Msg0x0100(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100() + { + Code = "J" + request.Header.TerminalPhoneNo, + JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 终端鉴权 + /// + /// + /// + public virtual byte[] Msg0x0102(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 位置信息汇报 + /// + /// + /// + public virtual byte[] Msg0x0200(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 定位数据批量上传 + /// + /// + /// + public virtual byte[] Msg0x0704(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 数据上行透传 + /// + /// + /// + public virtual byte[] Msg0x0900(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj new file mode 100644 index 0000000..84a759a --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj @@ -0,0 +1,25 @@ + + + + + JT808.DotNetty.SessionNotice + JT808.DotNetty.SessionNotice + 基于JT808会话通知服务 + 基于JT808会话通知服务 + LICENSE + + + + + + + + + True + + + + + + + diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeExtensions.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeExtensions.cs new file mode 100644 index 0000000..8f9ae0b --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeExtensions.cs @@ -0,0 +1,61 @@ +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.SessionNotice +{ + public static class JT808DotNettySessionNoticeExtensions + { + /// + /// 独享消息会话通知服务(不同的消费者实例) + /// + /// + /// + public static IJT808ClientBuilder AddInprocJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + + /// + /// 独享消息会话通知服务(不同的消费者实例) + /// + /// 自定义会话通知服务 + /// + /// + public static IJT808ClientBuilder AddInprocJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) + where TSessionNoticeService : JT808DotNettySessionNoticeService + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + + /// + /// 共享消息会话通知服务(消费者单实例) + /// + /// 自定义会话通知服务 + /// + /// + public static IJT808ClientBuilder AddShareJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) + where TSessionNoticeService : JT808DotNettySessionNoticeService + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + return jT808ClientBuilder; + } + + /// + /// 共享消息会话通知服务(消费者单实例) + /// + /// + /// + public static IJT808ClientBuilder AddShareJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + return jT808ClientBuilder; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeHostedService.cs new file mode 100644 index 0000000..a610ade --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeHostedService.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using JT808.DotNetty.Abstractions; +using JT808.Protocol; +using JT808.Protocol.Interfaces; +using Microsoft.Extensions.Hosting; +using System.Threading; + +namespace JT808.DotNetty.SessionNotice +{ + public class JT808DotNettySessionNoticeHostedService : IHostedService + { + private readonly JT808DotNettySessionNoticeService jT808DotNettySessionNoticeService; + private readonly IJT808SessionConsumer jT808SessionConsumer; + public JT808DotNettySessionNoticeHostedService( + IJT808SessionConsumer jT808SessionConsumer, + JT808DotNettySessionNoticeService jT808DotNettySessionNoticeService) + { + this.jT808DotNettySessionNoticeService = jT808DotNettySessionNoticeService; + this.jT808SessionConsumer = jT808SessionConsumer; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + jT808SessionConsumer.Subscribe(); + jT808SessionConsumer.OnMessage(jT808DotNettySessionNoticeService.Processor); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + jT808SessionConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeService.cs new file mode 100644 index 0000000..a4f164b --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeService.cs @@ -0,0 +1,25 @@ +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.SessionNotice +{ + public class JT808DotNettySessionNoticeService + { + protected ILogger logger { get; } + public JT808DotNettySessionNoticeService(ILoggerFactory loggerFactory) + { + logger = loggerFactory.CreateLogger("JT808DotNettySessionNoticeService"); + } + public virtual void Processor((string Notice, string TerminalNo) parameter) + { + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug($"{parameter.Notice}-{parameter.TerminalNo}"); + } + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj new file mode 100644 index 0000000..99be375 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj @@ -0,0 +1,27 @@ + + + + JT808.DotNetty.Traffic + JT808.DotNetty.Traffic + 基于JT808设备流量统计服务 + 基于JT808设备流量统计服务 + LICENSE + + + + + + + + + + + + True + + + + + + + diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficService.cs new file mode 100644 index 0000000..1dde491 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficService.cs @@ -0,0 +1,32 @@ +using Microsoft.Extensions.Configuration; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Traffic +{ + public class JT808DotNettyTrafficService:IDisposable + { + private readonly CSRedis.CSRedisClient redisClien; + public JT808DotNettyTrafficService(IConfiguration configuration) + { + redisClien = new CSRedis.CSRedisClient(configuration.GetConnectionString("TrafficRedisHost")); + TrafficRedisClient.Initialization(redisClien); + } + + public void Dispose() + { + redisClien.Dispose(); + } + + /// + /// 按设备每天统计sim卡流量 + /// + /// + /// + public void Processor(string terminalNo,int len) + { + TrafficRedisClient.HIncrBy(terminalNo, DateTime.Now.ToString("yyyyMMdd"), len); + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceExtensions.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceExtensions.cs new file mode 100644 index 0000000..fdeac49 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceExtensions.cs @@ -0,0 +1,34 @@ +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Traffic +{ + public static class JT808DotNettyTrafficServiceExtensions + { + /// + /// 独享消息流量统计服务(不同的消费者实例) + /// + /// + /// + public static IJT808ClientBuilder AddInprocJT808Traffic(this IJT808ClientBuilder jT808ClientBuilder) + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + jT808ClientBuilder.JT808Builder.Services.AddHostedService(); + return jT808ClientBuilder; + } + /// + /// 共享消息流量统计服务(消费者单实例) + /// + /// + /// + /// + public static IJT808ClientBuilder AddShareJT808Traffic(this IJT808ClientBuilder jT808ClientBuilder) + { + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + return jT808ClientBuilder; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceHostedService.cs new file mode 100644 index 0000000..bb83417 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceHostedService.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Hosting; +using System.Threading; + +namespace JT808.DotNetty.Traffic +{ + public class JT808DotNettyTrafficServiceHostedService : IHostedService + { + private readonly IJT808MsgConsumer jT808MsgConsumer; + private readonly JT808DotNettyTrafficService jT808DotNettyTrafficService; + + public JT808DotNettyTrafficServiceHostedService( + JT808DotNettyTrafficService jT808DotNettyTrafficService, + IJT808MsgConsumer jT808MsgConsumer) + { + this.jT808MsgConsumer = jT808MsgConsumer; + this.jT808DotNettyTrafficService = jT808DotNettyTrafficService; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Subscribe(); + jT808MsgConsumer.OnMessage((item)=> { + jT808DotNettyTrafficService.Processor(item.TerminalNo, item.Data.Length); + }); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + jT808MsgConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/TrafficRedisClient.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/TrafficRedisClient.cs new file mode 100644 index 0000000..675dd10 --- /dev/null +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/TrafficRedisClient.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Traffic +{ + class TrafficRedisClient: RedisHelper + { } +} diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj index f7b1f9c..cd826a9 100644 --- a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj @@ -1,30 +1,29 @@ - + - - - JT808.DotNetty.Transmit - JT808.DotNetty.Transmit - 基于DotNetty实现的JT808数据转发服务 - 基于DotNetty实现的JT808数据转发服务 - LICENSE - - - - - - - - - - - - - True - - - - - - - - + + + JT808.DotNetty.Transmit + JT808.DotNetty.Transmit + 基于DotNetty实现的JT808数据转发服务 + 基于DotNetty实现的JT808数据转发服务 + LICENSE + + + + + + + + + + + + + + + + True + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitExtensions.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitExtensions.cs index eef4fbb..a5084b3 100644 --- a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitExtensions.cs +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitExtensions.cs @@ -8,16 +8,34 @@ using JT808.DotNetty.Transmit; using Microsoft.Extensions.Configuration; using JT808.DotNetty.Transmit.Configs; -namespace JT808.DotNetty.Client +namespace JT808.DotNetty.Transmit { public static class JT808DotNettyTransmitExtensions { - public static IJT808ClientBuilder AddJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder,IConfiguration configuration) + /// + /// 独享转发服务(不同的消费者实例) + /// + /// + /// + /// + public static IJT808ClientBuilder AddInprocJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder,IConfiguration configuration) { jT808ClientBuilder.JT808Builder.Services.Configure(configuration.GetSection("RemoteServerOptions")); jT808ClientBuilder.JT808Builder.Services.AddSingleton(); jT808ClientBuilder.JT808Builder.Services.AddHostedService(); return jT808ClientBuilder; } + /// + /// 共享转发服务(消费者单实例) + /// + /// + /// + /// + public static IJT808ClientBuilder AddShareJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) + { + jT808ClientBuilder.JT808Builder.Services.Configure(configuration.GetSection("RemoteServerOptions")); + jT808ClientBuilder.JT808Builder.Services.AddSingleton(); + return jT808ClientBuilder; + } } } diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitHostedService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitHostedService.cs index d9e3b7a..b050198 100644 --- a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitHostedService.cs +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitHostedService.cs @@ -37,9 +37,7 @@ namespace JT808.DotNetty.Transmit public Task StartAsync(CancellationToken cancellationToken) { jT808MsgConsumer.Subscribe(); - jT808MsgConsumer.OnMessage(item=> { - jT808DotNettyTransmitService.SendAsync(item.TerminalNo,item.Data); - }); + jT808MsgConsumer.OnMessage(jT808DotNettyTransmitService.SendAsync); return Task.CompletedTask; } diff --git a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitService.cs b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitService.cs index 2bbd8b1..260a7c2 100644 --- a/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitService.cs +++ b/src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitService.cs @@ -28,7 +28,7 @@ namespace JT808.DotNetty.Transmit this.optionsMonitor = optionsMonitor; InitialDispatcherClient(); } - public void SendAsync(string terminalNo,byte[] data) + public void SendAsync((string TerminalNo, byte[] Data) parameter) { if (optionsMonitor.CurrentValue.DataTransfer != null) { @@ -40,11 +40,11 @@ namespace JT808.DotNetty.Transmit { if (allClientChannel.Open) { - if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) + if (logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug($"转发所有数据到该网关{item.Host}"); } - allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); + allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data)); } else { @@ -58,24 +58,24 @@ namespace JT808.DotNetty.Transmit } else { - if (item.TerminalNos.Contains(terminalNo) && channeldic.TryGetValue($"{terminalNo}_{item.Host}", out var clientChannel)) + if (item.TerminalNos.Contains(parameter.TerminalNo) && channeldic.TryGetValue($"{parameter.TerminalNo}_{item.Host}", out var clientChannel)) { try { if (clientChannel.Open) { if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) - logger.LogDebug($"转发{terminalNo}到该网关{item.Host}"); - clientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); + logger.LogDebug($"转发{parameter.TerminalNo}到该网关{item.Host}"); + clientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data)); } else { - logger.LogError($"{item.Host},{terminalNo}链接已关闭"); + logger.LogError($"{item.Host},{parameter.TerminalNo}链接已关闭"); } } catch (Exception ex) { - logger.LogError($"{item.Host},{terminalNo}发送数据出现异常:{ex}"); + logger.LogError($"{item.Host},{parameter.TerminalNo}发送数据出现异常:{ex}"); } } } diff --git a/src/JT808.DotNetty.sln b/src/JT808.DotNetty.sln index a97688e..25975a2 100644 --- a/src/JT808.DotNetty.sln +++ b/src/JT808.DotNetty.sln @@ -45,7 +45,29 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.RabbitMQ.Tes EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{7F077BD5-8E4C-402A-9E24-DECAF251A420}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Transmit", "JT808.DotNetty.Services\JT808.DotNetty.Transmit\JT808.DotNetty.Transmit.csproj", "{A3A0D0E1-F9AC-4004-A306-9491D2EA6883}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Transmit", "JT808.DotNetty.Services\JT808.DotNetty.Transmit\JT808.DotNetty.Transmit.csproj", "{0E2326F8-4C96-446B-9B91-285635870171}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.ReplyMessage", "JT808.DotNetty.Services\JT808.DotNetty.ReplyMessage\JT808.DotNetty.ReplyMessage.csproj", "{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.ReplyMessage.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.ReplyMessage.Test\JT808.DotNetty.ReplyMessage.Test.csproj", "{4C01B160-543B-4659-B99C-B9C774B3DEE9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Traffic", "JT808.DotNetty.Services\JT808.DotNetty.Traffic\JT808.DotNetty.Traffic.csproj", "{3C34D0D2-C9A5-42BB-830B-922C69AE74AE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Traffic.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.Traffic.Test\JT808.DotNetty.Traffic.Test.csproj", "{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.SessionNotice", "JT808.DotNetty.Services\JT808.DotNetty.SessionNotice\JT808.DotNetty.SessionNotice.csproj", "{A09B9BF7-FEC6-4D6C-A635-77DD445A4082}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.SessionNotice.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.SessionNotice.Test\JT808.DotNetty.SessionNotice.Test.csproj", "{81DE821F-0780-44B4-B02D-72998ECA6BD2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgLogging", "JT808.DotNetty.Services\JT808.DotNetty.MsgLogging\JT808.DotNetty.MsgLogging.csproj", "{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Transmit.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.Transmit.Test\JT808.DotNetty.Transmit.Test.csproj", "{EE5EF8D4-8B61-4706-81BB-412F643E8F51}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgLogging.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.MsgLogging.Test\JT808.DotNetty.MsgLogging.Test.csproj", "{591D7974-9AF5-41E2-9B3C-B271EE682943}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgIdHandler", "JT808.DotNetty.Services\JT808.DotNetty.MsgIdHandler\JT808.DotNetty.MsgIdHandler.csproj", "{F361C47C-0511-4383-99C1-A169D4E8F4ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgIdHandler.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.MsgIdHandler.Test\JT808.DotNetty.MsgIdHandler.Test.csproj", "{B5C872E6-4187-479A-B3BA-CCE76A225DE9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -125,10 +147,54 @@ Global {D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Debug|Any CPU.Build.0 = Debug|Any CPU {D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Release|Any CPU.Build.0 = Release|Any CPU - {A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Release|Any CPU.Build.0 = Release|Any CPU + {0E2326F8-4C96-446B-9B91-285635870171}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E2326F8-4C96-446B-9B91-285635870171}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E2326F8-4C96-446B-9B91-285635870171}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E2326F8-4C96-446B-9B91-285635870171}.Release|Any CPU.Build.0 = Release|Any CPU + {2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Release|Any CPU.Build.0 = Release|Any CPU + {4C01B160-543B-4659-B99C-B9C774B3DEE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C01B160-543B-4659-B99C-B9C774B3DEE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C01B160-543B-4659-B99C-B9C774B3DEE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C01B160-543B-4659-B99C-B9C774B3DEE9}.Release|Any CPU.Build.0 = Release|Any CPU + {3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Release|Any CPU.Build.0 = Release|Any CPU + {24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Release|Any CPU.Build.0 = Release|Any CPU + {A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Release|Any CPU.Build.0 = Release|Any CPU + {81DE821F-0780-44B4-B02D-72998ECA6BD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81DE821F-0780-44B4-B02D-72998ECA6BD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81DE821F-0780-44B4-B02D-72998ECA6BD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81DE821F-0780-44B4-B02D-72998ECA6BD2}.Release|Any CPU.Build.0 = Release|Any CPU + {DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Release|Any CPU.Build.0 = Release|Any CPU + {EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Release|Any CPU.Build.0 = Release|Any CPU + {591D7974-9AF5-41E2-9B3C-B271EE682943}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {591D7974-9AF5-41E2-9B3C-B271EE682943}.Debug|Any CPU.Build.0 = Debug|Any CPU + {591D7974-9AF5-41E2-9B3C-B271EE682943}.Release|Any CPU.ActiveCfg = Release|Any CPU + {591D7974-9AF5-41E2-9B3C-B271EE682943}.Release|Any CPU.Build.0 = Release|Any CPU + {F361C47C-0511-4383-99C1-A169D4E8F4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F361C47C-0511-4383-99C1-A169D4E8F4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F361C47C-0511-4383-99C1-A169D4E8F4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F361C47C-0511-4383-99C1-A169D4E8F4ED}.Release|Any CPU.Build.0 = Release|Any CPU + {B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -143,7 +209,18 @@ Global {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} {50A94BD5-5CDF-4777-AE4C-80BA769AEDAB} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} {D3CA0D73-1CCF-41BA-88D8-5BE50515CA64} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} - {A3A0D0E1-F9AC-4004-A306-9491D2EA6883} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {0E2326F8-4C96-446B-9B91-285635870171} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {2DB0F94A-2CF9-4FC0-B560-C4A7C311B225} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {4C01B160-543B-4659-B99C-B9C774B3DEE9} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {3C34D0D2-C9A5-42BB-830B-922C69AE74AE} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {A09B9BF7-FEC6-4D6C-A635-77DD445A4082} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {81DE821F-0780-44B4-B02D-72998ECA6BD2} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {DBB89A8E-D2AB-4BC9-849F-FFB8018C069E} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {EE5EF8D4-8B61-4706-81BB-412F643E8F51} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {591D7974-9AF5-41E2-9B3C-B271EE682943} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {F361C47C-0511-4383-99C1-A169D4E8F4ED} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} + {B5C872E6-4187-479A-B3BA-CCE76A225DE9} = {7F077BD5-8E4C-402A-9E24-DECAF251A420} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FC0FFCEA-E1EF-4C97-A1C5-F89418B6834B}