@@ -37,6 +37,8 @@ | |||
| IJT808MsgConsumer| 数据消费接口| 将数据进行对应的消息业务处理(例:设备流量统计、第三方平台数据转发、消息日志等) | | |||
| IJT808MsgReplyProducer| 应答数据生产接口|将生产的数据解析为对应的消息Id应答发送到队列 | | |||
| IJT808MsgReplyConsumer| 应答数据消费接口| 将接收到的应答数据下发给设备| | |||
| IJT808MsgReplyLoggingProducer| 网关应答数据日志生产接口|将网关能解析到直接能下发的数据发送到队列| | |||
| IJT808MsgReplyLoggingConsumer| 网关应答数据日志消费接口|将网关能解析到直接能下发的数据发送到日志系统| | |||
> 使用物联网卡通过udp下发指令时,存储的那个socket地址端口,有效期非常短,不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了,所以此处采用跟随设备消息下发指令。 | |||
@@ -44,11 +46,11 @@ | |||
|服务名称|服务说明|使用场景| | |||
|:------:|:------|:------| | |||
|MsgIdHandler| 消息处理服务|从队列中消费设备上报数据,再结合自身的业务场景,将数据进行处理并入库 | | |||
|MsgIdHandler (v1.0.2新版pipeline)| 消息处理服务|从队列中消费设备上报数据,再结合自身的业务场景,将数据进行处理并入库 | | |||
|MsgLogging | 消息日志服务|从队列中消费设备上报和平台应答数据,再将数据存入influxdb等数据库中,便于技术和技术支持排查设备与平台交互的原始数据| | |||
|ReplyMessage| 消息响应服务| 用于响应设备上报消息,以及下发指令信息到设备| | |||
|SessionNotice| 会话管理服务| 通知设备上线下线,对于udp设备来说,可以在设备上线时,将指令跟随消息下发到设备| | |||
|Traffic|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本 | |||
|Traffic (v1.0.2新版pipeline已移出)|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本 | |||
|Transmit| 原包转发服务|该服务可以将设备上报原始数据转发到第三方,支持全部转发,指定终端号转发| | |||
## 基于WebApi的消息业务处理程序 | |||
@@ -78,11 +80,11 @@ Pipeline分为两种方式使用,一种是使用队列的方式,一种是网 | |||
| Install-Package JT808.Gateway.Client|  | | | | |||
| Install-Package JT808.Gateway.Kafka|  ||  | | |||
| Install-Package JT808.Gateway.Transmit |  ||  | | |||
| Install-Package JT808.Gateway.Traffic |  | || | |||
| Install-Package JT808.Gateway.SessionNotice |  || | | |||
| Install-Package JT808.Gateway.ReplyMessage |  | | | | |||
| 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 | |||
@@ -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 | |||
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.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.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 | |||
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; | |||
} | |||
} | |||
} |