@@ -1,77 +0,0 @@ | |||||
using DotNetty.Buffers; | |||||
using DotNetty.Transport.Channels; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Text; | |||||
using JT808.Protocol; | |||||
using JT808.Protocol.Extensions; | |||||
using DotNetty.Common.Utilities; | |||||
using Microsoft.Extensions.Logging; | |||||
using Newtonsoft.Json; | |||||
using JT808.Protocol.Exceptions; | |||||
using System.Threading; | |||||
namespace GPS.JT808NettyServer.Handlers | |||||
{ | |||||
public class JT808ServiceHandler : ChannelHandlerAdapter | |||||
{ | |||||
private readonly ILogger<JT808ServiceHandler> logger; | |||||
private readonly JT808MsgIdHandler jT808MsgIdHandler; | |||||
public JT808ServiceHandler( | |||||
JT808MsgIdHandler jT808MsgIdHandler, | |||||
ILoggerFactory loggerFactory) | |||||
{ | |||||
this.jT808MsgIdHandler = jT808MsgIdHandler; | |||||
logger = loggerFactory.CreateLogger<JT808ServiceHandler>(); | |||||
} | |||||
public override void ChannelRead(IChannelHandlerContext context, object message) | |||||
{ | |||||
var jT808RequestInfo = (JT808RequestInfo)message; | |||||
string receive = string.Empty; | |||||
try | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Debug)) | |||||
{ | |||||
receive = jT808RequestInfo.OriginalBuffer.ToHexString(); | |||||
} | |||||
Func<JT808RequestInfo, IChannelHandlerContext,IJT808Package> handlerFunc; | |||||
if (jT808RequestInfo.JT808Package != null) | |||||
{ | |||||
if (jT808MsgIdHandler.HandlerDict.TryGetValue(jT808RequestInfo.JT808Package.Header.MsgId, out handlerFunc)) | |||||
{ | |||||
IJT808Package jT808PackageImpl = handlerFunc(jT808RequestInfo, context); | |||||
if (jT808PackageImpl != null) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Debug)) | |||||
{ | |||||
logger.LogDebug("send>>>" + jT808PackageImpl.JT808Package.Header.MsgId.ToString() + "-" + JT808Serializer.Serialize(jT808PackageImpl.JT808Package).ToHexString()); | |||||
//logger.LogDebug("send>>>" + jT808PackageImpl.JT808Package.Header.MsgId.ToString() + "-" + JsonConvert.SerializeObject(jT808PackageImpl.JT808Package)); | |||||
} | |||||
// 需要注意: | |||||
// 1.下发应答必须要在类中重写 ChannelReadComplete 不然客户端接收不到消息 | |||||
// context.WriteAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808PackageImpl.JT808Package))); | |||||
// 2.直接发送 | |||||
context.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808PackageImpl.JT808Package))); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
catch (JT808Exception ex) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Error)) | |||||
logger.LogError(ex, "JT808Exception receive<<<" + receive); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Error)) | |||||
logger.LogError(ex, "Exception receive<<<" + receive); | |||||
} | |||||
} | |||||
public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); | |||||
} | |||||
} |
@@ -1,9 +1,15 @@ | |||||
using DotNetty.Handlers.Timeout; | using DotNetty.Handlers.Timeout; | ||||
using DotNetty.Transport.Channels; | using DotNetty.Transport.Channels; | ||||
using JT809Netty.Core.Configs; | using JT809Netty.Core.Configs; | ||||
using JT809.Protocol.JT809Extensions; | |||||
using JT809.Protocol.JT809Enums; | |||||
using JT809.Protocol.JT809MessageBody; | |||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Microsoft.Extensions.Options; | using Microsoft.Extensions.Options; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using JT809.Protocol; | |||||
using DotNetty.Buffers; | |||||
using JT809Netty.Core.ServiceHandlers; | |||||
namespace JT809Netty.Core.Handlers | namespace JT809Netty.Core.Handlers | ||||
{ | { | ||||
@@ -14,13 +20,16 @@ namespace JT809Netty.Core.Handlers | |||||
{ | { | ||||
private readonly ILogger<JT809DownMasterLinkConnectionHandler> logger; | private readonly ILogger<JT809DownMasterLinkConnectionHandler> logger; | ||||
private IOptionsMonitor<JT809NettyOptions> optionsMonitor; | |||||
private readonly IOptionsMonitor<JT809NettyOptions> optionsMonitor; | |||||
private readonly JT809BusinessTypeHandler jT809BusinessTypeHandler; | |||||
public JT809DownMasterLinkConnectionHandler( | public JT809DownMasterLinkConnectionHandler( | ||||
JT809BusinessTypeHandler jT809BusinessTypeHandler, | |||||
IOptionsMonitor<JT809NettyOptions> optionsMonitor, | IOptionsMonitor<JT809NettyOptions> optionsMonitor, | ||||
SessionManager sessionManager, | |||||
ILoggerFactory loggerFactory) | ILoggerFactory loggerFactory) | ||||
{ | { | ||||
this.jT809BusinessTypeHandler = jT809BusinessTypeHandler; | |||||
this.optionsMonitor = optionsMonitor; | this.optionsMonitor = optionsMonitor; | ||||
logger = loggerFactory.CreateLogger<JT809DownMasterLinkConnectionHandler>(); | logger = loggerFactory.CreateLogger<JT809DownMasterLinkConnectionHandler>(); | ||||
} | } | ||||
@@ -56,7 +65,7 @@ namespace JT809Netty.Core.Handlers | |||||
/// <summary> | /// <summary> | ||||
/// 主链路超时策略 | /// 主链路超时策略 | ||||
/// 下级平台登录成功后,在与上级平台之间如果有应用业务数据包往来的情况下,不需要发送主链路保持数据包; | /// 下级平台登录成功后,在与上级平台之间如果有应用业务数据包往来的情况下,不需要发送主链路保持数据包; | ||||
/// 否则,下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 | |||||
/// 否则,下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 | |||||
/// </summary> | /// </summary> | ||||
/// <param name="context"></param> | /// <param name="context"></param> | ||||
/// <param name="evt"></param> | /// <param name="evt"></param> | ||||
@@ -69,17 +78,9 @@ namespace JT809Netty.Core.Handlers | |||||
logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); | logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); | ||||
switch (idleStateEvent.State) | switch (idleStateEvent.State) | ||||
{ | { | ||||
//case IdleState.ReaderIdle: | |||||
// break; | |||||
case IdleState.WriterIdle: | case IdleState.WriterIdle: | ||||
#warning 发送心跳保持 | |||||
break; | |||||
//case IdleState.AllIdle: | |||||
// break; | |||||
default: | |||||
//发送心跳保持 | |||||
jT809BusinessTypeHandler.Msg0x1005(context); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -0,0 +1,53 @@ | |||||
using DotNetty.Buffers; | |||||
using DotNetty.Transport.Channels; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Text; | |||||
using DotNetty.Common.Utilities; | |||||
using Microsoft.Extensions.Logging; | |||||
using Newtonsoft.Json; | |||||
using System.Threading; | |||||
using JT809Netty.Core.ServiceHandlers; | |||||
using JT809.Protocol; | |||||
using JT809.Protocol.JT809Exceptions; | |||||
namespace JT809Netty.Core.Handlers | |||||
{ | |||||
public class JT809DownMasterLinkServiceHandler : ChannelHandlerAdapter | |||||
{ | |||||
private readonly ILogger<JT809DownMasterLinkServiceHandler> logger; | |||||
private readonly JT809BusinessTypeHandler jT809BusinessTypeHandler; | |||||
public JT809DownMasterLinkServiceHandler( | |||||
JT809BusinessTypeHandler jT809BusinessTypeHandler, | |||||
ILoggerFactory loggerFactory) | |||||
{ | |||||
this.jT809BusinessTypeHandler = jT809BusinessTypeHandler; | |||||
logger = loggerFactory.CreateLogger<JT809DownMasterLinkServiceHandler>(); | |||||
} | |||||
public override void ChannelRead(IChannelHandlerContext context, object message) | |||||
{ | |||||
var jT809Package = (JT809Package)message; | |||||
string receive = string.Empty; | |||||
try | |||||
{ | |||||
} | |||||
catch (JT809Exception ex) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Error)) | |||||
logger.LogError(ex, "JT809Exception receive<<<" + receive); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Error)) | |||||
logger.LogError(ex, "Exception receive<<<" + receive); | |||||
} | |||||
} | |||||
public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); | |||||
} | |||||
} |
@@ -42,34 +42,26 @@ namespace JT809Netty.Core | |||||
public Task StartAsync(CancellationToken cancellationToken) | public Task StartAsync(CancellationToken cancellationToken) | ||||
{ | { | ||||
nettyOptions.OnChange(options => | |||||
Task.Run(async () => | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
bootstrap.ConnectAsync(options.Host, options.Port); | |||||
workerGroup = new MultithreadEventLoopGroup(); | |||||
bootstrap = new Bootstrap(); | |||||
bootstrap.Group(workerGroup) | |||||
.Channel<TcpSocketChannel>() | |||||
.Handler(new ActionChannelInitializer<IChannel>(channel => | |||||
{ | |||||
InitChannel(channel); | |||||
})) | |||||
.Option(ChannelOption.SoBacklog, 1048576); | |||||
IChannel clientChannel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(nettyOptions.CurrentValue.Host), nettyOptions.CurrentValue.Port)); | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
} | } | ||||
}); | }); | ||||
try | |||||
{ | |||||
workerGroup = new MultithreadEventLoopGroup(); | |||||
bootstrap = new Bootstrap(); | |||||
bootstrap.Group(workerGroup) | |||||
.Channel<TcpServerChannel>() | |||||
.Handler(new ActionChannelInitializer<IChannel>(channel => | |||||
{ | |||||
InitChannel(channel); | |||||
})) | |||||
.Option(ChannelOption.SoBacklog, 1048576); | |||||
bootstrap.ConnectAsync(nettyOptions.CurrentValue.Host, nettyOptions.CurrentValue.Port); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
} | |||||
return Task.CompletedTask; | return Task.CompletedTask; | ||||
} | } | ||||
@@ -89,13 +81,19 @@ namespace JT809Netty.Core | |||||
private void InitChannel(IChannel channel) | private void InitChannel(IChannel channel) | ||||
{ | { | ||||
var scope = serviceProvider.CreateScope(); | var scope = serviceProvider.CreateScope(); | ||||
//下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 | |||||
channel.Pipeline.AddLast("systemIdleState", new WriteTimeoutHandler(60)); | |||||
channel.Pipeline.AddLast("jt809DownMasterLinkConnection", scope.ServiceProvider.GetRequiredService<JT809DownMasterLinkConnectionHandler>()); | |||||
channel.Pipeline.AddLast("jt809Buffer", new DelimiterBasedFrameDecoder(int.MaxValue, Unpooled.CopiedBuffer(new byte[] { JT809.Protocol.JT809Package.BEGINFLAG }), Unpooled.CopiedBuffer(new byte[] { JT809.Protocol.JT809Package.ENDFLAG }))); | |||||
channel.Pipeline.AddLast("jt809Decode", scope.ServiceProvider.GetRequiredService<JT809DecodeHandler>()); | |||||
//channel.Pipeline.AddLast("jt809Service", scope.ServiceProvider.GetRequiredService<JT808ServiceHandler>()); | |||||
scope.Dispose(); | |||||
try | |||||
{ | |||||
//下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 | |||||
channel.Pipeline.AddLast("systemIdleState", new WriteTimeoutHandler(60)); | |||||
channel.Pipeline.AddLast("jt809DownMasterLinkConnection", scope.ServiceProvider.GetRequiredService<JT809DownMasterLinkConnectionHandler>()); | |||||
channel.Pipeline.AddLast("jt809Buffer", new DelimiterBasedFrameDecoder(int.MaxValue, Unpooled.CopiedBuffer(new byte[] { JT809.Protocol.JT809Package.BEGINFLAG }), Unpooled.CopiedBuffer(new byte[] { JT809.Protocol.JT809Package.ENDFLAG }))); | |||||
channel.Pipeline.AddLast("jt809Decode", scope.ServiceProvider.GetRequiredService<JT809DecodeHandler>()); | |||||
channel.Pipeline.AddLast("jT809DownMasterLinkServiceHandler", scope.ServiceProvider.GetRequiredService<JT809DownMasterLinkServiceHandler>()); | |||||
} | |||||
finally | |||||
{ | |||||
scope.Dispose(); | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -12,11 +12,17 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Handlers" Version="0.5.0" /> | <PackageReference Include="DotNetty.Handlers" Version="0.5.0" /> | ||||
<PackageReference Include="DotNetty.Transport.Libuv" Version="0.5.0" /> | <PackageReference Include="DotNetty.Transport.Libuv" Version="0.5.0" /> | ||||
<PackageReference Include="JT809" Version="1.0.0" /> | |||||
<PackageReference Include="JT809" Version="1.0.2" /> | |||||
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.1.1" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.1.1" /> | ||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" /> | <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options" Version="2.1.1" /> | <PackageReference Include="Microsoft.Extensions.Options" Version="2.1.1" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.1.1" /> | <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.1.1" /> | ||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
</Project> | </Project> |
@@ -0,0 +1,108 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using DotNetty.Transport.Channels; | |||||
using JT809.Protocol; | |||||
using JT809.Protocol.JT809Enums; | |||||
using JT809.Protocol.JT809MessageBody; | |||||
using JT809.Protocol.JT809Extensions; | |||||
using DotNetty.Buffers; | |||||
using Microsoft.Extensions.Logging; | |||||
using Newtonsoft.Json; | |||||
namespace JT809Netty.Core.ServiceHandlers | |||||
{ | |||||
public class JT809BusinessTypeHandler | |||||
{ | |||||
public Dictionary<JT809BusinessType, Func<IChannelHandlerContext, JT809Package>> RequestHandlerDict { get; } | |||||
public Dictionary<JT809BusinessType, Action<JT809Package, IChannelHandlerContext>> ResponseHandlerDict { get; } | |||||
private readonly ILogger<JT809BusinessTypeHandler> logger; | |||||
/// <summary> | |||||
/// 初始化业务处理 | |||||
/// </summary> | |||||
public JT809BusinessTypeHandler( | |||||
ILoggerFactory loggerFactory | |||||
) | |||||
{ | |||||
logger = loggerFactory.CreateLogger<JT809BusinessTypeHandler>(); | |||||
//RequestHandlerDict = new Dictionary<JT809BusinessType, Func<IChannelHandlerContext, JT809Package>> | |||||
//{ | |||||
// {JT809.Protocol.JT809Enums.JT809BusinessType.UP_CONNECT_REQ, Msg0x1001}, | |||||
// {JT809.Protocol.JT809Enums.JT809BusinessType.UP_DISCONNECT_REQ, Msg0x1003}, | |||||
// {JT809.Protocol.JT809Enums.JT809BusinessType.UP_LINKTEST_REQ, Msg0x1005}, | |||||
// //{JT809.Protocol.JT809Enums.JT809BusinessType.UP_DISCONNECT_INFORM, Msg0x1007}, | |||||
// //{JT809.Protocol.JT809Enums.JT809BusinessType.UP_CLOSELINK_INFORM, Msg0x1008}, | |||||
//}; | |||||
ResponseHandlerDict = new Dictionary<JT809BusinessType, Action<JT809Package, IChannelHandlerContext>> | |||||
{ | |||||
{JT809.Protocol.JT809Enums.JT809BusinessType.UP_CONNECT_RSP, Msg0x1002}, | |||||
{JT809.Protocol.JT809Enums.JT809BusinessType.UP_DISCONNECT_RSP, Msg0x1004}, | |||||
{JT809.Protocol.JT809Enums.JT809BusinessType.UP_LINKTEST_RSP, Msg0x1006}, | |||||
}; | |||||
} | |||||
public JT809Package Msg0x1001(IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
JT809Package loginPackage = JT809BusinessType.UP_CONNECT_REQ.Create(new JT809_0x1001 | |||||
{ | |||||
UserId=1234, | |||||
DownLinkIP="127.0.0.1", | |||||
DownLinkPort=8091, | |||||
Password="20181009" | |||||
}); | |||||
try | |||||
{ | |||||
byte[] sendLoginData = JT809Serializer.Serialize(loginPackage, 1000); | |||||
channelHandlerContext.WriteAndFlushAsync(Unpooled.WrappedBuffer(sendLoginData)); | |||||
return loginPackage; | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
throw; | |||||
} | |||||
} | |||||
public void Msg0x1002(JT809Package jT809Package, IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
logger.LogDebug(JsonConvert.SerializeObject(jT809Package)); | |||||
} | |||||
public JT809Package Msg0x1003(IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
return null; | |||||
} | |||||
public void Msg0x1004(JT809Package jT809Package, IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
} | |||||
public JT809Package Msg0x1005(IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
JT809Package heartbeatPackage = JT809BusinessType.UP_LINKTEST_REQ.Create(new JT809_0x1005()); | |||||
byte[] sendHeartbeatData = JT809Serializer.Serialize(heartbeatPackage, 100); | |||||
channelHandlerContext.WriteAndFlushAsync(Unpooled.WrappedBuffer(sendHeartbeatData)); | |||||
return heartbeatPackage; | |||||
} | |||||
public void Msg0x1006(JT809Package jT809Package, IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
} | |||||
public JT809Package Msg0x1007(IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
return null; | |||||
} | |||||
public void Msg0x1008(JT809Package jT809Package, IChannelHandlerContext channelHandlerContext) | |||||
{ | |||||
} | |||||
} | |||||
} |
@@ -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.Logging.Console" Version="2.1.1" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\JT809Netty.Core\JT809Netty.Core.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Update="appsettings.Development.json"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
<None Update="appsettings.json"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,49 @@ | |||||
using DotNetty.Handlers.Logging; | |||||
using JT809Netty.Core; | |||||
using JT809Netty.Core.Configs; | |||||
using JT809Netty.Core.Handlers; | |||||
using JT809Netty.Core.ServiceHandlers; | |||||
using Microsoft.Extensions.Configuration; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using Microsoft.Extensions.Hosting; | |||||
using Microsoft.Extensions.Logging; | |||||
using System; | |||||
using System.Threading.Tasks; | |||||
namespace JT809Netty.DownMasterLink | |||||
{ | |||||
class Program | |||||
{ | |||||
static async Task Main(string[] args) | |||||
{ | |||||
var serverHostBuilder = new HostBuilder() | |||||
.UseEnvironment(args[0].Split('=')[1]) | |||||
.ConfigureAppConfiguration((hostingContext, config) => | |||||
{ | |||||
config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); | |||||
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) | |||||
.AddJsonFile($"appsettings.{ hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); | |||||
}) | |||||
.ConfigureLogging((context, logging) => | |||||
{ | |||||
logging.AddConsole(); | |||||
//NLog.LogManager.LoadConfiguration("Configs/nlog.config"); | |||||
//logging.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true }); | |||||
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); | |||||
}) | |||||
.ConfigureServices((hostContext, services) => | |||||
{ | |||||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | |||||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | |||||
services.Configure<JT809NettyOptions>(hostContext.Configuration.GetSection("JT809NettyOptions")); | |||||
services.AddSingleton<JT809BusinessTypeHandler, JT809BusinessTypeHandler>(); | |||||
services.AddScoped<JT809DownMasterLinkConnectionHandler, JT809DownMasterLinkConnectionHandler>(); | |||||
services.AddScoped<JT809DownMasterLinkServiceHandler, JT809DownMasterLinkServiceHandler>(); | |||||
services.AddScoped<JT809DecodeHandler, JT809DecodeHandler>(); | |||||
services.AddSingleton<IHostedService, JT809DownMasterLinkNettyService>(); | |||||
}); | |||||
await serverHostBuilder.RunConsoleAsync(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
{ | |||||
"Logging": { | |||||
"IncludeScopes": false, | |||||
"Debug": { | |||||
"LogLevel": { | |||||
"Default": "Trace" | |||||
} | |||||
}, | |||||
"Console": { | |||||
"LogLevel": { | |||||
"Default": "Trace" | |||||
} | |||||
} | |||||
}, | |||||
"ConnectionStrings": { | |||||
"TestDbContext": "", | |||||
"RedisHost": "" | |||||
}, | |||||
"JT809NettyOptions": { | |||||
"Host": "127.0.0.1", | |||||
"Port": 16565, | |||||
"IpWhiteList": [], | |||||
"IpWhiteListDisabled": true | |||||
} | |||||
} |
@@ -0,0 +1,25 @@ | |||||
{ | |||||
"Logging": { | |||||
"IncludeScopes": false, | |||||
"Debug": { | |||||
"LogLevel": { | |||||
"Default": "Trace" | |||||
} | |||||
}, | |||||
"Console": { | |||||
"LogLevel": { | |||||
"Default": "Trace" | |||||
} | |||||
} | |||||
}, | |||||
"ConnectionStrings": { | |||||
"TestDbContext": "", | |||||
"RedisHost": "" | |||||
}, | |||||
"JT809NettyOptions": { | |||||
"Host": "", | |||||
"Port": 6566, | |||||
"IpWhiteList": [], | |||||
"IpWhiteListDisabled": false | |||||
} | |||||
} |
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio 15 | # Visual Studio 15 | ||||
VisualStudioVersion = 15.0.28010.2016 | VisualStudioVersion = 15.0.28010.2016 | ||||
MinimumVisualStudioVersion = 10.0.40219.1 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT809Netty.Core", "JT809Netty.Core\JT809Netty.Core.csproj", "{2054D7E6-53B6-412F-BE9D-C6DABD80A111}" | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT809Netty.Core", "JT809Netty.Core\JT809Netty.Core.csproj", "{2054D7E6-53B6-412F-BE9D-C6DABD80A111}" | |||||
EndProject | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT809Netty.DownMasterLink", "JT809Netty.DownMasterLink\JT809Netty.DownMasterLink.csproj", "{3BF1D40D-A17D-4FBC-B3FF-B6DF8B3F13ED}" | |||||
EndProject | EndProject | ||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
@@ -15,6 +17,10 @@ Global | |||||
{2054D7E6-53B6-412F-BE9D-C6DABD80A111}.Debug|Any CPU.Build.0 = Debug|Any CPU | {2054D7E6-53B6-412F-BE9D-C6DABD80A111}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
{2054D7E6-53B6-412F-BE9D-C6DABD80A111}.Release|Any CPU.ActiveCfg = Release|Any CPU | {2054D7E6-53B6-412F-BE9D-C6DABD80A111}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
{2054D7E6-53B6-412F-BE9D-C6DABD80A111}.Release|Any CPU.Build.0 = Release|Any CPU | {2054D7E6-53B6-412F-BE9D-C6DABD80A111}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
{3BF1D40D-A17D-4FBC-B3FF-B6DF8B3F13ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{3BF1D40D-A17D-4FBC-B3FF-B6DF8B3F13ED}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{3BF1D40D-A17D-4FBC-B3FF-B6DF8B3F13ED}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{3BF1D40D-A17D-4FBC-B3FF-B6DF8B3F13ED}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
@@ -1,12 +0,0 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>Exe</OutputType> | |||||
<TargetFramework>netcoreapp2.1</TargetFramework> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="JT809" Version="1.0.0" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -1,12 +0,0 @@ | |||||
using System; | |||||
namespace JT809NettyServer | |||||
{ | |||||
class Program | |||||
{ | |||||
static void Main(string[] args) | |||||
{ | |||||
Console.WriteLine("Hello World!"); | |||||
} | |||||
} | |||||
} |