2.增加设备会话通知服务 3.增加设备流量统计服务 4.完善数据转发服务 5.增加消息应答服务 6.增加消息业务处理服务tags/v2.2.0
@@ -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<UpService>(); | |||
}); | |||
await serverHostBuilder.RunConsoleAsync(); | |||
@@ -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<ClientBenchmarkOptions>(hostContext.Configuration.GetSection("ClientBenchmarkOptions")); | |||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | |||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | |||
services.AddJT808Client(); | |||
services.AddJT808Configure() | |||
.AddJT808Client(); | |||
services.AddHostedService<CleintBenchmarkHostedService>(); | |||
services.AddHostedService<CleintBenchmarkReportHostedService>(); | |||
}); | |||
@@ -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<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.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) | |||
{ | |||
@@ -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.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); | |||
} | |||
/// <summary> | |||
/// | |||
/// </summary> | |||
/// <param name="serviceDescriptors"></param> | |||
/// <param name="configuration">GetSection("JT808MsgConsumerConfig")</param> | |||
/// <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> | |||
/// | |||
@@ -25,11 +30,11 @@ namespace JT808.DotNetty.Kafka | |||
/// <param name="serviceDescriptors"></param> | |||
/// <param name="configuration">GetSection("JT808MsgReplyProducerConfig")</param> | |||
/// <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> | |||
/// | |||
@@ -37,11 +42,11 @@ namespace JT808.DotNetty.Kafka | |||
/// <param name="serviceDescriptors"></param> | |||
/// <param name="configuration">GetSection("JT808SessionConsumerConfig")</param> | |||
/// <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) | |||
{ | |||
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); | |||
@@ -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); | |||
@@ -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); | |||
@@ -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 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) | |||
/// <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.AddSingleton<JT808DotNettyTransmitService>(); | |||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyTransmitHostedService>(); | |||
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) | |||
{ | |||
jT808MsgConsumer.Subscribe(); | |||
jT808MsgConsumer.OnMessage(item=> { | |||
jT808DotNettyTransmitService.SendAsync(item.TerminalNo,item.Data); | |||
}); | |||
jT808MsgConsumer.OnMessage(jT808DotNettyTransmitService.SendAsync); | |||
return Task.CompletedTask; | |||
} | |||
@@ -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}"); | |||
} | |||
} | |||
} | |||
@@ -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} | |||