@@ -1,2 +1,2 @@ | |||||
# JT808DotNetty | # JT808DotNetty | ||||
JT808DotNetty | JT808DotNetty专注消息业务处理 |
@@ -0,0 +1,26 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.1</TargetFramework> | |||||
<LangVersion>latest</LangVersion> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.1" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\JT808.DotNetty\JT808.DotNetty.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Update="appsettings.json"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,26 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using DotNetty.Transport.Channels; | |||||
using JT808.Protocol; | |||||
using Microsoft.Extensions.Logging; | |||||
namespace JT808.DotNetty.Hosting | |||||
{ | |||||
public class JT808MsgIdCustomHandler : JT808MsgIdHandlerBase | |||||
{ | |||||
private readonly ILogger<JT808MsgIdCustomHandler> logger; | |||||
public JT808MsgIdCustomHandler( | |||||
ILoggerFactory loggerFactory, | |||||
JT808SessionManager sessionManager) : base(sessionManager) | |||||
{ | |||||
logger = loggerFactory.CreateLogger<JT808MsgIdCustomHandler>(); | |||||
} | |||||
public override JT808Package Msg0x0102(JT808Package reqJT808Package, IChannelHandlerContext ctx) | |||||
{ | |||||
logger.LogDebug("Msg0x0102"); | |||||
return base.Msg0x0102(reqJT808Package, ctx); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,39 @@ | |||||
using Microsoft.Extensions.Configuration; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using Microsoft.Extensions.DependencyInjection.Extensions; | |||||
using Microsoft.Extensions.Hosting; | |||||
using Microsoft.Extensions.Logging; | |||||
using System; | |||||
using System.Threading.Tasks; | |||||
namespace JT808.DotNetty.Hosting | |||||
{ | |||||
class Program | |||||
{ | |||||
static async Task Main(string[] args) | |||||
{ | |||||
//7E 01 02 00 06 01 38 12 34 56 78 00 85 32 31 31 33 31 33 B2 7E | |||||
var serverHostBuilder = new HostBuilder() | |||||
.ConfigureAppConfiguration((hostingContext, config) => | |||||
{ | |||||
config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); | |||||
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); | |||||
}) | |||||
.ConfigureLogging((context, logging) => | |||||
{ | |||||
logging.AddConsole(); | |||||
logging.SetMinimumLevel(LogLevel.Trace); | |||||
}) | |||||
.ConfigureServices((hostContext, services) => | |||||
{ | |||||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | |||||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | |||||
// 自定义消息处理业务 | |||||
services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase),typeof(JT808MsgIdCustomHandler),ServiceLifetime.Singleton)); | |||||
}) | |||||
.UseJT808Host(); | |||||
await serverHostBuilder.RunConsoleAsync(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
{ | |||||
"Logging": { | |||||
"IncludeScopes": false, | |||||
"Debug": { | |||||
"LogLevel": { | |||||
"Default": "Trace" | |||||
} | |||||
}, | |||||
"Console": { | |||||
"LogLevel": { | |||||
"Default": "Trace" | |||||
} | |||||
} | |||||
}, | |||||
"JT808Configuration": { | |||||
"Port": 6565 | |||||
} | |||||
} |
@@ -5,6 +5,8 @@ VisualStudioVersion = 15.0.28010.2016 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty", "JT808.DotNetty\JT808.DotNetty.csproj", "{80C7F67E-6B7C-4178-8726-ADD3695622DD}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty", "JT808.DotNetty\JT808.DotNetty.csproj", "{80C7F67E-6B7C-4178-8726-ADD3695622DD}" | ||||
EndProject | EndProject | ||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.Hosting", "JT808.DotNetty.Hosting\JT808.DotNetty.Hosting.csproj", "{46772BD5-4132-48A7-856B-11D658F7ADDB}" | |||||
EndProject | |||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
@@ -15,6 +17,10 @@ Global | |||||
{80C7F67E-6B7C-4178-8726-ADD3695622DD}.Debug|Any CPU.Build.0 = Debug|Any CPU | {80C7F67E-6B7C-4178-8726-ADD3695622DD}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
{80C7F67E-6B7C-4178-8726-ADD3695622DD}.Release|Any CPU.ActiveCfg = Release|Any CPU | {80C7F67E-6B7C-4178-8726-ADD3695622DD}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
{80C7F67E-6B7C-4178-8726-ADD3695622DD}.Release|Any CPU.Build.0 = Release|Any CPU | {80C7F67E-6B7C-4178-8726-ADD3695622DD}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
{46772BD5-4132-48A7-856B-11D658F7ADDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{46772BD5-4132-48A7-856B-11D658F7ADDB}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{46772BD5-4132-48A7-856B-11D658F7ADDB}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{46772BD5-4132-48A7-856B-11D658F7ADDB}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
@@ -17,11 +17,6 @@ namespace JT808.DotNetty.Codecs | |||||
{ | { | ||||
private readonly ILogger<JT808Decoder> logger; | private readonly ILogger<JT808Decoder> logger; | ||||
public JT808Decoder(ILogger<JT808Decoder> logger) | |||||
{ | |||||
this.logger = logger; | |||||
} | |||||
public JT808Decoder(ILoggerFactory loggerFactory) | public JT808Decoder(ILoggerFactory loggerFactory) | ||||
{ | { | ||||
this.logger = loggerFactory.CreateLogger<JT808Decoder>(); | this.logger = loggerFactory.CreateLogger<JT808Decoder>(); | ||||
@@ -0,0 +1,11 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.DotNetty.Configurations | |||||
{ | |||||
public class JT808SourcePackageDispatcherConfiguration | |||||
{ | |||||
public IList<JT808SourcePackageDispatcherInfo> SourcePackageDispatchers { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Net; | |||||
using System.Text; | |||||
namespace JT808.DotNetty.Configurations | |||||
{ | |||||
public class JT808SourcePackageDispatcherInfo | |||||
{ | |||||
public string Host { get; set; } | |||||
public int Port { get; set; } | |||||
private EndPoint endPoint; | |||||
public EndPoint EndPoint | |||||
{ | |||||
get | |||||
{ | |||||
if (endPoint == null) | |||||
{ | |||||
if (IPAddress.TryParse(Host, out IPAddress ip)) | |||||
{ | |||||
endPoint = new IPEndPoint(ip, Port); | |||||
} | |||||
else | |||||
{ | |||||
endPoint = new DnsEndPoint(Host, Port); | |||||
} | |||||
} | |||||
return endPoint; | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -19,12 +19,6 @@ namespace JT808.DotNetty.Handlers | |||||
logger = loggerFactory.CreateLogger<JT808ConnectionHandler>(); | logger = loggerFactory.CreateLogger<JT808ConnectionHandler>(); | ||||
} | } | ||||
public JT808ConnectionHandler( | |||||
ILogger<JT808ConnectionHandler> logger) | |||||
{ | |||||
this.logger = logger; | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// 通道激活 | /// 通道激活 | ||||
/// </summary> | /// </summary> | ||||
@@ -0,0 +1,15 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace JT808.DotNetty.Interfaces | |||||
{ | |||||
/// <summary> | |||||
/// 源包分发器 | |||||
/// </summary> | |||||
public interface IJT808SourcePackageDispatcher | |||||
{ | |||||
Task SendAsync(byte[] data); | |||||
} | |||||
} |
@@ -9,7 +9,7 @@ namespace JT808.DotNetty.Internal | |||||
/// </summary> | /// </summary> | ||||
internal class JT808MsgIdDefaultHandler : JT808MsgIdHandlerBase | internal class JT808MsgIdDefaultHandler : JT808MsgIdHandlerBase | ||||
{ | { | ||||
public JT808MsgIdDefaultHandler(SessionManager sessionManager) : base(sessionManager) | public JT808MsgIdDefaultHandler(JT808SessionManager sessionManager) : base(sessionManager) | ||||
{ | { | ||||
} | } | ||||
} | } | ||||
@@ -1,4 +1,5 @@ | |||||
using JT808.DotNetty.Configurations; | using JT808.DotNetty.Codecs; | ||||
using JT808.DotNetty.Configurations; | |||||
using JT808.DotNetty.Handlers; | using JT808.DotNetty.Handlers; | ||||
using JT808.DotNetty.Internal; | using JT808.DotNetty.Internal; | ||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
@@ -9,16 +10,17 @@ using System.Reflection; | |||||
namespace JT808.DotNetty | namespace JT808.DotNetty | ||||
{ | { | ||||
public static class DotnettyExtensions | public static class JT808DotnettyExtensions | ||||
{ | { | ||||
public static IHostBuilder UseJT808Host(this IHostBuilder builder) | public static IHostBuilder UseJT808Host(this IHostBuilder builder) | ||||
{ | { | ||||
return builder.ConfigureServices((hostContext, services) => | return builder.ConfigureServices((hostContext, services) => | ||||
{ | { | ||||
services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration")); | services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration")); | ||||
services.TryAddSingleton<SessionManager>(); | services.TryAddSingleton<JT808SessionManager>(); | ||||
services.TryAddSingleton<JT808MsgIdDefaultHandler>(); | services.TryAddSingleton<JT808MsgIdHandlerBase,JT808MsgIdDefaultHandler>(); | ||||
services.TryAddScoped<JT808ConnectionHandler>(); | services.TryAddScoped<JT808ConnectionHandler>(); | ||||
services.TryAddScoped<JT808Decoder>(); | |||||
services.TryAddScoped<JT808ServerHandler>(); | services.TryAddScoped<JT808ServerHandler>(); | ||||
services.AddHostedService<JT808ServerHost>(); | services.AddHostedService<JT808ServerHost>(); | ||||
}); | }); |
@@ -14,11 +14,11 @@ namespace JT808.DotNetty | |||||
/// </summary> | /// </summary> | ||||
public abstract class JT808MsgIdHandlerBase | public abstract class JT808MsgIdHandlerBase | ||||
{ | { | ||||
protected SessionManager sessionManager { get; } | protected JT808SessionManager sessionManager { get; } | ||||
/// <summary> | /// <summary> | ||||
/// 初始化消息处理业务 | /// 初始化消息处理业务 | ||||
/// </summary> | /// </summary> | ||||
protected JT808MsgIdHandlerBase(SessionManager sessionManager) | protected JT808MsgIdHandlerBase(JT808SessionManager sessionManager) | ||||
{ | { | ||||
this.sessionManager = sessionManager; | this.sessionManager = sessionManager; | ||||
HandlerDict = new Dictionary<JT808MsgId, Func<JT808Package, IChannelHandlerContext, JT808Package>> | HandlerDict = new Dictionary<JT808MsgId, Func<JT808Package, IChannelHandlerContext, JT808Package>> | ||||
@@ -12,16 +12,16 @@ using System.Threading.Tasks; | |||||
namespace JT808.DotNetty | namespace JT808.DotNetty | ||||
{ | { | ||||
public class SessionManager: IDisposable | public class JT808SessionManager: IDisposable | ||||
{ | { | ||||
private readonly ILogger<SessionManager> logger; | private readonly ILogger<JT808SessionManager> logger; | ||||
private readonly JT808Configuration configuration; | private readonly JT808Configuration configuration; | ||||
private readonly CancellationTokenSource cancellationTokenSource; | private readonly CancellationTokenSource cancellationTokenSource; | ||||
public SessionManager( | public JT808SessionManager( | ||||
IOptions<JT808Configuration> jT808ConfigurationAccessor, | IOptions<JT808Configuration> jT808ConfigurationAccessor, | ||||
ILoggerFactory loggerFactory) | ILoggerFactory loggerFactory) | ||||
{ | { | ||||
logger = loggerFactory.CreateLogger<SessionManager>(); | logger = loggerFactory.CreateLogger<JT808SessionManager>(); | ||||
configuration = jT808ConfigurationAccessor.Value; | configuration = jT808ConfigurationAccessor.Value; | ||||
cancellationTokenSource = new CancellationTokenSource(); | cancellationTokenSource = new CancellationTokenSource(); | ||||
Task.Run(() => | Task.Run(() => |