From 0f6c062ab0d3cb370b63213a0b28d3a7d84a3c7f Mon Sep 17 00:00:00 2001 From: SmallChi <564952747@qq.com> Date: Tue, 9 Oct 2018 17:50:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=85=E5=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Handlers/JT808ServiceHandler.cs | 77 ------------- .../JT809DownMasterLinkConnectionHandler.cs | 27 ++--- .../JT809DownMasterLinkServiceHandler.cs | 53 +++++++++ .../JT809DownMasterLinkNettyService.cs | 50 ++++---- src/JT809Netty.Core/JT809Netty.Core.csproj | 8 +- .../JT809BusinessTypeHandler.cs | 108 ++++++++++++++++++ .../JT809Netty.DownMasterLink.csproj | 26 +++++ src/JT809Netty.DownMasterLink/Program.cs | 49 ++++++++ .../appsettings.Development.json | 25 ++++ .../appsettings.json | 25 ++++ src/JT809Netty.sln | 8 +- src/JT809NettyServer/JT809NettyServer.csproj | 12 -- src/JT809NettyServer/Program.cs | 12 -- 13 files changed, 338 insertions(+), 142 deletions(-) delete mode 100644 src/JT809Netty.Core/Handlers/JT808ServiceHandler.cs create mode 100644 src/JT809Netty.Core/Handlers/JT809DownMasterLinkServiceHandler.cs create mode 100644 src/JT809Netty.Core/ServiceHandlers/JT809BusinessTypeHandler.cs create mode 100644 src/JT809Netty.DownMasterLink/JT809Netty.DownMasterLink.csproj create mode 100644 src/JT809Netty.DownMasterLink/Program.cs create mode 100644 src/JT809Netty.DownMasterLink/appsettings.Development.json create mode 100644 src/JT809Netty.DownMasterLink/appsettings.json delete mode 100644 src/JT809NettyServer/JT809NettyServer.csproj delete mode 100644 src/JT809NettyServer/Program.cs diff --git a/src/JT809Netty.Core/Handlers/JT808ServiceHandler.cs b/src/JT809Netty.Core/Handlers/JT808ServiceHandler.cs deleted file mode 100644 index f6e88de..0000000 --- a/src/JT809Netty.Core/Handlers/JT808ServiceHandler.cs +++ /dev/null @@ -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 logger; - - private readonly JT808MsgIdHandler jT808MsgIdHandler; - - public JT808ServiceHandler( - JT808MsgIdHandler jT808MsgIdHandler, - ILoggerFactory loggerFactory) - { - this.jT808MsgIdHandler = jT808MsgIdHandler; - logger = loggerFactory.CreateLogger(); - } - - 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 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(); - } -} diff --git a/src/JT809Netty.Core/Handlers/JT809DownMasterLinkConnectionHandler.cs b/src/JT809Netty.Core/Handlers/JT809DownMasterLinkConnectionHandler.cs index 4793815..fd3cceb 100644 --- a/src/JT809Netty.Core/Handlers/JT809DownMasterLinkConnectionHandler.cs +++ b/src/JT809Netty.Core/Handlers/JT809DownMasterLinkConnectionHandler.cs @@ -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 logger; - private IOptionsMonitor optionsMonitor; + private readonly IOptionsMonitor optionsMonitor; + + private readonly JT809BusinessTypeHandler jT809BusinessTypeHandler; public JT809DownMasterLinkConnectionHandler( + JT809BusinessTypeHandler jT809BusinessTypeHandler, IOptionsMonitor optionsMonitor, - SessionManager sessionManager, ILoggerFactory loggerFactory) { + this.jT809BusinessTypeHandler = jT809BusinessTypeHandler; this.optionsMonitor = optionsMonitor; logger = loggerFactory.CreateLogger(); } @@ -56,7 +65,7 @@ namespace JT809Netty.Core.Handlers /// /// 主链路超时策略 /// 下级平台登录成功后,在与上级平台之间如果有应用业务数据包往来的情况下,不需要发送主链路保持数据包; - /// 否则,下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 + /// 否则,下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 /// /// /// @@ -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; } } diff --git a/src/JT809Netty.Core/Handlers/JT809DownMasterLinkServiceHandler.cs b/src/JT809Netty.Core/Handlers/JT809DownMasterLinkServiceHandler.cs new file mode 100644 index 0000000..688850d --- /dev/null +++ b/src/JT809Netty.Core/Handlers/JT809DownMasterLinkServiceHandler.cs @@ -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 logger; + + private readonly JT809BusinessTypeHandler jT809BusinessTypeHandler; + + public JT809DownMasterLinkServiceHandler( + JT809BusinessTypeHandler jT809BusinessTypeHandler, + ILoggerFactory loggerFactory) + { + this.jT809BusinessTypeHandler = jT809BusinessTypeHandler; + logger = loggerFactory.CreateLogger(); + } + + 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(); + } +} diff --git a/src/JT809Netty.Core/JT809DownMasterLinkNettyService.cs b/src/JT809Netty.Core/JT809DownMasterLinkNettyService.cs index 4d752a3..6659232 100644 --- a/src/JT809Netty.Core/JT809DownMasterLinkNettyService.cs +++ b/src/JT809Netty.Core/JT809DownMasterLinkNettyService.cs @@ -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() + .Handler(new ActionChannelInitializer(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() - .Handler(new ActionChannelInitializer(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()); - 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()); - //channel.Pipeline.AddLast("jt809Service", scope.ServiceProvider.GetRequiredService()); - scope.Dispose(); + try + { + //下级平台应每 1min 发送一个主链路保持清求数据包到上级平台以保持链路连接 + channel.Pipeline.AddLast("systemIdleState", new WriteTimeoutHandler(60)); + channel.Pipeline.AddLast("jt809DownMasterLinkConnection", scope.ServiceProvider.GetRequiredService()); + 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()); + channel.Pipeline.AddLast("jT809DownMasterLinkServiceHandler", scope.ServiceProvider.GetRequiredService()); + } + finally + { + scope.Dispose(); + } } } } diff --git a/src/JT809Netty.Core/JT809Netty.Core.csproj b/src/JT809Netty.Core/JT809Netty.Core.csproj index 74aa6ca..d824e7a 100644 --- a/src/JT809Netty.Core/JT809Netty.Core.csproj +++ b/src/JT809Netty.Core/JT809Netty.Core.csproj @@ -12,11 +12,17 @@ - + + + + + + + diff --git a/src/JT809Netty.Core/ServiceHandlers/JT809BusinessTypeHandler.cs b/src/JT809Netty.Core/ServiceHandlers/JT809BusinessTypeHandler.cs new file mode 100644 index 0000000..c39bd7a --- /dev/null +++ b/src/JT809Netty.Core/ServiceHandlers/JT809BusinessTypeHandler.cs @@ -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> RequestHandlerDict { get; } + + public Dictionary> ResponseHandlerDict { get; } + + private readonly ILogger logger; + + /// + /// 初始化业务处理 + /// + public JT809BusinessTypeHandler( + ILoggerFactory loggerFactory + ) + { + logger = loggerFactory.CreateLogger(); + //RequestHandlerDict = new Dictionary> + //{ + // {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> + { + {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) + { + + } + } +} diff --git a/src/JT809Netty.DownMasterLink/JT809Netty.DownMasterLink.csproj b/src/JT809Netty.DownMasterLink/JT809Netty.DownMasterLink.csproj new file mode 100644 index 0000000..382e298 --- /dev/null +++ b/src/JT809Netty.DownMasterLink/JT809Netty.DownMasterLink.csproj @@ -0,0 +1,26 @@ + + + + Exe + netcoreapp2.1 + latest + + + + + + + + + + + + + Always + + + Always + + + + diff --git a/src/JT809Netty.DownMasterLink/Program.cs b/src/JT809Netty.DownMasterLink/Program.cs new file mode 100644 index 0000000..eaeaee9 --- /dev/null +++ b/src/JT809Netty.DownMasterLink/Program.cs @@ -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(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.Configure(hostContext.Configuration.GetSection("JT809NettyOptions")); + services.AddSingleton(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddSingleton(); + }); + + await serverHostBuilder.RunConsoleAsync(); + } + } +} diff --git a/src/JT809Netty.DownMasterLink/appsettings.Development.json b/src/JT809Netty.DownMasterLink/appsettings.Development.json new file mode 100644 index 0000000..58a5b75 --- /dev/null +++ b/src/JT809Netty.DownMasterLink/appsettings.Development.json @@ -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 + } +} diff --git a/src/JT809Netty.DownMasterLink/appsettings.json b/src/JT809Netty.DownMasterLink/appsettings.json new file mode 100644 index 0000000..5cc6ff9 --- /dev/null +++ b/src/JT809Netty.DownMasterLink/appsettings.json @@ -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 + } +} diff --git a/src/JT809Netty.sln b/src/JT809Netty.sln index 5b0b11d..b5c0b22 100644 --- a/src/JT809Netty.sln +++ b/src/JT809Netty.sln @@ -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 diff --git a/src/JT809NettyServer/JT809NettyServer.csproj b/src/JT809NettyServer/JT809NettyServer.csproj deleted file mode 100644 index d3fc122..0000000 --- a/src/JT809NettyServer/JT809NettyServer.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Exe - netcoreapp2.1 - - - - - - - diff --git a/src/JT809NettyServer/Program.cs b/src/JT809NettyServer/Program.cs deleted file mode 100644 index a596836..0000000 --- a/src/JT809NettyServer/Program.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace JT809NettyServer -{ - class Program - { - static void Main(string[] args) - { - Console.WriteLine("Hello World!"); - } - } -}