@@ -12,7 +12,7 @@ jobs: | |||||
- name: Setup .NET Core | - name: Setup .NET Core | ||||
uses: actions/setup-dotnet@master | uses: actions/setup-dotnet@master | ||||
with: | with: | ||||
dotnet-version: 6.0.100 | |||||
dotnet-version: 6.0.400 | |||||
- name: dotnet info | - name: dotnet info | ||||
run: dotnet --info | run: dotnet --info | ||||
- name: dotnet JT808.Gateway restore | - name: dotnet JT808.Gateway restore | ||||
@@ -1,5 +1,5 @@ | |||||
{ | { | ||||
"sdk": { | "sdk": { | ||||
"version": "6.0.101" | |||||
"version": "6.0.400" | |||||
} | } | ||||
} | } |
@@ -16,10 +16,10 @@ | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="JT808" Version="2.5.0-preview3" /> | |||||
<PackageReference Include="JT808" Version="2.5.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.2" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -18,7 +18,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | ||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | <PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -6,7 +6,7 @@ | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | ||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> | <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> | ||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | <PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | ||||
@@ -10,10 +10,10 @@ | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="JT808" Version="2.5.0-preview3" /> | |||||
<PackageReference Include="JT808" Version="2.5.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" /> | ||||
<PackageReference Include="System.IO.Pipelines" Version="6.0.3" /> | <PackageReference Include="System.IO.Pipelines" Version="6.0.3" /> | ||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.2" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -58,36 +58,44 @@ namespace JT808.Gateway.Client | |||||
clientSocket.Bind(new IPEndPoint(localIPAddress, DeviceConfig.LocalPort)); | clientSocket.Bind(new IPEndPoint(localIPAddress, DeviceConfig.LocalPort)); | ||||
} | } | ||||
await clientSocket.ConnectAsync(remoteEndPoint); | await clientSocket.ConnectAsync(remoteEndPoint); | ||||
await Task.Factory.StartNew(async()=> { | |||||
while (!heartbeatCTS.IsCancellationRequested) | |||||
try | |||||
{ | |||||
await Task.Factory.StartNew(async () => | |||||
{ | { | ||||
if (WriteableTimeout <= DateTime.UtcNow) | |||||
while (!heartbeatCTS.IsCancellationRequested) | |||||
{ | { | ||||
try | |||||
if (WriteableTimeout <= DateTime.UtcNow) | |||||
{ | { | ||||
if (Logger.IsEnabled(LogLevel.Information)) | |||||
try | |||||
{ | { | ||||
Logger.LogInformation($"{DeviceConfig.Heartbeat}s send heartbeat:{DeviceConfig.TerminalPhoneNo}-{DeviceConfig.Version.ToString()}"); | |||||
if (Logger.IsEnabled(LogLevel.Information)) | |||||
{ | |||||
Logger.LogInformation($"{DeviceConfig.Heartbeat}s send heartbeat:{DeviceConfig.TerminalPhoneNo}-{DeviceConfig.Version.ToString()}"); | |||||
} | |||||
if (DeviceConfig.Version == Protocol.Enums.JT808Version.JTT2013 || DeviceConfig.Version == Protocol.Enums.JT808Version.JTT2011) | |||||
{ | |||||
var package = JT808.Protocol.Enums.JT808MsgId._0x0002.Create(DeviceConfig.TerminalPhoneNo); | |||||
await SendAsync(new JT808ClientRequest(package)); | |||||
} | |||||
else | |||||
{ | |||||
var package = JT808.Protocol.Enums.JT808MsgId._0x0002.Create2019(DeviceConfig.TerminalPhoneNo); | |||||
await SendAsync(new JT808ClientRequest(package)); | |||||
} | |||||
} | } | ||||
if(DeviceConfig.Version== Protocol.Enums.JT808Version.JTT2013 || DeviceConfig.Version == Protocol.Enums.JT808Version.JTT2011) | |||||
catch (Exception ex) | |||||
{ | { | ||||
var package = JT808.Protocol.Enums.JT808MsgId._0x0002.Create(DeviceConfig.TerminalPhoneNo); | |||||
await SendAsync(new JT808ClientRequest(package)); | |||||
Logger.LogError(ex, ""); | |||||
} | } | ||||
else | |||||
{ | |||||
var package = JT808.Protocol.Enums.JT808MsgId._0x0002.Create2019(DeviceConfig.TerminalPhoneNo); | |||||
await SendAsync(new JT808ClientRequest(package)); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
Logger.LogError(ex, ""); | |||||
} | } | ||||
await Task.Delay(TimeSpan.FromSeconds(DeviceConfig.Heartbeat), heartbeatCTS.Token); | |||||
} | } | ||||
await Task.Delay(TimeSpan.FromSeconds(DeviceConfig.Heartbeat)); | |||||
} | |||||
}, heartbeatCTS.Token); | |||||
}, heartbeatCTS.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
} | |||||
return true; | return true; | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
@@ -99,19 +107,26 @@ namespace JT808.Gateway.Client | |||||
} | } | ||||
public async void StartAsync(CancellationToken cancellationToken) | public async void StartAsync(CancellationToken cancellationToken) | ||||
{ | { | ||||
await Task.Factory.StartNew(async (state) => | |||||
try | |||||
{ | { | ||||
var session = (Socket)state; | |||||
if (Logger.IsEnabled(LogLevel.Information)) | |||||
await Task.Factory.StartNew(async (state) => | |||||
{ | { | ||||
Logger.LogInformation($"[Connected]:{session.LocalEndPoint} to {session.RemoteEndPoint}"); | |||||
} | |||||
var pipe = new Pipe(); | |||||
Task writing = FillPipeAsync(session, pipe.Writer, cancellationToken); | |||||
Task reading = ReadPipeAsync(session, pipe.Reader); | |||||
await Task.WhenAll(reading, writing); | |||||
RetryBlockingCollection.RetryBlockingCollection.Add(DeviceConfig); | |||||
}, clientSocket); | |||||
var session = (Socket)state; | |||||
if (Logger.IsEnabled(LogLevel.Information)) | |||||
{ | |||||
Logger.LogInformation($"[Connected]:{session.LocalEndPoint} to {session.RemoteEndPoint}"); | |||||
} | |||||
var pipe = new Pipe(); | |||||
Task writing = FillPipeAsync(session, pipe.Writer, cancellationToken); | |||||
Task reading = ReadPipeAsync(session, pipe.Reader); | |||||
await Task.WhenAll(reading, writing); | |||||
RetryBlockingCollection.RetryBlockingCollection.Add(DeviceConfig); | |||||
}, clientSocket, cancellationToken, TaskCreationOptions.PreferFairness, TaskScheduler.Default); | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
} | |||||
} | } | ||||
private async Task FillPipeAsync(Socket session, PipeWriter writer, CancellationToken cancellationToken) | private async Task FillPipeAsync(Socket session, PipeWriter writer, CancellationToken cancellationToken) | ||||
{ | { | ||||
@@ -41,6 +41,7 @@ namespace JT808.Gateway.Client.Services | |||||
{ | { | ||||
while (!stoppingToken.IsCancellationRequested) | while (!stoppingToken.IsCancellationRequested) | ||||
{ | { | ||||
await Task.Delay(TimeSpan.FromSeconds(jT808ReportOptions.CurrentValue.Interval), stoppingToken); | |||||
var clients = jT808TcpClientFactory.GetAll(); | var clients = jT808TcpClientFactory.GetAll(); | ||||
JT808Report report = new JT808Report() | JT808Report report = new JT808Report() | ||||
{ | { | ||||
@@ -60,7 +61,6 @@ namespace JT808.Gateway.Client.Services | |||||
{ | { | ||||
sw.WriteLine(json); | sw.WriteLine(json); | ||||
} | } | ||||
await Task.Delay(TimeSpan.FromSeconds(jT808ReportOptions.CurrentValue.Interval), stoppingToken); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -37,35 +37,42 @@ namespace JT808.Gateway.Client.Services | |||||
{ | { | ||||
new Thread(async () => | new Thread(async () => | ||||
{ | { | ||||
foreach (var item in RetryBlockingCollection.RetryBlockingCollection.GetConsumingEnumerable(cancellationToken)) | |||||
try | |||||
{ | { | ||||
try | |||||
foreach (var item in RetryBlockingCollection.RetryBlockingCollection.GetConsumingEnumerable(cancellationToken)) | |||||
{ | { | ||||
jT808TcpClientFactory.Remove(item); | |||||
if (item.AutoReconnection) | |||||
try | |||||
{ | { | ||||
var result = await jT808TcpClientFactory.Create(item, cancellationToken); | |||||
if (result != null) | |||||
jT808TcpClientFactory.Remove(item); | |||||
if (item.AutoReconnection) | |||||
{ | { | ||||
if (logger.IsEnabled(LogLevel.Information)) | |||||
var result = await jT808TcpClientFactory.Create(item, cancellationToken); | |||||
if (result != null) | |||||
{ | { | ||||
logger.LogInformation($"Retry Success-{JsonSerializer.Serialize(item)}"); | |||||
if (logger.IsEnabled(LogLevel.Information)) | |||||
{ | |||||
logger.LogInformation($"Retry Success-{JsonSerializer.Serialize(item)}"); | |||||
} | |||||
} | } | ||||
} | |||||
else | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Warning)) | |||||
else | |||||
{ | { | ||||
logger.LogWarning($"Retry Fail-{JsonSerializer.Serialize(item)}"); | |||||
if (logger.IsEnabled(LogLevel.Warning)) | |||||
{ | |||||
logger.LogWarning($"Retry Fail-{JsonSerializer.Serialize(item)}"); | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError(ex, $"Retry Error-{JsonSerializer.Serialize(item)}"); | |||||
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); | |||||
} | |||||
} | } | ||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError(ex, $"Retry Error-{JsonSerializer.Serialize(item)}"); | |||||
await Task.Delay(TimeSpan.FromSeconds(5)); | |||||
} | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
} | } | ||||
}).Start(); | }).Start(); | ||||
return Task.CompletedTask; | return Task.CompletedTask; | ||||
@@ -8,7 +8,7 @@ | |||||
<DocumentationFile>JT808.Gateway.Kafka.xml</DocumentationFile> | <DocumentationFile>JT808.Gateway.Kafka.xml</DocumentationFile> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Confluent.Kafka" Version="1.9.2" /> | |||||
<PackageReference Include="Confluent.Kafka" Version="1.9.3" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -23,7 +23,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | ||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> | <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> | ||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | <PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | ||||
@@ -75,7 +75,7 @@ namespace JT808.Gateway.NormalHosting | |||||
//httpclient客户端调用 | //httpclient客户端调用 | ||||
services.AddHostedService<CallHttpClientJob>(); | services.AddHostedService<CallHttpClientJob>(); | ||||
//客户端测试 依赖AddClient()服务 | //客户端测试 依赖AddClient()服务 | ||||
//services.AddHostedService<UpJob>(); | |||||
services.AddHostedService<UpJob>(); | |||||
//需要跨域的 | //需要跨域的 | ||||
services.AddCors(options => | services.AddCors(options => | ||||
@@ -10,7 +10,7 @@ | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | ||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> | <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> | ||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | <PackageReference Include="NLog.Extensions.Logging" Version="5.0.4" /> | ||||
@@ -7,9 +7,9 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="6.0.0" /> | ||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" /> | |||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" /> | |||||
<PackageReference Include="xunit" Version="2.4.2" /> | <PackageReference Include="xunit" Version="2.4.2" /> | ||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> | <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> | ||||
<PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
@@ -95,28 +95,37 @@ namespace JT808.Gateway | |||||
public Task StartAsync(CancellationToken cancellationToken) | public Task StartAsync(CancellationToken cancellationToken) | ||||
{ | { | ||||
Logger.LogInformation($"JT808 TCP Server start at {IPAddress.Any}:{ConfigurationMonitor.CurrentValue.TcpPort}."); | Logger.LogInformation($"JT808 TCP Server start at {IPAddress.Any}:{ConfigurationMonitor.CurrentValue.TcpPort}."); | ||||
Task.Factory.StartNew(async () => | |||||
Task.Run(async () => | |||||
{ | { | ||||
while (!cancellationToken.IsCancellationRequested) | while (!cancellationToken.IsCancellationRequested) | ||||
{ | { | ||||
var socket = await server.AcceptAsync(); | |||||
JT808TcpSession jT808TcpSession = new JT808TcpSession(socket); | |||||
SessionManager.TryAdd(jT808TcpSession); | |||||
await Task.Factory.StartNew(async (state) => | |||||
try | |||||
{ | { | ||||
var session = (JT808TcpSession)state; | |||||
if (Logger.IsEnabled(LogLevel.Information)) | |||||
var socket = await server.AcceptAsync(); | |||||
JT808TcpSession jT808TcpSession = new JT808TcpSession(socket); | |||||
SessionManager.TryAdd(jT808TcpSession); | |||||
await Task.Factory.StartNew(async (state) => | |||||
{ | { | ||||
Logger.LogInformation($"[Connected]:{session.Client.RemoteEndPoint}"); | |||||
} | |||||
var pipe = new Pipe(); | |||||
Task writing = FillPipeAsync(session, pipe.Writer); | |||||
Task reading = ReadPipeAsync(session, pipe.Reader); | |||||
await Task.WhenAll(reading, writing); | |||||
SessionManager.RemoveBySessionId(session.SessionID); | |||||
}, jT808TcpSession); | |||||
var session = (JT808TcpSession)state; | |||||
if (Logger.IsEnabled(LogLevel.Information)) | |||||
{ | |||||
Logger.LogInformation($"[Connected]:{session.Client.RemoteEndPoint}"); | |||||
} | |||||
var pipe = new Pipe(); | |||||
Task writing = FillPipeAsync(session, pipe.Writer); | |||||
Task reading = ReadPipeAsync(session, pipe.Reader); | |||||
await Task.WhenAll(reading, writing); | |||||
SessionManager.RemoveBySessionId(session.SessionID); | |||||
}, jT808TcpSession, cancellationToken, TaskCreationOptions.PreferFairness, TaskScheduler.Default); | |||||
} | |||||
catch (OperationCanceledException) | |||||
{ | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
} | |||||
} | } | ||||
}, cancellationToken); | |||||
}); | |||||
return Task.CompletedTask; | return Task.CompletedTask; | ||||
} | } | ||||
private async Task FillPipeAsync(JT808TcpSession session, PipeWriter writer) | private async Task FillPipeAsync(JT808TcpSession session, PipeWriter writer) | ||||
@@ -62,7 +62,7 @@ namespace JT808.Gateway | |||||
public Task StartAsync(CancellationToken cancellationToken) | public Task StartAsync(CancellationToken cancellationToken) | ||||
{ | { | ||||
Logger.LogInformation($"JT808 Udp Server start at {IPAddress.Any}:{ConfigurationMonitor.CurrentValue.UdpPort}."); | Logger.LogInformation($"JT808 Udp Server start at {IPAddress.Any}:{ConfigurationMonitor.CurrentValue.UdpPort}."); | ||||
Task.Factory.StartNew(async() => { | |||||
Task.Run(async () => { | |||||
while (!cancellationToken.IsCancellationRequested) | while (!cancellationToken.IsCancellationRequested) | ||||
{ | { | ||||
var buffer = ArrayPool<byte>.Shared.Rent(ConfigurationMonitor.CurrentValue.MiniNumBufferSize); | var buffer = ArrayPool<byte>.Shared.Rent(ConfigurationMonitor.CurrentValue.MiniNumBufferSize); | ||||
@@ -93,7 +93,7 @@ namespace JT808.Gateway | |||||
ArrayPool<byte>.Shared.Return(buffer); | ArrayPool<byte>.Shared.Return(buffer); | ||||
} | } | ||||
} | } | ||||
}, cancellationToken); | |||||
}); | |||||
return Task.CompletedTask; | return Task.CompletedTask; | ||||
} | } | ||||
private void ReaderBuffer(ReadOnlySpan<byte> buffer, Socket socket,SocketReceiveMessageFromResult receiveMessageFromResult) | private void ReaderBuffer(ReadOnlySpan<byte> buffer, Socket socket,SocketReceiveMessageFromResult receiveMessageFromResult) | ||||
@@ -1,5 +1,5 @@ | |||||
{ | { | ||||
"sdk": { | "sdk": { | ||||
"version": "6.0.101" | |||||
"version": "6.0.400" | |||||
} | } | ||||
} | } |