Sfoglia il codice sorgente

1.增加Gateway服务项目

2.修改netty项目url连接几应答服务改为虚方法
3.修改文档
tags/pipeline-1.0.0
SmallChi(Koike) 5 anni fa
parent
commit
f2054b2a5a
53 ha cambiato i file con 1575 aggiunte e 83 eliminazioni
  1. +50
    -7
      README.md
  2. +13
    -0
      publish.gateway.bat
  3. +4
    -4
      src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj
  4. +4
    -4
      src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj
  5. +4
    -4
      src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj
  6. +4
    -4
      src/JT808.DotNetty.Kafka/JT808.DotNetty.Kafka.csproj
  7. +4
    -4
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj
  8. +4
    -4
      src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj
  9. +4
    -4
      src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj
  10. +8
    -8
      src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs
  11. +4
    -4
      src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj
  12. +4
    -4
      src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj
  13. +4
    -4
      src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj
  14. +4
    -4
      src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj
  15. +4
    -4
      src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj
  16. +4
    -4
      src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj
  17. +4
    -4
      src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj
  18. +5
    -4
      src/JT808.Gateway.Abstractions/JT808.Gateway.Abstractions.csproj
  19. +2
    -2
      src/JT808.Gateway.Kafka/JT808.Gateway.Kafka.csproj
  20. +14
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/IJT808MsgIdHandler.cs
  21. +34
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/JT808.Gateway.MsgIdHandler.csproj
  22. +19
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/JT808MsgIdHandlerExtensions.cs
  23. +34
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/JT808MsgIdHandlerHostedService.cs
  24. +15
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/IJT808MsgLogging.cs
  25. +35
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808.Gateway.MsgLogging.csproj
  26. +36
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgDownLoggingHostedService.cs
  27. +20
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgLoggingExtensions.cs
  28. +18
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgLoggingType.cs
  29. +36
    -0
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgUpLoggingHostedService.cs
  30. +34
    -0
      src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808.Gateway.ReplyMessage.csproj
  31. +59
    -0
      src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageExtensions.cs
  32. +34
    -0
      src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageHostedService.cs
  33. +250
    -0
      src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageService.cs
  34. +35
    -0
      src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808.Gateway.SessionNotice.csproj
  35. +62
    -0
      src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeExtensions.cs
  36. +35
    -0
      src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeHostedService.cs
  37. +24
    -0
      src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeService.cs
  38. +35
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808.Gateway.Traffic.csproj
  39. +32
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficService.cs
  40. +34
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficServiceExtensions.cs
  41. +38
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficServiceHostedService.cs
  42. +9
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Traffic/TrafficRedisClient.cs
  43. +13
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/Configs/DataTransferOptions.cs
  44. +11
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/Configs/RemoteServerOptions.cs
  45. +76
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/Handlers/ClientConnectionHandler.cs
  46. +39
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808.Gateway.Transmit.csproj
  47. +40
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitExtensions.cs
  48. +33
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitHostedService.cs
  49. +236
    -0
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitService.cs
  50. +46
    -0
      src/JT808.Gateway.sln
  51. +2
    -2
      src/JT808.Gateway/JT808.Gateway.csproj
  52. +2
    -4
      src/JT808.Gateway/JT808TcpServer.cs
  53. +1
    -0
      src/Version.props

+ 50
- 7
README.md Vedi File

@@ -27,12 +27,6 @@

![design_model](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/design_model.png)

## 基于WebApi的消息业务处理程序(JT808.DotNetty.WebApi)

通过继承JT808.DotNetty.Core.Handlers.JT808MsgIdHttpHandlerBase去实现自定义的WebApi接口服务。

[WebApi公共接口服务](https://github.com/SmallChi/JT808DotNetty/blob/master/api/README.md)

## 集成接口功能(JT808.DotNetty.Abstractions)

|接口名称|接口说明|使用场景|
@@ -57,6 +51,14 @@
|Traffic|流量统计服务 |由于运营商sim卡查询流量滞后,通过流量统计服务可以实时准确的统计设备流量,可以最优配置设备的流量大小,以节省成本
|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安装

| Package Name | Version | Downloads |
@@ -77,13 +79,19 @@
| Install-Package JT808.DotNetty.Kafka | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.Kafka.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.Kafka.svg) |
| Install-Package JT808.DotNetty.RabbitMQ | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.RabbitMQ.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.RabbitMQ.svg) |

## 基于Pipeline的NuGet安装
## 基于core 3.1 Pipeline的NuGet安装

| Package Name | Version | Downloads |
| --------------------- | -------------------------------------------------- | --------------------------------------------------- |
| Install-Package JT808.Gateway.Abstractions| ![JT808.Gateway.Abstractions](https://img.shields.io/nuget/v/JT808.Gateway.Abstractions.svg) | ![JT808.Gateway.Abstractions](https://img.shields.io/nuget/dt/JT808.Gateway.Abstractions.svg) |
| Install-Package JT808.Gateway | ![JT808.Gateway](https://img.shields.io/nuget/v/JT808.Gateway.svg) | ![JT808.Gateway](https://img.shields.io/nuget/dt/JT808.Gateway.svg) |
| Install-Package JT808.Gateway.Kafka| ![JT808.Gateway.Kafka](https://img.shields.io/nuget/v/JT808.Gateway.Kafka.svg) | ![JT808.Gateway.Kafka](https://img.shields.io/nuget/dt/JT808.Gateway.Kafka.svg) |
| Install-Package JT808.Gateway.Transmit | ![JT808](https://img.shields.io/nuget/v/JT808.Gateway.Transmit.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Gateway.Transmit.svg) |
| Install-Package JT808.Gateway.Traffic | ![JT808](https://img.shields.io/nuget/v/JT808.Gateway.Traffic.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Gateway.Traffic.svg)|
| Install-Package JT808.Gateway.SessionNotice | ![JT808](https://img.shields.io/nuget/v/JT808.Gateway.SessionNotice.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Gateway.SessionNotice.svg)|
| Install-Package JT808.Gateway.ReplyMessage | ![JT808](https://img.shields.io/nuget/v/JT808.Gateway.ReplyMessage.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Gateway.ReplyMessage.svg)|
| Install-Package JT808.Gateway.MsgLogging | ![JT808](https://img.shields.io/nuget/v/JT808.Gateway.MsgLogging.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Gateway.MsgLogging.svg)|
| Install-Package JT808.Gateway.MsgIdHandler | ![JT808](https://img.shields.io/nuget/v/JT808.Gateway.MsgIdHandler.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Gateway.MsgIdHandler.svg)|

## 举个栗子1

@@ -138,6 +146,41 @@ static async Task Main(string[] args)

## 举个栗子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.打开项目进行还原编译生成

2.进入JT808.DotNetty.SimpleServer项目下的Debug目录运行服务端


+ 13
- 0
publish.gateway.bat Vedi File

@@ -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

+ 4
- 4
src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Kafka/JT808.DotNetty.Kafka.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Services/JT808.DotNetty.MsgIdHandler/JT808.DotNetty.MsgIdHandler.csproj Vedi File

@@ -6,10 +6,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Services/JT808.DotNetty.MsgLogging/JT808.DotNetty.MsgLogging.csproj Vedi File

@@ -6,10 +6,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808.DotNetty.ReplyMessage.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 8
- 8
src/JT808.DotNetty.Services/JT808.DotNetty.ReplyMessage/JT808DotNettyReplyMessageService.cs Vedi File

@@ -60,7 +60,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0001(JT808HeaderPackage request)
public virtual byte[] Msg0x0001(JT808HeaderPackage request)
{
return null;
}
@@ -69,7 +69,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0002(JT808HeaderPackage request)
public virtual byte[] Msg0x0002(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{
@@ -95,7 +95,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0003(JT808HeaderPackage request)
public virtual byte[] Msg0x0003(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{
@@ -121,7 +121,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0100(JT808HeaderPackage request)
public virtual byte[] Msg0x0100(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{
@@ -147,7 +147,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0102(JT808HeaderPackage request)
public virtual byte[] Msg0x0102(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{
@@ -173,7 +173,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0200(JT808HeaderPackage request)
public virtual byte[] Msg0x0200(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{
@@ -199,7 +199,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0704(JT808HeaderPackage request)
public virtual byte[] Msg0x0704(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{
@@ -225,7 +225,7 @@ namespace JT808.DotNetty.ReplyMessage
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0x0900(JT808HeaderPackage request)
public virtual byte[] Msg0x0900(JT808HeaderPackage request)
{
if (request.Version == JT808Version.JTT2019)
{


+ 4
- 4
src/JT808.DotNetty.Services/JT808.DotNetty.SessionNotice/JT808.DotNetty.SessionNotice.csproj Vedi File

@@ -6,10 +6,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Services/JT808.DotNetty.Traffic/JT808.DotNetty.Traffic.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Services/JT808.DotNetty.Transmit/JT808.DotNetty.Transmit.csproj Vedi File

@@ -6,10 +6,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 4
- 4
src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj Vedi File

@@ -5,10 +5,10 @@
<LangVersion>7.3</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<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>
<Version>$(JT808DotNettyPackageVersion)</Version>
<SignAssembly>false</SignAssembly>


+ 5
- 4
src/JT808.Gateway.Abstractions/JT808.Gateway.Abstractions.csproj Vedi File

@@ -1,4 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Version.props" />
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<LangVersion>8.0</LangVersion>
@@ -16,19 +17,19 @@
<PackageReleaseNotes>基于Pipeline实现的JT808Gateway的抽象库</PackageReleaseNotes>
<PackageId>JT808.Gateway.Abstractions</PackageId>
<Product>JT808.Gateway.Abstractions</Product>
<Version>1.0.0-preview2</Version>
<Version>$(JT808GatewayPackageVersion)</Version>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="Protos\JT808Gateway.proto" />
</ItemGroup>
<ItemGroup>
<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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</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" />
</ItemGroup>
<ItemGroup>


+ 2
- 2
src/JT808.Gateway.Kafka/JT808.Gateway.Kafka.csproj Vedi File

@@ -1,5 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Version.props" />
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<LangVersion>8.0</LangVersion>
@@ -10,7 +10,6 @@
<licenseUrl>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</licenseUrl>
<license>https://github.com/SmallChi/JT808Gateway/blob/master/LICENSE</license>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>1.0.0-preview2</Version>
<SignAssembly>false</SignAssembly>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
@@ -18,6 +17,7 @@
<Product>JT808.Gateway.Kafka</Product>
<Description>基于Kafka的JT808消息发布与订阅</Description>
<PackageReleaseNotes>基于Kafka的JT808消息发布与订阅</PackageReleaseNotes>
<Version>$(JT808GatewayPackageVersion)</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Confluent.Kafka" Version="1.3.0" />


+ 14
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/IJT808MsgIdHandler.cs Vedi File

@@ -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);
}
}

+ 34
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/JT808.Gateway.MsgIdHandler.csproj Vedi File

@@ -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>

+ 19
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/JT808MsgIdHandlerExtensions.cs Vedi File

@@ -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;
}
}
}

+ 34
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgIdHandler/JT808MsgIdHandlerHostedService.cs Vedi File

@@ -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;
}
}
}

+ 15
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/IJT808MsgLogging.cs Vedi File

@@ -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);
}
}

+ 35
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808.Gateway.MsgLogging.csproj Vedi File

@@ -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>

+ 36
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgDownLoggingHostedService.cs Vedi File

@@ -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;
}
}
}

+ 20
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgLoggingExtensions.cs Vedi File

@@ -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;
}
}
}

+ 18
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgLoggingType.cs Vedi File

@@ -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
}
}

+ 36
- 0
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgUpLoggingHostedService.cs Vedi File

@@ -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;
}
}
}

+ 34
- 0
src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808.Gateway.ReplyMessage.csproj Vedi File

@@ -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>

+ 59
- 0
src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageExtensions.cs Vedi File

@@ -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;
}
}
}

+ 34
- 0
src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageHostedService.cs Vedi File

@@ -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;
}
}
}

+ 250
- 0
src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageService.cs Vedi File

@@ -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
}));
}
}
}
}

+ 35
- 0
src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808.Gateway.SessionNotice.csproj Vedi File

@@ -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>

+ 62
- 0
src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeExtensions.cs Vedi File

@@ -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;
}
}
}

+ 35
- 0
src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeHostedService.cs Vedi File

@@ -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;
}
}
}

+ 24
- 0
src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeService.cs Vedi File

@@ -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}");
}
}
}
}

+ 35
- 0
src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808.Gateway.Traffic.csproj Vedi File

@@ -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>

+ 32
- 0
src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficService.cs Vedi File

@@ -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);
}
}
}

+ 34
- 0
src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficServiceExtensions.cs Vedi File

@@ -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;
}
}
}

+ 38
- 0
src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficServiceHostedService.cs Vedi File

@@ -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;
}
}
}

+ 9
- 0
src/JT808.Gateway.Services/JT808.Gateway.Traffic/TrafficRedisClient.cs Vedi File

@@ -0,0 +1,9 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Gateway.Traffic
{
class TrafficRedisClient: RedisHelper<TrafficRedisClient>
{ }
}

+ 13
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/Configs/DataTransferOptions.cs Vedi File

@@ -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; }
}
}

+ 11
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/Configs/RemoteServerOptions.cs Vedi File

@@ -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; }
}
}

+ 76
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/Handlers/ClientConnectionHandler.cs Vedi File

@@ -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();
}
}
}

+ 39
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808.Gateway.Transmit.csproj Vedi File

@@ -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>

+ 40
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitExtensions.cs Vedi File

@@ -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;
}
}
}

+ 33
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitHostedService.cs Vedi File

@@ -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;
}
}
}

+ 236
- 0
src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitService.cs Vedi File

@@ -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}");
}
}
}
}
}

+ 46
- 0
src/JT808.Gateway.sln Vedi File

@@ -13,6 +13,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Abstractions"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Kafka", "JT808.Gateway.Kafka\JT808.Gateway.Kafka.csproj", "{274C048E-A8E3-4422-A578-A10A97DF36F2}"
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
GlobalSection(SolutionConfigurationPlatforms) = preSolution
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}.Release|Any CPU.ActiveCfg = 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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
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
SolutionGuid = {AA9303A7-6FB3-4572-88AA-3302E85330D1}
EndGlobalSection


+ 2
- 2
src/JT808.Gateway/JT808.Gateway.csproj Vedi File

@@ -1,5 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Version.props" />
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<LangVersion>8.0</LangVersion>
@@ -17,7 +17,7 @@
<PackageReleaseNotes>基于Pipeline实现的JT808Gateway的网络库</PackageReleaseNotes>
<PackageId>JT808.Gateway</PackageId>
<Product>JT808.Gateway</Product>
<Version>1.0.0-preview2</Version>
<Version>$(JT808GatewayPackageVersion)</Version>
</PropertyGroup>
<ItemGroup>


+ 2
- 4
src/JT808.Gateway/JT808TcpServer.cs Vedi File

@@ -25,8 +25,6 @@ namespace JT808.Gateway
{
private Socket server;

private const byte beginAndEndMark = 0x7e;

private readonly ILogger Logger;

private readonly JT808SessionManager SessionManager;
@@ -160,13 +158,13 @@ namespace JT808.Gateway
SequenceReader<byte> seqReader = new SequenceReader<byte>(buffer);
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;
long totalConsumed = 0;
while (!seqReader.End)
{
if (seqReader.IsNext(beginAndEndMark, advancePast: true))
if (seqReader.IsNext(JT808Package.BeginFlag, advancePast: true))
{
if (mark == 1)
{


+ 1
- 0
src/Version.props Vedi File

@@ -1,5 +1,6 @@
<Project>
<PropertyGroup>
<JT808DotNettyPackageVersion>2.3.1</JT808DotNettyPackageVersion>
<JT808GatewayPackageVersion>1.0.0-preview3</JT808GatewayPackageVersion>
</PropertyGroup>
</Project>

Caricamento…
Annulla
Salva