@@ -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.Transport.Channels; | |||
using JT809Netty.Core.Configs; | |||
using JT809.Protocol.JT809Extensions; | |||
using JT809.Protocol.JT809Enums; | |||
using JT809.Protocol.JT809MessageBody; | |||
using Microsoft.Extensions.Logging; | |||
using Microsoft.Extensions.Options; | |||
using System.Threading.Tasks; | |||
using JT809.Protocol; | |||
using DotNetty.Buffers; | |||
using JT809Netty.Core.ServiceHandlers; | |||
namespace JT809Netty.Core.Handlers | |||
{ | |||
@@ -14,13 +20,16 @@ namespace JT809Netty.Core.Handlers | |||
{ | |||
private readonly ILogger<JT809DownMasterLinkConnectionHandler> logger; | |||
private IOptionsMonitor<JT809NettyOptions> optionsMonitor; | |||
private readonly IOptionsMonitor<JT809NettyOptions> optionsMonitor; | |||
private readonly JT809BusinessTypeHandler jT809BusinessTypeHandler; | |||
public JT809DownMasterLinkConnectionHandler( | |||
JT809BusinessTypeHandler jT809BusinessTypeHandler, | |||
IOptionsMonitor<JT809NettyOptions> optionsMonitor, | |||
SessionManager sessionManager, | |||
ILoggerFactory loggerFactory) | |||
{ | |||
this.jT809BusinessTypeHandler = jT809BusinessTypeHandler; | |||
this.optionsMonitor = optionsMonitor; | |||
logger = loggerFactory.CreateLogger<JT809DownMasterLinkConnectionHandler>(); | |||
} | |||
@@ -56,7 +65,7 @@ namespace JT809Netty.Core.Handlers | |||
/// <summary> | |||
/// 主链路超时策略 | |||
/// 下级平台登录成功后,在与上级平台之间如果有应用业务数据包往来的情况下,不需要发送主链路保持数据包; | |||
/// 否则,下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 | |||
/// 否则,下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 | |||
/// </summary> | |||
/// <param name="context"></param> | |||
/// <param name="evt"></param> | |||
@@ -69,17 +78,9 @@ namespace JT809Netty.Core.Handlers | |||
logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); | |||
switch (idleStateEvent.State) | |||
{ | |||
//case IdleState.ReaderIdle: | |||
// break; | |||
case IdleState.WriterIdle: | |||
#warning 发送心跳保持 | |||
break; | |||
//case IdleState.AllIdle: | |||
// break; | |||
default: | |||
//发送心跳保持 | |||
jT809BusinessTypeHandler.Msg0x1005(context); | |||
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) | |||
{ | |||
nettyOptions.OnChange(options => | |||
Task.Run(async () => | |||
{ | |||
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) | |||
{ | |||
} | |||
}); | |||
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; | |||
} | |||
@@ -89,13 +81,19 @@ namespace JT809Netty.Core | |||
private void InitChannel(IChannel channel) | |||
{ | |||
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> | |||
<PackageReference Include="DotNetty.Handlers" 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.Logging.Abstractions" 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="Newtonsoft.Json" Version="11.0.2" /> | |||
</ItemGroup> | |||
</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 | |||
VisualStudioVersion = 15.0.28010.2016 | |||
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 | |||
Global | |||
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}.Release|Any CPU.ActiveCfg = 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 | |||
GlobalSection(SolutionProperties) = preSolution | |||
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!"); | |||
} | |||
} | |||
} |