@@ -27,12 +27,6 @@ | |||||
 |  | ||||
## 基于WebApi的消息业务处理程序(JT808.DotNetty.WebApi) | |||||
通过继承JT808.DotNetty.Core.Handlers.JT808MsgIdHttpHandlerBase去实现自定义的WebApi接口服务。 | |||||
[WebApi公共接口服务](https://github.com/SmallChi/JT808DotNetty/blob/master/api/README.md) | |||||
## 集成接口功能(JT808.DotNetty.Abstractions) | ## 集成接口功能(JT808.DotNetty.Abstractions) | ||||
|接口名称|接口说明|使用场景| | |接口名称|接口说明|使用场景| | ||||
@@ -57,6 +51,14 @@ | |||||
|Traffic|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本 | |Traffic|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本 | ||||
|Transmit| 原包转发服务|该服务可以将设备上报原始数据转发到第三方,支持全部转发,指定终端号转发| | |Transmit| 原包转发服务|该服务可以将设备上报原始数据转发到第三方,支持全部转发,指定终端号转发| | ||||
## 基于WebApi的消息业务处理程序(JT808.DotNetty.WebApi) | |||||
通过继承JT808.DotNetty.Core.Handlers.JT808MsgIdHttpHandlerBase去实现自定义的WebApi接口服务。 | |||||
## 基于GRPC的消息业务处理程序 | |||||
[GRPC协议](https://github.com/SmallChi/JT808Gateway/blob/master/src/JT808.Gateway.Abstractions/Protos/JT808Gateway.proto) | |||||
## 基于DotNetty的NuGet安装 | ## 基于DotNetty的NuGet安装 | ||||
| Package Name | Version | Downloads | | | Package Name | Version | Downloads | | ||||
@@ -77,13 +79,19 @@ | |||||
| Install-Package JT808.DotNetty.Kafka |  |  | | | Install-Package JT808.DotNetty.Kafka |  |  | | ||||
| Install-Package JT808.DotNetty.RabbitMQ |  |  | | | Install-Package JT808.DotNetty.RabbitMQ |  |  | | ||||
## 基于Pipeline的NuGet安装 | |||||
## 基于core 3.1 Pipeline的NuGet安装 | |||||
| Package Name | Version | Downloads | | | Package Name | Version | Downloads | | ||||
| --------------------- | -------------------------------------------------- | --------------------------------------------------- | | | --------------------- | -------------------------------------------------- | --------------------------------------------------- | | ||||
| Install-Package JT808.Gateway.Abstractions|  |  | | | Install-Package JT808.Gateway.Abstractions|  |  | | ||||
| Install-Package JT808.Gateway |  |  | | | Install-Package JT808.Gateway |  |  | | ||||
| Install-Package JT808.Gateway.Kafka|  |  | | | 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 |  | | | |||||
## 举个栗子1 | ## 举个栗子1 | ||||
@@ -138,6 +146,41 @@ static async Task Main(string[] args) | |||||
## 举个栗子2 | ## 举个栗子2 | ||||
``` 1 | |||||
static async Task Main(string[] args) | |||||
{ | |||||
var serverHostBuilder = new HostBuilder() | |||||
.ConfigureAppConfiguration((hostingContext, config) => | |||||
{ | |||||
config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory) | |||||
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) | |||||
.AddJsonFile($"appsettings.{ hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); | |||||
}) | |||||
.ConfigureLogging((context, logging) => | |||||
{ | |||||
Console.WriteLine($"Environment.OSVersion.Platform:{Environment.OSVersion.Platform.ToString()}"); | |||||
NLog.LogManager.LoadConfiguration($"Configs/nlog.{Environment.OSVersion.Platform.ToString()}.config"); | |||||
logging.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true }); | |||||
logging.SetMinimumLevel(LogLevel.Trace); | |||||
}) | |||||
.ConfigureServices((hostContext, services) => | |||||
{ | |||||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | |||||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | |||||
services.AddJT808Configure() | |||||
.AddJT808Gateway() | |||||
.AddTcp() | |||||
.AddUdp() | |||||
.AddGrpc(); | |||||
//services.AddHostedService<CallGrpcClientJob>(); | |||||
}); | |||||
await serverHostBuilder.RunConsoleAsync(); | |||||
} | |||||
``` | |||||
## 举个栗子3 | |||||
1.打开项目进行还原编译生成 | 1.打开项目进行还原编译生成 | ||||
2.进入JT808.DotNetty.SimpleServer项目下的Debug目录运行服务端 | 2.进入JT808.DotNetty.SimpleServer项目下的Debug目录运行服务端 | ||||
@@ -0,0 +1,13 @@ | |||||
dotnet pack .\src\JT808.Gateway\JT808.Gateway.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Kafka\JT808.Gateway.Kafka.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj --no-build --output ../../nupkgs | |||||
echo 'push service pacakge...' | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.MsgIdHandler\JT808.Gateway.MsgIdHandler.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.MsgLogging\JT808.Gateway.MsgLogging.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.ReplyMessage\JT808.Gateway.ReplyMessage.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.SessionNotice\JT808.Gateway.SessionNotice.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.Traffic\JT808.Gateway.Traffic.csproj --no-build --output ../../nupkgs | |||||
dotnet pack .\src\JT808.Gateway.Services\JT808.Gateway.Transmit\JT808.Gateway.Transmit.csproj --no-build --output ../../nupkgs | |||||
pause |
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -6,10 +6,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -6,10 +6,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -60,7 +60,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0001(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0001(JT808HeaderPackage request) | |||||
{ | { | ||||
return null; | return null; | ||||
} | } | ||||
@@ -69,7 +69,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0002(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0002(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -95,7 +95,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0003(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0003(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -121,7 +121,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0100(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0100(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -147,7 +147,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0102(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0102(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -173,7 +173,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0200(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0200(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -199,7 +199,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0704(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0704(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -225,7 +225,7 @@ namespace JT808.DotNetty.ReplyMessage | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public byte[] Msg0x0900(JT808HeaderPackage request) | |||||
public virtual byte[] Msg0x0900(JT808HeaderPackage request) | |||||
{ | { | ||||
if (request.Version == JT808Version.JTT2019) | if (request.Version == JT808Version.JTT2019) | ||||
{ | { | ||||
@@ -6,10 +6,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -6,10 +6,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -5,10 +5,10 @@ | |||||
<LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
<Copyright>Copyright 2018.</Copyright> | <Copyright>Copyright 2018.</Copyright> | ||||
<Authors>SmallChi(Koike)</Authors> | <Authors>SmallChi(Koike)</Authors> | ||||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||||
<licenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</licenseUrl> | |||||
<license>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</license> | |||||
<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> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>$(JT808DotNettyPackageVersion)</Version> | <Version>$(JT808DotNettyPackageVersion)</Version> | ||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
@@ -1,4 +1,5 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | <Project Sdk="Microsoft.NET.Sdk"> | ||||
<Import Project="..\Version.props" /> | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<TargetFramework>netstandard2.1</TargetFramework> | <TargetFramework>netstandard2.1</TargetFramework> | ||||
<LangVersion>8.0</LangVersion> | <LangVersion>8.0</LangVersion> | ||||
@@ -16,19 +17,19 @@ | |||||
<PackageReleaseNotes>基于Pipeline实现的JT808Gateway的抽象库</PackageReleaseNotes> | <PackageReleaseNotes>基于Pipeline实现的JT808Gateway的抽象库</PackageReleaseNotes> | ||||
<PackageId>JT808.Gateway.Abstractions</PackageId> | <PackageId>JT808.Gateway.Abstractions</PackageId> | ||||
<Product>JT808.Gateway.Abstractions</Product> | <Product>JT808.Gateway.Abstractions</Product> | ||||
<Version>1.0.0-preview2</Version> | |||||
<Version>$(JT808GatewayPackageVersion)</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Protobuf Include="Protos\JT808Gateway.proto" /> | <Protobuf Include="Protos\JT808Gateway.proto" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Google.Protobuf" Version="3.11.2" /> | <PackageReference Include="Google.Protobuf" Version="3.11.2" /> | ||||
<PackageReference Include="Grpc.Core" Version="2.25.0" /> | |||||
<PackageReference Include="Grpc.Tools" Version="2.25.0"> | |||||
<PackageReference Include="Grpc.Core" Version="2.26.0" /> | |||||
<PackageReference Include="Grpc.Tools" Version="2.26.0"> | |||||
<PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||
</PackageReference> | </PackageReference> | ||||
<PackageReference Include="JT808" Version="2.2.2" /> | |||||
<PackageReference Include="JT808" Version="2.2.3" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -1,5 +1,5 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | <Project Sdk="Microsoft.NET.Sdk"> | ||||
<Import Project="..\Version.props" /> | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<TargetFramework>netstandard2.1</TargetFramework> | <TargetFramework>netstandard2.1</TargetFramework> | ||||
<LangVersion>8.0</LangVersion> | <LangVersion>8.0</LangVersion> | ||||
@@ -10,7 +10,6 @@ | |||||
<licenseUrl>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</licenseUrl> | <licenseUrl>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</licenseUrl> | ||||
<license>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</license> | <license>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</license> | ||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> | <GeneratePackageOnBuild>false</GeneratePackageOnBuild> | ||||
<Version>1.0.0-preview2</Version> | |||||
<SignAssembly>false</SignAssembly> | <SignAssembly>false</SignAssembly> | ||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | <PackageLicenseFile>LICENSE</PackageLicenseFile> | ||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | ||||
@@ -18,6 +17,7 @@ | |||||
<Product>JT808.Gateway.Kafka</Product> | <Product>JT808.Gateway.Kafka</Product> | ||||
<Description>基于Kafka的JT808消息发布与订阅</Description> | <Description>基于Kafka的JT808消息发布与订阅</Description> | ||||
<PackageReleaseNotes>基于Kafka的JT808消息发布与订阅</PackageReleaseNotes> | <PackageReleaseNotes>基于Kafka的JT808消息发布与订阅</PackageReleaseNotes> | ||||
<Version>$(JT808GatewayPackageVersion)</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Confluent.Kafka" Version="1.3.0" /> | <PackageReference Include="Confluent.Kafka" Version="1.3.0" /> | ||||
@@ -0,0 +1,14 @@ | |||||
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); | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
<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> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,19 @@ | |||||
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 AddJT808MsgIdHandler<TJT808DotNettyMsgIdHandler>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TJT808DotNettyMsgIdHandler: IJT808MsgIdHandler | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808MsgIdHandler),typeof(TJT808DotNettyMsgIdHandler)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808MsgIdHandlerHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
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; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,15 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace JT808.Gateway.MsgLogging | |||||
{ | |||||
/// <summary> | |||||
/// 808数据上下行日志接口 | |||||
/// </summary> | |||||
public interface IJT808MsgLogging | |||||
{ | |||||
void Processor((string TerminalNo, byte[] Data) parameter, JT808MsgLoggingType jT808MsgLoggingType); | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
<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.MsgLogging</PackageId> | |||||
<Product>JT808.Gateway.MsgLogging</Product> | |||||
<Description>基于JT808消息上下行日志服务</Description> | |||||
<PackageReleaseNotes>基于JT808消息上下行日志服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,36 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.MsgLogging | |||||
{ | |||||
public class JT808MsgDownLoggingHostedService : IHostedService | |||||
{ | |||||
private readonly IJT808MsgReplyConsumer jT808MsgReplyConsumer; | |||||
private readonly IJT808MsgLogging jT808MsgLogging; | |||||
public JT808MsgDownLoggingHostedService( | |||||
IJT808MsgLogging jT808MsgLogging, | |||||
IJT808MsgReplyConsumer jT808MsgReplyConsumer) | |||||
{ | |||||
this.jT808MsgReplyConsumer = jT808MsgReplyConsumer; | |||||
this.jT808MsgLogging = jT808MsgLogging; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgReplyConsumer.Subscribe(); | |||||
jT808MsgReplyConsumer.OnMessage(item=> | |||||
{ | |||||
jT808MsgLogging.Processor(item, JT808MsgLoggingType.down); | |||||
}); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgReplyConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,20 @@ | |||||
using JT808.Gateway.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.MsgLogging | |||||
{ | |||||
public static class JT808MsgLoggingExtensions | |||||
{ | |||||
public static IJT808ClientBuilder AddJT808MsgLogging<TJT808MsgLogging>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TJT808MsgLogging: IJT808MsgLogging | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808MsgLogging),typeof(TJT808MsgLogging)); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808MsgDownLoggingHostedService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808MsgUpLoggingHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.MsgLogging | |||||
{ | |||||
public enum JT808MsgLoggingType | |||||
{ | |||||
/// <summary> | |||||
/// 数据上行 | |||||
/// </summary> | |||||
up, | |||||
/// <summary> | |||||
/// 数据下行 | |||||
/// </summary> | |||||
down | |||||
} | |||||
} |
@@ -0,0 +1,36 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.MsgLogging | |||||
{ | |||||
public class JT808MsgUpLoggingHostedService : IHostedService | |||||
{ | |||||
private readonly IJT808MsgConsumer jT808MsgConsumer; | |||||
private readonly IJT808MsgLogging jT808MsgLogging; | |||||
public JT808MsgUpLoggingHostedService( | |||||
IJT808MsgLogging jT808MsgLogging, | |||||
IJT808MsgConsumer jT808MsgConsumer) | |||||
{ | |||||
this.jT808MsgConsumer = jT808MsgConsumer; | |||||
this.jT808MsgLogging = jT808MsgLogging; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Subscribe(); | |||||
jT808MsgConsumer.OnMessage(item=> | |||||
{ | |||||
jT808MsgLogging.Processor(item, JT808MsgLoggingType.up); | |||||
}); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
<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.ReplyMessage</PackageId> | |||||
<Product>JT808.Gateway.ReplyMessage</Product> | |||||
<Description>基于JT808消息业务处理程序服务</Description> | |||||
<PackageReleaseNotes>基于JT808消息业务处理程序服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,59 @@ | |||||
| |||||
using JT808.Gateway.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.ReplyMessage | |||||
{ | |||||
public static class JT808ReplyMessageExtensions | |||||
{ | |||||
/// <summary> | |||||
/// 独享消息应答服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808ReplyMessageService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808ReplyMessageHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 独享消息应答服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <typeparam name="TReplyMessageService">自定义消息回复服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808ReplyMessage<TReplyMessageService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TReplyMessageService : JT808ReplyMessageService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808ReplyMessageService,TReplyMessageService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808ReplyMessageHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息应答服务(消费者单实例) | |||||
/// </summary> | |||||
/// <typeparam name="TReplyMessageService">自定义消息回复服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808ReplyMessage<TReplyMessageService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TReplyMessageService : JT808ReplyMessageService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808ReplyMessageService, TReplyMessageService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息应答服务(消费者单实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808ReplyMessage(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808ReplyMessageService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.ReplyMessage | |||||
{ | |||||
public class JT808ReplyMessageHostedService : IHostedService | |||||
{ | |||||
private readonly IJT808MsgConsumer jT808MsgConsumer; | |||||
private readonly JT808ReplyMessageService jT808ReplyMessageService; | |||||
public JT808ReplyMessageHostedService( | |||||
JT808ReplyMessageService jT808ReplyMessageService, | |||||
IJT808MsgConsumer jT808MsgConsumer) | |||||
{ | |||||
this.jT808MsgConsumer = jT808MsgConsumer; | |||||
this.jT808ReplyMessageService = jT808ReplyMessageService; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Subscribe(); | |||||
jT808MsgConsumer.OnMessage(jT808ReplyMessageService.Processor); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,250 @@ | |||||
using JT808.Gateway.Abstractions; | |||||
using JT808.Protocol; | |||||
using JT808.Protocol.Enums; | |||||
using JT808.Protocol.Extensions; | |||||
using JT808.Protocol.MessageBody; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.ReplyMessage | |||||
{ | |||||
public class JT808ReplyMessageService | |||||
{ | |||||
protected Dictionary<ushort, MsgIdMethodDelegate> HandlerDict { get; } | |||||
protected delegate byte[] MsgIdMethodDelegate(JT808HeaderPackage package); | |||||
protected JT808Serializer JT808Serializer { get; } | |||||
protected IJT808MsgReplyProducer JT808MsgReplyProducer { get; } | |||||
public JT808ReplyMessageService( | |||||
IJT808Config jT808Config, | |||||
IJT808MsgReplyProducer jT808MsgReplyProducer) | |||||
{ | |||||
this.JT808Serializer = jT808Config.GetSerializer(); | |||||
this.JT808MsgReplyProducer = jT808MsgReplyProducer; | |||||
HandlerDict = new Dictionary<ushort, MsgIdMethodDelegate> { | |||||
{JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | |||||
{JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, | |||||
{JT808MsgId.终端心跳.ToUInt16Value(), Msg0x0002}, | |||||
{JT808MsgId.终端注销.ToUInt16Value(), Msg0x0003}, | |||||
{JT808MsgId.终端注册.ToUInt16Value(), Msg0x0100}, | |||||
{JT808MsgId.位置信息汇报.ToUInt16Value(),Msg0x0200 }, | |||||
{JT808MsgId.定位数据批量上传.ToUInt16Value(),Msg0x0704 }, | |||||
{JT808MsgId.数据上行透传.ToUInt16Value(),Msg0x0900 } | |||||
}; | |||||
} | |||||
public virtual void Processor((string TerminalNo, byte[] Data) parameter) | |||||
{ | |||||
try | |||||
{ | |||||
var request = JT808Serializer.HeaderDeserialize(parameter.Data); | |||||
if (HandlerDict.TryGetValue(request.Header.MsgId, out var func)) | |||||
{ | |||||
var buffer = func(request); | |||||
if (buffer != null) | |||||
{ | |||||
JT808MsgReplyProducer.ProduceAsync(parameter.TerminalNo, buffer); | |||||
} | |||||
} | |||||
} | |||||
catch | |||||
{ | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 终端通用应答 | |||||
/// 平台无需回复 | |||||
/// 实现自己的业务 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0001(JT808HeaderPackage request) | |||||
{ | |||||
return null; | |||||
} | |||||
/// <summary> | |||||
/// 终端心跳 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0002(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 终端注销 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0003(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 终端注册 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0100(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create_终端注册应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8100() | |||||
{ | |||||
Code = "J" + request.Header.TerminalPhoneNo, | |||||
JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, | |||||
AckMsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100() | |||||
{ | |||||
Code = "J" + request.Header.TerminalPhoneNo, | |||||
JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, | |||||
AckMsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 终端鉴权 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0102(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 位置信息汇报 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0200(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 定位数据批量上传 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0704(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 数据上行透传 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public virtual byte[] Msg0x0900(JT808HeaderPackage request) | |||||
{ | |||||
if (request.Version == JT808Version.JTT2019) | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
else | |||||
{ | |||||
return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() | |||||
{ | |||||
AckMsgId = request.Header.MsgId, | |||||
JT808PlatformResult = JT808PlatformResult.成功, | |||||
MsgNum = request.Header.MsgNum | |||||
})); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
<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.SessionNotice</PackageId> | |||||
<Product>JT808.Gateway.SessionNotice</Product> | |||||
<Description>基于JT808会话通知服务</Description> | |||||
<PackageReleaseNotes>基于JT808会话通知服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,62 @@ | |||||
| |||||
using JT808.Gateway.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.SessionNotice | |||||
{ | |||||
public static class JT808SessionNoticeExtensions | |||||
{ | |||||
/// <summary> | |||||
/// 独享消息会话通知服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808SessionNoticeService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808SessionNoticeHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 独享消息会话通知服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <typeparam name="TSessionNoticeService">自定义会话通知服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808SessionNotice<TSessionNoticeService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TSessionNoticeService : JT808SessionNoticeService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808SessionNoticeService,TSessionNoticeService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808SessionNoticeHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息会话通知服务(消费者单实例) | |||||
/// </summary> | |||||
/// <typeparam name="TSessionNoticeService">自定义会话通知服务</typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808SessionNotice<TSessionNoticeService>(this IJT808ClientBuilder jT808ClientBuilder) | |||||
where TSessionNoticeService : JT808SessionNoticeService | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808SessionNoticeService, TSessionNoticeService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息会话通知服务(消费者单实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808SessionNotice(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808SessionNoticeService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
using System.Threading.Tasks; | |||||
using JT808.Protocol; | |||||
using JT808.Protocol.Interfaces; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.SessionNotice | |||||
{ | |||||
public class JT808SessionNoticeHostedService : IHostedService | |||||
{ | |||||
private readonly JT808SessionNoticeService jT808SessionNoticeService; | |||||
private readonly IJT808SessionConsumer jT808SessionConsumer; | |||||
public JT808SessionNoticeHostedService( | |||||
IJT808SessionConsumer jT808SessionConsumer, | |||||
JT808SessionNoticeService jT808SessionNoticeService) | |||||
{ | |||||
this.jT808SessionNoticeService = jT808SessionNoticeService; | |||||
this.jT808SessionConsumer = jT808SessionConsumer; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808SessionConsumer.Subscribe(); | |||||
jT808SessionConsumer.OnMessage(jT808SessionNoticeService.Processor); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808SessionConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,24 @@ | |||||
using Microsoft.Extensions.Configuration; | |||||
using Microsoft.Extensions.Logging; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.SessionNotice | |||||
{ | |||||
public class JT808SessionNoticeService | |||||
{ | |||||
protected ILogger logger { get; } | |||||
public JT808SessionNoticeService(ILoggerFactory loggerFactory) | |||||
{ | |||||
logger = loggerFactory.CreateLogger("JT808SessionNoticeService"); | |||||
} | |||||
public virtual void Processor((string Notice, string TerminalNo) parameter) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Debug)) | |||||
{ | |||||
logger.LogDebug($"{parameter.Notice}-{parameter.TerminalNo}"); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
<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> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.0" /> | |||||
<PackageReference Include="CSRedisCore" Version="3.2.1" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,32 @@ | |||||
using Microsoft.Extensions.Configuration; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.Traffic | |||||
{ | |||||
public class JT808TrafficService:IDisposable | |||||
{ | |||||
private readonly CSRedis.CSRedisClient redisClien; | |||||
public JT808TrafficService(IConfiguration configuration) | |||||
{ | |||||
redisClien = new CSRedis.CSRedisClient(configuration.GetConnectionString("TrafficRedisHost")); | |||||
TrafficRedisClient.Initialization(redisClien); | |||||
} | |||||
public void Dispose() | |||||
{ | |||||
redisClien.Dispose(); | |||||
} | |||||
/// <summary> | |||||
/// 按设备每天统计sim卡流量 | |||||
/// </summary> | |||||
/// <param name="terminalNo"></param> | |||||
/// <param name="len"></param> | |||||
public void Processor(string terminalNo,int len) | |||||
{ | |||||
TrafficRedisClient.HIncrBy(terminalNo, DateTime.Now.ToString("yyyyMMdd"), len); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,34 @@ | |||||
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 AddInprocJT808Traffic(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808TrafficService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808TrafficServiceHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享消息流量统计服务(消费者单实例) | |||||
/// </summary> | |||||
/// <typeparam name="TReplyMessageService"></typeparam> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808Traffic(this IJT808ClientBuilder jT808ClientBuilder) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808TrafficService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,38 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Protocol.Extensions; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.Traffic | |||||
{ | |||||
public class JT808TrafficServiceHostedService : IHostedService | |||||
{ | |||||
private readonly IJT808MsgConsumer jT808MsgConsumer; | |||||
private readonly JT808TrafficService jT808TrafficService; | |||||
public JT808TrafficServiceHostedService( | |||||
JT808TrafficService jT808TrafficService, | |||||
IJT808MsgConsumer jT808MsgConsumer) | |||||
{ | |||||
this.jT808MsgConsumer = jT808MsgConsumer; | |||||
this.jT808TrafficService = jT808TrafficService; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Subscribe(); | |||||
jT808MsgConsumer.OnMessage((item)=> { | |||||
string str = item.Data.ToHexString(); | |||||
jT808TrafficService.Processor(item.TerminalNo, item.Data.Length); | |||||
}); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.Traffic | |||||
{ | |||||
class TrafficRedisClient: RedisHelper<TrafficRedisClient> | |||||
{ } | |||||
} |
@@ -0,0 +1,13 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.Transmit.Configs | |||||
{ | |||||
public class DataTransferOptions | |||||
{ | |||||
public string Host { get; set; } | |||||
public List<string> TerminalNos { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,11 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT808.Gateway.Transmit.Configs | |||||
{ | |||||
public class RemoteServerOptions | |||||
{ | |||||
public List<DataTransferOptions> DataTransfer { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,76 @@ | |||||
using DotNetty.Transport.Bootstrapping; | |||||
using DotNetty.Transport.Channels; | |||||
using DotNetty.Transport.Channels.Sockets; | |||||
using Polly; | |||||
using System; | |||||
using System.Linq; | |||||
using System.Collections.Generic; | |||||
using System.Net; | |||||
using System.Text; | |||||
using Microsoft.Extensions.Logging; | |||||
namespace JT808.Gateway.Transmit.Handlers | |||||
{ | |||||
public class ClientConnectionHandler : ChannelHandlerAdapter | |||||
{ | |||||
private readonly Bootstrap bootstrap; | |||||
public Dictionary<string, IChannel> channeldic; | |||||
private readonly ILogger<ClientConnectionHandler> logger; | |||||
public ClientConnectionHandler(Bootstrap bootstrap, | |||||
Dictionary<string, IChannel> channeldic, | |||||
ILoggerFactory loggerFactory) | |||||
{ | |||||
this.bootstrap = bootstrap; | |||||
this.channeldic = channeldic; | |||||
logger = loggerFactory.CreateLogger<ClientConnectionHandler>(); | |||||
} | |||||
public override void ChannelInactive(IChannelHandlerContext context) | |||||
{ | |||||
Policy.HandleResult<bool>(context.Channel.Open) | |||||
.WaitAndRetryForeverAsync(retryAttempt => | |||||
{ | |||||
return retryAttempt > 20 ? TimeSpan.FromSeconds(Math.Pow(2, 50)) : TimeSpan.FromSeconds(Math.Pow(2, retryAttempt));//超过重试20次,之后重试都是接近12个小时重试一次 | |||||
}, | |||||
(exception, timespan, ctx) => | |||||
{ | |||||
logger.LogError($"服务端断开{context.Channel.RemoteAddress},重试结果{exception.Result},重试次数{timespan},下次重试间隔(s){ctx.TotalSeconds}"); | |||||
}) | |||||
.ExecuteAsync(async () => | |||||
{ | |||||
try | |||||
{ | |||||
var oldChannel = channeldic.FirstOrDefault(m => m.Value == context.Channel); | |||||
if (default(KeyValuePair<string, IChannel>).Equals(oldChannel)) | |||||
{ | |||||
if(logger.IsEnabled( LogLevel.Debug)) | |||||
logger.LogDebug($"服务器已经删除了{oldChannel.Key}远程服务器配置"); | |||||
return true; | |||||
} | |||||
var channel = await bootstrap.ConnectAsync(context.Channel.RemoteAddress); | |||||
channeldic.Remove(oldChannel.Key); | |||||
channeldic.Add(oldChannel.Key, channel); | |||||
return channel.Open; | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError($"服务端断开后{context.Channel.RemoteAddress},重连异常:{ex}"); | |||||
return false; | |||||
} | |||||
}); | |||||
} | |||||
public override void ChannelRead(IChannelHandlerContext context, object message) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Debug)) | |||||
{ | |||||
logger.LogError($"服务端返回消息{message}"); | |||||
} | |||||
} | |||||
public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) | |||||
{ | |||||
logger.LogError($"服务端Exception: {exception}"); | |||||
context.CloseAsync(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,39 @@ | |||||
<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.Transmit</PackageId> | |||||
<Product>JT808.Gateway.Transmit</Product> | |||||
<Description>基于DotNetty实现的JT808数据转发服务</Description> | |||||
<PackageReleaseNotes>基于DotNetty实现的JT808数据转发服务</PackageReleaseNotes> | |||||
<PackageLicenseFile>LICENSE</PackageLicenseFile> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="DotNetty.Buffers" Version="0.6.0" /> | |||||
<PackageReference Include="DotNetty.Handlers" Version="0.6.0" /> | |||||
<PackageReference Include="DotNetty.Transport" Version="0.6.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" /> | |||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.0" /> | |||||
<PackageReference Include="Polly" Version="7.2.0" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<None Include="..\..\..\LICENSE" Pack="true" PackagePath="" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\..\JT808.Gateway.Abstractions\JT808.Gateway.Abstractions.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,40 @@ | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using JT808.Protocol; | |||||
using Microsoft.Extensions.Configuration; | |||||
using JT808.Gateway.Abstractions; | |||||
using JT808.Gateway.Transmit.Configs; | |||||
namespace JT808.Gateway.Transmit | |||||
{ | |||||
public static class JT808TransmitExtensions | |||||
{ | |||||
/// <summary> | |||||
/// 独享转发服务(不同的消费者实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <param name="configuration"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddInprocJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder,IConfiguration configuration) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.Configure<RemoteServerOptions>(configuration.GetSection("RemoteServerOptions")); | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808TransmitService>(); | |||||
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808TransmitHostedService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
/// <summary> | |||||
/// 共享转发服务(消费者单实例) | |||||
/// </summary> | |||||
/// <param name="jT808ClientBuilder"></param> | |||||
/// <param name="configuration"></param> | |||||
/// <returns></returns> | |||||
public static IJT808ClientBuilder AddShareJT808Transmit(this IJT808ClientBuilder jT808ClientBuilder, IConfiguration configuration) | |||||
{ | |||||
jT808ClientBuilder.JT808Builder.Services.Configure<RemoteServerOptions>(configuration.GetSection("RemoteServerOptions")); | |||||
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808TransmitService>(); | |||||
return jT808ClientBuilder; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,33 @@ | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Hosting; | |||||
using System.Threading; | |||||
using JT808.Gateway.Abstractions; | |||||
namespace JT808.Gateway.Transmit | |||||
{ | |||||
public class JT808TransmitHostedService:IHostedService | |||||
{ | |||||
private readonly JT808TransmitService jT808TransmitService; | |||||
private readonly IJT808MsgConsumer jT808MsgConsumer; | |||||
public JT808TransmitHostedService( | |||||
IJT808MsgConsumer jT808MsgConsumer, | |||||
JT808TransmitService jT808TransmitService) | |||||
{ | |||||
this.jT808TransmitService = jT808TransmitService; | |||||
this.jT808MsgConsumer = jT808MsgConsumer; | |||||
} | |||||
public Task StartAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Subscribe(); | |||||
jT808MsgConsumer.OnMessage(jT808TransmitService.Send); | |||||
return Task.CompletedTask; | |||||
} | |||||
public Task StopAsync(CancellationToken cancellationToken) | |||||
{ | |||||
jT808MsgConsumer.Unsubscribe(); | |||||
return Task.CompletedTask; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,236 @@ | |||||
using DotNetty.Buffers; | |||||
using DotNetty.Transport.Bootstrapping; | |||||
using DotNetty.Transport.Channels; | |||||
using DotNetty.Transport.Channels.Sockets; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Net; | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Extensions.Logging; | |||||
using Microsoft.Extensions.Options; | |||||
using System.Linq; | |||||
using JT808.Gateway.Transmit.Configs; | |||||
using JT808.Gateway.Transmit.Handlers; | |||||
namespace JT808.Gateway.Transmit | |||||
{ | |||||
public class JT808TransmitService | |||||
{ | |||||
private readonly ILogger logger; | |||||
private readonly ILoggerFactory loggerFactory; | |||||
private IOptionsMonitor<RemoteServerOptions> optionsMonitor; | |||||
public Dictionary<string, IChannel> channeldic = new Dictionary<string, IChannel>(); | |||||
public JT808TransmitService(ILoggerFactory loggerFactory, | |||||
IOptionsMonitor<RemoteServerOptions> optionsMonitor) | |||||
{ | |||||
this.loggerFactory = loggerFactory; | |||||
logger = loggerFactory.CreateLogger("JT808TransmitService"); | |||||
this.optionsMonitor = optionsMonitor; | |||||
InitialDispatcherClient(); | |||||
} | |||||
public void Send((string TerminalNo, byte[] Data) parameter) | |||||
{ | |||||
if (optionsMonitor.CurrentValue.DataTransfer != null) | |||||
{ | |||||
foreach (var item in optionsMonitor.CurrentValue.DataTransfer) | |||||
{ | |||||
if (channeldic.TryGetValue($"all_{item.Host}", out var allClientChannel)) | |||||
{ | |||||
try | |||||
{ | |||||
if (allClientChannel.Open) | |||||
{ | |||||
if (logger.IsEnabled(LogLevel.Debug)) | |||||
{ | |||||
logger.LogDebug($"转发所有数据到该网关{item.Host}"); | |||||
} | |||||
allClientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data)); | |||||
} | |||||
else | |||||
{ | |||||
logger.LogError($"{item.Host}链接已关闭"); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError($"{item.Host}发送数据出现异常:{ex}"); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
if (item.TerminalNos.Contains(parameter.TerminalNo) && channeldic.TryGetValue($"{parameter.TerminalNo}_{item.Host}", out var clientChannel)) | |||||
{ | |||||
try | |||||
{ | |||||
if (clientChannel.Open) | |||||
{ | |||||
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) | |||||
logger.LogDebug($"转发{parameter.TerminalNo}到该网关{item.Host}"); | |||||
clientChannel.WriteAndFlushAsync(Unpooled.WrappedBuffer(parameter.Data)); | |||||
} | |||||
else | |||||
{ | |||||
logger.LogError($"{item.Host},{parameter.TerminalNo}链接已关闭"); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError($"{item.Host},{parameter.TerminalNo}发送数据出现异常:{ex}"); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
public void InitialDispatcherClient() | |||||
{ | |||||
Task.Run(async () => | |||||
{ | |||||
var group = new MultithreadEventLoopGroup(); | |||||
var bootstrap = new Bootstrap(); | |||||
bootstrap.Group(group) | |||||
.Channel<TcpSocketChannel>() | |||||
.Option(ChannelOption.TcpNodelay, true) | |||||
.Handler(new ActionChannelInitializer<ISocketChannel>(channel => | |||||
{ | |||||
IChannelPipeline pipeline = channel.Pipeline; | |||||
pipeline.AddLast(new ClientConnectionHandler(bootstrap, channeldic, loggerFactory)); | |||||
})); | |||||
optionsMonitor.OnChange(options => | |||||
{ | |||||
List<string> lastRemoteServers = new List<string>(); | |||||
if (options.DataTransfer != null) | |||||
{ | |||||
if (options.DataTransfer.Any()) | |||||
{ | |||||
foreach (var item in options.DataTransfer) | |||||
{ | |||||
if (item.TerminalNos != null) | |||||
{ | |||||
if (item.TerminalNos.Any()) | |||||
{ | |||||
foreach (var terminal in item.TerminalNos) | |||||
{ | |||||
lastRemoteServers.Add($"{terminal}_{item.Host}"); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
lastRemoteServers.Add($"all_{item.Host}"); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
lastRemoteServers.Add($"all_{item.Host}"); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
DelRemoteServsers(lastRemoteServers); | |||||
AddRemoteServsers(bootstrap, lastRemoteServers); | |||||
}); | |||||
await InitRemoteServsers(bootstrap); | |||||
}); | |||||
} | |||||
/// <summary> | |||||
/// 初始化远程服务器 | |||||
/// </summary> | |||||
/// <param name="bootstrap"></param> | |||||
/// <param name="remoteServers"></param> | |||||
/// <returns></returns> | |||||
private async Task InitRemoteServsers(Bootstrap bootstrap) | |||||
{ | |||||
List<string> remoteServers = new List<string>(); | |||||
if (optionsMonitor.CurrentValue.DataTransfer != null) | |||||
{ | |||||
if (optionsMonitor.CurrentValue.DataTransfer.Any()) | |||||
{ | |||||
foreach (var item in optionsMonitor.CurrentValue.DataTransfer) | |||||
{ | |||||
if (item.TerminalNos != null) | |||||
{ | |||||
if (item.TerminalNos.Any()) | |||||
{ | |||||
foreach (var terminal in item.TerminalNos) | |||||
{ | |||||
remoteServers.Add($"{terminal}_{item.Host}"); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
remoteServers.Add($"all_{item.Host}"); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
remoteServers.Add($"all_{item.Host}"); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
foreach (var item in remoteServers) | |||||
{ | |||||
try | |||||
{ | |||||
string ip_port = item.Split('_')[1]; | |||||
IChannel clientChannel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(ip_port.Split(':')[0]), int.Parse(ip_port.Split(':')[1]))); | |||||
channeldic.Add(item, clientChannel); | |||||
if (clientChannel.Open) | |||||
{ | |||||
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) | |||||
{ | |||||
logger.LogDebug($"该终端{item.Replace("_", "已连接上该服务器")}"); | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError($"初始化配置链接远程服务端{item},链接异常:{ex}"); | |||||
} | |||||
} | |||||
await Task.CompletedTask; | |||||
} | |||||
/// <summary> | |||||
/// 动态删除远程服务器 | |||||
/// </summary> | |||||
/// <param name="lastRemoteServers"></param> | |||||
private void DelRemoteServsers(List<string> lastRemoteServers) | |||||
{ | |||||
var delChannels = channeldic.Keys.Except(lastRemoteServers).ToList(); | |||||
foreach (var item in delChannels) | |||||
{ | |||||
channeldic[item].CloseAsync(); | |||||
channeldic.Remove(item); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 动态添加远程服务器 | |||||
/// </summary> | |||||
/// <param name="bootstrap"></param> | |||||
/// <param name="lastRemoteServers"></param> | |||||
private void AddRemoteServsers(Bootstrap bootstrap, List<string> lastRemoteServers) | |||||
{ | |||||
var addChannels = lastRemoteServers.Except(channeldic.Keys).ToList(); | |||||
foreach (var item in addChannels) | |||||
{ | |||||
try | |||||
{ | |||||
var ip_port = item.Split('_')[1]; | |||||
IChannel clientChannel = bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(ip_port.Split(':')[0]), int.Parse(ip_port.Split(':')[1]))).Result; | |||||
channeldic.Add(item, clientChannel); | |||||
if (clientChannel.Open) { | |||||
if (logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) | |||||
{ | |||||
logger.LogDebug($"该终端{item.Replace("_", "已连接上该服务器")}"); | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
logger.LogError($"变更配置后链接远程服务端{item},重连异常:{ex}"); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -13,6 +13,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Abstractions" | |||||
EndProject | EndProject | ||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Kafka", "JT808.Gateway.Kafka\JT808.Gateway.Kafka.csproj", "{274C048E-A8E3-4422-A578-A10A97DF36F2}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Kafka", "JT808.Gateway.Kafka\JT808.Gateway.Kafka.csproj", "{274C048E-A8E3-4422-A578-A10A97DF36F2}" | ||||
EndProject | EndProject | ||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{3EF8490D-C993-49D8-8A3D-493B7F259D70}" | |||||
EndProject | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.MsgIdHandler", "JT808.Gateway.Services\JT808.Gateway.MsgIdHandler\JT808.Gateway.MsgIdHandler.csproj", "{D62E3054-6924-4F1A-9BEF-E52B191F16B6}" | |||||
EndProject | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.MsgLogging", "JT808.Gateway.Services\JT808.Gateway.MsgLogging\JT808.Gateway.MsgLogging.csproj", "{A242A839-4F00-4434-A7E8-7E3BEBA5B75C}" | |||||
EndProject | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.SessionNotice", "JT808.Gateway.Services\JT808.Gateway.SessionNotice\JT808.Gateway.SessionNotice.csproj", "{1CB84599-5F56-4461-A451-DF16E3854AB9}" | |||||
EndProject | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.ReplyMessage", "JT808.Gateway.Services\JT808.Gateway.ReplyMessage\JT808.Gateway.ReplyMessage.csproj", "{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}" | |||||
EndProject | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Transmit", "JT808.Gateway.Services\JT808.Gateway.Transmit\JT808.Gateway.Transmit.csproj", "{598E445A-AF2E-42F0-98F4-18EC22E473FC}" | |||||
EndProject | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Traffic", "JT808.Gateway.Services\JT808.Gateway.Traffic\JT808.Gateway.Traffic.csproj", "{8FCC6D65-8A49-4AE7-8B19-F255100849D6}" | |||||
EndProject | |||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
@@ -39,10 +53,42 @@ Global | |||||
{274C048E-A8E3-4422-A578-A10A97DF36F2}.Debug|Any CPU.Build.0 = Debug|Any CPU | {274C048E-A8E3-4422-A578-A10A97DF36F2}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
{274C048E-A8E3-4422-A578-A10A97DF36F2}.Release|Any CPU.ActiveCfg = Release|Any CPU | {274C048E-A8E3-4422-A578-A10A97DF36F2}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
{274C048E-A8E3-4422-A578-A10A97DF36F2}.Release|Any CPU.Build.0 = Release|Any CPU | {274C048E-A8E3-4422-A578-A10A97DF36F2}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
{D62E3054-6924-4F1A-9BEF-E52B191F16B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{D62E3054-6924-4F1A-9BEF-E52B191F16B6}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{D62E3054-6924-4F1A-9BEF-E52B191F16B6}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{D62E3054-6924-4F1A-9BEF-E52B191F16B6}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{A242A839-4F00-4434-A7E8-7E3BEBA5B75C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{A242A839-4F00-4434-A7E8-7E3BEBA5B75C}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{A242A839-4F00-4434-A7E8-7E3BEBA5B75C}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{A242A839-4F00-4434-A7E8-7E3BEBA5B75C}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{8FCC6D65-8A49-4AE7-8B19-F255100849D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{8FCC6D65-8A49-4AE7-8B19-F255100849D6}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{8FCC6D65-8A49-4AE7-8B19-F255100849D6}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{8FCC6D65-8A49-4AE7-8B19-F255100849D6}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(NestedProjects) = preSolution | |||||
{D62E3054-6924-4F1A-9BEF-E52B191F16B6} = {3EF8490D-C993-49D8-8A3D-493B7F259D70} | |||||
{A242A839-4F00-4434-A7E8-7E3BEBA5B75C} = {3EF8490D-C993-49D8-8A3D-493B7F259D70} | |||||
{1CB84599-5F56-4461-A451-DF16E3854AB9} = {3EF8490D-C993-49D8-8A3D-493B7F259D70} | |||||
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4} = {3EF8490D-C993-49D8-8A3D-493B7F259D70} | |||||
{598E445A-AF2E-42F0-98F4-18EC22E473FC} = {3EF8490D-C993-49D8-8A3D-493B7F259D70} | |||||
{8FCC6D65-8A49-4AE7-8B19-F255100849D6} = {3EF8490D-C993-49D8-8A3D-493B7F259D70} | |||||
EndGlobalSection | |||||
GlobalSection(ExtensibilityGlobals) = postSolution | GlobalSection(ExtensibilityGlobals) = postSolution | ||||
SolutionGuid = {AA9303A7-6FB3-4572-88AA-3302E85330D1} | SolutionGuid = {AA9303A7-6FB3-4572-88AA-3302E85330D1} | ||||
EndGlobalSection | EndGlobalSection | ||||
@@ -1,5 +1,5 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | <Project Sdk="Microsoft.NET.Sdk"> | ||||
<Import Project="..\Version.props" /> | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<TargetFramework>netstandard2.1</TargetFramework> | <TargetFramework>netstandard2.1</TargetFramework> | ||||
<LangVersion>8.0</LangVersion> | <LangVersion>8.0</LangVersion> | ||||
@@ -17,7 +17,7 @@ | |||||
<PackageReleaseNotes>基于Pipeline实现的JT808Gateway的网络库</PackageReleaseNotes> | <PackageReleaseNotes>基于Pipeline实现的JT808Gateway的网络库</PackageReleaseNotes> | ||||
<PackageId>JT808.Gateway</PackageId> | <PackageId>JT808.Gateway</PackageId> | ||||
<Product>JT808.Gateway</Product> | <Product>JT808.Gateway</Product> | ||||
<Version>1.0.0-preview2</Version> | |||||
<Version>$(JT808GatewayPackageVersion)</Version> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -25,8 +25,6 @@ namespace JT808.Gateway | |||||
{ | { | ||||
private Socket server; | private Socket server; | ||||
private const byte beginAndEndMark = 0x7e; | |||||
private readonly ILogger Logger; | private readonly ILogger Logger; | ||||
private readonly JT808SessionManager SessionManager; | private readonly JT808SessionManager SessionManager; | ||||
@@ -160,13 +158,13 @@ namespace JT808.Gateway | |||||
SequenceReader<byte> seqReader = new SequenceReader<byte>(buffer); | SequenceReader<byte> seqReader = new SequenceReader<byte>(buffer); | ||||
if (seqReader.TryPeek(out byte beginMark)) | if (seqReader.TryPeek(out byte beginMark)) | ||||
{ | { | ||||
if (beginMark != beginAndEndMark) throw new ArgumentException("Not JT808 Packages."); | |||||
if (beginMark != JT808Package.BeginFlag) throw new ArgumentException("Not JT808 Packages."); | |||||
} | } | ||||
byte mark = 0; | byte mark = 0; | ||||
long totalConsumed = 0; | long totalConsumed = 0; | ||||
while (!seqReader.End) | while (!seqReader.End) | ||||
{ | { | ||||
if (seqReader.IsNext(beginAndEndMark, advancePast: true)) | |||||
if (seqReader.IsNext(JT808Package.BeginFlag, advancePast: true)) | |||||
{ | { | ||||
if (mark == 1) | if (mark == 1) | ||||
{ | { | ||||
@@ -1,5 +1,6 @@ | |||||
<Project> | <Project> | ||||
<PropertyGroup> | <PropertyGroup> | ||||
<JT808DotNettyPackageVersion>2.3.1</JT808DotNettyPackageVersion> | <JT808DotNettyPackageVersion>2.3.1</JT808DotNettyPackageVersion> | ||||
<JT808GatewayPackageVersion>1.0.0-preview3</JT808GatewayPackageVersion> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
</Project> | </Project> |