2.增加设备会话通知服务 3.增加设备流量统计服务 4.完善数据转发服务 5.增加消息应答服务 6.增加消息业务处理服务tags/v2.2.0
@@ -2,6 +2,7 @@ | |||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using System; | using System; | ||||
using JT808.Protocol; | |||||
using JT808.Protocol.MessageBody; | using JT808.Protocol.MessageBody; | ||||
using System.Text; | using System.Text; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
@@ -29,7 +30,8 @@ namespace JT808.DotNetty.SimpleClient | |||||
options.AddConsole(); | options.AddConsole(); | ||||
options.SetMinimumLevel(LogLevel.Trace); | options.SetMinimumLevel(LogLevel.Trace); | ||||
}); | }); | ||||
services.AddJT808Client(); | |||||
services.AddJT808Configure() | |||||
.AddJT808Client(); | |||||
services.AddHostedService<UpService>(); | services.AddHostedService<UpService>(); | ||||
}); | }); | ||||
await serverHostBuilder.RunConsoleAsync(); | await serverHostBuilder.RunConsoleAsync(); | ||||
@@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging; | |||||
using NLog.Extensions.Logging; | using NLog.Extensions.Logging; | ||||
using System; | using System; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using JT808.Protocol; | |||||
using JT808.DotNetty.Client; | using JT808.DotNetty.Client; | ||||
using JT808.DotNetty.CleintBenchmark.Configs; | using JT808.DotNetty.CleintBenchmark.Configs; | ||||
using JT808.DotNetty.CleintBenchmark.Services; | using JT808.DotNetty.CleintBenchmark.Services; | ||||
@@ -39,7 +40,8 @@ namespace JT808.DotNetty.CleintBenchmark | |||||
services.Configure<ClientBenchmarkOptions>(hostContext.Configuration.GetSection("ClientBenchmarkOptions")); | services.Configure<ClientBenchmarkOptions>(hostContext.Configuration.GetSection("ClientBenchmarkOptions")); | ||||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | services.AddSingleton<ILoggerFactory, LoggerFactory>(); | ||||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | ||||
services.AddJT808Client(); | |||||
services.AddJT808Configure() | |||||
.AddJT808Client(); | |||||
services.AddHostedService<CleintBenchmarkHostedService>(); | services.AddHostedService<CleintBenchmarkHostedService>(); | ||||
services.AddHostedService<CleintBenchmarkReportHostedService>(); | services.AddHostedService<CleintBenchmarkReportHostedService>(); | ||||
}); | }); | ||||
@@ -9,15 +9,14 @@ namespace JT808.DotNetty.Client | |||||
{ | { | ||||
public static class JT808ClientDotnettyExtensions | public static class JT808ClientDotnettyExtensions | ||||
{ | { | ||||
public static IServiceCollection AddJT808Client(this IServiceCollection serviceDescriptors) | |||||
public static IJT808Builder AddJT808Client(this IJT808Builder jT808Builder) | |||||
{ | { | ||||
serviceDescriptors.AddJT808Configure(); | |||||
serviceDescriptors.AddSingleton<JT808SendAtomicCounterService>(); | |||||
serviceDescriptors.AddSingleton<JT808ReceiveAtomicCounterService>(); | |||||
serviceDescriptors.AddSingleton<IJT808TcpClientFactory, JT808TcpClientFactory>(); | |||||
serviceDescriptors.AddSingleton<JT808ReportService>(); | |||||
serviceDescriptors.AddHostedService<JT808ReportHostedService>(); | |||||
return serviceDescriptors; | |||||
jT808Builder.Services.AddSingleton<JT808SendAtomicCounterService>(); | |||||
jT808Builder.Services.AddSingleton<JT808ReceiveAtomicCounterService>(); | |||||
jT808Builder.Services.AddSingleton<IJT808TcpClientFactory, JT808TcpClientFactory>(); | |||||
jT808Builder.Services.AddSingleton<JT808ReportService>(); | |||||
jT808Builder.Services.AddHostedService<JT808ReportHostedService>(); | |||||
return jT808Builder; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -1,4 +1,5 @@ | |||||
using DotNetty.Transport.Channels; | |||||
using DotNetty.Buffers; | |||||
using DotNetty.Transport.Channels; | |||||
using JT808.DotNetty.Abstractions; | using JT808.DotNetty.Abstractions; | ||||
using JT808.DotNetty.Abstractions.Enums; | using JT808.DotNetty.Abstractions.Enums; | ||||
using JT808.DotNetty.Core.Interfaces; | using JT808.DotNetty.Core.Interfaces; | ||||
@@ -96,7 +97,7 @@ namespace JT808.DotNetty.Core.Session | |||||
{ | { | ||||
if(session.TransportProtocolType== JT808TransportProtocolType.tcp) | if(session.TransportProtocolType== JT808TransportProtocolType.tcp) | ||||
{ | { | ||||
session.Channel.WriteAndFlushAsync(new JT808Response(data)); | |||||
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); | |||||
isSuccessed = true; | isSuccessed = true; | ||||
message = "ok"; | message = "ok"; | ||||
} | } | ||||
@@ -120,14 +121,14 @@ namespace JT808.DotNetty.Core.Session | |||||
} | } | ||||
return isSuccessed; | return isSuccessed; | ||||
} | } | ||||
public void Send(string terminalPhoneNo, byte[] data) | |||||
internal void Send(string terminalPhoneNo, byte[] data) | |||||
{ | { | ||||
var session = GetSessionByTerminalPhoneNo(terminalPhoneNo); | var session = GetSessionByTerminalPhoneNo(terminalPhoneNo); | ||||
if (session != null) | if (session != null) | ||||
{ | { | ||||
if (session.TransportProtocolType == JT808TransportProtocolType.tcp) | if (session.TransportProtocolType == JT808TransportProtocolType.tcp) | ||||
{ | { | ||||
session.Channel.WriteAndFlushAsync(new JT808Response(data)); | |||||
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); | |||||
} | } | ||||
else if (session.TransportProtocolType == JT808TransportProtocolType.udp) | else if (session.TransportProtocolType == JT808TransportProtocolType.udp) | ||||
{ | { | ||||
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -1,4 +1,5 @@ | |||||
using JT808.DotNetty.Abstractions; | using JT808.DotNetty.Abstractions; | ||||
using JT808.Protocol; | |||||
using Microsoft.Extensions.Configuration; | using Microsoft.Extensions.Configuration; | ||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
using Microsoft.Extensions.DependencyInjection.Extensions; | using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
@@ -7,17 +8,21 @@ namespace JT808.DotNetty.Kafka | |||||
{ | { | ||||
public static class JT808ClientKafkaExtensions | public static class JT808ClientKafkaExtensions | ||||
{ | { | ||||
public static IJT808ClientBuilder AddJT808ClientKafka(this IJT808Builder builder) | |||||
{ | |||||
return new JT808ClientBuilderDefault(builder); | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// | /// | ||||
/// </summary> | /// </summary> | ||||
/// <param name="serviceDescriptors"></param> | /// <param name="serviceDescriptors"></param> | ||||
/// <param name="configuration">GetSection("JT808MsgConsumerConfig")</param> | /// <param name="configuration">GetSection("JT808MsgConsumerConfig")</param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public static IServiceCollection AddJT808ClientKafkaMsgConsumer(this IServiceCollection serviceDescriptors, IConfiguration configuration) | |||||
public static IJT808ClientBuilder AddMsgConsumer(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) | |||||
{ | { | ||||
serviceDescriptors.Configure<JT808MsgConsumerConfig>(configuration.GetSection("JT808MsgConsumerConfig")); | |||||
serviceDescriptors.TryAddSingleton<IJT808MsgConsumer, JT808MsgConsumer>(); | |||||
return serviceDescriptors; | |||||
jT808ClientBuilder.JT808Builder.Services.Configure<JT808MsgConsumerConfig>(configuration.GetSection("JT808MsgConsumerConfig")); | |||||
jT808ClientBuilder.JT808Builder.Services.TryAddSingleton<IJT808MsgConsumer, JT808MsgConsumer>(); | |||||
return jT808ClientBuilder; | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// | /// | ||||
@@ -25,11 +30,11 @@ namespace JT808.DotNetty.Kafka | |||||
/// <param name="serviceDescriptors"></param> | /// <param name="serviceDescriptors"></param> | ||||
/// <param name="configuration">GetSection("JT808MsgReplyProducerConfig")</param> | /// <param name="configuration">GetSection("JT808MsgReplyProducerConfig")</param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public static IServiceCollection AddJT808ClientKafkaMsgReplyProducer(this IServiceCollection serviceDescriptors, IConfiguration configuration) | |||||
public static IJT808ClientBuilder AddMsgReplyProducer(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) | |||||
{ | { | ||||
serviceDescriptors.Configure<JT808MsgReplyProducerConfig>(configuration.GetSection("JT808MsgReplyProducerConfig")); | |||||
serviceDescriptors.TryAddSingleton<IJT808MsgReplyProducer, JT808MsgReplyProducer>(); | |||||
return serviceDescriptors; | |||||
jT808ClientBuilder.JT808Builder.Services.Configure<JT808MsgReplyProducerConfig>(configuration.GetSection("JT808MsgReplyProducerConfig")); | |||||
jT808ClientBuilder.JT808Builder.Services.TryAddSingleton<IJT808MsgReplyProducer, JT808MsgReplyProducer>(); | |||||
return jT808ClientBuilder; | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// | /// | ||||
@@ -37,11 +42,11 @@ namespace JT808.DotNetty.Kafka | |||||
/// <param name="serviceDescriptors"></param> | /// <param name="serviceDescriptors"></param> | ||||
/// <param name="configuration">GetSection("JT808SessionConsumerConfig")</param> | /// <param name="configuration">GetSection("JT808SessionConsumerConfig")</param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public static IServiceCollection AddJT808ClientKafkaSessionConsumer(this IServiceCollection serviceDescriptors, IConfiguration configuration) | |||||
public static IJT808ClientBuilder AddSessionConsumer(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) | |||||
{ | { | ||||
serviceDescriptors.Configure<JT808SessionConsumerConfig>(configuration.GetSection("JT808SessionConsumerConfig")); | |||||
serviceDescriptors.TryAddSingleton<IJT808SessionConsumer, JT808SessionConsumer>(); | |||||
return serviceDescriptors; | |||||
jT808ClientBuilder.JT808Builder.Services.Configure<JT808SessionConsumerConfig>(configuration.GetSection("JT808SessionConsumerConfig")); | |||||
jT808ClientBuilder.JT808Builder.Services.TryAddSingleton<IJT808SessionConsumer, JT808SessionConsumer>(); | |||||
return jT808ClientBuilder; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka | |||||
catch (ConsumeException ex) | catch (ConsumeException ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
catch (OperationCanceledException ex) | catch (OperationCanceledException ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
} | } | ||||
}, Cts.Token); | }, Cts.Token); | ||||
@@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka | |||||
catch (ConsumeException ex) | catch (ConsumeException ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
catch (OperationCanceledException ex) | catch (OperationCanceledException ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
} | } | ||||
}, Cts.Token); | }, Cts.Token); | ||||
@@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka | |||||
catch (ConsumeException ex) | catch (ConsumeException ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
catch (OperationCanceledException ex) | catch (OperationCanceledException ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
logger.LogError(ex, TopicName); | logger.LogError(ex, TopicName); | ||||
Thread.Sleep(1000); | |||||
} | } | ||||
} | } | ||||
}, Cts.Token); | }, Cts.Token); | ||||
@@ -0,0 +1,8 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,12 @@ | |||||
using System; | |||||
namespace JT808.DotNetty.MsgIdHandler.Test | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,12 @@ | |||||
using System; | |||||
namespace JT808.DotNetty.MsgLogging.Test | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,12 @@ | |||||
using System; | |||||
namespace JT808.DotNetty.ReplyMessage.Test | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,12 @@ | |||||
using System; | |||||
namespace JT808.DotNetty.SessionNotice.Test | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,12 @@ | |||||
using System; | |||||
namespace JT808.DotNetty.Traffic.Test | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.2</TargetFramework> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,12 @@ | |||||
using System; | |||||
namespace JT808.DotNetty.Transmit.Test | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,14 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.DotNetty.MsgIdHandler | |||||
{ | |||||
/// <summary> | |||||
/// JT808消息Id处理程序 | |||||
/// </summary> | |||||
public interface IJT808DotNettyMsgIdHandler | |||||
{ | |||||
void Processor((string TerminalNo, byte[] Data) parameter); | |||||
} | |||||
} |
@@ -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<TJT808DotNettyMsgIdHandler>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TJT808DotNettyMsgIdHandler: IJT808DotNettyMsgIdHandler | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808DotNettyMsgIdHandler),typeof(TJT808DotNettyMsgIdHandler)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyMsgIdHandlerHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.MsgIdHandler</PackageId> | |||||
<Product>JT808.DotNetty.MsgIdHandler</Product> | |||||
<Description>基于JT808消息业务处理程序服务</Description> | |||||
<PackageReleaseNotes>基于JT808消息业务处理程序服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
</Project> |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,15 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace JT808.DotNetty.MsgLogging | |||||
{ | |||||
/// <summary> | |||||
/// 808数据上下行日志接口 | |||||
/// </summary> | |||||
public interface IJT808MsgLogging | |||||
{ | |||||
void Processor((string TerminalNo, byte[] Data) parameter, JT808MsgLoggingType jT808MsgLoggingType); | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.MsgLogging</PackageId> | |||||
<Product>JT808.DotNetty.MsgLogging</Product> | |||||
<Description>基于JT808消息上下行日志服务</Description> | |||||
<PackageReleaseNotes>基于JT808消息上下行日志服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -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<TJT808MsgLogging>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TJT808MsgLogging: IJT808MsgLogging | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808MsgLogging),typeof(TJT808MsgLogging)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyMsgDownLoggingHostedService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyMsgUpLoggingHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.DotNetty.MsgLogging | |||||
{ | |||||
public enum JT808MsgLoggingType | |||||
{ | |||||
/// <summary> | |||||
/// 数据上行 | |||||
/// </summary> | |||||
up, | |||||
/// <summary> | |||||
/// 数据下行 | |||||
/// </summary> | |||||
down | |||||
} | |||||
} |
@@ -0,0 +1,24 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.ReplyMessage</PackageId> | |||||
<Product>JT808.DotNetty.ReplyMessage</Product> | |||||
<Description>基于JT808消息应答服务</Description> | |||||
<PackageReleaseNotes>基于JT808消息应答服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
</Project> |
@@ -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 | |||||
{ | |||||
/// <summary> | |||||
/// 独享消息应答服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyReplyMessageService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyReplyMessageHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 独享消息应答服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <typeparam name="TReplyMessageService">自定义消息回复服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808ReplyMessage<TReplyMessageService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TReplyMessageService : JT808DotNettyReplyMessageService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<TReplyMessageService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyReplyMessageHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息应答服务(消费者单实例) | |||||
/// </summary> | |||||
/// <typeparam name="TReplyMessageService">自定义消息回复服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808ReplyMessage<TReplyMessageService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TReplyMessageService : JT808DotNettyReplyMessageService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<TReplyMessageService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息应答服务(消费者单实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyReplyMessageService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -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<ushort, Func<JT808HeaderPackage, byte[]>> 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<ushort, Func<JT808HeaderPackage, byte[]>> { | |||||
{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 | |||||
{ | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 终端通用应答 | |||||
/// 平台无需回复 | |||||
/// 实现自己的业务 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0001(JT808HeaderPackage request) | |||||
{ | |||||
return null; | |||||
} | |||||
/// <summary> | |||||
/// 终端心跳 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
/// <summary> | |||||
/// 终端注销 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
/// <summary> | |||||
/// 终端注册 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
/// <summary> | |||||
/// 终端鉴权 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
/// <summary> | |||||
/// 位置信息汇报 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
/// <summary> | |||||
/// 定位数据批量上传 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
/// <summary> | |||||
/// 数据上行透传 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
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 | |||||
})); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.SessionNotice</PackageId> | |||||
<Product>JT808.DotNetty.SessionNotice</Product> | |||||
<Description>基于JT808会话通知服务</Description> | |||||
<PackageReleaseNotes>基于JT808会话通知服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -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 | |||||
{ | |||||
/// <summary> | |||||
/// 独享消息会话通知服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettySessionNoticeService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettySessionNoticeHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 独享消息会话通知服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <typeparam name="TSessionNoticeService">自定义会话通知服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808SessionNotice<TSessionNoticeService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TSessionNoticeService : JT808DotNettySessionNoticeService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<TSessionNoticeService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettySessionNoticeHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息会话通知服务(消费者单实例) | |||||
/// </summary> | |||||
/// <typeparam name="TSessionNoticeService">自定义会话通知服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808SessionNotice<TSessionNoticeService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TSessionNoticeService : JT808DotNettySessionNoticeService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<TSessionNoticeService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息会话通知服务(消费者单实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettySessionNoticeService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -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}"); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,27 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.Traffic</PackageId> | |||||
<Product>JT808.DotNetty.Traffic</Product> | |||||
<Description>基于JT808设备流量统计服务</Description> | |||||
<PackageReleaseNotes>基于JT808设备流量统计服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="CSRedisCore" Version="3.1.5" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -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(); | |||||
} | |||||
/// <summary> | |||||
/// 按设备每天统计sim卡流量 | |||||
/// </summary> | |||||
/// <param name="terminalNo"></param> | |||||
/// <param name="len"></param> | |||||
public void Processor(string terminalNo,int len) | |||||
{ | |||||
TrafficRedisClient.HIncrBy(terminalNo, DateTime.Now.ToString("yyyyMMdd"), len); | |||||
} | |||||
} | |||||
} |
@@ -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 | |||||
{ | |||||
/// <summary> | |||||
/// 独享消息流量统计服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808Traffic(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyTrafficService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyTrafficServiceHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息流量统计服务(消费者单实例) | |||||
/// </summary> | |||||
/// <typeparam name="TReplyMessageService"></typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808Traffic(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyTrafficService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.DotNetty.Traffic | |||||
{ | |||||
class TrafficRedisClient: RedisHelper<TrafficRedisClient> | |||||
{ } | |||||
} |
@@ -1,30 +1,29 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.Transmit</PackageId> | |||||
<Product>JT808.DotNetty.Transmit</Product> | |||||
<Description>基于DotNetty实现的JT808数据转发服务</Description> | |||||
<PackageReleaseNotes>基于DotNetty实现的JT808数据转发服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | |||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | |||||
<PackageReference Include="DotNetty.Transport" Version="0.6.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
<PackageReference Include="Polly" Version="7.1.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> | |||||
<Import Project="..\..\SharedProperties.props" /> | |||||
<PropertyGroup> | |||||
<PackageId>JT808.DotNetty.Transmit</PackageId> | |||||
<Product>JT808.DotNetty.Transmit</Product> | |||||
<Description>基于DotNetty实现的JT808数据转发服务</Description> | |||||
<PackageReleaseNotes>基于DotNetty实现的JT808数据转发服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | |||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | |||||
<PackageReference Include="DotNetty.Transport" Version="0.6.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||||
<PackageReference Include="Polly" Version="7.1.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE"> | |||||
<Pack>True</Pack> | |||||
<PackagePath></PackagePath> | |||||
</None> | |||||
</ItemGroup> | |||||
</Project> |
@@ -8,16 +8,34 @@ using JT808.DotNetty.Transmit; | |||||
using Microsoft.Extensions.Configuration; | using Microsoft.Extensions.Configuration; | ||||
using JT808.DotNetty.Transmit.Configs; | using JT808.DotNetty.Transmit.Configs; | ||||
namespace JT808.DotNetty.Client | |||||
namespace JT808.DotNetty.Transmit | |||||
{ | { | ||||
public static class JT808DotNettyTransmitExtensions | public static class JT808DotNettyTransmitExtensions | ||||
{ | { | ||||
public static IJT808ClientBuilder AddJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder,IConfiguration configuration) | |||||
/// <summary> | |||||
/// 独享转发服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <param name="configuration"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder,IConfiguration configuration) | |||||
{ | { | ||||
jT808ClientBuilder.JT808Builder.Services.Configure<RemoteServerOptions>(configuration.GetSection("RemoteServerOptions")); | jT808ClientBuilder.JT808Builder.Services.Configure<RemoteServerOptions>(configuration.GetSection("RemoteServerOptions")); | ||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyTransmitService>(); | jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyTransmitService>(); | ||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyTransmitHostedService>(); | jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyTransmitHostedService>(); | ||||
return jT808ClientBuilder; | return jT808ClientBuilder; | ||||
} | } | ||||
/// <summary> | |||||
/// 共享转发服务(消费者单实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <param name="configuration"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.Configure<RemoteServerOptions>(configuration.GetSection("RemoteServerOptions")); | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808DotNettyTransmitService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | } | ||||
} | } |
@@ -37,9 +37,7 @@ namespace JT808.DotNetty.Transmit | |||||
public Task StartAsync(CancellationToken cancellationToken) | public Task StartAsync(CancellationToken cancellationToken) | ||||
{ | { | ||||
jT808MsgConsumer.Subscribe(); | jT808MsgConsumer.Subscribe(); | ||||
jT808MsgConsumer.OnMessage(item=> { | |||||
jT808DotNettyTransmitService.SendAsync(item.TerminalNo,item.Data); | |||||
}); | |||||
jT808MsgConsumer.OnMessage(jT808DotNettyTransmitService.SendAsync); | |||||
return Task.CompletedTask; | return Task.CompletedTask; | ||||
} | } | ||||
@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Transmit | |||||
this.optionsMonitor = optionsMonitor; | this.optionsMonitor = optionsMonitor; | ||||
InitialDispatcherClient(); | InitialDispatcherClient(); | ||||
} | } | ||||
public void SendAsync(string terminalNo,byte[] data) | |||||
public void SendAsync((string TerminalNo, byte[] Data) parameter) | |||||
{ | { | ||||
if (optionsMonitor.CurrentValue.DataTransfer != null) | if (optionsMonitor.CurrentValue.DataTransfer != null) | ||||
{ | { | ||||
@@ -40,11 +40,11 @@ namespace JT808.DotNetty.Transmit | |||||
{ | { | ||||
if (allClientChannel.Open) | if (allClientChannel.Open) | ||||
{ | { | ||||
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) | |||||
if (logger.IsEnabled(LogLevel.Debug)) | |||||
{ | { | ||||
logger.LogDebug($"转发所有数据到该网关{item.Host}"); | logger.LogDebug($"转发所有数据到该网关{item.Host}"); | ||||
} | } | ||||
allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); | |||||
allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data)); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -58,24 +58,24 @@ namespace JT808.DotNetty.Transmit | |||||
} | } | ||||
else | 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 | try | ||||
{ | { | ||||
if (clientChannel.Open) | if (clientChannel.Open) | ||||
{ | { | ||||
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) | 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 | else | ||||
{ | { | ||||
logger.LogError($"{item.Host},{terminalNo}链接已关闭"); | |||||
logger.LogError($"{item.Host},{parameter.TerminalNo}链接已关闭"); | |||||
} | } | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
logger.LogError($"{item.Host},{terminalNo}发送数据出现异常:{ex}"); | |||||
logger.LogError($"{item.Host},{parameter.TerminalNo}发送数据出现异常:{ex}"); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -45,7 +45,29 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.RabbitMQ.Tes | |||||
EndProject | EndProject | ||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{7F077BD5-8E4C-402A-9E24-DECAF251A420}" | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{7F077BD5-8E4C-402A-9E24-DECAF251A420}" | ||||
EndProject | 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 | EndProject | ||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | 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}.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.ActiveCfg = Release|Any CPU | ||||
{D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Release|Any CPU.Build.0 = 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 | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
@@ -143,7 +209,18 @@ Global | |||||
{CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} | {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} | ||||
{50A94BD5-5CDF-4777-AE4C-80BA769AEDAB} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} | {50A94BD5-5CDF-4777-AE4C-80BA769AEDAB} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} | ||||
{D3CA0D73-1CCF-41BA-88D8-5BE50515CA64} = {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 | EndGlobalSection | ||||
GlobalSection(ExtensibilityGlobals) = postSolution | GlobalSection(ExtensibilityGlobals) = postSolution | ||||
SolutionGuid = {FC0FFCEA-E1EF-4C97-A1C5-F89418B6834B} | SolutionGuid = {FC0FFCEA-E1EF-4C97-A1C5-F89418B6834B} | ||||