@@ -37,6 +37,8 @@ | |||||
| IJT808MsgConsumer| 数据消费接口| 将数据进行对应的消息业务处理(例:设备流量统计、第三方平台数据转发、消息日志等) | | | IJT808MsgConsumer| 数据消费接口| 将数据进行对应的消息业务处理(例:设备流量统计、第三方平台数据转发、消息日志等) | | ||||
| IJT808MsgReplyProducer| 应答数据生产接口|将生产的数据解析为对应的消息Id应答发送到队列 | | | IJT808MsgReplyProducer| 应答数据生产接口|将生产的数据解析为对应的消息Id应答发送到队列 | | ||||
| IJT808MsgReplyConsumer| 应答数据消费接口| 将接收到的应答数据下发给设备| | | IJT808MsgReplyConsumer| 应答数据消费接口| 将接收到的应答数据下发给设备| | ||||
| IJT808MsgReplyLoggingProducer| 网关应答数据日志生产接口|将网关能解析到直接能下发的数据发送到队列| | |||||
| IJT808MsgReplyLoggingConsumer| 网关应答数据日志消费接口|将网关能解析到直接能下发的数据发送到日志系统| | |||||
> 使用物联网卡通过udp下发指令时,存储的那个socket地址端口,有效期非常短,不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了,所以此处采用跟随设备消息下发指令。 | > 使用物联网卡通过udp下发指令时,存储的那个socket地址端口,有效期非常短,不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了,所以此处采用跟随设备消息下发指令。 | ||||
@@ -44,11 +46,11 @@ | |||||
|服务名称|服务说明|使用场景| | |服务名称|服务说明|使用场景| | ||||
|:------:|:------|:------| | |:------:|:------|:------| | ||||
|MsgIdHandler| 消息处理服务|从队列中消费设备上报数据,再结合自身的业务场景,将数据进行处理并入库 | | |||||
|MsgIdHandler (v1.0.2新版pipeline)| 消息处理服务|从队列中消费设备上报数据,再结合自身的业务场景,将数据进行处理并入库 | | |||||
|MsgLogging | 消息日志服务|从队列中消费设备上报和平台应答数据,再将数据存入influxdb等数据库中,便于技术和技术支持排查设备与平台交互的原始数据| | |MsgLogging | 消息日志服务|从队列中消费设备上报和平台应答数据,再将数据存入influxdb等数据库中,便于技术和技术支持排查设备与平台交互的原始数据| | ||||
|ReplyMessage| 消息响应服务| 用于响应设备上报消息,以及下发指令信息到设备| | |ReplyMessage| 消息响应服务| 用于响应设备上报消息,以及下发指令信息到设备| | ||||
|SessionNotice| 会话管理服务| 通知设备上线下线,对于udp设备来说,可以在设备上线时,将指令跟随消息下发到设备| | |SessionNotice| 会话管理服务| 通知设备上线下线,对于udp设备来说,可以在设备上线时,将指令跟随消息下发到设备| | ||||
|Traffic|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本 | |||||
|Traffic (v1.0.2新版pipeline已移出)|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本 | |||||
|Transmit| 原包转发服务|该服务可以将设备上报原始数据转发到第三方,支持全部转发,指定终端号转发| | |Transmit| 原包转发服务|该服务可以将设备上报原始数据转发到第三方,支持全部转发,指定终端号转发| | ||||
## 基于WebApi的消息业务处理程序 | ## 基于WebApi的消息业务处理程序 | ||||
@@ -78,11 +80,11 @@ Pipeline分为两种方式使用,一种是使用队列的方式,一种是网 | |||||
| Install-Package JT808.Gateway.Client|  | | | | | Install-Package JT808.Gateway.Client|  | | | | ||||
| Install-Package JT808.Gateway.Kafka|  ||  | | | Install-Package JT808.Gateway.Kafka|  ||  | | ||||
| Install-Package JT808.Gateway.Transmit |  ||  | | | Install-Package JT808.Gateway.Transmit |  ||  | | ||||
| Install-Package JT808.Gateway.Traffic |  | || | |||||
| Install-Package JT808.Gateway.SessionNotice |  || | | | Install-Package JT808.Gateway.SessionNotice |  || | | ||||
| Install-Package JT808.Gateway.ReplyMessage |  | | | | | Install-Package JT808.Gateway.ReplyMessage |  | | | | ||||
| Install-Package JT808.Gateway.MsgLogging |  | || | | Install-Package JT808.Gateway.MsgLogging |  | || | ||||
| Install-Package JT808.Gateway.MsgIdHandler |  || | | |||||
| Install-Package JT808.Gateway.MsgIdHandler (v1.0.2新版已移出)|  || | | |||||
| Install-Package JT808.Gateway.Traffic (v1.0.2新版已移出)|  | || | |||||
## 基于DotNetty | ## 基于DotNetty | ||||
@@ -5,10 +5,8 @@ dotnet pack .\src\JT808.Gateway.Client\JT808.Gateway.Client.csproj -c Release -- | |||||
dotnet pack .\src\JT808.Gateway.WebApiClientTool\JT808.Gateway.WebApiClientTool.csproj -c Release --output nupkgs | dotnet pack .\src\JT808.Gateway.WebApiClientTool\JT808.Gateway.WebApiClientTool.csproj -c Release --output nupkgs | ||||
echo 'push service pacakge...' | echo 'push service pacakge...' | ||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.MsgIdHandler\JT808.Gateway.MsgIdHandler.csproj -c Release --output nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.MsgLogging\JT808.Gateway.MsgLogging.csproj -c Release --output nupkgs | dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.MsgLogging\JT808.Gateway.MsgLogging.csproj -c Release --output nupkgs | ||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.ReplyMessage\JT808.Gateway.ReplyMessage.csproj -c Release --output nupkgs | dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.ReplyMessage\JT808.Gateway.ReplyMessage.csproj -c Release --output nupkgs | ||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.SessionNotice\JT808.Gateway.SessionNotice.csproj -c Release --output nupkgs | dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.SessionNotice\JT808.Gateway.SessionNotice.csproj -c Release --output nupkgs | ||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.Traffic\JT808.Gateway.Traffic.csproj -c Release --output nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.Transmit\JT808.Gateway.Transmit.csproj -c Release --output nupkgs | dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.Transmit\JT808.Gateway.Transmit.csproj -c Release --output nupkgs | ||||
pause | pause |
@@ -1,14 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.MsgIdHandler | |||||
{ | |||||
/// <summary> | |||||
/// JT808消息Id处理程序 | |||||
/// </summary> | |||||
public interface IJT808MsgIdHandler | |||||
{ | |||||
void Processor((string TerminalNo, byte[] Data) parameter); | |||||
} | |||||
} |
@@ -1,30 +0,0 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\Version.props" /> | |||||
<PropertyGroup> | |||||
<TargetFramework>netstandard2.1</TargetFramework> | |||||
<LangVersion>8.0</LangVersion> | |||||
<Copyright>Copyright 2019.</Copyright> | |||||
<Authors>SmallChi(Koike)</Authors> | |||||
<RepositoryUrl>https://github.com/SmallChi/JT808Gateway</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808Gateway</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</license> | |||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> | |||||
<Version>$(JT808GatewayPackageVersion)</Version> | |||||
<SignAssembly>false</SignAssembly> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | |||||
<PackageId>JT808.Gateway.MsgIdHandler</PackageId> | |||||
<Product>JT808.Gateway.MsgIdHandler</Product> | |||||
<Description>基于JT808消息业务处理程序服务</Description> | |||||
<PackageReleaseNotes>基于JT808消息业务处理程序服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -1,19 +0,0 @@ | |||||
using JT808.Gateway.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.MsgIdHandler | |||||
{ | |||||
public static class JT808MsgIdHandlerExtensions | |||||
{ | |||||
public static IJT808ClientBuilder AddMsgIdHandler<TJT808MsgIdHandler>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TJT808MsgIdHandler: IJT808MsgIdHandler | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808MsgIdHandler),typeof(TJT808MsgIdHandler)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808MsgIdHandlerHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -1,34 +0,0 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.MsgIdHandler | |||||
{ | |||||
public class JT808MsgIdHandlerHostedService : IHostedService | |||||
{ | |||||
private readonly IJT808MsgConsumer jT808MsgConsumer; | |||||
private readonly IJT808MsgIdHandler jT808MsgIdHandler; | |||||
public JT808MsgIdHandlerHostedService( | |||||
IJT808MsgIdHandler jT808MsgIdHandler, | |||||
IJT808MsgConsumer jT808MsgConsumer) | |||||
{ | |||||
this.jT808MsgIdHandler = jT808MsgIdHandler; | |||||
this.jT808MsgConsumer = jT808MsgConsumer; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Subscribe(); | |||||
jT808MsgConsumer.OnMessage(jT808MsgIdHandler.Processor); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -1,37 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using System.Collections.Concurrent; | |||||
using System.Linq; | |||||
namespace JT808.Gateway.Traffic | |||||
{ | |||||
public interface IJT808Traffic | |||||
{ | |||||
long Get(string key); | |||||
long Increment(string terminalNo, string field, int len); | |||||
List<(string,long)> GetAll(); | |||||
} | |||||
class JT808TrafficDefault : IJT808Traffic | |||||
{ | |||||
private ConcurrentDictionary<string, long> dict = new ConcurrentDictionary<string, long>(); | |||||
public long Get(string key) | |||||
{ | |||||
long value; | |||||
dict.TryGetValue(key, out value); | |||||
return value; | |||||
} | |||||
public List<(string, long)> GetAll() | |||||
{ | |||||
return dict.Select(s => (s.Key, s.Value)).ToList(); | |||||
} | |||||
public long Increment(string terminalNo, string field, int len) | |||||
{ | |||||
return dict.AddOrUpdate($"{terminalNo}_{field}", len, (id, count) => count + len); | |||||
} | |||||
} | |||||
} |
@@ -1,29 +0,0 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Import Project="..\..\Version.props" /> | |||||
<PropertyGroup> | |||||
<TargetFramework>netstandard2.1</TargetFramework> | |||||
<LangVersion>8.0</LangVersion> | |||||
<Copyright>Copyright 2019.</Copyright> | |||||
<Authors>SmallChi(Koike)</Authors> | |||||
<RepositoryUrl>https://github.com/SmallChi/JT808Gateway</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808Gateway</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</license> | |||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> | |||||
<Version>$(JT808GatewayPackageVersion)</Version> | |||||
<SignAssembly>false</SignAssembly> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | |||||
<PackageId>JT808.Gateway.Traffic</PackageId> | |||||
<Product>JT808.Gateway.Traffic</Product> | |||||
<Description>基于JT808设备流量统计服务</Description> | |||||
<PackageReleaseNotes>基于JT808设备流量统计服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -1,60 +0,0 @@ | |||||
using JT808.Gateway.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.Traffic | |||||
{ | |||||
public static class JT808TrafficServiceExtensions | |||||
{ | |||||
/// <summary> | |||||
/// 消息流量统计服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddTraffic<TIJT808Traffic>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TIJT808Traffic:IJT808Traffic | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808Traffic), typeof(TIJT808Traffic)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808TrafficServiceHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 消息流量统计服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddTraffic(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808Traffic), typeof(JT808TrafficDefault)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808TrafficServiceHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 消息流量统计服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808GatewayBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808GatewayBuilder AddTraffic<TIJT808Traffic>(this IJT808GatewayBuilder jT808GatewayBuilder) | |||||
where TIJT808Traffic : IJT808Traffic | |||||
{ | |||||
jT808GatewayBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808Traffic), typeof(TIJT808Traffic)); | |||||
return jT808GatewayBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 消息流量统计服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808NormalGatewayBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808GatewayBuilder AddTraffic(this IJT808GatewayBuilder jT808NormalGatewayBuilder) | |||||
{ | |||||
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808Traffic), typeof(JT808TrafficDefault)); | |||||
return jT808NormalGatewayBuilder; | |||||
} | |||||
} | |||||
} |
@@ -1,39 +0,0 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Protocol.Extensions; | |||||
using JT808.Gateway.Abstractions; | |||||
using System; | |||||
namespace JT808.Gateway.Traffic | |||||
{ | |||||
public class JT808TrafficServiceHostedService : IHostedService | |||||
{ | |||||
private readonly IJT808MsgConsumer jT808MsgConsumer; | |||||
private readonly IJT808Traffic jT808Traffic; | |||||
public JT808TrafficServiceHostedService( | |||||
IJT808Traffic jT808Traffic, | |||||
IJT808MsgConsumer jT808MsgConsumer) | |||||
{ | |||||
this.jT808MsgConsumer = jT808MsgConsumer; | |||||
this.jT808Traffic = jT808Traffic; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Subscribe(); | |||||
jT808MsgConsumer.OnMessage((item)=> { | |||||
//string str = item.Data.ToHexString(); | |||||
jT808Traffic.Increment(item.TerminalNo,DateTime.Now.ToString("yyyyMMdd"), item.Data.Length); | |||||
}); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |