Bladeren bron

待做

tags/old
SmallChi 6 jaren geleden
bovenliggende
commit
0f6c062ab0
13 gewijzigde bestanden met toevoegingen van 338 en 142 verwijderingen
  1. +0
    -77
      src/JT809Netty.Core/Handlers/JT808ServiceHandler.cs
  2. +14
    -13
      src/JT809Netty.Core/Handlers/JT809DownMasterLinkConnectionHandler.cs
  3. +53
    -0
      src/JT809Netty.Core/Handlers/JT809DownMasterLinkServiceHandler.cs
  4. +24
    -26
      src/JT809Netty.Core/JT809DownMasterLinkNettyService.cs
  5. +7
    -1
      src/JT809Netty.Core/JT809Netty.Core.csproj
  6. +108
    -0
      src/JT809Netty.Core/ServiceHandlers/JT809BusinessTypeHandler.cs
  7. +26
    -0
      src/JT809Netty.DownMasterLink/JT809Netty.DownMasterLink.csproj
  8. +49
    -0
      src/JT809Netty.DownMasterLink/Program.cs
  9. +25
    -0
      src/JT809Netty.DownMasterLink/appsettings.Development.json
  10. +25
    -0
      src/JT809Netty.DownMasterLink/appsettings.json
  11. +7
    -1
      src/JT809Netty.sln
  12. +0
    -12
      src/JT809NettyServer/JT809NettyServer.csproj
  13. +0
    -12
      src/JT809NettyServer/Program.cs

+ 0
- 77
src/JT809Netty.Core/Handlers/JT808ServiceHandler.cs Bestand weergeven

@@ -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();
}
}

+ 14
- 13
src/JT809Netty.Core/Handlers/JT809DownMasterLinkConnectionHandler.cs Bestand weergeven

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


+ 53
- 0
src/JT809Netty.Core/Handlers/JT809DownMasterLinkServiceHandler.cs Bestand weergeven

@@ -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();
}
}

+ 24
- 26
src/JT809Netty.Core/JT809DownMasterLinkNettyService.cs Bestand weergeven

@@ -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();
}
}
}
}

+ 7
- 1
src/JT809Netty.Core/JT809Netty.Core.csproj Bestand weergeven

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

+ 108
- 0
src/JT809Netty.Core/ServiceHandlers/JT809BusinessTypeHandler.cs Bestand weergeven

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

}
}
}

+ 26
- 0
src/JT809Netty.DownMasterLink/JT809Netty.DownMasterLink.csproj Bestand weergeven

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

+ 49
- 0
src/JT809Netty.DownMasterLink/Program.cs Bestand weergeven

@@ -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();
}
}
}

+ 25
- 0
src/JT809Netty.DownMasterLink/appsettings.Development.json Bestand weergeven

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

+ 25
- 0
src/JT809Netty.DownMasterLink/appsettings.json Bestand weergeven

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

+ 7
- 1
src/JT809Netty.sln Bestand weergeven

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


+ 0
- 12
src/JT809NettyServer/JT809NettyServer.csproj Bestand weergeven

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

+ 0
- 12
src/JT809NettyServer/Program.cs Bestand weergeven

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

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

Laden…
Annuleren
Opslaan