瀏覽代碼

1.增加消息上下行日志服务

2.增加设备会话通知服务
3.增加设备流量统计服务
4.完善数据转发服务
5.增加消息应答服务
6.增加消息业务处理服务
tags/v2.2.0
smallchi 5 年之前
父節點
當前提交
b4ea22c52e
共有 50 個文件被更改,包括 1127 次插入83 次删除
  1. 二進制
      doc/img/design_model.png
  2. +3
    -1
      simples/JT808.DotNetty.SimpleClient/Program.cs
  3. +3
    -1
      src/JT808.DotNetty.CleintBenchmark/Program.cs
  4. +7
    -8
      src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs
  5. +5
    -4
      src/JT808.DotNetty.Core/Session/JT808SessionManager.cs
  6. +25
    -0
      src/JT808.DotNetty.Kafka/JT808ClientBuilderDefault.cs
  7. +17
    -12
      src/JT808.DotNetty.Kafka/JT808ClientKafkaExtensions.cs
  8. +0
    -3
      src/JT808.DotNetty.Kafka/JT808MsgConsumer.cs
  9. +0
    -3
      src/JT808.DotNetty.Kafka/JT808MsgReplyConsumer.cs
  10. +0
    -3
      src/JT808.DotNetty.Kafka/JT808SessionConsumer.cs
  11. +8
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/JT808.DotNetty.MsgIdHandler.Test.csproj
  12. +12
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/Program.cs
  13. +8
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/JT808.DotNetty.MsgLogging.Test.csproj
  14. +12
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/Program.cs
  15. +8
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/JT808.DotNetty.ReplyMessage.Test.csproj
  16. +12
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/Program.cs
  17. +8
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/JT808.DotNetty.SessionNotice.Test.csproj
  18. +12
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/Program.cs
  19. +8
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/JT808.DotNetty.Traffic.Test.csproj
  20. +12
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/Program.cs
  21. +8
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/JT808.DotNetty.Transmit.Test.csproj
  22. +12
    -0
      src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/Program.cs
  23. +14
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandler.cs
  24. +19
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandlerExtensions.cs
  25. +25
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj
  26. +34
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808DotNettyMsgIdHandlerHostedService.cs
  27. +15
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/IJT808MsgLogging.cs
  28. +25
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj
  29. +36
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgDownLoggingHostedService.cs
  30. +20
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgLoggingExtensions.cs
  31. +36
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgUpLoggingHostedService.cs
  32. +18
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808MsgLoggingType.cs
  33. +24
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj
  34. +58
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageExtensions.cs
  35. +34
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageHostedService.cs
  36. +165
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs
  37. +25
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj
  38. +61
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeExtensions.cs
  39. +35
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeHostedService.cs
  40. +25
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeService.cs
  41. +27
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj
  42. +32
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficService.cs
  43. +34
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceExtensions.cs
  44. +36
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceHostedService.cs
  45. +9
    -0
      src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/TrafficRedisClient.cs
  46. +28
    -29
      src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj
  47. +20
    -2
      src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitExtensions.cs
  48. +1
    -3
      src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitHostedService.cs
  49. +8
    -8
      src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitService.cs
  50. +83
    -6
      src/JT808.DotNetty.sln

二進制
doc/img/design_model.png 查看文件

Before After
Width: 884  |  Height: 676  |  Size: 56 KiB Width: 884  |  Height: 676  |  Size: 58 KiB

+ 3
- 1
simples/JT808.DotNetty.SimpleClient/Program.cs 查看文件

@@ -2,6 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using JT808.Protocol;
using JT808.Protocol.MessageBody;
using System.Text;
using System.Threading.Tasks;
@@ -29,7 +30,8 @@ namespace JT808.DotNetty.SimpleClient
options.AddConsole();
options.SetMinimumLevel(LogLevel.Trace);
});
services.AddJT808Client();
services.AddJT808Configure()
.AddJT808Client();
services.AddHostedService<UpService>();
});
await serverHostBuilder.RunConsoleAsync();


+ 3
- 1
src/JT808.DotNetty.CleintBenchmark/Program.cs 查看文件

@@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using System;
using System.Threading.Tasks;
using JT808.Protocol;
using JT808.DotNetty.Client;
using JT808.DotNetty.CleintBenchmark.Configs;
using JT808.DotNetty.CleintBenchmark.Services;
@@ -39,7 +40,8 @@ namespace JT808.DotNetty.CleintBenchmark
services.Configure<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>();
});


+ 7
- 8
src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs 查看文件

@@ -9,15 +9,14 @@ namespace JT808.DotNetty.Client
{
public static class JT808ClientDotnettyExtensions
{
public static IServiceCollection AddJT808Client(this IServiceCollection serviceDescriptors)
public static IJT808Builder AddJT808Client(this IJT808Builder jT808Builder)
{
serviceDescriptors.AddJT808Configure();
serviceDescriptors.AddSingleton<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;
}
}
}

+ 5
- 4
src/JT808.DotNetty.Core/Session/JT808SessionManager.cs 查看文件

@@ -1,4 +1,5 @@
using DotNetty.Transport.Channels;
using DotNetty.Buffers;
using DotNetty.Transport.Channels;
using JT808.DotNetty.Abstractions;
using JT808.DotNetty.Abstractions.Enums;
using JT808.DotNetty.Core.Interfaces;
@@ -96,7 +97,7 @@ namespace JT808.DotNetty.Core.Session
{
if(session.TransportProtocolType== JT808TransportProtocolType.tcp)
{
session.Channel.WriteAndFlushAsync(new JT808Response(data));
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data));
isSuccessed = true;
message = "ok";
}
@@ -120,14 +121,14 @@ namespace JT808.DotNetty.Core.Session
}
return isSuccessed;
}
public void Send(string terminalPhoneNo, byte[] data)
internal void Send(string terminalPhoneNo, byte[] data)
{
var session = GetSessionByTerminalPhoneNo(terminalPhoneNo);
if (session != null)
{
if (session.TransportProtocolType == JT808TransportProtocolType.tcp)
{
session.Channel.WriteAndFlushAsync(new JT808Response(data));
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data));
}
else if (session.TransportProtocolType == JT808TransportProtocolType.udp)
{


+ 25
- 0
src/JT808.DotNetty.Kafka/JT808ClientBuilderDefault.cs 查看文件

@@ -0,0 +1,25 @@
using JT808.DotNetty.Abstractions;
using JT808.Protocol;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.Kafka
{
internal class JT808ClientBuilderDefault : IJT808ClientBuilder
{
public IJT808Builder JT808Builder { get; }

public JT808ClientBuilderDefault(IJT808Builder builder)
{
JT808Builder = builder;
}

public IJT808Builder Builder()
{
return JT808Builder;
}
}
}

+ 17
- 12
src/JT808.DotNetty.Kafka/JT808ClientKafkaExtensions.cs 查看文件

@@ -1,4 +1,5 @@
using JT808.DotNetty.Abstractions;
using JT808.Protocol;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
@@ -7,17 +8,21 @@ namespace JT808.DotNetty.Kafka
{
public static class JT808ClientKafkaExtensions
{
public static IJT808ClientBuilder AddJT808ClientKafka(this IJT808Builder builder)
{
return new JT808ClientBuilderDefault(builder);
}
/// <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;
}
}
}

+ 0
- 3
src/JT808.DotNetty.Kafka/JT808MsgConsumer.cs 查看文件

@@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka
catch (ConsumeException ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
catch (OperationCanceledException ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
catch (Exception ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
}
}, Cts.Token);


+ 0
- 3
src/JT808.DotNetty.Kafka/JT808MsgReplyConsumer.cs 查看文件

@@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka
catch (ConsumeException ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
catch (OperationCanceledException ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
catch (Exception ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
}
}, Cts.Token);


+ 0
- 3
src/JT808.DotNetty.Kafka/JT808SessionConsumer.cs 查看文件

@@ -49,17 +49,14 @@ namespace JT808.DotNetty.Kafka
catch (ConsumeException ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
catch (OperationCanceledException ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
catch (Exception ex)
{
logger.LogError(ex, TopicName);
Thread.Sleep(1000);
}
}
}, Cts.Token);


+ 8
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/JT808.DotNetty.MsgIdHandler.Test.csproj 查看文件

@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

</Project>

+ 12
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgIdHandler.Test/Program.cs 查看文件

@@ -0,0 +1,12 @@
using System;

namespace JT808.DotNetty.MsgIdHandler.Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

+ 8
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/JT808.DotNetty.MsgLogging.Test.csproj 查看文件

@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

</Project>

+ 12
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.MsgLogging.Test/Program.cs 查看文件

@@ -0,0 +1,12 @@
using System;

namespace JT808.DotNetty.MsgLogging.Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

+ 8
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/JT808.DotNetty.ReplyMessage.Test.csproj 查看文件

@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

</Project>

+ 12
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.ReplyMessage.Test/Program.cs 查看文件

@@ -0,0 +1,12 @@
using System;

namespace JT808.DotNetty.ReplyMessage.Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

+ 8
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/JT808.DotNetty.SessionNotice.Test.csproj 查看文件

@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

</Project>

+ 12
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.SessionNotice.Test/Program.cs 查看文件

@@ -0,0 +1,12 @@
using System;

namespace JT808.DotNetty.SessionNotice.Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

+ 8
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/JT808.DotNetty.Traffic.Test.csproj 查看文件

@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

</Project>

+ 12
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Traffic.Test/Program.cs 查看文件

@@ -0,0 +1,12 @@
using System;

namespace JT808.DotNetty.Traffic.Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

+ 8
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/JT808.DotNetty.Transmit.Test.csproj 查看文件

@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

</Project>

+ 12
- 0
src/JT808.DotNetty.Services.Tests/JT808.DotNetty.Transmit.Test/Program.cs 查看文件

@@ -0,0 +1,12 @@
using System;

namespace JT808.DotNetty.Transmit.Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

+ 14
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandler.cs 查看文件

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.MsgIdHandler
{
/// <summary>
/// JT808消息Id处理程序
/// </summary>
public interface IJT808DotNettyMsgIdHandler
{
void Processor((string TerminalNo, byte[] Data) parameter);
}
}

+ 19
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/IJT808DotNettyMsgIdHandlerExtensions.cs 查看文件

@@ -0,0 +1,19 @@
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.MsgIdHandler
{
public static class IJT808DotNettyMsgIdHandlerExtensions
{
public static IJT808ClientBuilder AddJT808MsgIdHandler<TJT808DotNettyMsgIdHandler>(this IJT808ClientBuilder jT808ClientBuilder)
where TJT808DotNettyMsgIdHandler: IJT808DotNettyMsgIdHandler
{
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808DotNettyMsgIdHandler),typeof(TJT808DotNettyMsgIdHandler));
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808DotNettyMsgIdHandlerHostedService>();
return jT808ClientBuilder;
}
}
}

+ 25
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj 查看文件

@@ -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>

+ 34
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808DotNettyMsgIdHandlerHostedService.cs 查看文件

@@ -0,0 +1,34 @@
using System.Threading.Tasks;
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.Hosting;
using System.Threading;

namespace JT808.DotNetty.MsgIdHandler
{
public class JT808DotNettyMsgIdHandlerHostedService : IHostedService
{
private readonly IJT808MsgConsumer jT808MsgConsumer;

private readonly IJT808DotNettyMsgIdHandler jT808DotNettyMsgIdHandler;
public JT808DotNettyMsgIdHandlerHostedService(
IJT808DotNettyMsgIdHandler jT808DotNettyMsgIdHandler,
IJT808MsgConsumer jT808MsgConsumer)
{
this.jT808DotNettyMsgIdHandler = jT808DotNettyMsgIdHandler;
this.jT808MsgConsumer = jT808MsgConsumer;
}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Subscribe();
jT808MsgConsumer.OnMessage(jT808DotNettyMsgIdHandler.Processor);
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
}

+ 15
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/IJT808MsgLogging.cs 查看文件

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace JT808.DotNetty.MsgLogging
{
/// <summary>
/// 808数据上下行日志接口
/// </summary>
public interface IJT808MsgLogging
{
void Processor((string TerminalNo, byte[] Data) parameter, JT808MsgLoggingType jT808MsgLoggingType);
}
}

+ 25
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj 查看文件

@@ -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>

+ 36
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgDownLoggingHostedService.cs 查看文件

@@ -0,0 +1,36 @@
using System.Threading.Tasks;
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.Hosting;
using System.Threading;

namespace JT808.DotNetty.MsgLogging
{
public class JT808DotNettyMsgDownLoggingHostedService : IHostedService
{
private readonly IJT808MsgReplyConsumer jT808MsgReplyConsumer;
private readonly IJT808MsgLogging jT808MsgLogging;
public JT808DotNettyMsgDownLoggingHostedService(
IJT808MsgLogging jT808MsgLogging,
IJT808MsgReplyConsumer jT808MsgReplyConsumer)
{
this.jT808MsgReplyConsumer = jT808MsgReplyConsumer;
this.jT808MsgLogging = jT808MsgLogging;
}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgReplyConsumer.Subscribe();
jT808MsgReplyConsumer.OnMessage(item=>
{
jT808MsgLogging.Processor(item, JT808MsgLoggingType.down);
});
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808MsgReplyConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
}

+ 20
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgLoggingExtensions.cs 查看文件

@@ -0,0 +1,20 @@
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.MsgLogging
{
public static class JT808DotNettyMsgLoggingExtensions
{
public static IJT808ClientBuilder AddJT808MsgLogging<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;
}
}
}

+ 36
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808DotNettyMsgUpLoggingHostedService.cs 查看文件

@@ -0,0 +1,36 @@
using System.Threading.Tasks;
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.Hosting;
using System.Threading;

namespace JT808.DotNetty.MsgLogging
{
public class JT808DotNettyMsgUpLoggingHostedService : IHostedService
{
private readonly IJT808MsgConsumer jT808MsgConsumer;
private readonly IJT808MsgLogging jT808MsgLogging;
public JT808DotNettyMsgUpLoggingHostedService(
IJT808MsgLogging jT808MsgLogging,
IJT808MsgConsumer jT808MsgConsumer)
{
this.jT808MsgConsumer = jT808MsgConsumer;
this.jT808MsgLogging = jT808MsgLogging;
}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Subscribe();
jT808MsgConsumer.OnMessage(item=>
{
jT808MsgLogging.Processor(item, JT808MsgLoggingType.up);
});
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
}

+ 18
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808MsgLoggingType.cs 查看文件

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.MsgLogging
{
public enum JT808MsgLoggingType
{
/// <summary>
/// 数据上行
/// </summary>
up,
/// <summary>
/// 数据下行
/// </summary>
down
}
}

+ 24
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj 查看文件

@@ -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>

+ 58
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageExtensions.cs 查看文件

@@ -0,0 +1,58 @@
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.ReplyMessage
{
public static class JT808DotNettyReplyMessageExtensions
{
/// <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;
}
}
}

+ 34
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageHostedService.cs 查看文件

@@ -0,0 +1,34 @@
using System.Threading.Tasks;
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.Hosting;
using System.Threading;

namespace JT808.DotNetty.ReplyMessage
{
public class JT808DotNettyReplyMessageHostedService : IHostedService
{
private readonly IJT808MsgConsumer jT808MsgConsumer;
private readonly JT808DotNettyReplyMessageService jT808DotNettyReplyMessageService;

public JT808DotNettyReplyMessageHostedService(
JT808DotNettyReplyMessageService jT808DotNettyReplyMessageService,
IJT808MsgConsumer jT808MsgConsumer)
{
this.jT808MsgConsumer = jT808MsgConsumer;
this.jT808DotNettyReplyMessageService = jT808DotNettyReplyMessageService;
}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Subscribe();
jT808MsgConsumer.OnMessage(jT808DotNettyReplyMessageService.Processor);
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
}

+ 165
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs 查看文件

@@ -0,0 +1,165 @@
using JT808.DotNetty.Abstractions;
using JT808.Protocol;
using JT808.Protocol.Enums;
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.ReplyMessage
{
public class JT808DotNettyReplyMessageService
{
protected Dictionary<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
}));
}
}
}

+ 25
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj 查看文件

@@ -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>

+ 61
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeExtensions.cs 查看文件

@@ -0,0 +1,61 @@
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.SessionNotice
{
public static class JT808DotNettySessionNoticeExtensions
{
/// <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;
}
}
}

+ 35
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeHostedService.cs 查看文件

@@ -0,0 +1,35 @@
using System.Threading.Tasks;
using JT808.DotNetty.Abstractions;
using JT808.Protocol;
using JT808.Protocol.Interfaces;
using Microsoft.Extensions.Hosting;
using System.Threading;

namespace JT808.DotNetty.SessionNotice
{
public class JT808DotNettySessionNoticeHostedService : IHostedService
{
private readonly JT808DotNettySessionNoticeService jT808DotNettySessionNoticeService;
private readonly IJT808SessionConsumer jT808SessionConsumer;
public JT808DotNettySessionNoticeHostedService(
IJT808SessionConsumer jT808SessionConsumer,
JT808DotNettySessionNoticeService jT808DotNettySessionNoticeService)
{
this.jT808DotNettySessionNoticeService = jT808DotNettySessionNoticeService;
this.jT808SessionConsumer = jT808SessionConsumer;
}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808SessionConsumer.Subscribe();
jT808SessionConsumer.OnMessage(jT808DotNettySessionNoticeService.Processor);
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808SessionConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
}

+ 25
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808DotNettySessionNoticeService.cs 查看文件

@@ -0,0 +1,25 @@
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.SessionNotice
{
public class JT808DotNettySessionNoticeService
{
protected ILogger logger { get; }
public JT808DotNettySessionNoticeService(ILoggerFactory loggerFactory)
{
logger = loggerFactory.CreateLogger("JT808DotNettySessionNoticeService");
}
public virtual void Processor((string Notice, string TerminalNo) parameter)
{
if (logger.IsEnabled(LogLevel.Debug))
{
logger.LogDebug($"{parameter.Notice}-{parameter.TerminalNo}");
}
}
}
}

+ 27
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj 查看文件

@@ -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>

+ 32
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficService.cs 查看文件

@@ -0,0 +1,32 @@
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.Traffic
{
public class JT808DotNettyTrafficService:IDisposable
{
private readonly CSRedis.CSRedisClient redisClien;
public JT808DotNettyTrafficService(IConfiguration configuration)
{
redisClien = new CSRedis.CSRedisClient(configuration.GetConnectionString("TrafficRedisHost"));
TrafficRedisClient.Initialization(redisClien);
}

public void Dispose()
{
redisClien.Dispose();
}

/// <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);
}
}
}

+ 34
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceExtensions.cs 查看文件

@@ -0,0 +1,34 @@
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.Traffic
{
public static class JT808DotNettyTrafficServiceExtensions
{
/// <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;
}
}
}

+ 36
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808DotNettyTrafficServiceHostedService.cs 查看文件

@@ -0,0 +1,36 @@
using System.Threading.Tasks;
using JT808.DotNetty.Abstractions;
using Microsoft.Extensions.Hosting;
using System.Threading;

namespace JT808.DotNetty.Traffic
{
public class JT808DotNettyTrafficServiceHostedService : IHostedService
{
private readonly IJT808MsgConsumer jT808MsgConsumer;
private readonly JT808DotNettyTrafficService jT808DotNettyTrafficService;

public JT808DotNettyTrafficServiceHostedService(
JT808DotNettyTrafficService jT808DotNettyTrafficService,
IJT808MsgConsumer jT808MsgConsumer)
{
this.jT808MsgConsumer = jT808MsgConsumer;
this.jT808DotNettyTrafficService = jT808DotNettyTrafficService;
}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Subscribe();
jT808MsgConsumer.OnMessage((item)=> {
jT808DotNettyTrafficService.Processor(item.TerminalNo, item.Data.Length);
});
return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
}

+ 9
- 0
src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/TrafficRedisClient.cs 查看文件

@@ -0,0 +1,9 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.Traffic
{
class TrafficRedisClient: RedisHelper<TrafficRedisClient>
{ }
}

+ 28
- 29
src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj 查看文件

@@ -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>

+ 20
- 2
src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitExtensions.cs 查看文件

@@ -8,16 +8,34 @@ using JT808.DotNetty.Transmit;
using Microsoft.Extensions.Configuration;
using JT808.DotNetty.Transmit.Configs;

namespace JT808.DotNetty.Client
namespace JT808.DotNetty.Transmit
{
public static class JT808DotNettyTransmitExtensions
{
public static IJT808ClientBuilder AddJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder,IConfiguration configuration)
/// <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;
}
}
}

+ 1
- 3
src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitHostedService.cs 查看文件

@@ -37,9 +37,7 @@ namespace JT808.DotNetty.Transmit
public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Subscribe();
jT808MsgConsumer.OnMessage(item=> {
jT808DotNettyTransmitService.SendAsync(item.TerminalNo,item.Data);
});
jT808MsgConsumer.OnMessage(jT808DotNettyTransmitService.SendAsync);
return Task.CompletedTask;
}



+ 8
- 8
src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808DotNettyTransmitService.cs 查看文件

@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Transmit
this.optionsMonitor = optionsMonitor;
InitialDispatcherClient();
}
public void SendAsync(string terminalNo,byte[] data)
public void SendAsync((string TerminalNo, byte[] Data) parameter)
{
if (optionsMonitor.CurrentValue.DataTransfer != null)
{
@@ -40,11 +40,11 @@ namespace JT808.DotNetty.Transmit
{
if (allClientChannel.Open)
{
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug))
if (logger.IsEnabled(LogLevel.Debug))
{
logger.LogDebug($"转发所有数据到该网关{item.Host}");
}
allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data));
allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data));
}
else
{
@@ -58,24 +58,24 @@ namespace JT808.DotNetty.Transmit
}
else
{
if (item.TerminalNos.Contains(terminalNo) && channeldic.TryGetValue($"{terminalNo}_{item.Host}", out var clientChannel))
if (item.TerminalNos.Contains(parameter.TerminalNo) && channeldic.TryGetValue($"{parameter.TerminalNo}_{item.Host}", out var clientChannel))
{
try
{
if (clientChannel.Open)
{
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug))
logger.LogDebug($"转发{terminalNo}到该网关{item.Host}");
clientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data));
logger.LogDebug($"转发{parameter.TerminalNo}到该网关{item.Host}");
clientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data));
}
else
{
logger.LogError($"{item.Host},{terminalNo}链接已关闭");
logger.LogError($"{item.Host},{parameter.TerminalNo}链接已关闭");
}
}
catch (Exception ex)
{
logger.LogError($"{item.Host},{terminalNo}发送数据出现异常:{ex}");
logger.LogError($"{item.Host},{parameter.TerminalNo}发送数据出现异常:{ex}");
}
}
}


+ 83
- 6
src/JT808.DotNetty.sln 查看文件

@@ -45,7 +45,29 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.RabbitMQ.Tes
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{7F077BD5-8E4C-402A-9E24-DECAF251A420}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Transmit", "JT808.DotNetty.Services\JT808.DotNetty.Transmit\JT808.DotNetty.Transmit.csproj", "{A3A0D0E1-F9AC-4004-A306-9491D2EA6883}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Transmit", "JT808.DotNetty.Services\JT808.DotNetty.Transmit\JT808.DotNetty.Transmit.csproj", "{0E2326F8-4C96-446B-9B91-285635870171}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.ReplyMessage", "JT808.DotNetty.Services\JT808.DotNetty.ReplyMessage\JT808.DotNetty.ReplyMessage.csproj", "{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.ReplyMessage.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.ReplyMessage.Test\JT808.DotNetty.ReplyMessage.Test.csproj", "{4C01B160-543B-4659-B99C-B9C774B3DEE9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Traffic", "JT808.DotNetty.Services\JT808.DotNetty.Traffic\JT808.DotNetty.Traffic.csproj", "{3C34D0D2-C9A5-42BB-830B-922C69AE74AE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Traffic.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.Traffic.Test\JT808.DotNetty.Traffic.Test.csproj", "{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.SessionNotice", "JT808.DotNetty.Services\JT808.DotNetty.SessionNotice\JT808.DotNetty.SessionNotice.csproj", "{A09B9BF7-FEC6-4D6C-A635-77DD445A4082}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.SessionNotice.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.SessionNotice.Test\JT808.DotNetty.SessionNotice.Test.csproj", "{81DE821F-0780-44B4-B02D-72998ECA6BD2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgLogging", "JT808.DotNetty.Services\JT808.DotNetty.MsgLogging\JT808.DotNetty.MsgLogging.csproj", "{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Transmit.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.Transmit.Test\JT808.DotNetty.Transmit.Test.csproj", "{EE5EF8D4-8B61-4706-81BB-412F643E8F51}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgLogging.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.MsgLogging.Test\JT808.DotNetty.MsgLogging.Test.csproj", "{591D7974-9AF5-41E2-9B3C-B271EE682943}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgIdHandler", "JT808.DotNetty.Services\JT808.DotNetty.MsgIdHandler\JT808.DotNetty.MsgIdHandler.csproj", "{F361C47C-0511-4383-99C1-A169D4E8F4ED}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.MsgIdHandler.Test", "JT808.DotNetty.Services.Tests\JT808.DotNetty.MsgIdHandler.Test\JT808.DotNetty.MsgIdHandler.Test.csproj", "{B5C872E6-4187-479A-B3BA-CCE76A225DE9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -125,10 +147,54 @@ Global
{D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3CA0D73-1CCF-41BA-88D8-5BE50515CA64}.Release|Any CPU.Build.0 = Release|Any CPU
{A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A3A0D0E1-F9AC-4004-A306-9491D2EA6883}.Release|Any CPU.Build.0 = Release|Any CPU
{0E2326F8-4C96-446B-9B91-285635870171}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E2326F8-4C96-446B-9B91-285635870171}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E2326F8-4C96-446B-9B91-285635870171}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E2326F8-4C96-446B-9B91-285635870171}.Release|Any CPU.Build.0 = Release|Any CPU
{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225}.Release|Any CPU.Build.0 = Release|Any CPU
{4C01B160-543B-4659-B99C-B9C774B3DEE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C01B160-543B-4659-B99C-B9C774B3DEE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4C01B160-543B-4659-B99C-B9C774B3DEE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C01B160-543B-4659-B99C-B9C774B3DEE9}.Release|Any CPU.Build.0 = Release|Any CPU
{3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C34D0D2-C9A5-42BB-830B-922C69AE74AE}.Release|Any CPU.Build.0 = Release|Any CPU
{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB}.Release|Any CPU.Build.0 = Release|Any CPU
{A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A09B9BF7-FEC6-4D6C-A635-77DD445A4082}.Release|Any CPU.Build.0 = Release|Any CPU
{81DE821F-0780-44B4-B02D-72998ECA6BD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{81DE821F-0780-44B4-B02D-72998ECA6BD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81DE821F-0780-44B4-B02D-72998ECA6BD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81DE821F-0780-44B4-B02D-72998ECA6BD2}.Release|Any CPU.Build.0 = Release|Any CPU
{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E}.Release|Any CPU.Build.0 = Release|Any CPU
{EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE5EF8D4-8B61-4706-81BB-412F643E8F51}.Release|Any CPU.Build.0 = Release|Any CPU
{591D7974-9AF5-41E2-9B3C-B271EE682943}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{591D7974-9AF5-41E2-9B3C-B271EE682943}.Debug|Any CPU.Build.0 = Debug|Any CPU
{591D7974-9AF5-41E2-9B3C-B271EE682943}.Release|Any CPU.ActiveCfg = Release|Any CPU
{591D7974-9AF5-41E2-9B3C-B271EE682943}.Release|Any CPU.Build.0 = Release|Any CPU
{F361C47C-0511-4383-99C1-A169D4E8F4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F361C47C-0511-4383-99C1-A169D4E8F4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F361C47C-0511-4383-99C1-A169D4E8F4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F361C47C-0511-4383-99C1-A169D4E8F4ED}.Release|Any CPU.Build.0 = Release|Any CPU
{B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5C872E6-4187-479A-B3BA-CCE76A225DE9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -143,7 +209,18 @@ Global
{CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6}
{50A94BD5-5CDF-4777-AE4C-80BA769AEDAB} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22}
{D3CA0D73-1CCF-41BA-88D8-5BE50515CA64} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22}
{A3A0D0E1-F9AC-4004-A306-9491D2EA6883} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{0E2326F8-4C96-446B-9B91-285635870171} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{2DB0F94A-2CF9-4FC0-B560-C4A7C311B225} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{4C01B160-543B-4659-B99C-B9C774B3DEE9} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{3C34D0D2-C9A5-42BB-830B-922C69AE74AE} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{24E3A6DD-0BC4-4EDA-AC40-B07371BB5FDB} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{A09B9BF7-FEC6-4D6C-A635-77DD445A4082} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{81DE821F-0780-44B4-B02D-72998ECA6BD2} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{DBB89A8E-D2AB-4BC9-849F-FFB8018C069E} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{EE5EF8D4-8B61-4706-81BB-412F643E8F51} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{591D7974-9AF5-41E2-9B3C-B271EE682943} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{F361C47C-0511-4383-99C1-A169D4E8F4ED} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
{B5C872E6-4187-479A-B3BA-CCE76A225DE9} = {7F077BD5-8E4C-402A-9E24-DECAF251A420}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FC0FFCEA-E1EF-4C97-A1C5-F89418B6834B}


Loading…
取消
儲存