@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.2</Version> | |||||
<Version>1.0.3</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
</Project> | </Project> |
@@ -28,8 +28,6 @@ namespace JT808.DotNetty.Core.Configurations | |||||
public int AllIdleTimeSeconds { get; set; } = 3600; | public int AllIdleTimeSeconds { get; set; } = 3600; | ||||
public int UdpSlidingExpirationTimeSeconds { get; set; } = 5*60; | |||||
/// <summary> | /// <summary> | ||||
/// WebApi服务 | /// WebApi服务 | ||||
/// 默认828端口 | /// 默认828端口 | ||||
@@ -14,14 +14,17 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.2</Version> | |||||
<Version>1.0.3</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | |||||
<Compile Remove="Jobs\JT808UdpMaintainSessionJob.cs" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" /> | <PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | <PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | ||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" /> | <PackageReference Include="Newtonsoft.Json" Version="12.0.1" /> | ||||
@@ -1,44 +0,0 @@ | |||||
using JT808.DotNetty.Core.Configurations; | |||||
using Microsoft.Extensions.Logging; | |||||
using Microsoft.Extensions.Options; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using System.Threading; | |||||
using System.Threading.Tasks; | |||||
namespace JT808.DotNetty.Core.Jobs | |||||
{ | |||||
public class JT808UdpMaintainSessionJob : JT808BackgroundService | |||||
{ | |||||
private readonly ILogger<JT808UdpMaintainSessionJob> _logger; | |||||
private readonly JT808UdpSessionManager jT808UdpSessionManager; | |||||
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor; | |||||
public JT808UdpMaintainSessionJob( | |||||
JT808UdpSessionManager jT808UdpSessionManager, | |||||
IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor, | |||||
ILoggerFactory loggerFactory) | |||||
{ | |||||
this.jT808UdpSessionManager = jT808UdpSessionManager; | |||||
this.jT808ConfigurationAccessor = jT808ConfigurationAccessor; | |||||
_logger = loggerFactory.CreateLogger<JT808UdpMaintainSessionJob>(); | |||||
} | |||||
public override string ServiceName => nameof(JT808UdpMaintainSessionJob); | |||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken) | |||||
{ | |||||
_logger.LogInformation($"{ServiceName} is starting."); | |||||
stoppingToken.Register(() => _logger.LogInformation($"{ServiceName} background task is stopping.")); | |||||
while (!stoppingToken.IsCancellationRequested) | |||||
{ | |||||
_logger.LogInformation($"{ServiceName} task doing background work."); | |||||
jT808UdpSessionManager.TimerToRemoveExpiredData(); | |||||
await Task.Delay(TimeSpan.FromSeconds(jT808ConfigurationAccessor.CurrentValue.UdpSlidingExpirationTimeSeconds), stoppingToken); | |||||
} | |||||
_logger.LogInformation($"{ServiceName} background task is stopping."); | |||||
} | |||||
} | |||||
} |
@@ -6,7 +6,6 @@ using System.Linq; | |||||
using JT808.DotNetty.Abstractions; | using JT808.DotNetty.Abstractions; | ||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using DotNetty.Transport.Channels; | using DotNetty.Transport.Channels; | ||||
using Microsoft.Extensions.Caching.Memory; | |||||
using JT808.DotNetty.Core.Configurations; | using JT808.DotNetty.Core.Configurations; | ||||
using Microsoft.Extensions.Options; | using Microsoft.Extensions.Options; | ||||
@@ -21,17 +20,14 @@ namespace JT808.DotNetty.Core | |||||
private readonly ILogger<JT808UdpSessionManager> logger; | private readonly ILogger<JT808UdpSessionManager> logger; | ||||
private readonly IJT808SessionPublishing jT808SessionPublishing; | private readonly IJT808SessionPublishing jT808SessionPublishing; | ||||
private readonly IMemoryCache memoryCache; | |||||
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor; | private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor; | ||||
public JT808UdpSessionManager( | public JT808UdpSessionManager( | ||||
IJT808SessionPublishing jT808SessionPublishing, | IJT808SessionPublishing jT808SessionPublishing, | ||||
IMemoryCache memoryCache, | |||||
IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor, | IOptionsMonitor<JT808Configuration> jT808ConfigurationAccessor, | ||||
ILoggerFactory loggerFactory) | ILoggerFactory loggerFactory) | ||||
{ | { | ||||
this.jT808SessionPublishing = jT808SessionPublishing; | this.jT808SessionPublishing = jT808SessionPublishing; | ||||
logger = loggerFactory.CreateLogger<JT808UdpSessionManager>(); | logger = loggerFactory.CreateLogger<JT808UdpSessionManager>(); | ||||
this.memoryCache = memoryCache; | |||||
this.jT808ConfigurationAccessor = jT808ConfigurationAccessor; | this.jT808ConfigurationAccessor = jT808ConfigurationAccessor; | ||||
} | } | ||||
@@ -58,59 +54,28 @@ namespace JT808.DotNetty.Core | |||||
return default; | return default; | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 定期去删除过期数据 | |||||
/// </summary> | |||||
public void TimerToRemoveExpiredData() { | |||||
foreach (var item in SessionIdDict) | |||||
{ | |||||
memoryCache.Get(item.Key); | |||||
} | |||||
} | |||||
public void TryAdd(JT808UdpSession appSession) | public void TryAdd(JT808UdpSession appSession) | ||||
{ | { | ||||
memoryCache.GetOrCreate<bool>(appSession.TerminalPhoneNo, (cacheEntry) => | |||||
{ | |||||
cacheEntry.SetSlidingExpiration(TimeSpan.FromSeconds(jT808ConfigurationAccessor.CurrentValue.UdpSlidingExpirationTimeSeconds)); | |||||
cacheEntry.RegisterPostEvictionCallback((key, value, reason, state) => | |||||
{ | |||||
RemoveSession(key.ToString()); | |||||
}); | |||||
return true; | |||||
}); | |||||
//1.先判断是否在缓存里面 | //1.先判断是否在缓存里面 | ||||
if (SessionIdDict.TryGetValue(appSession.TerminalPhoneNo,out JT808UdpSession jT808UdpSession)) | if (SessionIdDict.TryGetValue(appSession.TerminalPhoneNo,out JT808UdpSession jT808UdpSession)) | ||||
{ | { | ||||
//处理缓存 | |||||
//判断设备的终结点是否相同 | |||||
if (jT808UdpSession.Sender.Equals(appSession.Sender)) | |||||
{ | |||||
//相同 更新最后上线时间 | |||||
//每次使用最新的通道 | |||||
//将设备第一次上线时间赋值给当前上线的时间 | |||||
appSession.StartTime = jT808UdpSession.StartTime; | |||||
SessionIdDict.TryUpdate(appSession.TerminalPhoneNo, appSession, appSession); | |||||
} | |||||
else | |||||
{ | |||||
//不同 算成新设备上来并且推送通知 | |||||
SessionIdDict.TryUpdate(appSession.TerminalPhoneNo, appSession, appSession); | |||||
jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo); | |||||
} | |||||
SessionIdDict.TryUpdate(appSession.TerminalPhoneNo, appSession, appSession); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
//添加缓存 | //添加缓存 | ||||
if (SessionIdDict.TryAdd(appSession.TerminalPhoneNo, appSession)) | |||||
{ | |||||
//使用场景: | |||||
//部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, | |||||
//这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 | |||||
//有设备关联上来可以进行通知 例如:使用Redis发布订阅 | |||||
jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo); | |||||
} | |||||
//使用场景: | |||||
//部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, | |||||
//这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 | |||||
//有设备关联上来可以进行通知 例如:使用Redis发布订阅 | |||||
SessionIdDict.TryAdd(appSession.TerminalPhoneNo, appSession); | |||||
} | } | ||||
//移动是个大的内网,不跟随下发,根本就发不出来 | |||||
//移动很多卡,存储的那个socket地址端口,有效期非常短 | |||||
//不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了 | |||||
//所以此处采用跟随设备消息下发指令 | |||||
jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo); | |||||
} | } | ||||
public void Heartbeat(string terminalPhoneNo) | public void Heartbeat(string terminalPhoneNo) | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.2</Version> | |||||
<Version>1.0.3</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.2</Version> | |||||
<Version>1.0.3</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -22,7 +22,6 @@ | |||||
<PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | <PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | ||||
<PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" /> | <PackageReference Include="DotNetty.Transport.Libuv" Version="0.6.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -4,7 +4,6 @@ using JT808.DotNetty.Core.Handlers; | |||||
using JT808.DotNetty.Core.Jobs; | using JT808.DotNetty.Core.Jobs; | ||||
using JT808.DotNetty.Core.Services; | using JT808.DotNetty.Core.Services; | ||||
using JT808.DotNetty.Udp.Handlers; | using JT808.DotNetty.Udp.Handlers; | ||||
using Microsoft.Extensions.Caching.Memory; | |||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
using Microsoft.Extensions.DependencyInjection.Extensions; | using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
using Microsoft.Extensions.Internal; | using Microsoft.Extensions.Internal; | ||||
@@ -19,7 +18,6 @@ namespace JT808.DotNetty.Udp | |||||
{ | { | ||||
public static IServiceCollection AddJT808UdpHost(this IServiceCollection serviceDescriptors) | public static IServiceCollection AddJT808UdpHost(this IServiceCollection serviceDescriptors) | ||||
{ | { | ||||
serviceDescriptors.TryAddSingleton< IMemoryCache, MemoryCache>(); | |||||
serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>(); | serviceDescriptors.TryAddSingleton<JT808UdpSessionManager>(); | ||||
serviceDescriptors.TryAddSingleton<JT808UdpAtomicCounterService>(); | serviceDescriptors.TryAddSingleton<JT808UdpAtomicCounterService>(); | ||||
serviceDescriptors.TryAddSingleton<JT808UdpTrafficService>(); | serviceDescriptors.TryAddSingleton<JT808UdpTrafficService>(); | ||||
@@ -28,7 +26,6 @@ namespace JT808.DotNetty.Udp | |||||
serviceDescriptors.TryAddScoped<JT808UdpServerHandler>(); | serviceDescriptors.TryAddScoped<JT808UdpServerHandler>(); | ||||
serviceDescriptors.AddHostedService<JT808UdpAtomicCouterResetDailyJob>(); | serviceDescriptors.AddHostedService<JT808UdpAtomicCouterResetDailyJob>(); | ||||
serviceDescriptors.AddHostedService<JT808UdpTrafficResetDailyJob>(); | serviceDescriptors.AddHostedService<JT808UdpTrafficResetDailyJob>(); | ||||
serviceDescriptors.AddHostedService<JT808UdpMaintainSessionJob>(); | |||||
serviceDescriptors.AddHostedService<JT808UdpServerHost>(); | serviceDescriptors.AddHostedService<JT808UdpServerHost>(); | ||||
return serviceDescriptors; | return serviceDescriptors; | ||||
} | } | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.2</Version> | |||||
<Version>1.0.3</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | <PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | ||||
@@ -14,7 +14,7 @@ | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | <PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | ||||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | <PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | ||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
<Version>1.0.2</Version> | |||||
<Version>1.0.3</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||