From 59e216ebfdcde1787cfc68d323b7df55273cf38d Mon Sep 17 00:00:00 2001 From: smallchi <564952747@qq.com> Date: Mon, 22 Jul 2019 13:46:18 +0800 Subject: [PATCH] v2.1.2 --- .gitignore | 333 ++ LICENSE | 21 + README.md | 133 + api/README.md | 512 +++ doc/README.md | 16 + doc/img/demo1.png | Bin 0 -> 44575 bytes doc/img/demo2.png | Bin 0 -> 110408 bytes doc/img/design_model.png | Bin 0 -> 41589 bytes doc/img/performance_1000.png | Bin 0 -> 132644 bytes doc/img/performance_10000.png | Bin 0 -> 160293 bytes doc/img/performance_2000.png | Bin 0 -> 139151 bytes doc/img/performance_5000.png | Bin 0 -> 156925 bytes .../JT808.DotNetty.SimpleClient.csproj | 19 + .../JT808.DotNetty.SimpleClient/Program.cs | 38 + .../Services/UpService.cs | 68 + .../Handlers/JT808MsgIdTcpSimpleHandler.cs | 59 + .../JT808.DotNetty.SimpleServer.csproj | 25 + .../JT808.DotNetty.SimpleServer/Program.cs | 47 + simples/JT808.DotNetty.Simples.sln | 125 + .../Dtos/JT808AtomicCounterDto.cs | 12 + .../Dtos/JT808DefaultResultDto.cs | 15 + .../Dtos/JT808IPAddressDto.cs | 37 + .../Dtos/JT808ResultDto.cs | 29 + .../Dtos/JT808SystemCollectInfoDto.cs | 33 + .../Dtos/JT808TcpSessionInfoDto.cs | 24 + .../Dtos/JT808TrafficInfoDto.cs | 20 + .../Dtos/JT808UdpSessionInfoDto.cs | 24 + .../Dtos/JT808UnificationSendRequestDto.cs | 11 + .../Enums/JT808TransportProtocolType.cs | 15 + .../IJT808DownlinkPacket.cs | 22 + .../IJT808SessionPublishing.cs | 12 + .../IJT808SourcePackageDispatcher.cs | 15 + .../IJT808UplinkPacket.cs | 19 + .../JT808.DotNetty.Abstractions.csproj | 10 + .../JT808Constants.cs | 84 + .../PublishProfiles/FolderProfile.pubxml | 13 + .../PublishProfiles/FolderProfile.pubxml.user | 6 + .../Configs/ClientBenchmarkOptions.cs | 19 + .../Configs/NLog.xsd | 3106 +++++++++++++++++ .../Configs/nlog.unix.config | 36 + .../Configs/nlog.win.config | 35 + .../JT808.DotNetty.CleintBenchmark.csproj | 37 + src/JT808.DotNetty.CleintBenchmark/Program.cs | 49 + .../Services/CleintBenchmarkHostedService.cs | 83 + .../CleintBenchmarkReportHostedService.cs | 55 + .../appsettings.json | 20 + .../Codecs/JT808ClientTcpDecoder.cs | 20 + .../Codecs/JT808ClientTcpEncoder.cs | 54 + src/JT808.DotNetty.Client/DeviceConfig.cs | 28 + .../JT808TcpClientConnectionHandler.cs | 95 + .../Handlers/JT808TcpClientHandler.cs | 30 + .../JT808.DotNetty.Client.csproj | 31 + .../JT808ClientDotnettyExtensions.cs | 21 + .../JT808ClientMsgSNDistributedImpl.cs | 16 + src/JT808.DotNetty.Client/JT808TcpClient.cs | 116 + .../JT808TcpClientExtensions.cs | 103 + .../JT808TcpClientFactory.cs | 62 + .../Metadata/JT808AtomicCounter.cs | 49 + .../Metadata/JT808ClientRequest.cs | 30 + .../Metadata/JT808Report.cs | 16 + .../JT808ReceiveAtomicCounterService.cs | 35 + .../Services/JT808ReportHostedService.cs | 37 + .../Services/JT808ReportService.cs | 42 + .../Services/JT808SendAtomicCounterService.cs | 35 + .../Codecs/JT808TcpDecoder.cs | 20 + .../Codecs/JT808TcpEncoder.cs | 67 + .../Codecs/JT808UdpDecoder.cs | 21 + .../JT808ClientConfiguration.cs | 31 + .../Configurations/JT808Configuration.cs | 47 + .../Converters/JsonByteArrayHexConverter.cs | 29 + .../Converters/JsonIPAddressConverter.cs | 26 + .../Converters/JsonIPEndPointConverter.cs | 32 + .../Handlers/JT808MsgIdHttpHandlerBase.cs | 91 + .../Handlers/JT808MsgIdTcpHandlerBase.cs | 153 + .../Handlers/JT808MsgIdUdpHandlerBase.cs | 154 + .../Impls/JT808DatagramPacketImpl.cs | 33 + .../Impls/JT808DownlinkPacketEmptyImpl.cs | 17 + .../Impls/JT808NettyBuilderDefault.cs | 56 + .../Impls/JT808SessionPublishingEmptyImpl.cs | 13 + .../JT808SourcePackageDispatcherEmptyImpl.cs | 16 + .../Impls/JT808UplinkPacketEmptyImpl.cs | 17 + .../Interfaces/IJT808DatagramPacket.cs | 13 + .../Interfaces/IJT808NettyBuilder.cs | 19 + .../Interfaces/IJT808Reply.cs | 17 + .../Interfaces/IJT808TcpCustomMsgIdHandler.cs | 20 + .../Interfaces/IJT808TcpNettyBuilder.cs | 17 + .../Interfaces/IJT808TcpSessionService.cs | 25 + .../Interfaces/IJT808UdpCustomMsgIdHandler.cs | 20 + .../Interfaces/IJT808UdpNettyBuilder.cs | 17 + .../Interfaces/IJT808UdpSessionService.cs | 25 + .../IJT808UnificationTcpSendService.cs | 12 + .../IJT808UnificationUdpSendService.cs | 12 + .../Interfaces/IJT808WebApiNettyBuilder.cs | 14 + .../JT808.DotNetty.Core.csproj | 29 + .../JT808BackgroundService.cs | 74 + .../JT808CoreDotnettyExtensions.cs | 96 + .../JT808SimpleTcpClient.cs | 50 + .../JT808SimpleUdpClient.cs | 48 + .../Jobs/JT808TcpAtomicCouterResetDailyJob.cs | 38 + .../Jobs/JT808TcpTrafficResetDailyJob.cs | 38 + .../Jobs/JT808UdpAtomicCouterResetDailyJob.cs | 38 + .../Jobs/JT808UdpTrafficResetDailyJob.cs | 38 + .../Metadata/JT808AtomicCounter.cs | 49 + .../Metadata/JT808HttpRequest.cs | 22 + .../Metadata/JT808HttpResponse.cs | 22 + .../Metadata/JT808Request.cs | 23 + .../Metadata/JT808Response.cs | 31 + .../Metadata/JT808TcpSession.cs | 29 + .../Metadata/JT808UdpPackage.cs | 20 + .../Metadata/JT808UdpSession.cs | 35 + .../PublishProfiles/FolderProfile.pubxml | 13 + .../PublishProfiles/FolderProfile.pubxml.user | 6 + .../Services/JT808AtomicCounterService.cs | 52 + .../JT808AtomicCounterServiceFactory.cs | 30 + .../JT808SimpleSystemCollectService.cs | 30 + .../Services/JT808TcpSessionService.cs | 73 + .../Services/JT808TrafficService.cs | 46 + .../Services/JT808TrafficServiceFactory.cs | 33 + .../JT808TransmitAddressFilterService.cs | 102 + .../Services/JT808UdpSessionService.cs | 73 + .../JT808UnificationTcpSendService.cs | 49 + .../JT808UnificationUdpSendService.cs | 54 + .../Session/JT808TcpSessionManager.cs | 211 ++ .../Session/JT808UdpSessionManager.cs | 139 + .../Handlers/JT808MsgIdDefaultTcpHandler.cs | 18 + .../Handlers/JT808TcpConnectionHandler.cs | 104 + .../Handlers/JT808TcpServerHandler.cs | 139 + .../JT808.DotNetty.Tcp.csproj | 20 + .../JT808TcpBuilderDefault.cs | 49 + .../JT808TcpDotnettyExtensions.cs | 41 + src/JT808.DotNetty.Tcp/JT808TcpServerHost.cs | 95 + .../PublishProfiles/FolderProfile.pubxml | 13 + .../PublishProfiles/FolderProfile.pubxml.user | 6 + .../JT808.DotNetty.Core.Test.csproj | 28 + .../JT808DefaultChannelId.cs | 36 + .../JT808TcpSessionManagerTest.cs | 83 + .../JT808TransmitAddressFilterServiceTest.cs | 75 + .../SeedTcpSession.cs | 37 + .../JT808.DotNetty.Core.Test/TestBase.cs | 37 + .../JT808.DotNetty.Core.Test/appsettings.json | 39 + .../JT808.DotNetty.Hosting/Configs/NLog.xsd | 3106 +++++++++++++++++ .../Configs/nlog.unix.config | 36 + .../Configs/nlog.win.config | 35 + .../Handlers/JT808MsgIdTcpCustomHandler.cs | 59 + .../Handlers/JT808MsgIdUdpCustomHandler.cs | 59 + .../Impls/JT808DownlinkPacketLogging.cs | 25 + .../JT808.DotNetty.Hosting.csproj | 42 + .../JT808.DotNetty.Hosting.ini | 6 + .../JT808.DotNetty.Hosting/Program.cs | 87 + .../JT808.DotNetty.Hosting/appsettings.json | 23 + .../JT808.DotNetty.Tcp.Test.csproj | 28 + .../JT808SessionServiceTest.cs | 94 + .../JT808UnificationTcpSendServiceTest.cs | 76 + .../JT808.DotNetty.Tcp.Test/TestBase.cs | 42 + .../JT808.DotNetty.Tcp.Test/appsettings.json | 21 + .../JT808.DotNetty.Udp.Test.csproj | 34 + .../JT808SessionServiceTest.cs | 92 + .../JT808UnificationUdpSendServiceTest.cs | 76 + .../JT808.DotNetty.Udp.Test/TestBase.cs | 40 + .../JT808.DotNetty.Udp.Test/appsettings.json | 22 + .../JT808.DotNetty.WebApi.Test.csproj | 32 + .../JT808DotNettyWebApiTest.cs | 125 + .../JT808.DotNetty.WebApi.Test/TestBase.cs | 142 + .../appsettings.json | 27 + .../Handlers/JT808MsgIdDefaultUdpHandler.cs | 15 + .../Handlers/JT808UdpServerHandler.cs | 139 + .../JT1078UdpBuilderDefault.cs | 49 + .../JT808.DotNetty.Udp.csproj | 23 + .../JT808UdpDotnettyExtensions.cs | 38 + src/JT808.DotNetty.Udp/JT808UdpServerHost.cs | 76 + .../PublishProfiles/FolderProfile.pubxml | 13 + .../PublishProfiles/FolderProfile.pubxml.user | 6 + .../JT808MsgIdDefaultWebApiHandler.cs | 334 ++ .../Handlers/JT808WebAPIServerHandler.cs | 82 + .../JT808.DotNetty.WebApi.csproj | 21 + .../JT808WebAPIServerHost.cs | 82 + .../JT808WebApiBuilderDefault.cs | 30 + .../JT808WebApiDotnettyExtensions.cs | 22 + .../PublishProfiles/FolderProfile.pubxml | 13 + .../PublishProfiles/FolderProfile.pubxml.user | 6 + .../IJT808DotNettyWebApi.cs | 112 + .../JT808.DotNetty.WebApiClientTool.csproj | 18 + .../JT808DotNettyWebApiOptions.cs | 15 + .../PublishProfiles/FolderProfile.pubxml | 13 + .../PublishProfiles/FolderProfile.pubxml.user | 6 + src/JT808.DotNetty.sln | 122 + src/SharedProperties.props | 20 + 187 files changed, 15086 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/README.md create mode 100644 doc/README.md create mode 100644 doc/img/demo1.png create mode 100644 doc/img/demo2.png create mode 100644 doc/img/design_model.png create mode 100644 doc/img/performance_1000.png create mode 100644 doc/img/performance_10000.png create mode 100644 doc/img/performance_2000.png create mode 100644 doc/img/performance_5000.png create mode 100644 simples/JT808.DotNetty.SimpleClient/JT808.DotNetty.SimpleClient.csproj create mode 100644 simples/JT808.DotNetty.SimpleClient/Program.cs create mode 100644 simples/JT808.DotNetty.SimpleClient/Services/UpService.cs create mode 100644 simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs create mode 100644 simples/JT808.DotNetty.SimpleServer/JT808.DotNetty.SimpleServer.csproj create mode 100644 simples/JT808.DotNetty.SimpleServer/Program.cs create mode 100644 simples/JT808.DotNetty.Simples.sln create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808AtomicCounterDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808DefaultResultDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808IPAddressDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808ResultDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808SystemCollectInfoDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808TcpSessionInfoDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808UdpSessionInfoDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Dtos/JT808UnificationSendRequestDto.cs create mode 100644 src/JT808.DotNetty.Abstractions/Enums/JT808TransportProtocolType.cs create mode 100644 src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs create mode 100644 src/JT808.DotNetty.Abstractions/IJT808SessionPublishing.cs create mode 100644 src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs create mode 100644 src/JT808.DotNetty.Abstractions/IJT808UplinkPacket.cs create mode 100644 src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj create mode 100644 src/JT808.DotNetty.Abstractions/JT808Constants.cs create mode 100644 src/JT808.DotNetty.Abstractions/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 src/JT808.DotNetty.Abstractions/Properties/PublishProfiles/FolderProfile.pubxml.user create mode 100644 src/JT808.DotNetty.CleintBenchmark/Configs/ClientBenchmarkOptions.cs create mode 100644 src/JT808.DotNetty.CleintBenchmark/Configs/NLog.xsd create mode 100644 src/JT808.DotNetty.CleintBenchmark/Configs/nlog.unix.config create mode 100644 src/JT808.DotNetty.CleintBenchmark/Configs/nlog.win.config create mode 100644 src/JT808.DotNetty.CleintBenchmark/JT808.DotNetty.CleintBenchmark.csproj create mode 100644 src/JT808.DotNetty.CleintBenchmark/Program.cs create mode 100644 src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs create mode 100644 src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkReportHostedService.cs create mode 100644 src/JT808.DotNetty.CleintBenchmark/appsettings.json create mode 100644 src/JT808.DotNetty.Client/Codecs/JT808ClientTcpDecoder.cs create mode 100644 src/JT808.DotNetty.Client/Codecs/JT808ClientTcpEncoder.cs create mode 100644 src/JT808.DotNetty.Client/DeviceConfig.cs create mode 100644 src/JT808.DotNetty.Client/Handlers/JT808TcpClientConnectionHandler.cs create mode 100644 src/JT808.DotNetty.Client/Handlers/JT808TcpClientHandler.cs create mode 100644 src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj create mode 100644 src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs create mode 100644 src/JT808.DotNetty.Client/JT808ClientMsgSNDistributedImpl.cs create mode 100644 src/JT808.DotNetty.Client/JT808TcpClient.cs create mode 100644 src/JT808.DotNetty.Client/JT808TcpClientExtensions.cs create mode 100644 src/JT808.DotNetty.Client/JT808TcpClientFactory.cs create mode 100644 src/JT808.DotNetty.Client/Metadata/JT808AtomicCounter.cs create mode 100644 src/JT808.DotNetty.Client/Metadata/JT808ClientRequest.cs create mode 100644 src/JT808.DotNetty.Client/Metadata/JT808Report.cs create mode 100644 src/JT808.DotNetty.Client/Services/JT808ReceiveAtomicCounterService.cs create mode 100644 src/JT808.DotNetty.Client/Services/JT808ReportHostedService.cs create mode 100644 src/JT808.DotNetty.Client/Services/JT808ReportService.cs create mode 100644 src/JT808.DotNetty.Client/Services/JT808SendAtomicCounterService.cs create mode 100644 src/JT808.DotNetty.Core/Codecs/JT808TcpDecoder.cs create mode 100644 src/JT808.DotNetty.Core/Codecs/JT808TcpEncoder.cs create mode 100644 src/JT808.DotNetty.Core/Codecs/JT808UdpDecoder.cs create mode 100644 src/JT808.DotNetty.Core/Configurations/JT808ClientConfiguration.cs create mode 100644 src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs create mode 100644 src/JT808.DotNetty.Core/Converters/JsonByteArrayHexConverter.cs create mode 100644 src/JT808.DotNetty.Core/Converters/JsonIPAddressConverter.cs create mode 100644 src/JT808.DotNetty.Core/Converters/JsonIPEndPointConverter.cs create mode 100644 src/JT808.DotNetty.Core/Handlers/JT808MsgIdHttpHandlerBase.cs create mode 100644 src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs create mode 100644 src/JT808.DotNetty.Core/Handlers/JT808MsgIdUdpHandlerBase.cs create mode 100644 src/JT808.DotNetty.Core/Impls/JT808DatagramPacketImpl.cs create mode 100644 src/JT808.DotNetty.Core/Impls/JT808DownlinkPacketEmptyImpl.cs create mode 100644 src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs create mode 100644 src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs create mode 100644 src/JT808.DotNetty.Core/Impls/JT808SourcePackageDispatcherEmptyImpl.cs create mode 100644 src/JT808.DotNetty.Core/Impls/JT808UplinkPacketEmptyImpl.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808DatagramPacket.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808Reply.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808TcpCustomMsgIdHandler.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808TcpSessionService.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808UdpCustomMsgIdHandler.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808UdpSessionService.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808UnificationTcpSendService.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808UnificationUdpSendService.cs create mode 100644 src/JT808.DotNetty.Core/Interfaces/IJT808WebApiNettyBuilder.cs create mode 100644 src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj create mode 100644 src/JT808.DotNetty.Core/JT808BackgroundService.cs create mode 100644 src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs create mode 100644 src/JT808.DotNetty.Core/JT808SimpleTcpClient.cs create mode 100644 src/JT808.DotNetty.Core/JT808SimpleUdpClient.cs create mode 100644 src/JT808.DotNetty.Core/Jobs/JT808TcpAtomicCouterResetDailyJob.cs create mode 100644 src/JT808.DotNetty.Core/Jobs/JT808TcpTrafficResetDailyJob.cs create mode 100644 src/JT808.DotNetty.Core/Jobs/JT808UdpAtomicCouterResetDailyJob.cs create mode 100644 src/JT808.DotNetty.Core/Jobs/JT808UdpTrafficResetDailyJob.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808AtomicCounter.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808HttpRequest.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808HttpResponse.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808Request.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808Response.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808TcpSession.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808UdpPackage.cs create mode 100644 src/JT808.DotNetty.Core/Metadata/JT808UdpSession.cs create mode 100644 src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml.user create mode 100644 src/JT808.DotNetty.Core/Services/JT808AtomicCounterService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808AtomicCounterServiceFactory.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808SimpleSystemCollectService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808TcpSessionService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808TrafficService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808TrafficServiceFactory.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808TransmitAddressFilterService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808UdpSessionService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808UnificationTcpSendService.cs create mode 100644 src/JT808.DotNetty.Core/Services/JT808UnificationUdpSendService.cs create mode 100644 src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs create mode 100644 src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs create mode 100644 src/JT808.DotNetty.Tcp/Handlers/JT808MsgIdDefaultTcpHandler.cs create mode 100644 src/JT808.DotNetty.Tcp/Handlers/JT808TcpConnectionHandler.cs create mode 100644 src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs create mode 100644 src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj create mode 100644 src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs create mode 100644 src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs create mode 100644 src/JT808.DotNetty.Tcp/JT808TcpServerHost.cs create mode 100644 src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml.user create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808.DotNetty.Core.Test.csproj create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808DefaultChannelId.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TcpSessionManagerTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TransmitAddressFilterServiceTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/TestBase.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/appsettings.json create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/NLog.xsd create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.unix.config create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.win.config create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdUdpCustomHandler.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Impls/JT808DownlinkPacketLogging.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.ini create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/appsettings.json create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808.DotNetty.Tcp.Test.csproj create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808SessionServiceTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808UnificationTcpSendServiceTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/TestBase.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/appsettings.json create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808.DotNetty.Udp.Test.csproj create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808SessionServiceTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808UnificationUdpSendServiceTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/TestBase.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/appsettings.json create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808.DotNetty.WebApi.Test.csproj create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808DotNettyWebApiTest.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs create mode 100644 src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/appsettings.json create mode 100644 src/JT808.DotNetty.Udp/Handlers/JT808MsgIdDefaultUdpHandler.cs create mode 100644 src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs create mode 100644 src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs create mode 100644 src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj create mode 100644 src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs create mode 100644 src/JT808.DotNetty.Udp/JT808UdpServerHost.cs create mode 100644 src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml.user create mode 100644 src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs create mode 100644 src/JT808.DotNetty.WebApi/Handlers/JT808WebAPIServerHandler.cs create mode 100644 src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj create mode 100644 src/JT808.DotNetty.WebApi/JT808WebAPIServerHost.cs create mode 100644 src/JT808.DotNetty.WebApi/JT808WebApiBuilderDefault.cs create mode 100644 src/JT808.DotNetty.WebApi/JT808WebApiDotnettyExtensions.cs create mode 100644 src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user create mode 100644 src/JT808.DotNetty.WebApiClientTool/IJT808DotNettyWebApi.cs create mode 100644 src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj create mode 100644 src/JT808.DotNetty.WebApiClientTool/JT808DotNettyWebApiOptions.cs create mode 100644 src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml.user create mode 100644 src/JT808.DotNetty.sln create mode 100644 src/SharedProperties.props diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c9e495 --- /dev/null +++ b/.gitignore @@ -0,0 +1,333 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ +*.json +/nupkgs +/src/JT808.DotNetty.Admin/tools/protoc-gen-grpc-web-1.0.3-windows-x86_64.exe diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..67b52f7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 SmallChi(Koike) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1dded66 --- /dev/null +++ b/README.md @@ -0,0 +1,133 @@ +# JT808DotNetty + +基于DotNetty封装的JT808DotNetty支持TCP/UDP通用消息业务处理 + +[了解JT808协议进这边](https://github.com/SmallChi/JT808) + +[了解JT809协议进这边](https://github.com/SmallChi/JT809) + +[了解JT1078协议进这边](https://github.com/SmallChi/JT1078) + +[了解JTNE协议进这边](https://github.com/SmallChi/JTNewEnergy) + + [玩一玩压力测试](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/README.md) + +[![MIT Licence](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE) + +## 新网关的优势: + +1. 跨平台 +2. 借助 .NET Core模块化的思想 +3. 单机同时一万辆车在线不是梦(真有一万辆车那都很吃香了<( ̄3 ̄)> <( ̄3 ̄)> <( ̄3 ̄)> ) +4. 简单易上手 + +## 设计模型 + +![design_model](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/design_model.png) + +## 基于Tcp的消息业务处理程序(JT808.DotNetty.Tcp) + +通过继承JT808.DotNetty.Core.Handlers.JT808MsgIdTcpHandlerBase去实现自定义的消息业务处理程序。 + +## 基于Udp的消息业务处理程序(JT808.DotNetty.Udp) + +通过继承JT808.DotNetty.Core.Handlers.JT808MsgIdUdpHandlerBase去实现自定义的消息业务处理程序。 + +## 基于WebApi的消息业务处理程序(JT808.DotNetty.WebApi) + +通过继承JT808.DotNetty.Core.Handlers.JT808MsgIdHttpHandlerBase去实现自定义的WebApi接口服务。 + +[WebApi公共接口服务](https://github.com/SmallChi/JT808DotNetty/blob/master/api/README.md) + +## 集成接口功能(JT808.DotNetty.Abstractions) + +|接口名称|接口说明|使用场景| +|:------:|:------|:------| +| IJT808SessionPublishing| 会话通知(在线/离线)| 有些超长待机的设备,不会实时保持连接,那么通过平台下发的命令是无法到达的,这时候就需要设备一上线,就即时通知服务去处理,然后在即时的下发消息到设备。| +| IJT808SourcePackageDispatcher| 原包分发器| 需要将源数据转给其他平台| +| IJT808UplinkPacket| 上行数据包处理接口| 平台需要查看网关的上行数据日志(可以配合InfluxDB使用)| +| IJT808DownlinkPacket| 下行数据包处理接口| 平台需要查看网关的下行数据日志(可以配合InfluxDB使用)| + +> 只要实现IJT808SessionPublishing接口的任意一款MQ都能实现该功能。 + +> 使用物联网卡通过udp下发指令时,存储的那个socket地址端口,有效期非常短,不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了,所以此处采用跟随设备消息下发指令。 + +## NuGet安装 + +| Package Name | Version | Downloads | +| --------------------- | -------------------------------------------------- | --------------------------------------------------- | +| Install-Package JT808.DotNetty.Core | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.Core.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.Core.svg) | +| Install-Package JT808.DotNetty.Abstractions | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.Abstractions.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.Abstractions.svg) | +| Install-Package JT808.DotNetty.Tcp | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.Tcp.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.Tcp.svg) | +| Install-Package JT808.DotNetty.Udp | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.Udp.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.Udp.svg) | +| Install-Package JT808.DotNetty.WebApi | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.WebApi.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.WebApi.svg) | +| Install-Package JT808.DotNetty.WebApiClientTool | ![JT808](https://img.shields.io/nuget/v/JT808.DotNetty.WebApiClientTool.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.DotNetty.WebApiClientTool.svg) | + +## 举个栗子1 + +``` demo1 +static async Task Main(string[] args) +{ + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureLogging((context, logging) => + { + logging.AddConsole(); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration) + //自定义日志下发包 + .ReplaceDownlinkPacket() + //自定义会话通知(在线/离线)使用异步方式 + //.ReplaceSessionPublishing() + //自定义原包转发 使用异步方式 + //.ReplaceSourcePackageDispatcher + .AddJT808TcpNettyHost() + // 自定义Tcp消息处理业务 + .ReplaceMsgIdHandler() + .Builder() + .AddJT808UdpNettyHost() + // 自定义Udp消息处理业务 + .ReplaceMsgIdHandler() + .Builder() + .AddJT808WebApiNettyHost() + .Builder(); + //webapi客户端调用 + services.AddHttpApi().ConfigureHttpApiConfig((c, p) => + { + c.HttpHost = new Uri("http://localhost:828/jt808api/"); + c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; + c.LoggerFactory = p.GetRequiredService(); + }); + var client = services.BuildServiceProvider().GetRequiredService(); + var result = client.GetTcpAtomicCounter().InvokeAsync().Result; + }); + + await serverHostBuilder.RunConsoleAsync(); +} +``` + +如图所示: +![demo1](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/demo1.png) + +## 举个栗子2 + +1.拉取JT808子模块 + +2.打开项目进行还原编译生成 + +3.进入JT808.DotNetty.SimpleServer项目下的Debug目录运行服务端 + +4.进入JT808.DotNetty.SimpleClient项目下的Debug目录运行客户端 + +如图所示: +![demo2](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/demo2.png) diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..7d8fa86 --- /dev/null +++ b/api/README.md @@ -0,0 +1,512 @@ +# JT808 WebApi服务 + +基地址:127.0.0.1:828/jt808api/ + +> 注意url格式 + +数据格式:只支持Json格式 + +默认端口:828 + +## 1.统一下发设备消息服务 + +[基于Tcp统一下发设备消息服务](#tcp_send) + +[基于Udp统一下发设备消息服务](#udp_send) + +## 2.管理会话服务 + +[基于Tcp管理会话服务](#tcp_session) + +[基于Udp管理会话服务](#udp_session) + +## 3.转发地址过滤服务 + +[基于Tcp转发地址过滤服务](#tcp_transmit) + +## 4.消息包计数服务(次日清零) + +[基于Tcp消息包计数服务](#tcp_counter) + +[基于Udp消息包计数服务](#udp_counter) + +## 5.流量统计服务(次日清零) + +[基于Tcp流量统计服务](#tcp_traffic) + +[基于Udp流量统计服务](#udp_traffic) + +## 6.系统性能数据采集服务 + +[获取当前系统进程使用率](#system_collect) + +## 接口请求对照表 + +### 基于Tcp接口请求 + +|请求Url|请求方式|说明| +|:------|:------|:------| +| 127.0.0.1:828/jt808api/Tcp/UnificationSend| POST| 基于Tcp统一下发设备消息服务| +| 127.0.0.1:828/jt808api/Tcp/Session/GetAll| GET| 基于Tcp管理会话服务-获取会话集合| +| 127.0.0.1:828/jt808api/Tcp/Session/RemoveByTerminalPhoneNo| POST| 基于Tcp管理会话服务-通过设备终端号移除对应会话| +| 127.0.0.1:828/jt808api/Tcp/Transmit/Add| POST| 基于Tcp转发地址过滤服务-添加转发过滤地址| +| 127.0.0.1:828/jt808api/Tcp/Transmit/Remove| POST| 基于Tcp转发地址过滤服务-删除转发过滤地址| +| 127.0.0.1:828/jt808api/Tcp/Transmit/GetAll| GET| 基于Tcp转发地址过滤服务-获取转发过滤地址信息集合| +| 127.0.0.1:828/jt808api/Tcp/GetAtomicCounter| GET| 基于Tcp消息包计数服务| +| 127.0.0.1:828/jt808api/Tcp/Traffic/Get| GET| 基于Tcp流量统计服务| + +### 基于Udp接口请求 + +|请求Url|请求方式|说明| +|:------|:------|:------| +| 127.0.0.1:828/jt808api/Udp/UnificationSend| POST| 基于Udp统一下发设备消息服务| +| 127.0.0.1:828/jt808api/Udp/Session/GetAll| GET| 基于Udp管理会话服务-获取会话集合| +| 127.0.0.1:828/jt808api/Udp/Session/RemoveByTerminalPhoneNo| POST| 基于Udp管理会话服务-通过设备终端号移除对应会话| +| 127.0.0.1:828/jt808api/Udp/GetAtomicCounter| GET| 基于Udp消息包计数服务| +| 127.0.0.1:828/jt808api/Udp/Traffic/Get| GET| 基于Udp流量统计服务| + +### 公共接口请求 + +|请求Url|请求方式|说明| +|:------|:------|:------| +| 127.0.0.1:828/jt808api/SystemCollect/Get| GET| 获取当前系统进程使用情况| + +### 统一对象返回 JT808ResultDto\ + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Message| string| 消息描述| +| Code| int| 状态码| +| Data| T(泛型)| 数据| + +返回Code[状态码]说明: + +|状态码|说明| +|:------:|:------:| +| 200 | 返回成功 | +| 201 | 内容为空 | +| 404 | 没有该服务 | +| 500 | 服务内部错误 | + +### 基于Tcp统一下发设备消息服务 + +请求地址:Tcp/UnificationSend + +请求方式:POST + +请求参数: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| TerminalPhoneNo| string| 设备终端号| +| Data| byte[]| JT808 byte[]数组| + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| bool| 是否成功| + +返回结果: + +``` result1 +{ + "Message":"", + "Code":200, + "Data":true +} +``` + +### 基于Udp统一下发设备消息服务 + +请求地址:Udp/UnificationSend + +请求方式:POST + +请求参数: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| TerminalPhoneNo| string| 设备终端号| +| Data| byte[]| JT808 byte[]数组| + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| bool| 是否成功| + +返回结果: + +``` result1 +{ + "Message":"", + "Code":200, + "Data":true +} +``` + +### 基于Tcp管理会话服务 + +#### 统一会话信息对象返回 JT808TcpSessionInfoDto + +|属性|数据类型|参数说明| +|------|------|------| +| LastActiveTime| DateTime| 最后上线时间| +| StartTime| DateTime| 上线时间| +| TerminalPhoneNo|string| 终端手机号| +| RemoteAddressIP| string| 远程ip地址| + +#### 1.获取会话集合 + +请求地址:Tcp/Session/GetAll + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| List\ | 实际会话信息集合 | + +返回结果: + +``` session1 +{ + "Message":"", + "Code":200, + "Data":[ + { + "LastActiveTime":"2018-11-27 20:00:00", + "StartTime":"2018-11-25 20:00:00", + "TerminalPhoneNo":"123456789012", + "RemoteAddressIP":"127.0.0.1:11808" + },{ + "LastActiveTime":"2018-11-27 20:00:00", + "StartTime":"2018-11-25 20:00:00", + "TerminalPhoneNo":"123456789013", + "RemoteAddressIP":"127.0.0.1:11808" + } + ] +} +``` + +#### 2.通过设备终端号移除对应会话 + +请求地址:Tcp/Session/RemoveByTerminalPhoneNo + +请求方式:POST + +请求参数: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| terminalPhoneNo| string| 设备终端号| + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| bool | 是否成功 + +返回结果: + +``` session3 +{ + "Message":"", + "Code":200, + "Data":true +} +``` + +### 基于Udp管理会话服务 + +#### 统一会话信息对象返回 JT808UdpSessionInfoDto + +|属性|数据类型|参数说明| +|------|------|------| +| LastActiveTime| DateTime| 最后上线时间| +| StartTime| DateTime| 上线时间| +| TerminalPhoneNo|string| 终端手机号| +| RemoteAddressIP| string| 远程ip地址| + +#### 1.获取会话集合 + +请求地址:Udp/Session/GetAll + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| List\ | 实际会话信息集合 | + +返回结果: + +``` session1 +{ + "Message":"", + "Code":200, + "Data":[ + { + "LastActiveTime":"2018-11-27 20:00:00", + "StartTime":"2018-11-25 20:00:00", + "TerminalPhoneNo":"123456789012", + "RemoteAddressIP":"127.0.0.1:11808" + },{ + "LastActiveTime":"2018-11-27 20:00:00", + "StartTime":"2018-11-25 20:00:00", + "TerminalPhoneNo":"123456789013", + "RemoteAddressIP":"127.0.0.1:11808" + } + ] +} +``` + +#### 2.通过设备终端号移除对应会话 + +请求地址:Udp/Session/RemoveByTerminalPhoneNo + +请求方式:POST + +请求参数: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| terminalPhoneNo| string| 设备终端号| + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| bool | 是否成功 + +返回结果: + +``` session3 +{ + "Message":"", + "Code":200, + "Data":true +} +``` + +### 基于Tcp转发地址过滤服务 + +#### 1.添加转发过滤地址 + +请求地址:Tcp/Transmit/Add + +请求方式:POST + +请求参数: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Host| string| ip地址| +| Port| int| 端口号| + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| bool | 是否成功 + +返回结果: + +``` tr1 +{ + "Message":"", + "Code":200, + "Data":true +} +``` + +#### 2.删除转发过滤地址(不能删除在网关服务器配置文件配的地址) + +请求地址:Tcp/Transmit/Remove + +请求方式:POST + +请求参数: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Host| string| ip地址| + +返回数据: + +|属性|数据类型|参数说明| +|:------:|:------:|:------| +| Data| bool | 是否成功| + +返回结果: + +``` tr2 +{ + "Message":"", + "Code":200, + "Data":true +} +``` + +#### 3.获取转发过滤地址信息集合 + +请求地址:Tcp/Transmit/GetAll + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| Data| List\ | 远程ip地址(不加端口号)| + +返回结果: + +``` tr3 +{ + "Message":"", + "Code":200, + "Data":[ + "127.0.0.1" + ] +} +``` + +### 基于Tcp消息包计数服务 + +请求地址:Tcp/GetAtomicCounter + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| MsgSuccessCount| long| 消息包成功数| +| MsgFailCount| long| 消息包失败数| + +返回结果: + +``` counter +{ + "Message":"", + "Code":200, + "Data":{ + "MsgSuccessCount":10000, + "MsgFailCount":0 + } +} +``` + +### 基于Udp消息包计数服务 + +请求地址:Udp/GetAtomicCounter + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| MsgSuccessCount| long| 消息包成功数| +| MsgFailCount| long| 消息包失败数| + +返回结果: + +``` counter +{ + "Message":"", + "Code":200, + "Data":{ + "MsgSuccessCount":1000, + "MsgFailCount":0 + } +} +``` + +### 基于Tcp流量统计服务 + +请求地址:Tcp/Traffic/Get + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| TotalReceiveSize| double| 总接收大小(单位KB)| +| TotalSendSize| double| 总发送大小(单位KB)| + +返回结果: + +``` traffic1 +{ + "Message":"", + "Code":200, + "Data":{ + "TotalReceiveSize":0.0478515625, + "TotalSendSize":0.01953125 + } +} +``` + +### 基于Udp流量统计服务 + +请求地址:Udp/Traffic/Get + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| TotalReceiveSize| double| 总接收大小(单位KB)| +| TotalSendSize| double| 总发送大小(单位KB)| + +返回结果: + +``` traffic2 +{ + "Message":"", + "Code":200, + "Data":{ + "TotalReceiveSize":0.0478515625, + "TotalSendSize":0.01953125 + } +} +``` + +### 系统性能数据采集服务 + +请求地址:SystemCollect/Get + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| ProcessId| int| 进程Id| +| WorkingSet64| double| 进程分配内存(单位MB)| +| PeakWorkingSet64| double| 进程分配内存峰值(单位MB)| +| PrivateMemorySize64| double| 进程分配私有内存(单位MB)| +| CPUTotalProcessorTime| TimeSpan|进程执行CPU总处理时间| + +返回结果: + +``` sc +{ + "Message":"", + "Code":200, + "Data":{ + "ProcessId":101412, + "WorkingSet64":73.0625, + "PeakWorkingSet64":73.0625, + "PrivateMemorySize64":134.6796875, + "CPUTotalProcessorTime":"00:00:14.5625000" + } +} +``` \ No newline at end of file diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..ae791e0 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,16 @@ +## 压力测试 + +[感谢泥水佬提供的压力测试工具](https://www.cnblogs.com/smark/p/4496660.html?utm_source=tuicool) + +| 操作系统 | 配置 | 使用 | +|:-------:|:-------:|:-------:| +| win server 2016 | 4c8g | 压力测试客户端 | +| centos7 | 4c8g | JT808服务端 | + +![performance_1000](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/performance_1000.png) + +![performance_2000](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/performance_2000.png) + +![performance_5000](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/performance_5000.png) + +![performance_10000](https://github.com/SmallChi/JT808DotNetty/blob/master/doc/img/performance_10000.png) diff --git a/doc/img/demo1.png b/doc/img/demo1.png new file mode 100644 index 0000000000000000000000000000000000000000..da66b6583c4ba7d8a972838cfb0ada6d4e04e5ab GIT binary patch literal 44575 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

bB2Agyo#G;`OSap)Q8muXx%C` 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 (YCRQdwVt0j2b^r0`n8hovCsuaN zb~hdWc&PI|Ix3$~$~6fIi3u4giCgF5Qq4tcZZm(pH)Qupt5ZM?q5c~b^yl(ox`zxE z{>XxpHvNjdcU9w}suE?R1vm;f2|EU74pXf8276bM{{9qG`hw0GFcT(111T~at^og( MZ)+%)$(siMA2Is^HUIzs literal 0 HcmV?d00001 diff --git a/doc/img/design_model.png b/doc/img/design_model.png new file mode 100644 index 0000000000000000000000000000000000000000..297e9aa962039cb1130cc645ec8f915e1588d644 GIT binary patch literal 41589 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/img/performance_5000.png b/doc/img/performance_5000.png new file mode 100644 index 0000000000000000000000000000000000000000..cf97f7ee89055456cf7f2a82d3753f3cb1ce4133 GIT binary patch literal 156925 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

+ /// 包计数器服务 + /// + public class JT808AtomicCounterDto + { + public long MsgSuccessCount { get; set; } + + public long MsgFailCount { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808DefaultResultDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808DefaultResultDto.cs new file mode 100644 index 0000000..7faf2ee --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808DefaultResultDto.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808DefaultResultDto: JT808ResultDto + { + public JT808DefaultResultDto() + { + Data = "Hello,JT808 WebAPI"; + Code = JT808ResultCode.Ok; + } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808IPAddressDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808IPAddressDto.cs new file mode 100644 index 0000000..3f69192 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808IPAddressDto.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Runtime.Serialization; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808IPAddressDto + { + public string Host { get; set; } + + public int Port { get; set; } + + public EndPoint endPoint; + + public EndPoint EndPoint + { + get + { + if (endPoint == null) + { + if (IPAddress.TryParse(Host, out IPAddress ip)) + { + endPoint = new IPEndPoint(ip, Port); + } + else + { + endPoint = new DnsEndPoint(Host, Port); + } + } + return endPoint; + } + set { } + } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808ResultDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808ResultDto.cs new file mode 100644 index 0000000..c6e8970 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808ResultDto.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808ResultDto + { + public JT808ResultDto() + { + Code = JT808ResultCode.Ok; + } + + public string Message { get; set; } + + public int Code { get; set; } + + public T Data { get; set; } + } + + public class JT808ResultCode + { + public const int Ok = 200; + public const int Empty = 201; + public const int NotFound = 404; + public const int Fail = 400; + public const int Error = 500; + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808SystemCollectInfoDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808SystemCollectInfoDto.cs new file mode 100644 index 0000000..23c883c --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808SystemCollectInfoDto.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808SystemCollectInfoDto + { + /// + /// 进程Id + /// + public int ProcessId { get; set; } + /// + /// 进程分配内存 + /// 单位MB + /// + public double WorkingSet64 { get; set; } + /// + /// 进程分配内存峰值 + /// 单位MB + /// + public double PeakWorkingSet64 { get; set; } + /// + /// 进程分配私有内存 + /// 单位MB + /// + public double PrivateMemorySize64 { get; set; } + /// + /// 进程执行CPU总处理时间 + /// + public TimeSpan CPUTotalProcessorTime { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808TcpSessionInfoDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808TcpSessionInfoDto.cs new file mode 100644 index 0000000..4a71a69 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808TcpSessionInfoDto.cs @@ -0,0 +1,24 @@ +using System; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808TcpSessionInfoDto + { + /// + /// 最后上线时间 + /// + public DateTime LastActiveTime { get; set; } + /// + /// 上线时间 + /// + public DateTime StartTime { get; set; } + /// + /// 终端手机号 + /// + public string TerminalPhoneNo { get; set; } + /// + /// 远程ip地址 + /// + public string RemoteAddressIP { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs new file mode 100644 index 0000000..594c355 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808TrafficInfoDto + { + /// + /// 总接收大小 + /// 单位KB + /// + public double TotalReceiveSize { get; set; } + /// + /// 总发送大小 + /// 单位KB + /// + public double TotalSendSize { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808UdpSessionInfoDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808UdpSessionInfoDto.cs new file mode 100644 index 0000000..a7d3f25 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808UdpSessionInfoDto.cs @@ -0,0 +1,24 @@ +using System; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808UdpSessionInfoDto + { + /// + /// 最后上线时间 + /// + public DateTime LastActiveTime { get; set; } + /// + /// 上线时间 + /// + public DateTime StartTime { get; set; } + /// + /// 终端手机号 + /// + public string TerminalPhoneNo { get; set; } + /// + /// 远程ip地址 + /// + public string RemoteAddressIP { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808UnificationSendRequestDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808UnificationSendRequestDto.cs new file mode 100644 index 0000000..8f32473 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808UnificationSendRequestDto.cs @@ -0,0 +1,11 @@ +namespace JT808.DotNetty.Abstractions.Dtos +{ + /// + /// 统一下发请求参数 + /// + public class JT808UnificationSendRequestDto + { + public string TerminalPhoneNo { get; set; } + public byte[] Data { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/Enums/JT808TransportProtocolType.cs b/src/JT808.DotNetty.Abstractions/Enums/JT808TransportProtocolType.cs new file mode 100644 index 0000000..0134bb8 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Enums/JT808TransportProtocolType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Enums +{ + /// + /// 传输协议类型 + /// + public enum JT808TransportProtocolType + { + tcp=1, + udp = 2 + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs b/src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs new file mode 100644 index 0000000..9969bd0 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs @@ -0,0 +1,22 @@ +using JT808.DotNetty.Abstractions.Enums; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Abstractions +{ + /// + /// 下行数据包处理接口 + /// + public interface IJT808DownlinkPacket + { + /// + /// + /// + /// 数据包 + /// 协议类型:tcp/udp + /// + Task ProcessorAsync(byte[] data, JT808TransportProtocolType transportProtocolType); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808SessionPublishing.cs b/src/JT808.DotNetty.Abstractions/IJT808SessionPublishing.cs new file mode 100644 index 0000000..3a8e56c --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808SessionPublishing.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace JT808.DotNetty.Abstractions +{ + /// + /// 会话通知(在线/离线) + /// + public interface IJT808SessionPublishing + { + Task PublishAsync(string topicName, string value); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs b/src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs new file mode 100644 index 0000000..f3fa1dd --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; + +namespace JT808.DotNetty.Abstractions +{ + /// + /// 源包分发器 + /// 自定义源包分发器业务 + /// ConfigureServices: + /// services.Replace(new ServiceDescriptor(typeof(IJT808SourcePackageDispatcher),typeof(JT808SourcePackageDispatcherDefaultImpl),ServiceLifetime.Singleton)); + /// + public interface IJT808SourcePackageDispatcher + { + Task SendAsync(byte[] data); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808UplinkPacket.cs b/src/JT808.DotNetty.Abstractions/IJT808UplinkPacket.cs new file mode 100644 index 0000000..5198855 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808UplinkPacket.cs @@ -0,0 +1,19 @@ +using JT808.DotNetty.Abstractions.Enums; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Abstractions +{ + /// + /// 上行数据包处理接口 + /// + public interface IJT808UplinkPacket + { + /// + /// + /// + /// 数据包 + /// 传输协议类型 + /// + Task ProcessorAsync(byte[] data, JT808TransportProtocolType transportProtocolType); + } +} diff --git a/src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj b/src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj new file mode 100644 index 0000000..87166d8 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/JT808.DotNetty.Abstractions.csproj @@ -0,0 +1,10 @@ + + + + JT808.DotNetty.Abstractions + JT808.DotNetty.Abstractions + 基于DotNetty实现的JT808DotNetty的抽象库 + 基于DotNetty实现的JT808DotNetty的抽象库 + + + diff --git a/src/JT808.DotNetty.Abstractions/JT808Constants.cs b/src/JT808.DotNetty.Abstractions/JT808Constants.cs new file mode 100644 index 0000000..bc65121 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/JT808Constants.cs @@ -0,0 +1,84 @@ +namespace JT808.DotNetty.Abstractions +{ + public static class JT808Constants + { + public const string SessionOnline= "JT808SessionOnline"; + + public const string SessionOffline = "JT808SessionOffline"; + + public static class JT808WebApiRouteTable + { + public const string RouteTablePrefix = "/jt808api"; + + public const string SessionPrefix = "Session"; + + public const string TransmitPrefix = "Transmit"; + + public const string SystemCollectPrefix = "SystemCollect"; + + public const string TrafficPrefix = "Traffic"; + + public const string TcpPrefix = "Tcp"; + + public const string UdpPrefix = "Udp"; + + /// + ///获取当前系统进程使用率 + /// + public static string SystemCollectGet = $"{RouteTablePrefix}/{SystemCollectPrefix}/Get"; + /// + ///基于Tcp的添加转发过滤地址 + /// + public static string TransmitAdd = $"{RouteTablePrefix}/{TcpPrefix}/{TransmitPrefix}/Add"; + /// + /// 基于Tcp的删除转发过滤地址(不能删除在网关服务器配置文件配的地址) + /// + public static string TransmitRemove = $"{RouteTablePrefix}/{TcpPrefix}/{TransmitPrefix}/Remove"; + /// + ///基于Tcp的获取转发过滤地址信息集合 + /// + public static string TransmitGetAll = $"{RouteTablePrefix}/{TcpPrefix}/{TransmitPrefix}/GetAll"; + /// + /// 基于Tcp的包计数器 + /// + public static string GetTcpAtomicCounter = $"{RouteTablePrefix}/{TcpPrefix}/GetAtomicCounter"; + /// + /// 基于Tcp的会话服务集合 + /// + public static string SessionTcpGetAll = $"{RouteTablePrefix}/{TcpPrefix}/{SessionPrefix}/GetAll"; + /// + /// 基于Tcp的会话服务-通过设备终端号移除对应会话 + /// + public static string SessionTcpRemoveByTerminalPhoneNo = $"{RouteTablePrefix}/{TcpPrefix}/{SessionPrefix}/RemoveByTerminalPhoneNo"; + /// + /// 基于Tcp的统一下发信息 + /// + public static string UnificationTcpSend = $"{RouteTablePrefix}/{TcpPrefix}/UnificationSend"; + /// + /// 基于Tcp的流量服务获取 + /// + public static string TrafficTcpGet = $"{RouteTablePrefix}/{TcpPrefix}/{TrafficPrefix}/Get"; + + /// + /// 获取Udp包计数器 + /// + public static string GetUdpAtomicCounter = $"{RouteTablePrefix}/{UdpPrefix}/GetAtomicCounter"; + /// + /// 基于Udp的统一下发信息 + /// + public static string UnificationUdpSend = $"{RouteTablePrefix}/{UdpPrefix}/UnificationSend"; + /// + /// 基于Udp的会话服务集合 + /// + public static string SessionUdpGetAll = $"{RouteTablePrefix}/{UdpPrefix}/{SessionPrefix}/GetAll"; + /// + /// 基于Udp的会话服务-通过设备终端号移除对应会话 + /// + public static string SessionUdpRemoveByTerminalPhoneNo = $"{RouteTablePrefix}/{UdpPrefix}/{SessionPrefix}/RemoveByTerminalPhoneNo"; + /// + /// 基于Udp的流量服务获取 + /// + + + + FileSystem + Release + Any CPU + netstandard2.0 + ..\..\nupkgs + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Abstractions/Properties/PublishProfiles/FolderProfile.pubxml.user b/src/JT808.DotNetty.Abstractions/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..312c6e3 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.CleintBenchmark/Configs/ClientBenchmarkOptions.cs b/src/JT808.DotNetty.CleintBenchmark/Configs/ClientBenchmarkOptions.cs new file mode 100644 index 0000000..564da09 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Configs/ClientBenchmarkOptions.cs @@ -0,0 +1,19 @@ +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.CleintBenchmark.Configs +{ + public class ClientBenchmarkOptions : IOptions + { + public string IP { get; set; } + public int Port { get; set; } + public int DeviceCount { get; set; } = 10; + /// + /// 5000ms毫秒 + /// + public int Interval { get; set; } = 5000; + public ClientBenchmarkOptions Value =>this; + } +} diff --git a/src/JT808.DotNetty.CleintBenchmark/Configs/NLog.xsd b/src/JT808.DotNetty.CleintBenchmark/Configs/NLog.xsd new file mode 100644 index 0000000..2f57d09 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Configs/NLog.xsd @@ -0,0 +1,3106 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged.. + + + + + Throw an exception when there is an internal error. Default value is: false. + + + + + Throw an exception when there is a configuration error. If not set, determined by throwExceptions. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. Default value is: false. + + + + + Write internal NLog messages to the System.Diagnostics.Trace. Default value is: false. + + + + + Write timestamps for internal NLog messages. Default value is: true. + + + + + Use InvariantCulture as default culture instead of CurrentCulture. Default value is: false. + + + + + Perform mesage template parsing and formatting of LogEvent messages (true = Always, false = Never, empty = Auto Detect). Default value is: empty. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Name of the logger. May include '*' character which acts like a wildcard. Allowed forms are: *, Name, *Name, Name* and *Name* + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable or disable logging rule. Disabled rules are ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. You could use * wildcard. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Limit of full s to write before yielding into Performance is better when writing many small batches, than writing a single large batch + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + Condition expression. Log events who meet this condition will cause a flush on the wrapped target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Indicates whether to use sliding timeout. + + + + + Action to take if the buffer overflows. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Maximum current connections. 0 = no maximum. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Maximum queue size. + + + + + NDC item separator. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Viewer parameter name. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to use default row highlighting rules. + + + + + Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. Gets or sets a value indicating whether to use database transactions. Some data providers require this. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Name of the database provider. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Database parameter name. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Database parameter size. + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Value to be used as the event Source. + + + + + Action to take if the message is larger than the option. + + + + + Optional entrytype. When not set, or when not convertable to then determined by + + + + + Maximum Event log size in kilobytes. If null, the value won't be set. Default is 512 Kilobytes as specified by Eventlog API + + + + + Message length limit to write to the Event Log. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose: + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Maximum number of archive files that should be kept. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + Is the an absolute or relative path? + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Is the an absolute or relative path? + + + + + Value indicationg whether file creation calls should be synchronized by a system global mutex. + + + + + Maximum number of log filenames that should be stored as existing. + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Name of the file to write to. + + + + + Value specifying the date format to use when archiving files. + + + + + Indicates whether to archive old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + File attributes (Windows only). + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Interval in which messages will be written up to the number of messages. + + + + + Maximum allowed number of messages written per . + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + Type of the parameter. Obsolete alias for + + + + + Parameter can combine multiple LogEvents into a single parameter value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Encoding to be used for sending e-mail. + + + + + Indicates whether to add new lines between log entries. + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Indicates the SMTP client timeout. + + + + + Priority used for sending mails. + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + Folder where applications save mail messages to be processed by the local SMTP server. + + + + + Specifies how outgoing email messages will be handled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum current connections. 0 = no maximum. + + + + + Maximum queue size. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Maximum current connections. 0 = no maximum. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Maximum queue size. + + + + + NDC item separator. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + The value by which to increment the counter. + + + + + Performance counter instance name. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Always use independent of + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Encoding. + + + + + Value whether escaping be done according to the old NLog style (Very non-standard) + + + + + Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters) + + + + + Protocol to be used when calling web service. + + + + + Web service URL. + + + + + Name of the root XML element, if POST of XML document chosen. If so, this property must not be null. (see and ). + + + + + (optional) root namespace of the XML document, if POST of XML document chosen. (see and ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + + + + + + + + + + + + + + List of property names to exclude when is true + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json + + + + + + + + + + + + + + + Determines wether or not this attribute will be Json encoded. + + + + + Indicates whether to escape non-ascii characters + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include contents of the stack. + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Layout to be used to filter log messages. + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + Append FilterCount to the when an event is no longer filtered + + + + + Insert FilterCount value into when an event is no longer filtered + + + + + Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout. + + + + + Max number of unique filter values to expect simultaneously + + + + + Max length of filter values, will truncate if above limit + + + + + Default buffer size for the internal buffers + + + + + Reuse internal buffers, and doesn't have to constantly allocate new buffers + + + + + How long before a filter expires, and logging is accepted again + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.CleintBenchmark/Configs/nlog.unix.config b/src/JT808.DotNetty.CleintBenchmark/Configs/nlog.unix.config new file mode 100644 index 0000000..2c8b777 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Configs/nlog.unix.config @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.CleintBenchmark/Configs/nlog.win.config b/src/JT808.DotNetty.CleintBenchmark/Configs/nlog.win.config new file mode 100644 index 0000000..14d4a10 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Configs/nlog.win.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.CleintBenchmark/JT808.DotNetty.CleintBenchmark.csproj b/src/JT808.DotNetty.CleintBenchmark/JT808.DotNetty.CleintBenchmark.csproj new file mode 100644 index 0000000..a77a0a4 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/JT808.DotNetty.CleintBenchmark.csproj @@ -0,0 +1,37 @@ + + + + Exe + netcoreapp2.2 + 7.3 + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + Designer + + + + diff --git a/src/JT808.DotNetty.CleintBenchmark/Program.cs b/src/JT808.DotNetty.CleintBenchmark/Program.cs new file mode 100644 index 0000000..de57c88 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Program.cs @@ -0,0 +1,49 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using System; +using System.Threading.Tasks; +using JT808.DotNetty.Client; +using JT808.DotNetty.CleintBenchmark.Configs; +using JT808.DotNetty.CleintBenchmark.Services; +using Microsoft.Extensions.Configuration; + +namespace JT808.DotNetty.CleintBenchmark +{ + class Program + { + static async Task Main(string[] args) + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureLogging((context, logging) => + { + if (Environment.OSVersion.Platform == PlatformID.Unix) + { + NLog.LogManager.LoadConfiguration("Configs/nlog.unix.config"); + } + else + { + NLog.LogManager.LoadConfiguration("Configs/nlog.win.config"); + } + logging.AddNLog(); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .ConfigureServices((hostContext, services) => + { + services.Configure(hostContext.Configuration.GetSection("ClientBenchmarkOptions")); + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Client(); + services.AddHostedService(); + services.AddHostedService(); + }); + await serverHostBuilder.RunConsoleAsync(); + } + } +} diff --git a/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs b/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs new file mode 100644 index 0000000..d20a92b --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs @@ -0,0 +1,83 @@ +using JT808.DotNetty.CleintBenchmark.Configs; +using JT808.DotNetty.Client; +using JT808.Protocol.MessageBody; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + + +namespace JT808.DotNetty.CleintBenchmark.Services +{ + public class CleintBenchmarkHostedService : IHostedService + { + private readonly ClientBenchmarkOptions clientBenchmarkOptions; + + private readonly ILogger logger; + + private readonly IJT808TcpClientFactory jT808TcpClientFactory; + + private CancellationTokenSource cts=new CancellationTokenSource(); + + private TaskFactory taskFactory; + + public CleintBenchmarkHostedService( + ILoggerFactory loggerFactory, + IJT808TcpClientFactory jT808TcpClientFactory, + IOptions clientBenchmarkOptionsAccessor) + { + this.jT808TcpClientFactory = jT808TcpClientFactory; + clientBenchmarkOptions = clientBenchmarkOptionsAccessor.Value; + logger = loggerFactory.CreateLogger("CleintBenchmarkHostedService"); + taskFactory = new TaskFactory(); + } + public Task StartAsync(CancellationToken cancellationToken) + { + logger.LogInformation("StartAsync..."); + ThreadPool.GetMinThreads(out var minWorkerThreads, out var minCompletionPortThreads); + ThreadPool.GetMaxThreads(out var maxWorkerThreads, out var maxCompletionPortThreads); + logger.LogInformation($"GetMinThreads:{minWorkerThreads}-{minCompletionPortThreads}"); + logger.LogInformation($"GetMaxThreads:{maxWorkerThreads}-{maxCompletionPortThreads}"); + //ThreadPool.SetMaxThreads(20, 20); + //ThreadPool.GetMaxThreads(out var setMaxWorkerThreads, out var setMaxCompletionPortThreads); + //logger.LogInformation($"SetMaxThreads:{setMaxWorkerThreads}-{setMaxCompletionPortThreads}"); + for (int i=0;i< clientBenchmarkOptions.DeviceCount; i++) + { + taskFactory.StartNew((item) => + { + + var client = jT808TcpClientFactory.Create(new DeviceConfig(((int)item).ToString(), clientBenchmarkOptions.IP, clientBenchmarkOptions.Port)); + int lat = new Random(1000).Next(100000, 180000); + int Lng = new Random(1000).Next(100000, 180000); + while (!cts.IsCancellationRequested) + { + client.Send(new JT808_0x0200() + { + Lat = lat, + Lng = Lng, + GPSTime = DateTime.Now, + Speed = 50, + Direction = 30, + AlarmFlag = 5, + Altitude = 50, + StatusFlag = 10 + }); + Thread.Sleep(clientBenchmarkOptions.Interval); + } + }, i,cts.Token); + } + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + cts.Cancel(); + logger.LogInformation("StopAsync..."); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkReportHostedService.cs b/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkReportHostedService.cs new file mode 100644 index 0000000..6eddfdd --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkReportHostedService.cs @@ -0,0 +1,55 @@ +using JT808.DotNetty.CleintBenchmark.Configs; +using JT808.DotNetty.Client; +using JT808.DotNetty.Client.Services; +using JT808.Protocol.MessageBody; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + + +namespace JT808.DotNetty.CleintBenchmark.Services +{ + public class CleintBenchmarkReportHostedService : IHostedService + { + private readonly JT808ReportService jT808ReportService; + + private CancellationTokenSource cts=new CancellationTokenSource(); + + private readonly ILogger logger; + public CleintBenchmarkReportHostedService( + ILoggerFactory loggerFactory, + JT808ReportService jT808ReportService) + { + this.jT808ReportService = jT808ReportService; + logger = loggerFactory.CreateLogger("CleintBenchmarkReportHostedService"); + } + public Task StartAsync(CancellationToken cancellationToken) + { + logger.LogInformation("StartAsync..."); + Task.Run(() => { + while (!cts.IsCancellationRequested) + { + logger.LogInformation(JsonConvert.SerializeObject(jT808ReportService.JT808Reports.LastOrDefault())); + Thread.Sleep(3000); + } + }, cts.Token); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + logger.LogInformation("StopAsync..."); + cts.Cancel(); + logger.LogInformation("正在生成报表..."); + logger.LogInformation(JsonConvert.SerializeObject(jT808ReportService.JT808Reports,Formatting.Indented)); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.CleintBenchmark/appsettings.json b/src/JT808.DotNetty.CleintBenchmark/appsettings.json new file mode 100644 index 0000000..0b507a3 --- /dev/null +++ b/src/JT808.DotNetty.CleintBenchmark/appsettings.json @@ -0,0 +1,20 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Trace" + } + }, + "Console": { + "LogLevel": { + "Default": "Trace" + } + } + }, + "ClientBenchmarkOptions": { + "IP": "127.0.0.1", + "Port": 808, + "DeviceCount": 10 + } +} diff --git a/src/JT808.DotNetty.Client/Codecs/JT808ClientTcpDecoder.cs b/src/JT808.DotNetty.Client/Codecs/JT808ClientTcpDecoder.cs new file mode 100644 index 0000000..9dff52c --- /dev/null +++ b/src/JT808.DotNetty.Client/Codecs/JT808ClientTcpDecoder.cs @@ -0,0 +1,20 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using System.Collections.Generic; +using JT808.Protocol; +using DotNetty.Transport.Channels; + +namespace JT808.DotNetty.Client.Codecs +{ + public class JT808ClientTcpDecoder : ByteToMessageDecoder + { + protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output) + { + byte[] buffer = new byte[input.Capacity + 2]; + input.ReadBytes(buffer, 1, input.Capacity); + buffer[0] = JT808Package.BeginFlag; + buffer[input.Capacity + 1] = JT808Package.EndFlag; + output.Add(buffer); + } + } +} diff --git a/src/JT808.DotNetty.Client/Codecs/JT808ClientTcpEncoder.cs b/src/JT808.DotNetty.Client/Codecs/JT808ClientTcpEncoder.cs new file mode 100644 index 0000000..741d2f9 --- /dev/null +++ b/src/JT808.DotNetty.Client/Codecs/JT808ClientTcpEncoder.cs @@ -0,0 +1,54 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using System.Collections.Generic; +using JT808.Protocol; +using DotNetty.Transport.Channels; +using Microsoft.Extensions.Logging; +using JT808.DotNetty.Client.Metadata; +using JT808.DotNetty.Client.Services; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.Client.Codecs +{ + public class JT808ClientTcpEncoder : MessageToByteEncoder + { + private readonly ILogger logger; + private readonly JT808SendAtomicCounterService jT808SendAtomicCounterService; + private readonly JT808Serializer JT808Serializer; + + public JT808ClientTcpEncoder( + IJT808Config jT808Config, + JT808SendAtomicCounterService jT808SendAtomicCounterService,ILoggerFactory loggerFactory) + { + logger=loggerFactory.CreateLogger(); + this.jT808SendAtomicCounterService = jT808SendAtomicCounterService; + JT808Serializer = jT808Config.GetSerializer(); + } + + protected override void Encode(IChannelHandlerContext context, JT808ClientRequest message, IByteBuffer output) + { + if (message.Package != null) + { + try + { + var sendData = JT808Serializer.Serialize(message.Package, message.MinBufferSize); + output.WriteBytes(sendData); + jT808SendAtomicCounterService.MsgSuccessIncrement(); + } + catch (JT808.Protocol.Exceptions.JT808Exception ex) + { + logger.LogError(ex, context.Channel.Id.AsShortText()); + } + catch (System.Exception ex) + { + logger.LogError(ex, context.Channel.Id.AsShortText()); + } + } + else if (message.HexData != null) + { + output.WriteBytes(message.HexData); + jT808SendAtomicCounterService.MsgSuccessIncrement(); + } + } + } +} diff --git a/src/JT808.DotNetty.Client/DeviceConfig.cs b/src/JT808.DotNetty.Client/DeviceConfig.cs new file mode 100644 index 0000000..332d6cf --- /dev/null +++ b/src/JT808.DotNetty.Client/DeviceConfig.cs @@ -0,0 +1,28 @@ +using JT808.Protocol; +using JT808.Protocol.Interfaces; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Client +{ + public class DeviceConfig + { + public DeviceConfig(string terminalPhoneNo, string tcpHost,int tcpPort) + { + TerminalPhoneNo = terminalPhoneNo; + TcpHost = tcpHost; + TcpPort = tcpPort; + MsgSNDistributed = new JT808ClientMsgSNDistributedImpl(); + } + public string TerminalPhoneNo { get; private set; } + public string TcpHost { get; private set; } + public int TcpPort { get; private set; } + /// + /// 心跳时间(秒) + /// + public int Heartbeat { get; set; } = 30; + + public IJT808MsgSNDistributed MsgSNDistributed { get; } + } +} diff --git a/src/JT808.DotNetty.Client/Handlers/JT808TcpClientConnectionHandler.cs b/src/JT808.DotNetty.Client/Handlers/JT808TcpClientConnectionHandler.cs new file mode 100644 index 0000000..e495ffc --- /dev/null +++ b/src/JT808.DotNetty.Client/Handlers/JT808TcpClientConnectionHandler.cs @@ -0,0 +1,95 @@ +using DotNetty.Handlers.Timeout; +using DotNetty.Transport.Channels; +using JT808.Protocol.MessageBody; +using Microsoft.Extensions.Logging; +using System; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Client.Handlers +{ + /// + /// JT808客户端连接通道处理程序 + /// + public class JT808TcpClientConnectionHandler : ChannelHandlerAdapter + { + private readonly ILogger logger; + private readonly JT808TcpClient jT808TcpClient; + + public JT808TcpClientConnectionHandler( + JT808TcpClient jT808TcpClient) + { + logger = jT808TcpClient.LoggerFactory.CreateLogger(); + this.jT808TcpClient = jT808TcpClient; + } + + /// + /// 通道激活 + /// + /// + public override void ChannelActive(IChannelHandlerContext context) + { + string channelId = context.Channel.Id.AsShortText(); + if (logger.IsEnabled(LogLevel.Debug)) + logger.LogDebug($"<<<{ channelId } Successful client connection to server."); + base.ChannelActive(context); + } + + /// + /// 设备主动断开 + /// + /// + public override void ChannelInactive(IChannelHandlerContext context) + { + string channelId = context.Channel.Id.AsShortText(); + if (logger.IsEnabled(LogLevel.Debug)) + logger.LogDebug($">>>{ channelId } The client disconnects from the server."); + + base.ChannelInactive(context); + } + + /// + /// 服务器主动断开 + /// + /// + /// + public override Task CloseAsync(IChannelHandlerContext context) + { + string channelId = context.Channel.Id.AsShortText(); + if (logger.IsEnabled(LogLevel.Debug)) + logger.LogDebug($"<<<{ channelId } The server disconnects from the client."); + + return base.CloseAsync(context); + } + + public override void ChannelReadComplete(IChannelHandlerContext context)=> context.Flush(); + + /// + /// 超时策略 + /// + /// + /// + public override void UserEventTriggered(IChannelHandlerContext context, object evt) + { + IdleStateEvent idleStateEvent = evt as IdleStateEvent; + if (idleStateEvent != null) + { + if(idleStateEvent.State== IdleState.WriterIdle) + { + string channelId = context.Channel.Id.AsShortText(); + logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); + jT808TcpClient.Send(new JT808_0x0002()); + } + } + base.UserEventTriggered(context, evt); + } + + public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) + { + string channelId = context.Channel.Id.AsShortText(); + logger.LogError(exception,$"{channelId} {exception.Message}" ); + + context.CloseAsync(); + } + } +} + diff --git a/src/JT808.DotNetty.Client/Handlers/JT808TcpClientHandler.cs b/src/JT808.DotNetty.Client/Handlers/JT808TcpClientHandler.cs new file mode 100644 index 0000000..376a486 --- /dev/null +++ b/src/JT808.DotNetty.Client/Handlers/JT808TcpClientHandler.cs @@ -0,0 +1,30 @@ +using DotNetty.Buffers; +using DotNetty.Transport.Channels; +using System; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.DependencyInjection; +using JT808.DotNetty.Client.Services; + +namespace JT808.DotNetty.Client.Handlers +{ + /// + /// JT808客户端处理程序 + /// + internal class JT808TcpClientHandler : SimpleChannelInboundHandler + { + private readonly ILogger logger; + private readonly JT808ReceiveAtomicCounterService jT808ReceiveAtomicCounterService; + public JT808TcpClientHandler(JT808ReceiveAtomicCounterService jT808ReceiveAtomicCounterService,JT808TcpClient jT808TcpClient) + { + logger = jT808TcpClient.LoggerFactory.CreateLogger(); + this.jT808ReceiveAtomicCounterService= jT808ReceiveAtomicCounterService; + } + + protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) + { + if(logger.IsEnabled(LogLevel.Trace)) + logger.LogTrace("accept msg<<<" + ByteBufferUtil.HexDump(msg)); + jT808ReceiveAtomicCounterService.MsgSuccessIncrement(); + } + } +} diff --git a/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj b/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj new file mode 100644 index 0000000..f08d5ee --- /dev/null +++ b/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj @@ -0,0 +1,31 @@ + + + + netstandard2.0 + 7.3 + Copyright 2018. + SmallChi + JT808.DotNetty.Client + JT808.DotNetty.Client + 基于DotNetty实现的JT808DotNetty的客户端工具 + 基于DotNetty实现的JT808DotNetty的客户端工具 + false + https://github.com/SmallChi/JT808DotNetty + https://github.com/SmallChi/JT808DotNetty + https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE + true + 2.1.2 + + + + + + + + + + + + + + diff --git a/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs b/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs new file mode 100644 index 0000000..2c8790d --- /dev/null +++ b/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs @@ -0,0 +1,21 @@ +using JT808.DotNetty.Client.Services; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Client +{ + public static class JT808ClientDotnettyExtensions + { + public static IServiceCollection AddJT808Client(this IServiceCollection serviceDescriptors) + { + serviceDescriptors.AddSingleton(); + serviceDescriptors.AddSingleton(); + serviceDescriptors.AddSingleton(); + serviceDescriptors.AddSingleton(); + serviceDescriptors.AddHostedService(); + return serviceDescriptors; + } + } +} diff --git a/src/JT808.DotNetty.Client/JT808ClientMsgSNDistributedImpl.cs b/src/JT808.DotNetty.Client/JT808ClientMsgSNDistributedImpl.cs new file mode 100644 index 0000000..e15d703 --- /dev/null +++ b/src/JT808.DotNetty.Client/JT808ClientMsgSNDistributedImpl.cs @@ -0,0 +1,16 @@ +using JT808.Protocol; +using JT808.Protocol.Interfaces; +using System.Threading; + +namespace JT808.DotNetty.Client +{ + internal class JT808ClientMsgSNDistributedImpl : IJT808MsgSNDistributed + { + int _counter = 0; + + public ushort Increment() + { + return (ushort)Interlocked.Increment(ref _counter); + } + } +} diff --git a/src/JT808.DotNetty.Client/JT808TcpClient.cs b/src/JT808.DotNetty.Client/JT808TcpClient.cs new file mode 100644 index 0000000..9967add --- /dev/null +++ b/src/JT808.DotNetty.Client/JT808TcpClient.cs @@ -0,0 +1,116 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using DotNetty.Handlers.Timeout; +using DotNetty.Transport.Bootstrapping; +using DotNetty.Transport.Channels; +using DotNetty.Transport.Channels.Sockets; +using DotNetty.Transport.Libuv; +using JT808.DotNetty.Client.Handlers; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.Extensions.DependencyInjection; +using System.Net; +using System.Threading.Tasks; +using JT808.DotNetty.Client.Metadata; +using JT808.DotNetty.Client.Codecs; +using JT808.DotNetty.Client.Services; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.Client +{ + public sealed class JT808TcpClient : IDisposable + { + private MultithreadEventLoopGroup group; + + private IChannel clientChannel; + + private bool disposed = false; + + public DeviceConfig DeviceConfig { get; private set; } + + public ILoggerFactory LoggerFactory { get; private set; } + + public JT808TcpClient(DeviceConfig deviceConfig, IServiceProvider serviceProvider) + { + DeviceConfig = deviceConfig; + LoggerFactory = serviceProvider.GetRequiredService(); + JT808SendAtomicCounterService jT808SendAtomicCounterService = serviceProvider.GetRequiredService(); + JT808ReceiveAtomicCounterService jT808ReceiveAtomicCounterService = serviceProvider.GetRequiredService(); + IJT808Config jT808Config = serviceProvider.GetRequiredService(); + group = new MultithreadEventLoopGroup(1); + Bootstrap bootstrap = new Bootstrap(); + bootstrap.Group(group); + bootstrap.Channel(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + bootstrap.Option(ChannelOption.SoReuseport, true); + } + bootstrap + .Option(ChannelOption.SoBacklog, 8192) + .Handler(new ActionChannelInitializer(channel => + { + channel.Pipeline.AddLast("jt808TcpBuffer", new DelimiterBasedFrameDecoder(int.MaxValue, + Unpooled.CopiedBuffer(new byte[] { JT808.Protocol.JT808Package.BeginFlag }), + Unpooled.CopiedBuffer(new byte[] { JT808.Protocol.JT808Package.EndFlag }))); + channel.Pipeline.AddLast("systemIdleState", new IdleStateHandler(60, deviceConfig.Heartbeat, 3600)); + channel.Pipeline.AddLast("jt808TcpDecode", new JT808ClientTcpDecoder()); + channel.Pipeline.AddLast("jt808TcpEncode", new JT808ClientTcpEncoder(jT808Config,jT808SendAtomicCounterService, LoggerFactory)); + channel.Pipeline.AddLast("jt808TcpClientConnection", new JT808TcpClientConnectionHandler(this)); + channel.Pipeline.AddLast("jt808TcpService", new JT808TcpClientHandler(jT808ReceiveAtomicCounterService,this)); + })); + clientChannel = bootstrap.ConnectAsync(IPAddress.Parse(DeviceConfig.TcpHost), DeviceConfig.TcpPort).Result; + } + + public async void Send(JT808ClientRequest request) + { + if (disposed) return; + if (clientChannel == null) throw new NullReferenceException("Channel is empty."); + if (request == null) throw new ArgumentNullException("JT808ClientRequest Parameter is empty."); + if (clientChannel.Active && clientChannel.Open) + { + await clientChannel.WriteAndFlushAsync(request); + } + } + + public bool IsOpen + { + get + { + if (clientChannel == null) return false; + return clientChannel.Active && clientChannel.Open; + } + } + + private void Dispose(bool disposing) + { + if (disposed) + { + return; + } + if (disposing) + { + // 清理托管资源 + group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)); + } + disposed = true; + } + + ~JT808TcpClient() + { + //必须为false + //这表明,隐式清理时,只要处理非托管资源就可以了。 + Dispose(false); + } + + public void Dispose() + { + //必须为true + Dispose(true); + //通知垃圾回收机制不再调用终结器(析构器) + GC.SuppressFinalize(this); + } + } +} diff --git a/src/JT808.DotNetty.Client/JT808TcpClientExtensions.cs b/src/JT808.DotNetty.Client/JT808TcpClientExtensions.cs new file mode 100644 index 0000000..3f886a0 --- /dev/null +++ b/src/JT808.DotNetty.Client/JT808TcpClientExtensions.cs @@ -0,0 +1,103 @@ +using JT808.DotNetty.Client.Metadata; +using JT808.Protocol; +using JT808.Protocol.MessageBody; +using System; +using System.Collections.Generic; +using System.Text; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; + +namespace JT808.DotNetty.Client +{ + public static class JT808TcpClientExtensions + { + public static void Send(this JT808TcpClient client, JT808Header header, JT808Bodies bodies, int minBufferSize = 1024) + { + JT808Package package = new JT808Package(); + package.Header = header; + package.Bodies = bodies; + package.Header.TerminalPhoneNo = client.DeviceConfig.TerminalPhoneNo; + package.Header.MsgNum = client.DeviceConfig.MsgSNDistributed.Increment(); + JT808ClientRequest request = new JT808ClientRequest(package, minBufferSize); + client.Send(request); + } + + /// + /// 终端通用应答 + /// + /// + /// + /// + public static void Send(this JT808TcpClient client, JT808_0x0001 bodies, int minBufferSize = 100) + { + JT808Header header = new JT808Header(); + header.MsgId = JT808MsgId.终端通用应答.ToUInt16Value(); + client.Send(header, bodies, minBufferSize); + } + + /// + /// 终端心跳 + /// + /// + /// + /// + public static void Send(this JT808TcpClient client, JT808_0x0002 bodies, int minBufferSize = 100) + { + JT808Header header = new JT808Header(); + header.MsgId = JT808MsgId.终端心跳.ToUInt16Value(); + client.Send(header, bodies, minBufferSize); + } + + /// + /// 终端注销 + /// + /// + /// + /// + public static void Send(this JT808TcpClient client, JT808_0x0003 bodies, int minBufferSize = 100) + { + JT808Header header = new JT808Header(); + header.MsgId = JT808MsgId.终端注销.ToUInt16Value(); + client.Send(header, bodies, minBufferSize); + } + + /// + /// 终端鉴权 + /// + /// + /// + /// + public static void Send(this JT808TcpClient client, JT808_0x0102 bodies, int minBufferSize = 100) + { + JT808Header header = new JT808Header(); + header.MsgId = JT808MsgId.终端鉴权.ToUInt16Value(); + client.Send(header, bodies, minBufferSize); + } + + /// + /// 终端注册 + /// + /// + /// + /// + public static void Send(this JT808TcpClient client, JT808_0x0100 bodies, int minBufferSize = 100) + { + JT808Header header = new JT808Header(); + header.MsgId = JT808MsgId.终端注册.ToUInt16Value(); + client.Send(header, bodies, minBufferSize); + } + + /// + /// 位置信息汇报 + /// + /// + /// + /// + public static void Send(this JT808TcpClient client, JT808_0x0200 bodies, int minBufferSize = 200) + { + JT808Header header = new JT808Header(); + header.MsgId = JT808MsgId.位置信息汇报.ToUInt16Value(); + client.Send(header, bodies, minBufferSize); + } + } +} diff --git a/src/JT808.DotNetty.Client/JT808TcpClientFactory.cs b/src/JT808.DotNetty.Client/JT808TcpClientFactory.cs new file mode 100644 index 0000000..0f15ed3 --- /dev/null +++ b/src/JT808.DotNetty.Client/JT808TcpClientFactory.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace JT808.DotNetty.Client +{ + public interface IJT808TcpClientFactory : IDisposable + { + JT808TcpClient Create(DeviceConfig deviceConfig); + + List GetAll(); + } + + public class JT808TcpClientFactory: IJT808TcpClientFactory + { + private readonly ConcurrentDictionary dict; + + private readonly IServiceProvider serviceProvider; + + public JT808TcpClientFactory(IServiceProvider serviceProvider) + { + dict = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + this.serviceProvider = serviceProvider; + } + + public JT808TcpClient Create(DeviceConfig deviceConfig) + { + if(dict.TryGetValue(deviceConfig.TerminalPhoneNo,out var client)) + { + return client; + } + else + { + JT808TcpClient jT808TcpClient = new JT808TcpClient(deviceConfig, serviceProvider); + dict.TryAdd(deviceConfig.TerminalPhoneNo, jT808TcpClient); + return jT808TcpClient; + } + } + + public void Dispose() + { + foreach(var client in dict) + { + try + { + client.Value.Dispose(); + } + catch + { + } + } + } + + public List GetAll() + { + return dict.Values.ToList(); + } + } +} diff --git a/src/JT808.DotNetty.Client/Metadata/JT808AtomicCounter.cs b/src/JT808.DotNetty.Client/Metadata/JT808AtomicCounter.cs new file mode 100644 index 0000000..1ffe64d --- /dev/null +++ b/src/JT808.DotNetty.Client/Metadata/JT808AtomicCounter.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace JT808.DotNetty.Client.Metadata +{ + /// + /// + /// + /// + internal class JT808AtomicCounter + { + long counter = 0; + + public JT808AtomicCounter(long initialCount = 0) + { + this.counter = initialCount; + } + + public void Reset() + { + Interlocked.Exchange(ref counter, 0); + } + + public long Increment() + { + return Interlocked.Increment(ref counter); + } + + public long Add(long len) + { + return Interlocked.Add(ref counter,len); + } + + public long Decrement() + { + return Interlocked.Decrement(ref counter); + } + + public long Count + { + get + { + return Interlocked.Read(ref counter); + } + } + } +} diff --git a/src/JT808.DotNetty.Client/Metadata/JT808ClientRequest.cs b/src/JT808.DotNetty.Client/Metadata/JT808ClientRequest.cs new file mode 100644 index 0000000..00c1991 --- /dev/null +++ b/src/JT808.DotNetty.Client/Metadata/JT808ClientRequest.cs @@ -0,0 +1,30 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Client.Metadata +{ + public class JT808ClientRequest + { + public JT808Package Package { get; } + + public byte[] HexData { get; } + + /// + /// 根据实际情况适当调整包的大小 + /// + public int MinBufferSize { get;} + + public JT808ClientRequest(JT808Package package,int minBufferSize=1024) + { + Package = package; + MinBufferSize = minBufferSize; + } + + public JT808ClientRequest(byte[] hexData) + { + HexData = hexData; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Client/Metadata/JT808Report.cs b/src/JT808.DotNetty.Client/Metadata/JT808Report.cs new file mode 100644 index 0000000..78e695e --- /dev/null +++ b/src/JT808.DotNetty.Client/Metadata/JT808Report.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Client.Metadata +{ + public class JT808Report + { + public long SendTotalCount { get; set; } + public long ReceiveTotalCount { get; set; } + public DateTime CurrentDate { get; set; } + public int Connections { get; set; } + public int OnlineConnections { get; set; } + public int OfflineConnections { get; set; } + } +} diff --git a/src/JT808.DotNetty.Client/Services/JT808ReceiveAtomicCounterService.cs b/src/JT808.DotNetty.Client/Services/JT808ReceiveAtomicCounterService.cs new file mode 100644 index 0000000..d7cec1d --- /dev/null +++ b/src/JT808.DotNetty.Client/Services/JT808ReceiveAtomicCounterService.cs @@ -0,0 +1,35 @@ +using JT808.DotNetty.Client.Metadata; + +namespace JT808.DotNetty.Client.Services +{ + /// + /// 接收计数包服务 + /// + public class JT808ReceiveAtomicCounterService + { + private readonly JT808AtomicCounter MsgSuccessCounter; + + public JT808ReceiveAtomicCounterService() + { + MsgSuccessCounter=new JT808AtomicCounter(); + } + + public void Reset() + { + MsgSuccessCounter.Reset(); + } + + public long MsgSuccessIncrement() + { + return MsgSuccessCounter.Increment(); + } + + public long MsgSuccessCount + { + get + { + return MsgSuccessCounter.Count; + } + } + } +} diff --git a/src/JT808.DotNetty.Client/Services/JT808ReportHostedService.cs b/src/JT808.DotNetty.Client/Services/JT808ReportHostedService.cs new file mode 100644 index 0000000..063afa1 --- /dev/null +++ b/src/JT808.DotNetty.Client/Services/JT808ReportHostedService.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Client.Services +{ + public class JT808ReportHostedService : IHostedService + { + private readonly JT808ReportService jT808ReportService; + private CancellationTokenSource cts = new CancellationTokenSource(); + public JT808ReportHostedService(JT808ReportService jT808ReportService) + { + this.jT808ReportService = jT808ReportService; + } + public Task StartAsync(CancellationToken cancellationToken) + { + Task.Run(() => + { + while (!cts.IsCancellationRequested) + { + jT808ReportService.Create(); + Thread.Sleep(1000); + //Task.Delay(TimeSpan.FromSeconds(1), cts.Token); + } + }, cts.Token); + return Task.CompletedTask; + } + public Task StopAsync(CancellationToken cancellationToken) + { + cts.Cancel(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Client/Services/JT808ReportService.cs b/src/JT808.DotNetty.Client/Services/JT808ReportService.cs new file mode 100644 index 0000000..ef94b7b --- /dev/null +++ b/src/JT808.DotNetty.Client/Services/JT808ReportService.cs @@ -0,0 +1,42 @@ +using JT808.DotNetty.Client.Metadata; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace JT808.DotNetty.Client.Services +{ + public class JT808ReportService + { + private readonly JT808ReceiveAtomicCounterService jT808ReceiveAtomicCounterService; + private readonly JT808SendAtomicCounterService jT808SendAtomicCounterService; + private readonly IJT808TcpClientFactory jT808TcpClientFactory; + + public List JT808Reports { get; private set; } + + public JT808ReportService( + JT808ReceiveAtomicCounterService jT808ReceiveAtomicCounterService, + JT808SendAtomicCounterService jT808SendAtomicCounterService, + IJT808TcpClientFactory jT808TcpClientFactory) + { + this.jT808ReceiveAtomicCounterService = jT808ReceiveAtomicCounterService; + this.jT808SendAtomicCounterService = jT808SendAtomicCounterService; + this.jT808TcpClientFactory = jT808TcpClientFactory; + JT808Reports = new List(); + } + + public void Create() + { + var clients = jT808TcpClientFactory.GetAll(); + JT808Reports.Add(new JT808Report() + { + SendTotalCount= jT808SendAtomicCounterService.MsgSuccessCount, + ReceiveTotalCount= jT808ReceiveAtomicCounterService.MsgSuccessCount, + CurrentDate=DateTime.Now, + Connections= clients.Count, + OnlineConnections= clients.Where(w => w.IsOpen).Count(), + OfflineConnections= clients.Where(w => !w.IsOpen).Count(), + }); + } + } +} diff --git a/src/JT808.DotNetty.Client/Services/JT808SendAtomicCounterService.cs b/src/JT808.DotNetty.Client/Services/JT808SendAtomicCounterService.cs new file mode 100644 index 0000000..7642bc0 --- /dev/null +++ b/src/JT808.DotNetty.Client/Services/JT808SendAtomicCounterService.cs @@ -0,0 +1,35 @@ +using JT808.DotNetty.Client.Metadata; + +namespace JT808.DotNetty.Client.Services +{ + /// + /// 发送计数包服务 + /// + public class JT808SendAtomicCounterService + { + private readonly JT808AtomicCounter MsgSuccessCounter; + + public JT808SendAtomicCounterService() + { + MsgSuccessCounter=new JT808AtomicCounter(); + } + + public void Reset() + { + MsgSuccessCounter.Reset(); + } + + public long MsgSuccessIncrement() + { + return MsgSuccessCounter.Increment(); + } + + public long MsgSuccessCount + { + get + { + return MsgSuccessCounter.Count; + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Codecs/JT808TcpDecoder.cs b/src/JT808.DotNetty.Core/Codecs/JT808TcpDecoder.cs new file mode 100644 index 0000000..3eb3006 --- /dev/null +++ b/src/JT808.DotNetty.Core/Codecs/JT808TcpDecoder.cs @@ -0,0 +1,20 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using System.Collections.Generic; +using JT808.Protocol; +using DotNetty.Transport.Channels; + +namespace JT808.DotNetty.Core.Codecs +{ + public class JT808TcpDecoder : ByteToMessageDecoder + { + protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output) + { + byte[] buffer = new byte[input.Capacity + 2]; + input.ReadBytes(buffer, 1, input.Capacity); + buffer[0] = JT808Package.BeginFlag; + buffer[input.Capacity + 1] = JT808Package.EndFlag; + output.Add(buffer); + } + } +} diff --git a/src/JT808.DotNetty.Core/Codecs/JT808TcpEncoder.cs b/src/JT808.DotNetty.Core/Codecs/JT808TcpEncoder.cs new file mode 100644 index 0000000..80bee07 --- /dev/null +++ b/src/JT808.DotNetty.Core/Codecs/JT808TcpEncoder.cs @@ -0,0 +1,67 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using JT808.Protocol; +using DotNetty.Transport.Channels; +using JT808.DotNetty.Core.Interfaces; +using Microsoft.Extensions.Logging; +using JT808.DotNetty.Core.Services; +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Abstractions.Enums; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.Core.Codecs +{ + /// + /// tcp统一下发出口 + /// + public class JT808TcpEncoder : MessageToByteEncoder + { + private readonly ILogger logger; + + private readonly JT808TrafficService jT808TrafficService; + + private readonly IJT808DownlinkPacket jT808DownlinkPacket; + + private readonly JT808Serializer JT808Serializer; + + public JT808TcpEncoder( + IJT808Config jT808Config, + ILoggerFactory loggerFactory, + JT808TrafficServiceFactory jT808TrafficServiceFactory, + IJT808DownlinkPacket jT808DownlinkPacket) + { + logger = loggerFactory.CreateLogger(); + this.jT808TrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.tcp); + this.jT808DownlinkPacket = jT808DownlinkPacket; + this.JT808Serializer = jT808Config.GetSerializer(); + } + + protected override void Encode(IChannelHandlerContext context, IJT808Reply message, IByteBuffer output) + { + if (message.Package != null) + { + try + { + var sendData = JT808Serializer.Serialize(message.Package, message.MinBufferSize); + jT808TrafficService.SendSize(sendData.Length); + jT808DownlinkPacket.ProcessorAsync(sendData, JT808TransportProtocolType.tcp); + output.WriteBytes(Unpooled.WrappedBuffer(sendData)); + } + catch (JT808.Protocol.Exceptions.JT808Exception ex) + { + logger.LogError(ex, context.Channel.Id.AsShortText()); + } + catch (System.Exception ex) + { + logger.LogError(ex, context.Channel.Id.AsShortText()); + } + } + else if (message.HexData != null) + { + jT808TrafficService.SendSize(message.HexData.Length); + jT808DownlinkPacket.ProcessorAsync(message.HexData, JT808TransportProtocolType.tcp); + output.WriteBytes(Unpooled.WrappedBuffer(message.HexData)); + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Codecs/JT808UdpDecoder.cs b/src/JT808.DotNetty.Core/Codecs/JT808UdpDecoder.cs new file mode 100644 index 0000000..df27984 --- /dev/null +++ b/src/JT808.DotNetty.Core/Codecs/JT808UdpDecoder.cs @@ -0,0 +1,21 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using DotNetty.Transport.Channels; +using System.Collections.Generic; +using DotNetty.Transport.Channels.Sockets; +using JT808.DotNetty.Core.Metadata; + +namespace JT808.DotNetty.Core.Codecs +{ + public class JT808UdpDecoder : MessageToMessageDecoder + { + protected override void Decode(IChannelHandlerContext context, DatagramPacket message, List output) + { + if (!message.Content.IsReadable()) return; + IByteBuffer byteBuffer = message.Content; + byte[] buffer = new byte[byteBuffer.ReadableBytes]; + byteBuffer.ReadBytes(buffer); + output.Add(new JT808UdpPackage(buffer, message.Sender)); + } + } +} diff --git a/src/JT808.DotNetty.Core/Configurations/JT808ClientConfiguration.cs b/src/JT808.DotNetty.Core/Configurations/JT808ClientConfiguration.cs new file mode 100644 index 0000000..8288fd4 --- /dev/null +++ b/src/JT808.DotNetty.Core/Configurations/JT808ClientConfiguration.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace JT808.DotNetty.Core.Configurations +{ + public class JT808ClientConfiguration + { + public string Host { get; set; } + + public int Port { get; set; } + + private EndPoint endPoint; + + public EndPoint EndPoint + { + get + { + if (endPoint == null) + { + if (IPAddress.TryParse(Host, out IPAddress ip)) + { + endPoint = new IPEndPoint(ip, Port); + } + } + return endPoint; + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs b/src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs new file mode 100644 index 0000000..8375363 --- /dev/null +++ b/src/JT808.DotNetty.Core/Configurations/JT808Configuration.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Configurations +{ + public class JT808Configuration + { + public int TcpPort { get; set; } = 808; + + public int UdpPort { get; set; } = 808; + + public int QuietPeriodSeconds { get; set; } = 1; + + public TimeSpan QuietPeriodTimeSpan => TimeSpan.FromSeconds(QuietPeriodSeconds); + + public int ShutdownTimeoutSeconds { get; set; } = 3; + + public TimeSpan ShutdownTimeoutTimeSpan => TimeSpan.FromSeconds(ShutdownTimeoutSeconds); + + public int SoBacklog { get; set; } = 8192; + + public int EventLoopCount { get; set; } = Environment.ProcessorCount; + + public int ReaderIdleTimeSeconds { get; set; } = 3600; + + public int WriterIdleTimeSeconds { get; set; } = 3600; + + public int AllIdleTimeSeconds { get; set; } = 3600; + + /// + /// WebApi服务 + /// 默认828端口 + /// + public int WebApiPort { get; set; } = 828; + + /// + /// 转发远程地址 (可选项)知道转发的地址有利于提升性能 + /// 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括: + // 1.消息的序列化 + // 2.消息的下发 + // 都有一定的性能损耗,那么不需要判断写超时 IdleState.WriterIdle + // 就跟神兽貔貅一样。。。 + /// + public List ForwardingRemoteIPAddress { get; set; } + } +} diff --git a/src/JT808.DotNetty.Core/Converters/JsonByteArrayHexConverter.cs b/src/JT808.DotNetty.Core/Converters/JsonByteArrayHexConverter.cs new file mode 100644 index 0000000..14875fb --- /dev/null +++ b/src/JT808.DotNetty.Core/Converters/JsonByteArrayHexConverter.cs @@ -0,0 +1,29 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Converters +{ + class ByteArrayHexConverter : JsonConverter + { + public override bool CanConvert(Type objectType) => objectType == typeof(byte[]); + + public override bool CanRead => false; + public override bool CanWrite => true; + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => throw new NotImplementedException(); + + private readonly string _separator; + + public ByteArrayHexConverter(string separator = " ") => _separator = separator; + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var hexString = string.Join(_separator, ((byte[])value).Select(p => p.ToString("X2"))); + writer.WriteValue(hexString); + } + } +} diff --git a/src/JT808.DotNetty.Core/Converters/JsonIPAddressConverter.cs b/src/JT808.DotNetty.Core/Converters/JsonIPAddressConverter.cs new file mode 100644 index 0000000..955ed04 --- /dev/null +++ b/src/JT808.DotNetty.Core/Converters/JsonIPAddressConverter.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace JT808.DotNetty.Core.Converters +{ + public class JsonIPAddressConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(IPAddress)); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(value.ToString()); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + return IPAddress.Parse((string)reader.Value); + } + } +} diff --git a/src/JT808.DotNetty.Core/Converters/JsonIPEndPointConverter.cs b/src/JT808.DotNetty.Core/Converters/JsonIPEndPointConverter.cs new file mode 100644 index 0000000..8bed28f --- /dev/null +++ b/src/JT808.DotNetty.Core/Converters/JsonIPEndPointConverter.cs @@ -0,0 +1,32 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Net; + +namespace JT808.DotNetty.Core.Converters +{ + public class JsonIPEndPointConverter: JsonConverter + { + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(IPEndPoint)); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + IPEndPoint ep = (IPEndPoint)value; + JObject jo = new JObject(); + jo.Add("Host", JToken.FromObject(ep.Address, serializer)); + jo.Add("Port", ep.Port); + jo.WriteTo(writer); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + JObject jo = JObject.Load(reader); + IPAddress address = jo["Host"].ToObject(serializer); + int port = (int)jo["Port"]; + return new IPEndPoint(address, port); + } + } +} diff --git a/src/JT808.DotNetty.Core/Handlers/JT808MsgIdHttpHandlerBase.cs b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdHttpHandlerBase.cs new file mode 100644 index 0000000..fc7ef74 --- /dev/null +++ b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdHttpHandlerBase.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Text; +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Core.Metadata; +using Newtonsoft.Json; + +namespace JT808.DotNetty.Core.Handlers +{ + /// + /// 基于webapi http模式抽象消息处理业务 + /// 自定义消息处理业务 + /// 注意: + /// 1.ConfigureServices: + /// services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHttpHandlerBase),typeof(JT808MsgIdCustomHttpHandlerImpl),ServiceLifetime.Singleton)); + /// 2.解析具体的消息体,具体消息调用具体的JT808Serializer.Deserialize + /// + public abstract class JT808MsgIdHttpHandlerBase + { + /// + /// 初始化消息处理业务 + /// + protected JT808MsgIdHttpHandlerBase() + { + HandlerDict = new Dictionary>(); + } + + protected void CreateRoute(string url, Func func) + { + if (!HandlerDict.ContainsKey(url)) + { + HandlerDict.Add(url, func); + } + else + { + // 替换 + HandlerDict[url] = func; + } + } + + public Dictionary> HandlerDict { get; } + + protected JT808HttpResponse CreateJT808HttpResponse(dynamic dynamicObject) + { + byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dynamicObject)); + return new JT808HttpResponse() + { + Data = data + }; + } + + public JT808HttpResponse DefaultHttpResponse() + { + byte[] json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new JT808DefaultResultDto())); + return new JT808HttpResponse(json); + } + + public JT808HttpResponse EmptyHttpResponse() + { + byte[] json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new JT808ResultDto() + { + Code = JT808ResultCode.Empty, + Message = "内容为空", + Data = "Content Empty" + })); + return new JT808HttpResponse(json); + } + + public JT808HttpResponse NotFoundHttpResponse() + { + byte[] json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new JT808ResultDto() + { + Code = JT808ResultCode.NotFound, + Message = "没有该服务", + Data = "没有该服务" + })); + return new JT808HttpResponse(json); + } + + public JT808HttpResponse ErrorHttpResponse(Exception ex) + { + byte[] json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new JT808ResultDto() + { + Code = JT808ResultCode.Error, + Message = JsonConvert.SerializeObject(ex), + Data = ex.Message + })); + return new JT808HttpResponse(json); + } + } +} diff --git a/src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs new file mode 100644 index 0000000..8729013 --- /dev/null +++ b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; +using JT808.Protocol.MessageBody; + +namespace JT808.DotNetty.Core.Handlers +{ + /// + /// 基于Tcp模式抽象消息处理业务 + /// 自定义消息处理业务 + /// 注意: + /// 1.ConfigureServices: + /// services.Replace(new ServiceDescriptor(typeof(JT808MsgIdTcpHandlerBase),typeof(JT808MsgIdCustomTcpHandlerImpl),ServiceLifetime.Singleton)); + /// 2.解析具体的消息体,具体消息调用具体的JT808Serializer.Deserialize + /// + public abstract class JT808MsgIdTcpHandlerBase + { + protected JT808TcpSessionManager sessionManager { get; } + /// + /// 初始化消息处理业务 + /// + protected JT808MsgIdTcpHandlerBase(JT808TcpSessionManager sessionManager) + { + this.sessionManager = sessionManager; + HandlerDict = new Dictionary> + { + {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 Dictionary> HandlerDict { get; protected set; } + /// + /// 终端通用应答 + /// 平台无需回复 + /// 实现自己的业务 + /// + /// + /// + public virtual IJT808Reply Msg0x0001(JT808Request request) + { + return null; + } + /// + /// 终端心跳 + /// + /// + /// + public virtual IJT808Reply Msg0x0002(JT808Request request) + { + sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 终端注销 + /// + /// + /// + public virtual IJT808Reply Msg0x0003(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 终端注册 + /// + /// + /// + public virtual IJT808Reply Msg0x0100(JT808Request request) + { + return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() + { + Code = "J" + request.Package.Header.TerminalPhoneNo, + JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 终端鉴权 + /// + /// + /// + public virtual IJT808Reply Msg0x0102(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 位置信息汇报 + /// + /// + /// + public virtual IJT808Reply Msg0x0200(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 定位数据批量上传 + /// + /// + /// + public virtual IJT808Reply Msg0x0704(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId =request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 数据上行透传 + /// + /// + /// + public virtual IJT808Reply Msg0x0900(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId =request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + } +} diff --git a/src/JT808.DotNetty.Core/Handlers/JT808MsgIdUdpHandlerBase.cs b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdUdpHandlerBase.cs new file mode 100644 index 0000000..19a072b --- /dev/null +++ b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdUdpHandlerBase.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; +using JT808.Protocol.MessageBody; + +namespace JT808.DotNetty.Core.Handlers +{ + /// + /// 基于Udp模式的抽象消息处理业务 + /// 自定义消息处理业务 + /// 注意: + /// 1.ConfigureServices: + /// services.Replace(new ServiceDescriptor(typeof(JT808MsgIdUdpHandlerBase),typeof(JT808MsgIdCustomUdpHandlerImpl),ServiceLifetime.Singleton)); + /// 2.解析具体的消息体,具体消息调用具体的JT808Serializer.Deserialize + /// + public abstract class JT808MsgIdUdpHandlerBase + { + protected JT808UdpSessionManager sessionManager { get; } + /// + /// 初始化消息处理业务 + /// + protected JT808MsgIdUdpHandlerBase(JT808UdpSessionManager sessionManager) + { + this.sessionManager = sessionManager; + HandlerDict = new Dictionary> + { + {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 Dictionary> HandlerDict { get; protected set; } + /// + /// 终端通用应答 + /// 平台无需回复 + /// 实现自己的业务 + /// + /// + /// + public virtual IJT808Reply Msg0x0001(JT808Request request) + { + return null; + } + /// + /// 终端心跳 + /// + /// + /// + public virtual IJT808Reply Msg0x0002(JT808Request request) + { + sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 终端注销 + /// + /// + /// + public virtual IJT808Reply Msg0x0003(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 终端注册 + /// + /// + /// + public virtual IJT808Reply Msg0x0100(JT808Request request) + { + return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() + { + Code = "J" + request.Package.Header.TerminalPhoneNo, + JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 终端鉴权 + /// + /// + /// + public virtual IJT808Reply Msg0x0102(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 位置信息汇报 + /// + /// + /// + /// + public virtual IJT808Reply Msg0x0200(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 定位数据批量上传 + /// + /// + /// + public virtual IJT808Reply Msg0x0704(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId =request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + /// + /// 数据上行透传 + /// + /// + /// + public virtual IJT808Reply Msg0x0900(JT808Request request) + { + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId =request.Package.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Package.Header.MsgNum + })); + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808DatagramPacketImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808DatagramPacketImpl.cs new file mode 100644 index 0000000..71421f2 --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808DatagramPacketImpl.cs @@ -0,0 +1,33 @@ +using DotNetty.Buffers; +using DotNetty.Transport.Channels.Sockets; +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Services; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace JT808.DotNetty.Core.Impls +{ + class JT808DatagramPacketImpl : IJT808DatagramPacket + { + private readonly JT808TrafficService jT808TrafficService; + private readonly IJT808DownlinkPacket jT808DownlinkPacket; + public JT808DatagramPacketImpl( + JT808TrafficServiceFactory jT808TrafficServiceFactory, + IJT808DownlinkPacket jT808DownlinkPacket) + { + this.jT808DownlinkPacket = jT808DownlinkPacket; + this.jT808TrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.udp); + } + + public DatagramPacket Create(byte[] message, EndPoint recipient) + { + jT808TrafficService.SendSize(message.Length); + jT808DownlinkPacket.ProcessorAsync(message, JT808TransportProtocolType.udp); + return new DatagramPacket(Unpooled.WrappedBuffer(message), recipient); + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808DownlinkPacketEmptyImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808DownlinkPacketEmptyImpl.cs new file mode 100644 index 0000000..7ba5593 --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808DownlinkPacketEmptyImpl.cs @@ -0,0 +1,17 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Abstractions.Enums; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Impls +{ + class JT808DownlinkPacketEmptyImpl : IJT808DownlinkPacket + { + public Task ProcessorAsync(byte[] data, JT808TransportProtocolType transportProtocolType) + { + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs b/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs new file mode 100644 index 0000000..237bb6d --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs @@ -0,0 +1,56 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Interfaces; +using JT808.Protocol; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Impls +{ + public class JT808NettyBuilderDefault : IJT808NettyBuilder + { + public IJT808Builder JT808Builder { get; } + + public JT808NettyBuilderDefault(IJT808Builder builder) + { + JT808Builder = builder; + } + + public IJT808NettyBuilder Replace() where T : IJT808SourcePackageDispatcher + { + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808SourcePackageDispatcher), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808Builder Builder() + { + return JT808Builder; + } + + public IJT808NettyBuilder ReplaceSourcePackageDispatcher() where T : IJT808SourcePackageDispatcher + { + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808SourcePackageDispatcher), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808NettyBuilder ReplaceDownlinkPacket() where T : IJT808DownlinkPacket + { + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808DownlinkPacket), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808NettyBuilder ReplaceUplinkPacket() where T : IJT808UplinkPacket + { + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808UplinkPacket), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808NettyBuilder ReplaceSessionPublishing() where T : IJT808SessionPublishing + { + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808SessionPublishing), typeof(T), ServiceLifetime.Singleton)); + return this; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs new file mode 100644 index 0000000..af7aa6c --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs @@ -0,0 +1,13 @@ +using JT808.DotNetty.Abstractions; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core +{ + internal class JT808SessionPublishingEmptyImpl : IJT808SessionPublishing + { + public Task PublishAsync(string topicName, string value) + { + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808SourcePackageDispatcherEmptyImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808SourcePackageDispatcherEmptyImpl.cs new file mode 100644 index 0000000..f17ae75 --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808SourcePackageDispatcherEmptyImpl.cs @@ -0,0 +1,16 @@ +using JT808.DotNetty.Abstractions; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Impls +{ + /// + /// 原包分发器默认空实现 + /// + public class JT808SourcePackageDispatcherEmptyImpl : IJT808SourcePackageDispatcher + { + public Task SendAsync(byte[] data) + { + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808UplinkPacketEmptyImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808UplinkPacketEmptyImpl.cs new file mode 100644 index 0000000..11a1b04 --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808UplinkPacketEmptyImpl.cs @@ -0,0 +1,17 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Abstractions.Enums; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Impls +{ + class JT808UplinkPacketEmptyImpl : IJT808UplinkPacket + { + public Task ProcessorAsync(byte[] data, JT808TransportProtocolType transportProtocolType) + { + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808DatagramPacket.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808DatagramPacket.cs new file mode 100644 index 0000000..70e2a4b --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808DatagramPacket.cs @@ -0,0 +1,13 @@ +using DotNetty.Transport.Channels.Sockets; +using System.Net; + +namespace JT808.DotNetty.Core.Interfaces +{ + /// + /// 基于udp的创建发送包 + /// + interface IJT808DatagramPacket + { + DatagramPacket Create(byte[] message, EndPoint recipient); + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs new file mode 100644 index 0000000..5f1600d --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs @@ -0,0 +1,19 @@ +using JT808.DotNetty.Abstractions; +using JT808.Protocol; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808NettyBuilder + { + IJT808Builder JT808Builder { get; } + IJT808NettyBuilder ReplaceSourcePackageDispatcher() where T : IJT808SourcePackageDispatcher; + IJT808NettyBuilder ReplaceDownlinkPacket() where T: IJT808DownlinkPacket; + IJT808NettyBuilder ReplaceUplinkPacket() where T : IJT808UplinkPacket; + IJT808NettyBuilder ReplaceSessionPublishing() where T : IJT808SessionPublishing; + IJT808Builder Builder(); + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808Reply.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808Reply.cs new file mode 100644 index 0000000..99a2a74 --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808Reply.cs @@ -0,0 +1,17 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808Reply + { + JT808Package Package { get; set; } + byte[] HexData { get; set; } + /// + /// 根据实际情况适当调整包的大小 + /// + int MinBufferSize { get; set; } + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808TcpCustomMsgIdHandler.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpCustomMsgIdHandler.cs new file mode 100644 index 0000000..42fb845 --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpCustomMsgIdHandler.cs @@ -0,0 +1,20 @@ +using JT808.DotNetty.Core.Metadata; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808TcpCustomMsgIdHandler + { + IJT808Reply Proccesser(JT808Request request); + } + + public class JT808TcpCustomMsgIdHandlerEmpty : IJT808TcpCustomMsgIdHandler + { + public IJT808Reply Proccesser(JT808Request request) + { + return default; + } + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs new file mode 100644 index 0000000..0e67228 --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs @@ -0,0 +1,17 @@ +using JT808.DotNetty.Core.Handlers; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808TcpNettyBuilder + { + IJT808NettyBuilder Instance { get; } + IJT808NettyBuilder Builder(); + IJT808TcpNettyBuilder ReplaceCustomMsgIdHandler() where T : IJT808TcpCustomMsgIdHandler; + IJT808TcpNettyBuilder ReplaceMsgIdHandler() where T : JT808MsgIdTcpHandlerBase; + IJT808TcpNettyBuilder ReplaceSessionService() where T : IJT808TcpSessionService; + IJT808TcpNettyBuilder ReplaceUnificationSendService() where T : IJT808UnificationTcpSendService; + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808TcpSessionService.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpSessionService.cs new file mode 100644 index 0000000..e18982b --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpSessionService.cs @@ -0,0 +1,25 @@ +using JT808.DotNetty.Abstractions.Dtos; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + /// + /// JT808 Tcp会话服务 + /// + public interface IJT808TcpSessionService + { + /// + /// 获取会话集合 + /// + /// + JT808ResultDto> GetAll(); + /// + /// 通过设备终端号移除对应会话 + /// + /// + /// + JT808ResultDto RemoveByTerminalPhoneNo(string terminalPhoneNo); + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808UdpCustomMsgIdHandler.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpCustomMsgIdHandler.cs new file mode 100644 index 0000000..f9c4698 --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpCustomMsgIdHandler.cs @@ -0,0 +1,20 @@ +using JT808.DotNetty.Core.Metadata; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808UdpCustomMsgIdHandler + { + IJT808Reply Proccesser(JT808Request request); + } + + public class JT808UdpCustomMsgIdHandlerEmpty : IJT808UdpCustomMsgIdHandler + { + public IJT808Reply Proccesser(JT808Request request) + { + return default; + } + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs new file mode 100644 index 0000000..8efc02b --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs @@ -0,0 +1,17 @@ +using JT808.DotNetty.Core.Handlers; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808UdpNettyBuilder + { + IJT808NettyBuilder Instance { get; } + IJT808NettyBuilder Builder(); + IJT808UdpNettyBuilder ReplaceCustomMsgIdHandler() where T : IJT808UdpCustomMsgIdHandler; + IJT808UdpNettyBuilder ReplaceMsgIdHandler() where T : JT808MsgIdUdpHandlerBase; + IJT808UdpNettyBuilder ReplaceSessionService() where T : IJT808UdpSessionService; + IJT808UdpNettyBuilder ReplaceUnificationSendService() where T : IJT808UnificationUdpSendService; + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808UdpSessionService.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpSessionService.cs new file mode 100644 index 0000000..8e9052c --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpSessionService.cs @@ -0,0 +1,25 @@ +using JT808.DotNetty.Abstractions.Dtos; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + /// + /// JT808 Udp会话服务 + /// + public interface IJT808UdpSessionService + { + /// + /// 获取会话集合 + /// + /// + JT808ResultDto> GetAll(); + /// + /// 通过设备终端号移除对应会话 + /// + /// + /// + JT808ResultDto RemoveByTerminalPhoneNo(string terminalPhoneNo); + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808UnificationTcpSendService.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808UnificationTcpSendService.cs new file mode 100644 index 0000000..528edcf --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808UnificationTcpSendService.cs @@ -0,0 +1,12 @@ +using JT808.DotNetty.Abstractions.Dtos; + +namespace JT808.DotNetty.Core.Interfaces +{ + /// + /// JT808基于tcp的统一下发命令服务 + /// + public interface IJT808UnificationTcpSendService + { + JT808ResultDto Send(string terminalPhoneNo, byte[] data); + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808UnificationUdpSendService.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808UnificationUdpSendService.cs new file mode 100644 index 0000000..fffbd94 --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808UnificationUdpSendService.cs @@ -0,0 +1,12 @@ +using JT808.DotNetty.Abstractions.Dtos; + +namespace JT808.DotNetty.Core.Interfaces +{ + /// + /// JT808基于udp的统一下发命令服务 + /// + public interface IJT808UnificationUdpSendService + { + JT808ResultDto Send(string terminalPhoneNo, byte[] data); + } +} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808WebApiNettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808WebApiNettyBuilder.cs new file mode 100644 index 0000000..09bf34a --- /dev/null +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808WebApiNettyBuilder.cs @@ -0,0 +1,14 @@ +using JT808.DotNetty.Core.Handlers; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Interfaces +{ + public interface IJT808WebApiNettyBuilder + { + IJT808NettyBuilder Instance { get; } + IJT808NettyBuilder Builder(); + IJT808WebApiNettyBuilder ReplaceMsgIdHandler() where T : JT808MsgIdHttpHandlerBase; + } +} diff --git a/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj b/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj new file mode 100644 index 0000000..d538217 --- /dev/null +++ b/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj @@ -0,0 +1,29 @@ + + + + JT808.DotNetty.Core + JT808.DotNetty.Core + 基于DotNetty实现的JT808DotNetty的核心库 + 基于DotNetty实现的JT808DotNetty的核心库 + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/JT808.DotNetty.Core/JT808BackgroundService.cs b/src/JT808.DotNetty.Core/JT808BackgroundService.cs new file mode 100644 index 0000000..cda2139 --- /dev/null +++ b/src/JT808.DotNetty.Core/JT808BackgroundService.cs @@ -0,0 +1,74 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core +{ + /// + /// + /// + /// + public abstract class JT808BackgroundService : IHostedService, IDisposable + { + /// + /// 默认次日过期 + /// + public virtual TimeSpan DelayTimeSpan + { + get + { + DateTime current = DateTime.Now; + DateTime tmp = current.Date.AddDays(1).AddSeconds(-1); + return tmp.Subtract(current); + } + set { } + } + + private Task _executingTask; + + public abstract string ServiceName { get; } + + private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource(); + + protected abstract Task ExecuteAsync(CancellationToken stoppingToken); + + public void Dispose() + { + _stoppingCts.Cancel(); + } + + public virtual Task StartAsync(CancellationToken cancellationToken) + { + // Store the task we're executing + _executingTask = ExecuteAsync(_stoppingCts.Token); + // If the task is completed then return it, + // this will bubble cancellation and failure to the caller + if (_executingTask.IsCompleted) + { + return _executingTask; + } + // Otherwise it's running + return Task.CompletedTask; + } + + public virtual async Task StopAsync(CancellationToken cancellationToken) + { + // Stop called without start + if (_executingTask == null) + { + return; + } + try + { + // Signal cancellation to the executing method + _stoppingCts.Cancel(); + } + finally + { + // Wait until the task completes or the stop token triggers + await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite,cancellationToken)); + } + } + } +} diff --git a/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs b/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs new file mode 100644 index 0000000..818fb72 --- /dev/null +++ b/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs @@ -0,0 +1,96 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Configurations; +using JT808.DotNetty.Core.Converters; +using JT808.DotNetty.Core.Impls; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Services; +using JT808.DotNetty.Internal; +using JT808.Protocol; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("JT808.DotNetty.Core.Test")] +[assembly: InternalsVisibleTo("JT808.DotNetty.Tcp.Test")] +[assembly: InternalsVisibleTo("JT808.DotNetty.Udp.Test")] +[assembly: InternalsVisibleTo("JT808.DotNetty.WebApi.Test")] +[assembly: InternalsVisibleTo("JT808.DotNetty.Tcp")] +[assembly: InternalsVisibleTo("JT808.DotNetty.Udp")] +[assembly: InternalsVisibleTo("JT808.DotNetty.WebApi")] +namespace JT808.DotNetty.Core +{ + public static class JT808CoreDotnettyExtensions + { + static JT808CoreDotnettyExtensions() + { + JsonConvert.DefaultSettings = new Func(() => + { + Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings(); + //日期类型默认格式化处理 + settings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat; + settings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; + //空值处理 + settings.NullValueHandling = NullValueHandling.Ignore; + settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + settings.Converters.Add(new JsonIPAddressConverter()); + settings.Converters.Add(new JsonIPEndPointConverter()); + settings.Converters.Add(new ByteArrayHexConverter()); + return settings; + }); + } + + public static IJT808NettyBuilder AddJT808NettyCore(this IJT808Builder jt808Builder, IConfiguration configuration, Newtonsoft.Json.JsonSerializerSettings settings=null) + { + if (settings != null) + { + JsonConvert.DefaultSettings = new Func(() => + { + settings.Converters.Add(new JsonIPAddressConverter()); + settings.Converters.Add(new JsonIPEndPointConverter()); + settings.Converters.Add(new ByteArrayHexConverter()); + settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + return settings; + }); + } + IJT808NettyBuilder nettyBuilder = new JT808NettyBuilderDefault(jt808Builder); + nettyBuilder.JT808Builder.Services.Configure(configuration.GetSection("JT808Configuration")); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + return nettyBuilder; + } + + public static IJT808NettyBuilder AddJT808NettyCore(this IJT808Builder jt808Builder, Action jt808Options, Newtonsoft.Json.JsonSerializerSettings settings = null) + { + if (settings != null) + { + JsonConvert.DefaultSettings = new Func(() => + { + settings.Converters.Add(new JsonIPAddressConverter()); + settings.Converters.Add(new JsonIPEndPointConverter()); + settings.Converters.Add(new ByteArrayHexConverter()); + settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + return settings; + }); + } + IJT808NettyBuilder nettyBuilder = new JT808NettyBuilderDefault(jt808Builder); + nettyBuilder.JT808Builder.Services.Configure(jt808Options); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + nettyBuilder.JT808Builder.Services.TryAddSingleton(); + return nettyBuilder; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/JT808SimpleTcpClient.cs b/src/JT808.DotNetty.Core/JT808SimpleTcpClient.cs new file mode 100644 index 0000000..8887a27 --- /dev/null +++ b/src/JT808.DotNetty.Core/JT808SimpleTcpClient.cs @@ -0,0 +1,50 @@ +using System; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core +{ + internal class JT808SimpleTcpClient + { + private TcpClient tcpClient; + + public JT808SimpleTcpClient(IPEndPoint remoteAddress) + { + tcpClient = new TcpClient(); + tcpClient.Connect(remoteAddress); + Task.Run(()=> { + while (true) + { + try + { + byte[] buffer = new byte[100]; + tcpClient.GetStream().Read(buffer, 0, 100); + Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " " + string.Join(" ", buffer)); + + } + catch + { + + + } + Thread.Sleep(1000); + } + }); + } + + + + public void WriteAsync(byte[] data) + { + tcpClient.GetStream().WriteAsync(data, 0, data.Length); + } + + public void Down() + { + tcpClient.Close(); + } + } +} diff --git a/src/JT808.DotNetty.Core/JT808SimpleUdpClient.cs b/src/JT808.DotNetty.Core/JT808SimpleUdpClient.cs new file mode 100644 index 0000000..568658f --- /dev/null +++ b/src/JT808.DotNetty.Core/JT808SimpleUdpClient.cs @@ -0,0 +1,48 @@ +using System; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core +{ + internal class JT808SimpleUdpClient + { + private UdpClient udpClient; + + public JT808SimpleUdpClient(IPEndPoint remoteAddress) + { + udpClient = new UdpClient(); + udpClient.Connect(remoteAddress); + Task.Run(() => + { + while (true) + { + try + { + string tmp = string.Join(" ", udpClient.Receive(ref remoteAddress)); + Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " " + tmp); + Thread.Sleep(1000); + } + catch + { + + + } + Thread.Sleep(1000); + } + }); + } + + public void WriteAsync(byte[] data) + { + udpClient.SendAsync(data, data.Length); + } + + public void Down() + { + udpClient.Close(); + } + } +} diff --git a/src/JT808.DotNetty.Core/Jobs/JT808TcpAtomicCouterResetDailyJob.cs b/src/JT808.DotNetty.Core/Jobs/JT808TcpAtomicCouterResetDailyJob.cs new file mode 100644 index 0000000..54b438b --- /dev/null +++ b/src/JT808.DotNetty.Core/Jobs/JT808TcpAtomicCouterResetDailyJob.cs @@ -0,0 +1,38 @@ +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Services; +using Microsoft.Extensions.Logging; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Jobs +{ + internal class JT808TcpAtomicCouterResetDailyJob : JT808BackgroundService + { + private readonly ILogger _logger; + + private readonly JT808AtomicCounterService _jT808AtomicCounterService; + + public JT808TcpAtomicCouterResetDailyJob( + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory, + ILoggerFactory loggerFactory) + { + _jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.tcp); + _logger =loggerFactory.CreateLogger(); + } + + public override string ServiceName => nameof(JT808TcpAtomicCouterResetDailyJob); + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogInformation($"{ServiceName} is starting."); + stoppingToken.Register(() => _logger.LogInformation($"{ServiceName} background task is stopping.")); + while (!stoppingToken.IsCancellationRequested) + { + _logger.LogInformation($"{ServiceName} task doing background work."); + _jT808AtomicCounterService.Reset(); + await Task.Delay(DelayTimeSpan, stoppingToken); + } + _logger.LogInformation($"{ServiceName} background task is stopping."); + } + } +} diff --git a/src/JT808.DotNetty.Core/Jobs/JT808TcpTrafficResetDailyJob.cs b/src/JT808.DotNetty.Core/Jobs/JT808TcpTrafficResetDailyJob.cs new file mode 100644 index 0000000..5e5dcad --- /dev/null +++ b/src/JT808.DotNetty.Core/Jobs/JT808TcpTrafficResetDailyJob.cs @@ -0,0 +1,38 @@ +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Services; +using Microsoft.Extensions.Logging; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Jobs +{ + internal class JT808TcpTrafficResetDailyJob : JT808BackgroundService + { + private readonly ILogger _logger; + + private readonly JT808TrafficService _jT808TrafficService; + + public JT808TcpTrafficResetDailyJob( + JT808TrafficServiceFactory jT808TrafficServiceFactory, + ILoggerFactory loggerFactory) + { + _jT808TrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.tcp); + _logger =loggerFactory.CreateLogger(); + } + + public override string ServiceName => nameof(JT808TcpTrafficResetDailyJob); + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogInformation($"{ServiceName} is starting."); + stoppingToken.Register(() => _logger.LogInformation($"{ServiceName} background task is stopping.")); + while (!stoppingToken.IsCancellationRequested) + { + _logger.LogInformation($"{ServiceName} task doing background work."); + _jT808TrafficService.ResetSize(); + await Task.Delay(DelayTimeSpan, stoppingToken); + } + _logger.LogInformation($"{ServiceName} background task is stopping."); + } + } +} diff --git a/src/JT808.DotNetty.Core/Jobs/JT808UdpAtomicCouterResetDailyJob.cs b/src/JT808.DotNetty.Core/Jobs/JT808UdpAtomicCouterResetDailyJob.cs new file mode 100644 index 0000000..1cd668f --- /dev/null +++ b/src/JT808.DotNetty.Core/Jobs/JT808UdpAtomicCouterResetDailyJob.cs @@ -0,0 +1,38 @@ +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Services; +using Microsoft.Extensions.Logging; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Jobs +{ + internal class JT808UdpAtomicCouterResetDailyJob : JT808BackgroundService + { + private readonly ILogger _logger; + + private readonly JT808AtomicCounterService _jT808AtomicCounterService; + + public JT808UdpAtomicCouterResetDailyJob( + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory, + ILoggerFactory loggerFactory) + { + _jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp); + _logger =loggerFactory.CreateLogger(); + } + + public override string ServiceName => nameof(JT808UdpAtomicCouterResetDailyJob); + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogInformation($"{ServiceName} is starting."); + stoppingToken.Register(() => _logger.LogInformation($"{ServiceName} background task is stopping.")); + while (!stoppingToken.IsCancellationRequested) + { + _logger.LogInformation($"{ServiceName} task doing background work."); + _jT808AtomicCounterService.Reset(); + await Task.Delay(DelayTimeSpan, stoppingToken); + } + _logger.LogInformation($"{ServiceName} background task is stopping."); + } + } +} diff --git a/src/JT808.DotNetty.Core/Jobs/JT808UdpTrafficResetDailyJob.cs b/src/JT808.DotNetty.Core/Jobs/JT808UdpTrafficResetDailyJob.cs new file mode 100644 index 0000000..620a80f --- /dev/null +++ b/src/JT808.DotNetty.Core/Jobs/JT808UdpTrafficResetDailyJob.cs @@ -0,0 +1,38 @@ +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Services; +using Microsoft.Extensions.Logging; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Jobs +{ + internal class JT808UdpTrafficResetDailyJob : JT808BackgroundService + { + private readonly ILogger _logger; + + private readonly JT808TrafficService _jT808TrafficService; + + public JT808UdpTrafficResetDailyJob( + JT808TrafficServiceFactory jT808TrafficServiceFactory, + ILoggerFactory loggerFactory) + { + _jT808TrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.udp); + _logger =loggerFactory.CreateLogger(); + } + + public override string ServiceName => nameof(JT808UdpTrafficResetDailyJob); + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogInformation($"{ServiceName} is starting."); + stoppingToken.Register(() => _logger.LogInformation($"{ServiceName} background task is stopping.")); + while (!stoppingToken.IsCancellationRequested) + { + _logger.LogInformation($"{ServiceName} task doing background work."); + _jT808TrafficService.ResetSize(); + await Task.Delay(DelayTimeSpan, stoppingToken); + } + _logger.LogInformation($"{ServiceName} background task is stopping."); + } + } +} diff --git a/src/JT808.DotNetty.Core/Metadata/JT808AtomicCounter.cs b/src/JT808.DotNetty.Core/Metadata/JT808AtomicCounter.cs new file mode 100644 index 0000000..25b8cca --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808AtomicCounter.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace JT808.DotNetty.Core.Metadata +{ + /// + /// + /// + /// + internal class JT808AtomicCounter + { + long counter = 0; + + public JT808AtomicCounter(long initialCount = 0) + { + this.counter = initialCount; + } + + public void Reset() + { + Interlocked.Exchange(ref counter, 0); + } + + public long Increment() + { + return Interlocked.Increment(ref counter); + } + + public long Add(long len) + { + return Interlocked.Add(ref counter,len); + } + + public long Decrement() + { + return Interlocked.Decrement(ref counter); + } + + public long Count + { + get + { + return Interlocked.Read(ref counter); + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Metadata/JT808HttpRequest.cs b/src/JT808.DotNetty.Core/Metadata/JT808HttpRequest.cs new file mode 100644 index 0000000..274226b --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808HttpRequest.cs @@ -0,0 +1,22 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808HttpRequest + { + public string Json { get; set; } + + public JT808HttpRequest() + { + + } + + public JT808HttpRequest(string json) + { + Json = json; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Metadata/JT808HttpResponse.cs b/src/JT808.DotNetty.Core/Metadata/JT808HttpResponse.cs new file mode 100644 index 0000000..3bd3379 --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808HttpResponse.cs @@ -0,0 +1,22 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808HttpResponse + { + public byte[] Data { get; set; } + + public JT808HttpResponse() + { + + } + + public JT808HttpResponse(byte[] data) + { + this.Data = data; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Metadata/JT808Request.cs b/src/JT808.DotNetty.Core/Metadata/JT808Request.cs new file mode 100644 index 0000000..84aa29e --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808Request.cs @@ -0,0 +1,23 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808Request + { + public JT808HeaderPackage Package { get; } + + /// + /// 用于消息发送 + /// + public byte[] OriginalPackage { get;} + + public JT808Request(JT808HeaderPackage package, byte[] originalPackage) + { + Package = package; + OriginalPackage = originalPackage; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Metadata/JT808Response.cs b/src/JT808.DotNetty.Core/Metadata/JT808Response.cs new file mode 100644 index 0000000..ef75f3c --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808Response.cs @@ -0,0 +1,31 @@ +using JT808.DotNetty.Core.Interfaces; +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808Response: IJT808Reply + { + public JT808Package Package { get; set; } + public byte[] HexData { get; set; } + public int MinBufferSize { get; set; } + + public JT808Response() + { + + } + + public JT808Response(JT808Package package, int minBufferSize = 1024) + { + Package = package; + MinBufferSize = minBufferSize; + } + + public JT808Response(byte[] hexData) + { + HexData = hexData; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Metadata/JT808TcpSession.cs b/src/JT808.DotNetty.Core/Metadata/JT808TcpSession.cs new file mode 100644 index 0000000..6d0e651 --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808TcpSession.cs @@ -0,0 +1,29 @@ +using DotNetty.Transport.Channels; +using System; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808TcpSession + { + public JT808TcpSession(IChannel channel, string terminalPhoneNo) + { + Channel = channel; + TerminalPhoneNo = terminalPhoneNo; + StartTime = DateTime.Now; + LastActiveTime = DateTime.Now; + } + + public JT808TcpSession() { } + + /// + /// 终端手机号 + /// + public string TerminalPhoneNo { get; set; } + + public IChannel Channel { get; set; } + + public DateTime LastActiveTime { get; set; } + + public DateTime StartTime { get; set; } + } +} diff --git a/src/JT808.DotNetty.Core/Metadata/JT808UdpPackage.cs b/src/JT808.DotNetty.Core/Metadata/JT808UdpPackage.cs new file mode 100644 index 0000000..939f93f --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808UdpPackage.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808UdpPackage + { + public JT808UdpPackage(byte[] buffer, EndPoint sender) + { + Buffer = buffer; + Sender = sender; + } + + public byte[] Buffer { get; } + + public EndPoint Sender { get; } + } +} diff --git a/src/JT808.DotNetty.Core/Metadata/JT808UdpSession.cs b/src/JT808.DotNetty.Core/Metadata/JT808UdpSession.cs new file mode 100644 index 0000000..7984202 --- /dev/null +++ b/src/JT808.DotNetty.Core/Metadata/JT808UdpSession.cs @@ -0,0 +1,35 @@ +using DotNetty.Transport.Channels; +using System; +using System.Net; + +namespace JT808.DotNetty.Core.Metadata +{ + public class JT808UdpSession + { + public JT808UdpSession(IChannel channel, + EndPoint sender, + string terminalPhoneNo) + { + Channel = channel; + TerminalPhoneNo = terminalPhoneNo; + StartTime = DateTime.Now; + LastActiveTime = DateTime.Now; + Sender = sender; + } + + public EndPoint Sender { get; set; } + + public JT808UdpSession() { } + + /// + /// 终端手机号 + /// + public string TerminalPhoneNo { get; set; } + + public IChannel Channel { get; set; } + + public DateTime LastActiveTime { get; set; } + + public DateTime StartTime { get; set; } + } +} diff --git a/src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml b/src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..e572661 --- /dev/null +++ b/src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,13 @@ + + + + + FileSystem + Release + Any CPU + netstandard2.0 + ..\..\nupkgs + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml.user b/src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..312c6e3 --- /dev/null +++ b/src/JT808.DotNetty.Core/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Core/Services/JT808AtomicCounterService.cs b/src/JT808.DotNetty.Core/Services/JT808AtomicCounterService.cs new file mode 100644 index 0000000..85cf0d5 --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808AtomicCounterService.cs @@ -0,0 +1,52 @@ +using JT808.DotNetty.Core.Metadata; + +namespace JT808.DotNetty.Core.Services +{ + /// + /// 计数包服务 + /// + public class JT808AtomicCounterService + { + private readonly JT808AtomicCounter MsgSuccessCounter; + + private readonly JT808AtomicCounter MsgFailCounter; + + public JT808AtomicCounterService() + { + MsgSuccessCounter=new JT808AtomicCounter(); + MsgFailCounter = new JT808AtomicCounter(); + } + + public void Reset() + { + MsgSuccessCounter.Reset(); + MsgFailCounter.Reset(); + } + + public long MsgSuccessIncrement() + { + return MsgSuccessCounter.Increment(); + } + + public long MsgSuccessCount + { + get + { + return MsgSuccessCounter.Count; + } + } + + public long MsgFailIncrement() + { + return MsgFailCounter.Increment(); + } + + public long MsgFailCount + { + get + { + return MsgFailCounter.Count; + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808AtomicCounterServiceFactory.cs b/src/JT808.DotNetty.Core/Services/JT808AtomicCounterServiceFactory.cs new file mode 100644 index 0000000..916befb --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808AtomicCounterServiceFactory.cs @@ -0,0 +1,30 @@ +using JT808.DotNetty.Abstractions.Enums; +using System; +using System.Collections.Concurrent; + +namespace JT808.DotNetty.Core.Services +{ + public class JT808AtomicCounterServiceFactory + { + private readonly ConcurrentDictionary cache; + + public JT808AtomicCounterServiceFactory() + { + cache = new ConcurrentDictionary(); + } + + public JT808AtomicCounterService Create(JT808TransportProtocolType type) + { + if(cache.TryGetValue(type,out var service)) + { + return service; + } + else + { + var serviceNew = new JT808AtomicCounterService(); + cache.TryAdd(type, serviceNew); + return serviceNew; + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808SimpleSystemCollectService.cs b/src/JT808.DotNetty.Core/Services/JT808SimpleSystemCollectService.cs new file mode 100644 index 0000000..2482cff --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808SimpleSystemCollectService.cs @@ -0,0 +1,30 @@ +using JT808.DotNetty.Abstractions.Dtos; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace JT808.DotNetty.Core.Services +{ + /// + /// 简单系统收集服务 + /// + public class JT808SimpleSystemCollectService + { + /// + /// 获取系统当前进程使用情况 + /// + /// + public JT808SystemCollectInfoDto Get() + { + JT808SystemCollectInfoDto jT808SystemCollectInfoDto = new JT808SystemCollectInfoDto(); + var proc = Process.GetCurrentProcess(); + jT808SystemCollectInfoDto.ProcessId = proc.Id; + jT808SystemCollectInfoDto.WorkingSet64 = proc.WorkingSet64 / 1024.0 / 1024.0; + jT808SystemCollectInfoDto.PeakWorkingSet64 = proc.PeakWorkingSet64 / 1024.0 / 1024.0; + jT808SystemCollectInfoDto.PrivateMemorySize64 = proc.PrivateMemorySize64 / 1024.0 / 1024.0; + jT808SystemCollectInfoDto.CPUTotalProcessorTime = proc.TotalProcessorTime; + return jT808SystemCollectInfoDto; + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808TcpSessionService.cs b/src/JT808.DotNetty.Core/Services/JT808TcpSessionService.cs new file mode 100644 index 0000000..7ff872d --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808TcpSessionService.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Core.Interfaces; + +namespace JT808.DotNetty.Core.Services +{ + internal class JT808TcpSessionService : IJT808TcpSessionService + { + private readonly JT808TcpSessionManager jT808SessionManager; + + public JT808TcpSessionService( + JT808TcpSessionManager jT808SessionManager) + { + this.jT808SessionManager = jT808SessionManager; + } + + public JT808ResultDto> GetAll() + { + JT808ResultDto> resultDto = new JT808ResultDto>(); + try + { + resultDto.Data = jT808SessionManager.GetAll().Select(s => new JT808TcpSessionInfoDto + { + LastActiveTime = s.LastActiveTime, + StartTime = s.StartTime, + TerminalPhoneNo = s.TerminalPhoneNo, + RemoteAddressIP = s.Channel.RemoteAddress.ToString(), + }).ToList(); + resultDto.Code = JT808ResultCode.Ok; + } + catch (Exception ex) + { + resultDto.Data = null; + resultDto.Code = JT808ResultCode.Error; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + return resultDto; + } + + public JT808ResultDto RemoveByTerminalPhoneNo(string terminalPhoneNo) + { + JT808ResultDto resultDto = new JT808ResultDto(); + try + { + var session = jT808SessionManager.RemoveSession(terminalPhoneNo); + if (session != null) + { + if(session.Channel.Open) + { + session.Channel.CloseAsync(); + } + } + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = true; + } + catch (AggregateException ex) + { + resultDto.Data = false; + resultDto.Code = 500; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + catch (Exception ex) + { + resultDto.Data = false; + resultDto.Code = JT808ResultCode.Error; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + return resultDto; + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808TrafficService.cs b/src/JT808.DotNetty.Core/Services/JT808TrafficService.cs new file mode 100644 index 0000000..6740ff8 --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808TrafficService.cs @@ -0,0 +1,46 @@ +using JT808.DotNetty.Core.Metadata; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Services +{ + public class JT808TrafficService + { + public JT808TrafficService() + { + receiveCounter = new JT808AtomicCounter(); + sendCounter = new JT808AtomicCounter(); + } + + private readonly JT808AtomicCounter receiveCounter; + + private readonly JT808AtomicCounter sendCounter; + + public void ReceiveSize(long size) + { + receiveCounter.Add(size); + } + + public void SendSize(long size) + { + sendCounter.Add(size); + } + + public long TotalReceiveSize + { + get { return receiveCounter.Count; } + } + + public long TotalSendSize + { + get { return sendCounter.Count; } + } + + public void ResetSize() + { + receiveCounter.Reset(); + sendCounter.Reset(); + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808TrafficServiceFactory.cs b/src/JT808.DotNetty.Core/Services/JT808TrafficServiceFactory.cs new file mode 100644 index 0000000..1e3bc3d --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808TrafficServiceFactory.cs @@ -0,0 +1,33 @@ +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Metadata; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Services +{ + public class JT808TrafficServiceFactory + { + private readonly ConcurrentDictionary cache; + + public JT808TrafficServiceFactory() + { + cache = new ConcurrentDictionary(); + } + + public JT808TrafficService Create(JT808TransportProtocolType type) + { + if (cache.TryGetValue(type, out var service)) + { + return service; + } + else + { + var serviceNew = new JT808TrafficService(); + cache.TryAdd(type, serviceNew); + return serviceNew; + } + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808TransmitAddressFilterService.cs b/src/JT808.DotNetty.Core/Services/JT808TransmitAddressFilterService.cs new file mode 100644 index 0000000..7fd1078 --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808TransmitAddressFilterService.cs @@ -0,0 +1,102 @@ +using JT808.DotNetty.Abstractions.Dtos; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using JT808.DotNetty.Core.Configurations; + +namespace JT808.DotNetty.Core.Services +{ + /// + /// JT808转发地址过滤服务 + /// 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括: + // 1.消息的序列化 + // 2.消息的下发 + // 都有一定的性能损耗,那么不需要判断写超时 IdleState.WriterIdle + // 就跟神兽貔貅一样。。。 + /// + public class JT808TransmitAddressFilterService : IDisposable + { + private readonly IOptionsMonitor jT808ConfigurationOptionsMonitor; + + private ConcurrentDictionary ForwardingRemoteAddresssDict; + + private IDisposable jT808ConfigurationOptionsMonitorDisposable; + + public JT808TransmitAddressFilterService( + IOptionsMonitor jT808ConfigurationOptionsMonitor) + { + this.jT808ConfigurationOptionsMonitor = jT808ConfigurationOptionsMonitor; + ForwardingRemoteAddresssDict = new ConcurrentDictionary(); + InitForwardingRemoteAddress(jT808ConfigurationOptionsMonitor.CurrentValue.ForwardingRemoteIPAddress); + //OnChange 源码多播委托 + jT808ConfigurationOptionsMonitorDisposable = this.jT808ConfigurationOptionsMonitor.OnChange(options => + { + ChangeForwardingRemoteAddress(options.ForwardingRemoteIPAddress); + }); + } + + private void InitForwardingRemoteAddress(List jT808ClientConfigurations) + { + if (jT808ClientConfigurations != null && jT808ClientConfigurations.Count > 0) + { + foreach (var item in jT808ClientConfigurations) + { + ForwardingRemoteAddresssDict.TryAdd(item, 0); + } + } + } + + private void ChangeForwardingRemoteAddress(List jT808ClientConfigurations) + { + if (jT808ClientConfigurations != null && jT808ClientConfigurations.Count > 0) + { + ForwardingRemoteAddresssDict.Clear(); + foreach (var item in jT808ClientConfigurations) + { + ForwardingRemoteAddresssDict.TryAdd(item, 0); + } + } + else + { + ForwardingRemoteAddresssDict.Clear(); + } + } + + public bool ContainsKey(EndPoint endPoint) + { + IPAddress ip = ((IPEndPoint)endPoint).Address; + return ForwardingRemoteAddresssDict.ContainsKey(ip.ToString()); + } + + public JT808ResultDto Add(string host) + { + return new JT808ResultDto() { Code = JT808ResultCode.Ok, Data = ForwardingRemoteAddresssDict.TryAdd(host,0) }; + } + + public JT808ResultDto Remove(string host) + { + if(jT808ConfigurationOptionsMonitor.CurrentValue.ForwardingRemoteIPAddress!=null && + jT808ConfigurationOptionsMonitor.CurrentValue.ForwardingRemoteIPAddress.Any(w=>w== host)) + { + return new JT808ResultDto() { Code = JT808ResultCode.Ok, Data = false,Message="不能删除服务器配置的地址" }; + } + else + { + return new JT808ResultDto() { Code = JT808ResultCode.Ok, Data = ForwardingRemoteAddresssDict.TryRemove(host,out var temp) }; + } + } + + public JT808ResultDto> GetAll() + { + return new JT808ResultDto>(){ Code = JT808ResultCode.Ok, Data = ForwardingRemoteAddresssDict.Select(s=>s.Key).ToList() }; + } + + public void Dispose() + { + jT808ConfigurationOptionsMonitorDisposable.Dispose(); + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808UdpSessionService.cs b/src/JT808.DotNetty.Core/Services/JT808UdpSessionService.cs new file mode 100644 index 0000000..975108c --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808UdpSessionService.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Core.Interfaces; + +namespace JT808.DotNetty.Core.Services +{ + internal class JT808UdpSessionService : IJT808UdpSessionService + { + private readonly JT808UdpSessionManager jT808SessionManager; + + public JT808UdpSessionService( + JT808UdpSessionManager jT808SessionManager) + { + this.jT808SessionManager = jT808SessionManager; + } + + public JT808ResultDto> GetAll() + { + JT808ResultDto> resultDto = new JT808ResultDto>(); + try + { + resultDto.Data = jT808SessionManager.GetAll().Select(s => new JT808UdpSessionInfoDto + { + LastActiveTime = s.LastActiveTime, + StartTime = s.StartTime, + TerminalPhoneNo = s.TerminalPhoneNo, + RemoteAddressIP = s.Sender.ToString() + }).ToList(); + resultDto.Code = JT808ResultCode.Ok; + } + catch (Exception ex) + { + resultDto.Data = null; + resultDto.Code = JT808ResultCode.Error; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + return resultDto; + } + + public JT808ResultDto RemoveByTerminalPhoneNo(string terminalPhoneNo) + { + JT808ResultDto resultDto = new JT808ResultDto(); + try + { + var session = jT808SessionManager.RemoveSession(terminalPhoneNo); + if (session != null) + { + if(session.Channel.Open) + { + session.Channel.CloseAsync(); + } + } + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = true; + } + catch (AggregateException ex) + { + resultDto.Data = false; + resultDto.Code = 500; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + catch (Exception ex) + { + resultDto.Data = false; + resultDto.Code = JT808ResultCode.Error; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + return resultDto; + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808UnificationTcpSendService.cs b/src/JT808.DotNetty.Core/Services/JT808UnificationTcpSendService.cs new file mode 100644 index 0000000..0082c9f --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808UnificationTcpSendService.cs @@ -0,0 +1,49 @@ +using DotNetty.Buffers; +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using JT808.DotNetty.Core.Services; +using System; +using System.Linq; + +namespace JT808.DotNetty.Internal +{ + internal class JT808UnificationTcpSendService : IJT808UnificationTcpSendService + { + private readonly JT808TcpSessionManager jT808SessionManager; + + public JT808UnificationTcpSendService( + JT808TcpSessionManager jT808SessionManager) + { + this.jT808SessionManager = jT808SessionManager; + } + + public JT808ResultDto Send(string terminalPhoneNo, byte[] data) + { + JT808ResultDto resultDto = new JT808ResultDto(); + try + { + if(jT808SessionManager.TrySend(terminalPhoneNo, data, out var message)) + { + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = true; + resultDto.Message = message; + } + else + { + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = false; + resultDto.Message = message; + } + } + catch (Exception ex) + { + resultDto.Data = false; + resultDto.Code = JT808ResultCode.Error; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + return resultDto; + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808UnificationUdpSendService.cs b/src/JT808.DotNetty.Core/Services/JT808UnificationUdpSendService.cs new file mode 100644 index 0000000..89d6a99 --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808UnificationUdpSendService.cs @@ -0,0 +1,54 @@ +using DotNetty.Buffers; +using DotNetty.Transport.Channels.Sockets; +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Services; +using System; + +namespace JT808.DotNetty.Internal +{ + internal class JT808UnificationUdpSendService : IJT808UnificationUdpSendService + { + private readonly JT808UdpSessionManager jT808SessionManager; + + private readonly IJT808DatagramPacket jT808DatagramPacket; + + public JT808UnificationUdpSendService( + IJT808DatagramPacket jT808DatagramPacket, + JT808UdpSessionManager jT808SessionManager) + { + this.jT808DatagramPacket = jT808DatagramPacket; + this.jT808SessionManager = jT808SessionManager; + } + + public JT808ResultDto Send(string terminalPhoneNo, byte[] data) + { + JT808ResultDto resultDto = new JT808ResultDto(); + try + { + var session = jT808SessionManager.GetSession(terminalPhoneNo); + if (session != null) + { + session.Channel.WriteAndFlushAsync(jT808DatagramPacket.Create(data, session.Sender)); + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = true; + resultDto.Message = "Ok"; + } + else + { + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = false; + resultDto.Message = "offline"; + } + } + catch (Exception ex) + { + resultDto.Data = false; + resultDto.Code = JT808ResultCode.Error; + resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex); + } + return resultDto; + } + } +} diff --git a/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs b/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs new file mode 100644 index 0000000..c122832 --- /dev/null +++ b/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs @@ -0,0 +1,211 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using DotNetty.Transport.Channels; +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Metadata; +using JT808.DotNetty.Core.Interfaces; + +namespace JT808.DotNetty.Core +{ + /// + /// JT808 Tcp会话管理 + /// + public class JT808TcpSessionManager + { + private readonly ILogger logger; + + private readonly IJT808SessionPublishing jT808SessionPublishing; + + public JT808TcpSessionManager( + IJT808SessionPublishing jT808SessionPublishing, + ILoggerFactory loggerFactory) + { + this.jT808SessionPublishing = jT808SessionPublishing; + logger = loggerFactory.CreateLogger(); + } + + private ConcurrentDictionary SessionIdDict = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + + public int SessionCount + { + get + { + return SessionIdDict.Count; + } + } + + public JT808TcpSession GetSession(string terminalPhoneNo) + { + if (string.IsNullOrEmpty(terminalPhoneNo)) + return default; + if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808TcpSession targetSession)) + { + return targetSession; + } + else + { + return default; + } + } + + public void Heartbeat(string terminalPhoneNo) + { + if (string.IsNullOrEmpty(terminalPhoneNo)) return; + if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808TcpSession oldjT808Session)) + { + oldjT808Session.LastActiveTime = DateTime.Now; + SessionIdDict.TryUpdate(terminalPhoneNo, oldjT808Session, oldjT808Session); + } + } + + public bool TrySend(string terminalPhoneNo, byte[] data, out string message) + { + bool isSuccessed; + var session = GetSession(terminalPhoneNo); + if (session != null) + { + //判断转发数据是下发不了消息的 + if (SessionIdDict.Select(s=>s.Value).Count(c => c.Channel.Id == session.Channel.Id) > 1) + { + isSuccessed = false; + message = "not support transmit data send."; + } + else + { + session.Channel.WriteAndFlushAsync(new JT808Response(data)); + isSuccessed = true; + message = "ok"; + } + } + else + { + isSuccessed = false; + message = "offline"; + } + return isSuccessed; + } + + public bool TrySend(string terminalPhoneNo, IJT808Reply reply, out string message) + { + bool isSuccessed; + var session = GetSession(terminalPhoneNo); + if (session != null) + { + //判断转发数据是下发不了消息的 + if (SessionIdDict.Select(s => s.Value).Count(c => c.Channel.Id == session.Channel.Id) > 1) + { + isSuccessed = false; + message = "not support transmit data send."; + } + else + { + session.Channel.WriteAndFlushAsync(reply); + isSuccessed = true; + message = "ok"; + } + } + else + { + isSuccessed = false; + message = "offline"; + } + return isSuccessed; + } + + public void TryAdd(string terminalPhoneNo,IChannel channel) + { + // 解决了设备号跟通道绑定到一起,不需要用到通道本身的SessionId + // 不管设备下发更改了设备终端号,只要是没有在内存中就当是新的 + // 存在的问题: + // 1.原先老的如何销毁 + // 2.这时候用的通道是相同的,设备终端是不同的 + // 当设备主动或者服务器断开以后,可以释放,这点内存忽略不计,况且更改设备号不是很频繁。 + + //修复第一次通过转发过来的数据,再次通过直连后通道没有改变导致下发不成功,所以每次进行通道的更新操作。 + if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808TcpSession oldJT808Session)) + { + oldJT808Session.LastActiveTime = DateTime.Now; + oldJT808Session.Channel = channel; + SessionIdDict.TryUpdate(terminalPhoneNo, oldJT808Session, oldJT808Session); + } + else + { + JT808TcpSession jT808TcpSession = new JT808TcpSession(channel, terminalPhoneNo); + if (SessionIdDict.TryAdd(terminalPhoneNo, jT808TcpSession)) + { + //使用场景: + //部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, + //这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 + //有设备关联上来可以进行通知 例如:使用Redis发布订阅 + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, jT808TcpSession.TerminalPhoneNo); + } + } + } + + public JT808TcpSession RemoveSession(string terminalPhoneNo) + { + //设备离线可以进行通知 + //使用Redis 发布订阅 + if (string.IsNullOrEmpty(terminalPhoneNo)) return default; + if (!SessionIdDict.TryGetValue(terminalPhoneNo, out JT808TcpSession jT808Session)) + { + return default; + } + // 处理转发过来的是数据 这时候通道对设备是1对多关系,需要清理垃圾数据 + //1.用当前会话的通道Id找出通过转发过来的其他设备的终端号 + var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == jT808Session.Channel.Id).Select(s => s.Key).ToList(); + //2.存在则一个个移除 + if (terminalPhoneNos.Count > 1) + { + //3.移除包括当前的设备号 + foreach (var key in terminalPhoneNos) + { + SessionIdDict.TryRemove(key, out JT808TcpSession jT808SessionRemove); + } + string nos = string.Join(",", terminalPhoneNos); + logger.LogInformation($">>>{terminalPhoneNo}-{nos} 1-n Session Remove."); + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOffline, nos); + return jT808Session; + } + else + { + if (SessionIdDict.TryRemove(terminalPhoneNo, out JT808TcpSession jT808SessionRemove)) + { + logger.LogInformation($">>>{terminalPhoneNo} Session Remove."); + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOffline,terminalPhoneNo); + return jT808SessionRemove; + } + else + { + return default; + } + } + } + + public void RemoveSessionByChannel(IChannel channel) + { + //设备离线可以进行通知 + //使用Redis 发布订阅 + var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == channel.Id).Select(s => s.Key).ToList(); + if (terminalPhoneNos.Count > 0) + { + foreach (var key in terminalPhoneNos) + { + SessionIdDict.TryRemove(key, out JT808TcpSession jT808SessionRemove); + } + string nos = string.Join(",", terminalPhoneNos); + logger.LogInformation($">>>{nos} Channel Remove."); + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOffline, nos); + } + } + + public IEnumerable GetAll() + { + return SessionIdDict.Select(s => s.Value).ToList(); + } + } +} + diff --git a/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs b/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs new file mode 100644 index 0000000..4a202f6 --- /dev/null +++ b/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs @@ -0,0 +1,139 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Metadata; +using DotNetty.Transport.Channels; +using JT808.DotNetty.Core.Configurations; +using Microsoft.Extensions.Options; +using System.Net; + +namespace JT808.DotNetty.Core +{ + /// + /// JT808 udp会话管理 + /// 估计要轮询下 + /// + public class JT808UdpSessionManager + { + private readonly ILogger logger; + + private readonly IJT808SessionPublishing jT808SessionPublishing; + private readonly IOptionsMonitor jT808ConfigurationAccessor; + public JT808UdpSessionManager( + IJT808SessionPublishing jT808SessionPublishing, + IOptionsMonitor jT808ConfigurationAccessor, + ILoggerFactory loggerFactory) + { + this.jT808SessionPublishing = jT808SessionPublishing; + logger = loggerFactory.CreateLogger(); + this.jT808ConfigurationAccessor = jT808ConfigurationAccessor; + } + + private ConcurrentDictionary SessionIdDict = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + + public int SessionCount + { + get + { + return SessionIdDict.Count; + } + } + + public JT808UdpSession GetSession(string terminalPhoneNo) + { + if (string.IsNullOrEmpty(terminalPhoneNo)) + return default; + if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808UdpSession targetSession)) + { + return targetSession; + } + else + { + return default; + } + } + + public void TryAdd(IChannel channel,EndPoint sender,string terminalPhoneNo) + { + //1.先判断是否在缓存里面 + if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808UdpSession jT808UdpSession)) + { + jT808UdpSession.LastActiveTime=DateTime.Now; + jT808UdpSession.Sender = sender; + jT808UdpSession.Channel = channel; + SessionIdDict.TryUpdate(terminalPhoneNo, jT808UdpSession, jT808UdpSession); + } + else + { + //添加缓存 + //使用场景: + //部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, + //这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 + //有设备关联上来可以进行通知 例如:使用Redis发布订阅 + SessionIdDict.TryAdd(terminalPhoneNo, new JT808UdpSession(channel, sender, terminalPhoneNo)); + } + //移动是个大的内网,不跟随下发,根本就发不出来 + //移动很多卡,存储的那个socket地址端口,有效期非常短 + //不速度快点下发,那个socket地址端口就可能映射到别的对应卡去了 + //所以此处采用跟随设备消息下发指令 + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, terminalPhoneNo); + } + + public void Heartbeat(string terminalPhoneNo) + { + if (string.IsNullOrEmpty(terminalPhoneNo)) return; + if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808UdpSession oldjT808Session)) + { + oldjT808Session.LastActiveTime = DateTime.Now; + SessionIdDict.TryUpdate(terminalPhoneNo, oldjT808Session, oldjT808Session); + } + } + + public JT808UdpSession RemoveSession(string terminalPhoneNo) + { + //设备离线可以进行通知 + //使用Redis 发布订阅 + if (string.IsNullOrEmpty(terminalPhoneNo)) return default; + if (!SessionIdDict.TryGetValue(terminalPhoneNo, out JT808UdpSession jT808Session)) + { + return default; + } + if (SessionIdDict.TryRemove(terminalPhoneNo, out JT808UdpSession jT808SessionRemove)) + { + logger.LogInformation($">>>{terminalPhoneNo} Session Remove."); + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOffline,terminalPhoneNo); + return jT808SessionRemove; + } + else + { + return default; + } + } + + public void RemoveSessionByChannel(IChannel channel) + { + //设备离线可以进行通知 + //使用Redis 发布订阅 + var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == channel.Id).Select(s => s.Key).ToList(); + if (terminalPhoneNos.Count > 0) + { + foreach (var key in terminalPhoneNos) + { + SessionIdDict.TryRemove(key, out JT808UdpSession jT808SessionRemove); + } + string nos = string.Join(",", terminalPhoneNos); + logger.LogInformation($">>>{nos} Channel Remove."); + jT808SessionPublishing.PublishAsync(JT808Constants.SessionOffline, nos); + } + } + + public IEnumerable GetAll() + { + return SessionIdDict.Select(s => s.Value).ToList(); + } + } +} + diff --git a/src/JT808.DotNetty.Tcp/Handlers/JT808MsgIdDefaultTcpHandler.cs b/src/JT808.DotNetty.Tcp/Handlers/JT808MsgIdDefaultTcpHandler.cs new file mode 100644 index 0000000..fcebc15 --- /dev/null +++ b/src/JT808.DotNetty.Tcp/Handlers/JT808MsgIdDefaultTcpHandler.cs @@ -0,0 +1,18 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Tcp.Handlers +{ + /// + /// 默认消息处理业务实现 + /// + internal class JT808MsgIdDefaultTcpHandler : JT808MsgIdTcpHandlerBase + { + public JT808MsgIdDefaultTcpHandler(JT808TcpSessionManager sessionManager) : base(sessionManager) + { + } + } +} diff --git a/src/JT808.DotNetty.Tcp/Handlers/JT808TcpConnectionHandler.cs b/src/JT808.DotNetty.Tcp/Handlers/JT808TcpConnectionHandler.cs new file mode 100644 index 0000000..33e4d13 --- /dev/null +++ b/src/JT808.DotNetty.Tcp/Handlers/JT808TcpConnectionHandler.cs @@ -0,0 +1,104 @@ +using DotNetty.Handlers.Timeout; +using DotNetty.Transport.Channels; +using JT808.DotNetty.Core; +using Microsoft.Extensions.Logging; +using System; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Tcp.Handlers +{ + /// + /// JT808服务通道处理程序 + /// + internal class JT808TcpConnectionHandler : ChannelHandlerAdapter + { + private readonly ILogger logger; + + private readonly JT808TcpSessionManager jT808SessionManager; + + public JT808TcpConnectionHandler( + JT808TcpSessionManager jT808SessionManager, + ILoggerFactory loggerFactory) + { + this.jT808SessionManager = jT808SessionManager; + logger = loggerFactory.CreateLogger(); + } + + /// + /// 通道激活 + /// + /// + public override void ChannelActive(IChannelHandlerContext context) + { + string channelId = context.Channel.Id.AsShortText(); + if (logger.IsEnabled(LogLevel.Debug)) + logger.LogDebug($"<<<{ channelId } Successful client connection to server."); + base.ChannelActive(context); + } + + /// + /// 设备主动断开 + /// + /// + public override void ChannelInactive(IChannelHandlerContext context) + { + string channelId = context.Channel.Id.AsShortText(); + if (logger.IsEnabled(LogLevel.Debug)) + logger.LogDebug($">>>{ channelId } The client disconnects from the server."); + jT808SessionManager.RemoveSessionByChannel(context.Channel); + base.ChannelInactive(context); + } + + /// + /// 服务器主动断开 + /// + /// + /// + public override Task CloseAsync(IChannelHandlerContext context) + { + string channelId = context.Channel.Id.AsShortText(); + if (logger.IsEnabled(LogLevel.Debug)) + logger.LogDebug($"<<<{ channelId } The server disconnects from the client."); + jT808SessionManager.RemoveSessionByChannel(context.Channel); + return base.CloseAsync(context); + } + + public override void ChannelReadComplete(IChannelHandlerContext context)=> context.Flush(); + + /// + /// 超时策略 + /// + /// + /// + public override void UserEventTriggered(IChannelHandlerContext context, object evt) + { + IdleStateEvent idleStateEvent = evt as IdleStateEvent; + if (idleStateEvent != null) + { + if(idleStateEvent.State== IdleState.ReaderIdle) + { + string channelId = context.Channel.Id.AsShortText(); + logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); + // 由于808是设备发心跳,如果很久没有上报数据,那么就由服务器主动关闭连接。 + jT808SessionManager.RemoveSessionByChannel(context.Channel); + context.CloseAsync(); + } + // 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括: + // 1.消息的序列化 + // 2.消息的下发 + // 都有一定的性能损耗,那么不需要判断写超时 IdleState.WriterIdle + // 就跟神兽貔貅一样。。。 + } + base.UserEventTriggered(context, evt); + } + + public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) + { + string channelId = context.Channel.Id.AsShortText(); + logger.LogError(exception,$"{channelId} {exception.Message}" ); + jT808SessionManager.RemoveSessionByChannel(context.Channel); + context.CloseAsync(); + } + } +} + diff --git a/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs b/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs new file mode 100644 index 0000000..ed23021 --- /dev/null +++ b/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs @@ -0,0 +1,139 @@ +using DotNetty.Buffers; +using DotNetty.Transport.Channels; +using JT808.Protocol; +using System; +using JT808.DotNetty.Core; +using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Logging; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Services; +using JT808.DotNetty.Core.Metadata; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Abstractions.Enums; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.Tcp.Handlers +{ + /// + /// JT808服务端处理程序 + /// + internal class JT808TcpServerHandler : SimpleChannelInboundHandler + { + private readonly JT808MsgIdTcpHandlerBase handler; + + private readonly JT808TcpSessionManager jT808SessionManager; + + private readonly JT808TransmitAddressFilterService jT808TransmitAddressFilterService; + + private readonly IJT808SourcePackageDispatcher jT808SourcePackageDispatcher; + + private readonly JT808AtomicCounterService jT808AtomicCounterService; + + private readonly JT808TrafficService jT808TrafficService; + + private readonly IJT808UplinkPacket jT808UplinkPacket; + + private readonly IJT808TcpCustomMsgIdHandler jT808TcpCustomMsgIdHandler; + + private readonly ILogger logger; + + private readonly ILogger unknownLogger; + + private readonly JT808Serializer JT808Serializer; + + public JT808TcpServerHandler( + IJT808Config jT808Config, + JT808TrafficServiceFactory jT808TrafficServiceFactory, + ILoggerFactory loggerFactory, + JT808TransmitAddressFilterService jT808TransmitAddressFilterService, + IJT808SourcePackageDispatcher jT808SourcePackageDispatcher, + IJT808UplinkPacket jT808UplinkPacket, + JT808MsgIdTcpHandlerBase handler, + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory, + IJT808TcpCustomMsgIdHandler jT808TcpCustomMsgIdHandler, + JT808TcpSessionManager jT808SessionManager) + { + this.jT808TcpCustomMsgIdHandler = jT808TcpCustomMsgIdHandler; + this.jT808TrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.tcp); + this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService; + this.handler = handler; + this.jT808SessionManager = jT808SessionManager; + this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher; + this.jT808UplinkPacket = jT808UplinkPacket; + this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.tcp); + this.JT808Serializer = jT808Config.GetSerializer(); + logger = loggerFactory.CreateLogger(); + unknownLogger = loggerFactory.CreateLogger("tcp_unknown_msgid"); + } + + + protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) + { + try + { + jT808SourcePackageDispatcher.SendAsync(msg); + jT808UplinkPacket.ProcessorAsync(msg, JT808TransportProtocolType.tcp); + //解析到头部,然后根据具体的消息Id通过队列去进行消费 + //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息, + //解析具体的消息体,具体调用JT808Serializer.Deserialize + JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize(msg); + jT808AtomicCounterService.MsgSuccessIncrement(); + jT808TrafficService.ReceiveSize(msg.Length); + if (logger.IsEnabled(LogLevel.Trace)) + { + logger.LogTrace("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); + logger.LogTrace("accept msg <<< " + ByteBufferUtil.HexDump(msg)); + } + jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo,ctx.Channel); + if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out var handlerFunc)) + { + IJT808Reply jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg)); + if (jT808Response != null) + { + if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) + { + ctx.WriteAndFlushAsync(jT808Response); + } + } + } + else + { + IJT808Reply jT808CustomMsgIdResponse = jT808TcpCustomMsgIdHandler.Proccesser(new JT808Request(jT808HeaderPackage, msg)); + if (jT808CustomMsgIdResponse != null) + { + if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) + { + ctx.WriteAndFlushAsync(jT808CustomMsgIdResponse); + } + } + else + { + //未知的消息类型已日志形式输出 + if (unknownLogger.IsEnabled(LogLevel.Debug)) + { + unknownLogger.LogDebug(ByteBufferUtil.HexDump(msg)); + } + } + } + } + catch (JT808.Protocol.Exceptions.JT808Exception ex) + { + jT808AtomicCounterService.MsgFailIncrement(); + if (logger.IsEnabled(LogLevel.Error)) + { + logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); + logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); + } + } + catch (Exception ex) + { + jT808AtomicCounterService.MsgFailIncrement(); + if (logger.IsEnabled(LogLevel.Error)) + { + logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); + logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); + } + } + } + } +} diff --git a/src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj b/src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj new file mode 100644 index 0000000..28ac10a --- /dev/null +++ b/src/JT808.DotNetty.Tcp/JT808.DotNetty.Tcp.csproj @@ -0,0 +1,20 @@ + + + + JT808.DotNetty.Tcp + JT808.DotNetty.Tcp + 基于DotNetty实现的JT808DotNetty的Tcp服务 + 基于DotNetty实现的JT808DotNetty的Tcp服务 + + + + + + + + + + + + + diff --git a/src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs b/src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs new file mode 100644 index 0000000..369071d --- /dev/null +++ b/src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs @@ -0,0 +1,49 @@ +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Tcp +{ + public class JT808TcpBuilderDefault : IJT808TcpNettyBuilder + { + public IJT808NettyBuilder Instance { get; } + + public JT808TcpBuilderDefault(IJT808NettyBuilder builder) + { + Instance = builder; + } + + public IJT808NettyBuilder Builder() + { + return Instance; + } + + public IJT808TcpNettyBuilder ReplaceCustomMsgIdHandler() where T : IJT808TcpCustomMsgIdHandler + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808TcpCustomMsgIdHandler), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808TcpNettyBuilder ReplaceMsgIdHandler() where T : JT808MsgIdTcpHandlerBase + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(JT808MsgIdTcpHandlerBase), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808TcpNettyBuilder ReplaceSessionService() where T : IJT808TcpSessionService + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808TcpSessionService), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808TcpNettyBuilder ReplaceUnificationSendService() where T : IJT808UnificationTcpSendService + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808UnificationTcpSendService), typeof(T), ServiceLifetime.Singleton)); + return this; + } + } +} diff --git a/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs b/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs new file mode 100644 index 0000000..43ffb3f --- /dev/null +++ b/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs @@ -0,0 +1,41 @@ +using JT808.DotNetty.Core.Codecs; +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Services; +using JT808.DotNetty.Tcp.Handlers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using JT808.DotNetty.Core.Jobs; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Internal; + +[assembly: InternalsVisibleTo("JT808.DotNetty.Tcp.Test")] + +namespace JT808.DotNetty.Tcp +{ + public static class JT808TcpDotnettyExtensions + { + public static IJT808TcpNettyBuilder AddJT808TcpNettyHost(this IJT808NettyBuilder jT808NettyBuilder) + { + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + return new JT808TcpBuilderDefault(jT808NettyBuilder); + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Tcp/JT808TcpServerHost.cs b/src/JT808.DotNetty.Tcp/JT808TcpServerHost.cs new file mode 100644 index 0000000..c19f31d --- /dev/null +++ b/src/JT808.DotNetty.Tcp/JT808TcpServerHost.cs @@ -0,0 +1,95 @@ +using DotNetty.Buffers; +using DotNetty.Codecs; +using DotNetty.Handlers.Timeout; +using DotNetty.Transport.Bootstrapping; +using DotNetty.Transport.Channels; +using DotNetty.Transport.Libuv; +using JT808.DotNetty.Core.Codecs; +using JT808.DotNetty.Core.Configurations; +using JT808.DotNetty.Tcp.Handlers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Tcp +{ + /// + /// JT808 Tcp网关服务 + /// + internal class JT808TcpServerHost : IHostedService + { + private readonly IServiceProvider serviceProvider; + private readonly JT808Configuration configuration; + private readonly ILogger logger; + private DispatcherEventLoopGroup bossGroup; + private WorkerEventLoopGroup workerGroup; + private IChannel bootstrapChannel; + private IByteBufferAllocator serverBufferAllocator; + + public JT808TcpServerHost( + IServiceProvider provider, + ILoggerFactory loggerFactory, + IOptions jT808ConfigurationAccessor) + { + serviceProvider = provider; + configuration = jT808ConfigurationAccessor.Value; + logger=loggerFactory.CreateLogger(); + } + + public Task StartAsync(CancellationToken cancellationToken) + { + bossGroup = new DispatcherEventLoopGroup(); + workerGroup = new WorkerEventLoopGroup(bossGroup, configuration.EventLoopCount); + serverBufferAllocator = new PooledByteBufferAllocator(); + ServerBootstrap bootstrap = new ServerBootstrap(); + bootstrap.Group(bossGroup, workerGroup); + bootstrap.Channel(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) + || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + bootstrap + .Option(ChannelOption.SoReuseport, true) + .ChildOption(ChannelOption.SoReuseaddr, true); + } + bootstrap + .Option(ChannelOption.SoBacklog, configuration.SoBacklog) + .ChildOption(ChannelOption.Allocator, serverBufferAllocator) + .ChildHandler(new ActionChannelInitializer(channel => + { + IChannelPipeline pipeline = channel.Pipeline; + using (var scope = serviceProvider.CreateScope()) + { + channel.Pipeline.AddLast("jt808TcpBuffer", new DelimiterBasedFrameDecoder(int.MaxValue, + Unpooled.CopiedBuffer(new byte[] { JT808.Protocol.JT808Package.BeginFlag }), + Unpooled.CopiedBuffer(new byte[] { JT808.Protocol.JT808Package.EndFlag }))); + channel.Pipeline.AddLast("jt808TcpDecode", scope.ServiceProvider.GetRequiredService()); + channel.Pipeline.AddLast("jt808TcpEncode", scope.ServiceProvider.GetRequiredService()); + channel.Pipeline.AddLast("systemIdleState", new IdleStateHandler( + configuration.ReaderIdleTimeSeconds, + configuration.WriterIdleTimeSeconds, + configuration.AllIdleTimeSeconds)); + channel.Pipeline.AddLast("jt808TcpConnection", scope.ServiceProvider.GetRequiredService()); + channel.Pipeline.AddLast("jt808TcpService", scope.ServiceProvider.GetRequiredService()); + } + })); + logger.LogInformation($"JT808 TCP Server start at {IPAddress.Any}:{configuration.TcpPort}."); + return bootstrap.BindAsync(configuration.TcpPort) + .ContinueWith(i => bootstrapChannel = i.Result); + } + + public async Task StopAsync(CancellationToken cancellationToken) + { + await bootstrapChannel.CloseAsync(); + var quietPeriod = configuration.QuietPeriodTimeSpan; + var shutdownTimeout = configuration.ShutdownTimeoutTimeSpan; + await workerGroup.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout); + await bossGroup.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout); + } + } +} diff --git a/src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml b/src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..e572661 --- /dev/null +++ b/src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,13 @@ + + + + + FileSystem + Release + Any CPU + netstandard2.0 + ..\..\nupkgs + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml.user b/src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..312c6e3 --- /dev/null +++ b/src/JT808.DotNetty.Tcp/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808.DotNetty.Core.Test.csproj b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808.DotNetty.Core.Test.csproj new file mode 100644 index 0000000..2de938d --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808.DotNetty.Core.Test.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + + + + + + Always + + + + diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808DefaultChannelId.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808DefaultChannelId.cs new file mode 100644 index 0000000..c60dc1d --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808DefaultChannelId.cs @@ -0,0 +1,36 @@ +using DotNetty.Transport.Channels; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Test +{ + public class JT808DefaultChannelId : IChannelId + { + private string Id { + get + { + return Guid.NewGuid().ToString("N"); + } + } + + public string AsLongText() + { + return Id; + } + + public string AsShortText() + { + return Id; + } + + public int CompareTo(IChannelId other) + { + if(other.AsShortText()== Id) + { + return 1; + } + return 0; + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TcpSessionManagerTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TcpSessionManagerTest.cs new file mode 100644 index 0000000..cdec189 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TcpSessionManagerTest.cs @@ -0,0 +1,83 @@ +using DotNetty.Transport.Channels.Embedded; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Threading; + + +namespace JT808.DotNetty.Core.Test +{ + [TestClass] + public class JT808SessionManagerTest: SeedTcpSession + { + [TestMethod] + public void Test1() + { + var no = "test150"; + var channel = new EmbeddedChannel(new JT808DefaultChannelId()); + jT80TcpSessionManager.TryAdd(no,channel); + Thread.Sleep(1000); + jT80TcpSessionManager.Heartbeat(no); + } + + [TestMethod] + public void Test2() + { + var no = "test151"; + var channel = new EmbeddedChannel(new JT808DefaultChannelId()); + jT80TcpSessionManager.TryAdd(no, channel); + var sessionInfo = jT80TcpSessionManager.RemoveSession(no); + Assert.AreEqual(no, sessionInfo.TerminalPhoneNo); + } + + [TestMethod] + public void Test3() + { + var realSessionInfos = jT80TcpSessionManager.GetAll(); + } + + [TestMethod] + public void Test4() + { + var realSessionCount = jT80TcpSessionManager.SessionCount; + } + + [TestMethod] + public void Test5() + { + //转发过来的数据 1:n 一个通道对应多个设备 + var no = "test1"; + var no1 = "test2"; + var no2 = "test3"; + var no3 = "test4"; + var no4 = "test5"; + var channel = new EmbeddedChannel(new JT808DefaultChannelId()); + jT80TcpSessionManager.TryAdd(no,channel); + jT80TcpSessionManager.TryAdd(no1,channel); + jT80TcpSessionManager.TryAdd(no2,channel); + jT80TcpSessionManager.TryAdd(no3,channel); + jT80TcpSessionManager.TryAdd(no4,channel); + var removeSession = jT80TcpSessionManager.RemoveSession(no); + Assert.AreEqual(no, removeSession.TerminalPhoneNo); + Assert.AreEqual(channel, removeSession.Channel); + Assert.AreEqual(channel.Id, removeSession.Channel.Id); + } + + [TestMethod] + public void Test6() + { + //转发过来的数据 1:n 一个通道对应多个设备 + var no = "test61"; + var no1 = "test62"; + var no2 = "test63"; + var no3 = "test64"; + var no4 = "test65"; + var channel1 = new EmbeddedChannel(new JT808DefaultChannelId()); + var channel2 = new EmbeddedChannel(new JT808DefaultChannelId()); + jT80TcpSessionManager.TryAdd(no,channel1); + jT80TcpSessionManager.TryAdd(no1,channel1); + jT80TcpSessionManager.TryAdd(no2,channel1); + jT80TcpSessionManager.TryAdd(no3,channel2); + jT80TcpSessionManager.TryAdd(no4,channel2); + jT80TcpSessionManager.RemoveSessionByChannel(channel1); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TransmitAddressFilterServiceTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TransmitAddressFilterServiceTest.cs new file mode 100644 index 0000000..0cf5c65 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/JT808TransmitAddressFilterServiceTest.cs @@ -0,0 +1,75 @@ +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Core.Configurations; +using JT808.DotNetty.Core.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; + +namespace JT808.DotNetty.Core.Test +{ + [TestClass] + public class JT808TransmitAddressFilterServiceTest + { + private JT808TransmitAddressFilterService jT808TransmitAddressFilterService; + + public JT808TransmitAddressFilterServiceTest() + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.Configure(hostContext.Configuration.GetSection("JT808Configuration")); + services.AddSingleton(); + }); + var serviceProvider = serverHostBuilder.Build().Services; + jT808TransmitAddressFilterService = serviceProvider.GetService(); + jT808TransmitAddressFilterService.Add("127.0.0.1"); + } + + [TestMethod] + public void Test1() + { + Assert.IsTrue(jT808TransmitAddressFilterService.ContainsKey(new JT808IPAddressDto + { + Host = "127.0.0.1", + Port = 12348 + }.EndPoint)); + } + + [TestMethod] + public void Test2() + { + var result = jT808TransmitAddressFilterService.GetAll(); + } + + [TestMethod] + public void Test3() + { + var result1= jT808TransmitAddressFilterService.Add("127.0.0.1"); + Assert.AreEqual(JT808ResultCode.Ok, result1.Code); + Assert.IsTrue(result1.Data); + var result2 = jT808TransmitAddressFilterService.Remove("127.0.0.1"); + Assert.AreEqual(JT808ResultCode.Ok, result2.Code); + Assert.IsTrue(result2.Data); + } + + [TestMethod] + public void Test4() + { + var result2 = jT808TransmitAddressFilterService.Remove("127.0.0.1"); + Assert.AreEqual(JT808ResultCode.Ok, result2.Code); + Assert.IsFalse(result2.Data); + Assert.AreEqual("不能删除服务器配置的地址", result2.Message); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs new file mode 100644 index 0000000..352a1ca --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs @@ -0,0 +1,37 @@ +using DotNetty.Transport.Channels.Embedded; +using JT808.DotNetty.Internal; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Test +{ + [TestClass] + public class SeedTcpSession + { + public JT808TcpSessionManager jT80TcpSessionManager = new JT808TcpSessionManager( + new JT808SessionPublishingEmptyImpl(), + new LoggerFactory()); + + public SeedTcpSession() + { + for (var i = 0; i < 10; i++) + { + var channel = new EmbeddedChannel(new JT808DefaultChannelId()); + jT80TcpSessionManager.TryAdd(i.ToString(),channel); + } + } + + [TestMethod] + public void Init() + { + for (var i = 0; i < 10; i++) + { + var channel = new EmbeddedChannel(new JT808DefaultChannelId()); + jT80TcpSessionManager.TryAdd(i.ToString(), channel); + } + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/TestBase.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/TestBase.cs new file mode 100644 index 0000000..5e325fb --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/TestBase.cs @@ -0,0 +1,37 @@ +using JT808.Protocol; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Test +{ + public class TestBase + { + public static IServiceProvider ServiceProvider; + + static TestBase() + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration); + }); + var build = serverHostBuilder.Build(); + build.Start(); + ServiceProvider = build.Services; + + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/appsettings.json b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/appsettings.json new file mode 100644 index 0000000..28e73d8 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/appsettings.json @@ -0,0 +1,39 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Trace" + } + }, + "Console": { + "LogLevel": { + "Default": "Trace" + } + } + }, + "JT808Configuration": { + "Port": 6565, + "SourcePackageDispatcherClientConfigurations": [ + { + "Host": "127.0.0.1", + "Port": 6655 + }, + { + "Host": "127.0.0.1", + "Port": 6656 + } + ], + "ForwardingRemoteAddress": [ + { + "Host": "127.0.0.1", + "Port": 6561 + }, + { + "Host": "127.0.0.1", + "Port": 6562 + } + ], + "RedisHost": "127.0.0.1:6379" + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/NLog.xsd b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/NLog.xsd new file mode 100644 index 0000000..2f57d09 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/NLog.xsd @@ -0,0 +1,3106 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged.. + + + + + Throw an exception when there is an internal error. Default value is: false. + + + + + Throw an exception when there is a configuration error. If not set, determined by throwExceptions. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. Default value is: false. + + + + + Write internal NLog messages to the System.Diagnostics.Trace. Default value is: false. + + + + + Write timestamps for internal NLog messages. Default value is: true. + + + + + Use InvariantCulture as default culture instead of CurrentCulture. Default value is: false. + + + + + Perform mesage template parsing and formatting of LogEvent messages (true = Always, false = Never, empty = Auto Detect). Default value is: empty. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Name of the logger. May include '*' character which acts like a wildcard. Allowed forms are: *, Name, *Name, Name* and *Name* + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable or disable logging rule. Disabled rules are ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. You could use * wildcard. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Limit of full s to write before yielding into Performance is better when writing many small batches, than writing a single large batch + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + Condition expression. Log events who meet this condition will cause a flush on the wrapped target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Indicates whether to use sliding timeout. + + + + + Action to take if the buffer overflows. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Maximum current connections. 0 = no maximum. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Maximum queue size. + + + + + NDC item separator. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Viewer parameter name. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to use default row highlighting rules. + + + + + Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the . + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Obsolete - value will be ignored! The logging code always runs outside of transaction. Gets or sets a value indicating whether to use database transactions. Some data providers require this. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Name of the database provider. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Database parameter name. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Database parameter size. + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Value to be used as the event Source. + + + + + Action to take if the message is larger than the option. + + + + + Optional entrytype. When not set, or when not convertable to then determined by + + + + + Maximum Event log size in kilobytes. If null, the value won't be set. Default is 512 Kilobytes as specified by Eventlog API + + + + + Message length limit to write to the Event Log. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose: + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Maximum number of archive files that should be kept. + + + + + Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation. + + + + + Is the an absolute or relative path? + + + + + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Is the an absolute or relative path? + + + + + Value indicationg whether file creation calls should be synchronized by a system global mutex. + + + + + Maximum number of log filenames that should be stored as existing. + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Name of the file to write to. + + + + + Value specifying the date format to use when archiving files. + + + + + Indicates whether to archive old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + File attributes (Windows only). + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Interval in which messages will be written up to the number of messages. + + + + + Maximum allowed number of messages written per . + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + Type of the parameter. Obsolete alias for + + + + + Parameter can combine multiple LogEvents into a single parameter value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Encoding to be used for sending e-mail. + + + + + Indicates whether to add new lines between log entries. + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Indicates the SMTP client timeout. + + + + + Priority used for sending mails. + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + Folder where applications save mail messages to be processed by the local SMTP server. + + + + + Specifies how outgoing email messages will be handled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum current connections. 0 = no maximum. + + + + + Maximum queue size. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + End of line value if a newline is appended at the end of log message . + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the will be more connections than . + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Maximum current connections. 0 = no maximum. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Maximum queue size. + + + + + NDC item separator. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + The value by which to increment the counter. + + + + + Performance counter instance name. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + Name of the target. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Always use independent of + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit + + + + + Encoding. + + + + + Value whether escaping be done according to the old NLog style (Very non-standard) + + + + + Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs) + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters) + + + + + Protocol to be used when calling web service. + + + + + Web service URL. + + + + + Name of the root XML element, if POST of XML document chosen. If so, this property must not be null. (see and ). + + + + + (optional) root namespace of the XML document, if POST of XML document chosen. (see and ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + + + + + + + + + + + + + + List of property names to exclude when is true + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json + + + + + + + + + + + + + + + Determines wether or not this attribute will be Json encoded. + + + + + Indicates whether to escape non-ascii characters + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the dictionary. + + + + + Indicates whether to include contents of the stack. + + + + + Indicates whether to include contents of the stack. + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Layout to be used to filter log messages. + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + Append FilterCount to the when an event is no longer filtered + + + + + Insert FilterCount value into when an event is no longer filtered + + + + + Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout. + + + + + Max number of unique filter values to expect simultaneously + + + + + Max length of filter values, will truncate if above limit + + + + + Default buffer size for the internal buffers + + + + + Reuse internal buffers, and doesn't have to constantly allocate new buffers + + + + + How long before a filter expires, and logging is accepted again + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.unix.config b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.unix.config new file mode 100644 index 0000000..f35bd45 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.unix.config @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.win.config b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.win.config new file mode 100644 index 0000000..14d4a10 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Configs/nlog.win.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs new file mode 100644 index 0000000..845b220 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs @@ -0,0 +1,59 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Hosting.Handlers +{ + public class JT808MsgIdTcpCustomHandler : JT808MsgIdTcpHandlerBase + { + public JT808MsgIdTcpCustomHandler( + ILoggerFactory loggerFactory, + JT808TcpSessionManager sessionManager) : base(sessionManager) + { + logger = loggerFactory.CreateLogger(); + } + + private readonly ILogger logger; + + public override IJT808Reply Msg0x0200(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0200"); + return base.Msg0x0200(request); + } + + public override IJT808Reply Msg0x0001(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0001"); + return base.Msg0x0001(request); + } + + public override IJT808Reply Msg0x0002(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0002"); + return base.Msg0x0002(request); + } + + public override IJT808Reply Msg0x0003(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0003"); + return base.Msg0x0003(request); + } + + public override IJT808Reply Msg0x0100(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0100"); + return base.Msg0x0100(request); + } + + public override IJT808Reply Msg0x0102(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0102"); + return base.Msg0x0102(request); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdUdpCustomHandler.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdUdpCustomHandler.cs new file mode 100644 index 0000000..7280a9d --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdUdpCustomHandler.cs @@ -0,0 +1,59 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Hosting.Handlers +{ + public class JT808MsgIdUdpCustomHandler : JT808MsgIdUdpHandlerBase + { + public JT808MsgIdUdpCustomHandler( + ILoggerFactory loggerFactory, + JT808UdpSessionManager sessionManager) : base(sessionManager) + { + logger = loggerFactory.CreateLogger(); + } + + private readonly ILogger logger; + + public override IJT808Reply Msg0x0200(JT808Request request) + { + logger.LogDebug("Udp_Msg0x0200"); + return base.Msg0x0200(request); + } + + public override IJT808Reply Msg0x0001(JT808Request request) + { + logger.LogDebug("Udp_Msg0x0001"); + return base.Msg0x0001(request); + } + + public override IJT808Reply Msg0x0002(JT808Request request) + { + logger.LogDebug("Udp_Msg0x0002"); + return base.Msg0x0002(request); + } + + public override IJT808Reply Msg0x0003(JT808Request request) + { + logger.LogDebug("Udp_Msg0x0003"); + return base.Msg0x0003(request); + } + + public override IJT808Reply Msg0x0100(JT808Request request) + { + logger.LogDebug("Udp_Msg0x0100"); + return base.Msg0x0100(request); + } + + public override IJT808Reply Msg0x0102(JT808Request request) + { + logger.LogDebug("Udp_Msg0x0102"); + return base.Msg0x0102(request); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Impls/JT808DownlinkPacketLogging.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Impls/JT808DownlinkPacketLogging.cs new file mode 100644 index 0000000..af0abb1 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Impls/JT808DownlinkPacketLogging.cs @@ -0,0 +1,25 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Abstractions.Enums; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using JT808.Protocol.Extensions; + +namespace JT808.DotNetty.Hosting.Impls +{ + public class JT808DownlinkPacketLogging : IJT808DownlinkPacket + { + private readonly ILogger logger; + public JT808DownlinkPacketLogging(ILoggerFactory loggerFactory ) + { + logger = loggerFactory.CreateLogger("JT808DownlinkPacketLogging"); + } + public Task ProcessorAsync(byte[] data, JT808TransportProtocolType transportProtocolType) + { + logger.LogInformation("send >>>"+data.ToHexString()); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj new file mode 100644 index 0000000..ee41510 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj @@ -0,0 +1,42 @@ + + + + Exe + netcoreapp2.2 + true + latest + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + + diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.ini b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.ini new file mode 100644 index 0000000..75ec140 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.ini @@ -0,0 +1,6 @@ +[program:JT808.DotNetty.Hosting] +command=dotnet JT808.DotNetty.Hosting.dll +directory=/data/dotnetty_test +user=root +stdout_logfile=/data/supervisordlog/JT808.DotNetty.Hosting.log +redirect_stderr=true \ No newline at end of file diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs new file mode 100644 index 0000000..30c39f5 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs @@ -0,0 +1,87 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Hosting.Handlers; +using JT808.DotNetty.Hosting.Impls; +using JT808.DotNetty.Tcp; +using JT808.DotNetty.Udp; +using JT808.DotNetty.WebApi; +using JT808.DotNetty.WebApiClientTool; +using JT808.Protocol; +using JT808.Protocol.Interfaces; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading.Tasks; +using WebApiClient.Extensions.DependencyInjection; + +namespace JT808.DotNetty.Hosting +{ + class Program + { + static async Task Main(string[] args) + { + //7E020000220138123456780085000000010000000101EA2A3F08717931000C015400201901032000020104000000E6F87E + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureLogging((context, logging) => + { + if (Environment.OSVersion.Platform == PlatformID.Unix) + { + NLog.LogManager.LoadConfiguration("Configs/nlog.unix.config"); + } + else + { + NLog.LogManager.LoadConfiguration("Configs/nlog.win.config"); + } + logging.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true }); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration) + //自定义日志下发包 + .ReplaceDownlinkPacket() + //自定义会话通知(在线/离线)使用异步方式 + //.ReplaceSessionPublishing() + //自定义原包转发 使用异步方式 + //.ReplaceSourcePackageDispatcher + .AddJT808TcpNettyHost() + // 自定义Tcp消息处理业务 + .ReplaceMsgIdHandler() + .Builder() + .AddJT808UdpNettyHost() + // 自定义Udp消息处理业务 + .ReplaceMsgIdHandler() + .Builder() + .AddJT808WebApiNettyHost() + .Builder(); + //webapi客户端调用 + services.AddHttpApi().ConfigureHttpApiConfig((c, p) => + { + c.HttpHost = new Uri("http://localhost:828/jt808api/"); + c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; + c.LoggerFactory = p.GetRequiredService(); + }); + var client = services.BuildServiceProvider().GetRequiredService(); + var result = client.GetTcpAtomicCounter().InvokeAsync().Result; + }); + + await serverHostBuilder.RunConsoleAsync(); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/appsettings.json b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/appsettings.json new file mode 100644 index 0000000..6603db6 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/appsettings.json @@ -0,0 +1,23 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Trace" + } + }, + "Console": { + "LogLevel": { + "Default": "Trace" + } + } + }, + "JT808Configuration": { + "TcpPort": 808, + "UdpPort": 808, + "WebApiPort": 828, + "ForwardingRemoteIPAddress": [ + //"172.16.19.209" + ] + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808.DotNetty.Tcp.Test.csproj b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808.DotNetty.Tcp.Test.csproj new file mode 100644 index 0000000..c72c6a7 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808.DotNetty.Tcp.Test.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + + + + + + Always + + + + diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808SessionServiceTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808SessionServiceTest.cs new file mode 100644 index 0000000..3a483d8 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808SessionServiceTest.cs @@ -0,0 +1,94 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Interfaces; +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using Microsoft.Extensions.DependencyInjection; +using JT808.Protocol.Extensions; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace JT808.DotNetty.Tcp.Test +{ + [TestClass] + public class JT808SessionServiceTest:TestBase,IDisposable + { + static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6565); + + JT808SimpleTcpClient SimpleTcpClient1; + JT808SimpleTcpClient SimpleTcpClient2; + JT808SimpleTcpClient SimpleTcpClient3; + JT808SimpleTcpClient SimpleTcpClient4; + JT808SimpleTcpClient SimpleTcpClient5; + + public JT808SessionServiceTest() + { + SimpleTcpClient1 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient2 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient3 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient4 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient5 = new JT808SimpleTcpClient(endPoint); + // 心跳会话包 + JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789001"); + SimpleTcpClient1.WriteAsync(JT808Serializer.Serialize(jT808Package1)); + + // 心跳会话包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789002"); + SimpleTcpClient2.WriteAsync(JT808Serializer.Serialize(jT808Package2)); + + // 心跳会话包 + JT808Package jT808Package3 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789003"); + SimpleTcpClient3.WriteAsync(JT808Serializer.Serialize(jT808Package3)); + + // 心跳会话包 + JT808Package jT808Package4 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789004"); + SimpleTcpClient4.WriteAsync(JT808Serializer.Serialize(jT808Package4)); + + // 心跳会话包 + JT808Package jT808Package5 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789005"); + SimpleTcpClient5.WriteAsync(JT808Serializer.Serialize(jT808Package5)); + Thread.Sleep(1000); + } + + public void Dispose() + { + SimpleTcpClient1.Down(); + SimpleTcpClient2.Down(); + SimpleTcpClient3.Down(); + SimpleTcpClient4.Down(); + SimpleTcpClient5.Down(); + } + + [TestMethod] + public void Test1() + { + IJT808TcpSessionService jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + var result = jT808SessionServiceDefaultImpl.GetAll(); + Thread.Sleep(5000); + } + + [TestMethod] + public void Test2() + { + IJT808TcpSessionService jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + var result1 = jT808SessionServiceDefaultImpl.GetAll(); + var result2 = jT808SessionServiceDefaultImpl.RemoveByTerminalPhoneNo("123456789001"); + var result3 = jT808SessionServiceDefaultImpl.GetAll(); + } + + [TestMethod] + public void Test3() + { + // 判断通道是否关闭 + IJT808TcpSessionService jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + JT808TcpSessionManager jT808TcpSessionManager = ServiceProvider.GetService(); + var result1 = jT808SessionServiceDefaultImpl.GetAll(); + SimpleTcpClient1.Down(); + Thread.Sleep(5000); + var session = jT808TcpSessionManager.GetSession("123456789001"); + Thread.Sleep(100000); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808UnificationTcpSendServiceTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808UnificationTcpSendServiceTest.cs new file mode 100644 index 0000000..d2070e7 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/JT808UnificationTcpSendServiceTest.cs @@ -0,0 +1,76 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Interfaces; +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using Microsoft.Extensions.DependencyInjection; +using JT808.Protocol.Extensions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using JT808.Protocol.MessageBody; +using JT808.DotNetty.Abstractions.Dtos; + +namespace JT808.DotNetty.Tcp.Test +{ + [TestClass] + public class JT808UnificationTcpSendServiceTest: TestBase + { + static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6565); + + private IJT808UnificationTcpSendService jT808UnificationTcpSendService; + private IJT808TcpSessionService jT808SessionServiceDefaultImpl; + + public JT808UnificationTcpSendServiceTest() + { + + JT808SimpleTcpClient SimpleTcpClient1 = new JT808SimpleTcpClient(endPoint); + JT808SimpleTcpClient SimpleTcpClient2 = new JT808SimpleTcpClient(endPoint); + JT808SimpleTcpClient SimpleTcpClient3 = new JT808SimpleTcpClient(endPoint); + JT808SimpleTcpClient SimpleTcpClient4 = new JT808SimpleTcpClient(endPoint); + JT808SimpleTcpClient SimpleTcpClient5 = new JT808SimpleTcpClient(endPoint); + // 心跳会话包 + JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789001"); + SimpleTcpClient1.WriteAsync(JT808Serializer.Serialize(jT808Package1)); + + // 心跳会话包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789002"); + SimpleTcpClient2.WriteAsync(JT808Serializer.Serialize(jT808Package2)); + + // 心跳会话包 + JT808Package jT808Package3 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789003"); + SimpleTcpClient3.WriteAsync(JT808Serializer.Serialize(jT808Package3)); + + // 心跳会话包 + JT808Package jT808Package4 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789004"); + SimpleTcpClient4.WriteAsync(JT808Serializer.Serialize(jT808Package4)); + + // 心跳会话包 + JT808Package jT808Package5 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789005"); + SimpleTcpClient5.WriteAsync(JT808Serializer.Serialize(jT808Package5)); + + Thread.Sleep(300); + } + + [TestMethod] + public void Test1() + { + jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + jT808UnificationTcpSendService = ServiceProvider.GetService(); + jT808SessionServiceDefaultImpl.GetAll(); + string no = "123456789001"; + // 文本信息包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.文本信息下发.Create(no, new JT808_0x8300 + { + TextFlag = 5, + TextInfo = "smallchi 518" + }); + var data = JT808Serializer.Serialize(jT808Package2); + JT808ResultDto jt808Result = jT808UnificationTcpSendService.Send(no, data); + Thread.Sleep(1000); + Assert.AreEqual(200, jt808Result.Code); + Assert.IsTrue(jt808Result.Data); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/TestBase.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/TestBase.cs new file mode 100644 index 0000000..fa57faa --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/TestBase.cs @@ -0,0 +1,42 @@ +using JT808.DotNetty.Core; +using JT808.Protocol; +using JT808.Protocol.Interfaces; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Tcp.Test +{ + public class TestBase + { + public static IServiceProvider ServiceProvider; + public static JT808Serializer JT808Serializer; + static TestBase() + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration) + .AddJT808TcpNettyHost() + .Builder(); + //.Replace<>; + }); + var build = serverHostBuilder.Build(); + build.Start(); + ServiceProvider = build.Services; + JT808Serializer = ServiceProvider.GetRequiredService().GetSerializer(); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/appsettings.json b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/appsettings.json new file mode 100644 index 0000000..38418be --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Tcp.Test/appsettings.json @@ -0,0 +1,21 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Trace" + } + }, + "Console": { + "LogLevel": { + "Default": "Trace" + } + } + }, + "JT808Configuration": { + "TcpPort": 6565, + "ForwardingRemoteIPAddress": [ + "127.0.0.1" + ] + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808.DotNetty.Udp.Test.csproj b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808.DotNetty.Udp.Test.csproj new file mode 100644 index 0000000..64634d8 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808.DotNetty.Udp.Test.csproj @@ -0,0 +1,34 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + + + + + + Always + + + + + + Always + + + + diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808SessionServiceTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808SessionServiceTest.cs new file mode 100644 index 0000000..d9ab3fd --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808SessionServiceTest.cs @@ -0,0 +1,92 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Interfaces; +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using Microsoft.Extensions.DependencyInjection; +using JT808.Protocol.Extensions; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace JT808.DotNetty.Udp.Test +{ + [TestClass] + public class JT808SessionServiceTest:TestBase,IDisposable + { + static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 818); + JT808SimpleUdpClient SimpleUdpClient1; + JT808SimpleUdpClient SimpleUdpClient2; + JT808SimpleUdpClient SimpleUdpClient3; + JT808SimpleUdpClient SimpleUdpClient4; + JT808SimpleUdpClient SimpleUdpClient5; + + public void Dispose() + { + SimpleUdpClient1.Down(); + SimpleUdpClient2.Down(); + SimpleUdpClient3.Down(); + SimpleUdpClient4.Down(); + SimpleUdpClient5.Down(); + } + + public JT808SessionServiceTest() + { + SimpleUdpClient1 = new JT808SimpleUdpClient(endPoint); + SimpleUdpClient2 = new JT808SimpleUdpClient(endPoint); + SimpleUdpClient3 = new JT808SimpleUdpClient(endPoint); + SimpleUdpClient4 = new JT808SimpleUdpClient(endPoint); + SimpleUdpClient5 = new JT808SimpleUdpClient(endPoint); + // 心跳会话包 + JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789001"); + SimpleUdpClient1.WriteAsync(JT808Serializer.Serialize(jT808Package1)); + + // 心跳会话包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789002"); + SimpleUdpClient2.WriteAsync(JT808Serializer.Serialize(jT808Package2)); + + // 心跳会话包 + JT808Package jT808Package3 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789003"); + SimpleUdpClient3.WriteAsync(JT808Serializer.Serialize(jT808Package3)); + + // 心跳会话包 + JT808Package jT808Package4 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789004"); + SimpleUdpClient4.WriteAsync(JT808Serializer.Serialize(jT808Package4)); + + // 心跳会话包 + JT808Package jT808Package5 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789005"); + SimpleUdpClient5.WriteAsync(JT808Serializer.Serialize(jT808Package5)); + Thread.Sleep(1000); + } + + [TestMethod] + public void Test1() + { + IJT808UdpSessionService jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + var result = jT808SessionServiceDefaultImpl.GetAll(); + } + + [TestMethod] + public void Test2() + { + IJT808UdpSessionService jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + var result1 = jT808SessionServiceDefaultImpl.GetAll(); + var result2 = jT808SessionServiceDefaultImpl.RemoveByTerminalPhoneNo("123456789001"); + var result3 = jT808SessionServiceDefaultImpl.GetAll(); + } + + [TestMethod] + public void Test3() + { + // 判断通道是否关闭 + IJT808UdpSessionService jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + JT808UdpSessionManager jT808UdpSessionManager = ServiceProvider.GetService(); + var result1 = jT808SessionServiceDefaultImpl.GetAll(); + SimpleUdpClient1.Down(); + var session = jT808UdpSessionManager.GetSession("123456789001"); + var result3 = jT808UdpSessionManager.GetAll(); + Thread.Sleep(100000); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808UnificationUdpSendServiceTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808UnificationUdpSendServiceTest.cs new file mode 100644 index 0000000..e64fd9a --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/JT808UnificationUdpSendServiceTest.cs @@ -0,0 +1,76 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Interfaces; +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using Microsoft.Extensions.DependencyInjection; +using JT808.Protocol.Extensions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using JT808.Protocol.MessageBody; +using JT808.DotNetty.Abstractions.Dtos; + +namespace JT808.DotNetty.Udp.Test +{ + [TestClass] + public class JT808UnificationUdpSendServiceTest : TestBase + { + static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 818); + + private IJT808UnificationUdpSendService jT808UnificationUdpSendService; + private IJT808UdpSessionService jT808SessionServiceDefaultImpl; + + public JT808UnificationUdpSendServiceTest() + { + JT808SimpleUdpClient SimpleUdpClient1 = new JT808SimpleUdpClient(endPoint); + JT808SimpleUdpClient SimpleUdpClient2 = new JT808SimpleUdpClient(endPoint); + JT808SimpleUdpClient SimpleUdpClient3 = new JT808SimpleUdpClient(endPoint); + JT808SimpleUdpClient SimpleUdpClient4 = new JT808SimpleUdpClient(endPoint); + JT808SimpleUdpClient SimpleUdpClient5 = new JT808SimpleUdpClient(endPoint); + // 心跳会话包 + JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789001"); + SimpleUdpClient1.WriteAsync(JT808Serializer.Serialize(jT808Package1)); + + // 心跳会话包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789002"); + SimpleUdpClient2.WriteAsync(JT808Serializer.Serialize(jT808Package2)); + + // 心跳会话包 + JT808Package jT808Package3 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789003"); + SimpleUdpClient3.WriteAsync(JT808Serializer.Serialize(jT808Package3)); + + // 心跳会话包 + JT808Package jT808Package4 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789004"); + SimpleUdpClient4.WriteAsync(JT808Serializer.Serialize(jT808Package4)); + + // 心跳会话包 + JT808Package jT808Package5 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789005"); + SimpleUdpClient5.WriteAsync(JT808Serializer.Serialize(jT808Package5)); + + Thread.Sleep(300); + } + + [TestMethod] + public void Test1() + { + //"126 131 0 0 13 18 52 86 120 144 1 0 11 5 115 109 97 108 108 99 104 105 32 53 49 56 24 126" + jT808SessionServiceDefaultImpl = ServiceProvider.GetService(); + jT808UnificationUdpSendService = ServiceProvider.GetService(); + jT808SessionServiceDefaultImpl.GetAll(); + string no = "123456789001"; + // 文本信息包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.文本信息下发.Create(no, new JT808_0x8300 + { + TextFlag = 5, + TextInfo = "smallchi 518" + }); + var data = JT808Serializer.Serialize(jT808Package2); + JT808ResultDto jt808Result = jT808UnificationUdpSendService.Send(no, data); + Thread.Sleep(1000); + Assert.AreEqual(200, jt808Result.Code); + Assert.IsTrue(jt808Result.Data); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/TestBase.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/TestBase.cs new file mode 100644 index 0000000..82b48ae --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/TestBase.cs @@ -0,0 +1,40 @@ +using JT808.DotNetty.Core; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; +using JT808.Protocol; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.Udp.Test +{ + public class TestBase + { + public static IServiceProvider ServiceProvider; + public static JT808Serializer JT808Serializer; + static TestBase() + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration) + .AddJT808UdpNettyHost(); + }); + var build = serverHostBuilder.Build(); + build.Start(); + ServiceProvider = build.Services; + JT808Serializer = ServiceProvider.GetRequiredService().GetSerializer(); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/appsettings.json b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/appsettings.json new file mode 100644 index 0000000..df938a4 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Udp.Test/appsettings.json @@ -0,0 +1,22 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Trace" + } + }, + "Console": { + "LogLevel": { + "Default": "Trace" + } + } + }, + "JT808Configuration": { + "TcpPort": 6565, + "ForwardingRemoteIPAddress": [ + "127.0.0.1" + ], + "RedisHost": "127.0.0.1:6379" + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808.DotNetty.WebApi.Test.csproj b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808.DotNetty.WebApi.Test.csproj new file mode 100644 index 0000000..1b35530 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808.DotNetty.WebApi.Test.csproj @@ -0,0 +1,32 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + + + + + + + + + + Always + + + + diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808DotNettyWebApiTest.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808DotNettyWebApiTest.cs new file mode 100644 index 0000000..bbb9014 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/JT808DotNettyWebApiTest.cs @@ -0,0 +1,125 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.WebApiClientTool; +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using WebApiClient; + +namespace JT808.DotNetty.WebApi.Test +{ + [TestClass] + public class JT808DotNettyWebApiTest: TestBase + { + IJT808DotNettyWebApi jT808DotNettyWebApi; + + public JT808DotNettyWebApiTest() + { + HttpApi.Register().ConfigureHttpApiConfig(c => + { + c.HttpHost = new Uri("http://127.0.0.1:12828" + JT808Constants.JT808WebApiRouteTable.RouteTablePrefix + "/"); + c.LoggerFactory = new LoggerFactory(); + }); + var api = HttpApi.Resolve(); + } + + [TestMethod] + public void GetSystemCollectTest() + { + var result = jT808DotNettyWebApi.GetSystemCollect().GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetUdpAtomicCounterTest() + { + var result = jT808DotNettyWebApi.GetUdpAtomicCounter().GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetUdpTrafficTest() + { + var result = jT808DotNettyWebApi.GetUdpTraffic().GetAwaiter().GetResult(); + } + + [TestMethod] + public void UnificationUdpSendTest() + { + var result = jT808DotNettyWebApi.UnificationUdpSend(new Abstractions.Dtos.JT808UnificationSendRequestDto { + TerminalPhoneNo= "123456789014", + Data=new byte[] {1,2,3,4} + }).GetAwaiter().GetResult(); + } + + [TestMethod] + public void RemoveUdpSessionByTerminalPhoneNoTest() + { + var result = jT808DotNettyWebApi.RemoveUdpSessionByTerminalPhoneNo("123456789014").GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetUdpSessionAllTest() + { + var result = jT808DotNettyWebApi.GetUdpSessionAll().GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetTcpTrafficTest() + { + var result = jT808DotNettyWebApi.GetTcpTraffic().GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetTcpAtomicCounterTest() + { + var result = jT808DotNettyWebApi.GetTcpAtomicCounter().GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetTransmitAllTest() + { + var result = jT808DotNettyWebApi.GetTransmitAll().GetAwaiter().GetResult(); + } + + [TestMethod] + public void RemoveTransmitAddressTest() + { + var result = jT808DotNettyWebApi.RemoveTransmitAddress(new Abstractions.Dtos.JT808IPAddressDto + { + Host = "127.0.0.1", + Port = 6561 + }).GetAwaiter().GetResult(); + } + + [TestMethod] + public void AddTransmitAddressTest() + { + var result = jT808DotNettyWebApi.AddTransmitAddress(new Abstractions.Dtos.JT808IPAddressDto + { + Host = "127.0.0.1", + Port = 6553 + }).GetAwaiter().GetResult(); + } + + [TestMethod] + public void UnificationTcpSendTest() + { + var result = jT808DotNettyWebApi.UnificationTcpSend(new Abstractions.Dtos.JT808UnificationSendRequestDto + { + TerminalPhoneNo = "123456789002", + Data = new byte[] { 1, 2, 3, 4 } + }).GetAwaiter().GetResult(); + } + + [TestMethod] + public void RemoveTcpSessionByTerminalPhoneNoTest() + { + var result = jT808DotNettyWebApi.RemoveTcpSessionByTerminalPhoneNo("123456789002").GetAwaiter().GetResult(); + } + + [TestMethod] + public void GetTcpSessionAllTest() + { + var result = jT808DotNettyWebApi.GetTcpSessionAll().GetAwaiter().GetResult(); + + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs new file mode 100644 index 0000000..8309c83 --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs @@ -0,0 +1,142 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Udp; +using JT808.DotNetty.Tcp; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; +using JT808.DotNetty.WebApiClientTool; +using System.Net; +using JT808.Protocol; +using JT808.Protocol.Extensions; +using System.Threading; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.WebApi.Test +{ + public class TestBase + { + public static IServiceProvider ServiceProvider; + public static JT808Serializer JT808Serializer; + static TestBase() + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureServices((hostContext, services) => + { + services.Configure(hostContext.Configuration.GetSection("JT808DotNettyWebApiOptions")); + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration) + .AddJT808TcpNettyHost() + .Builder() + .AddJT808UdpNettyHost() + .Builder() + .AddJT808WebApiNettyHost(); + }); + var build = serverHostBuilder.Build(); + build.Start(); + ServiceProvider = build.Services; + JT808Serializer = ServiceProvider.GetRequiredService().GetSerializer(); + } + + static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12808); + + static IPEndPoint endPoint1 = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12818); + + JT808SimpleTcpClient SimpleTcpClient1; + JT808SimpleTcpClient SimpleTcpClient2; + JT808SimpleTcpClient SimpleTcpClient3; + JT808SimpleTcpClient SimpleTcpClient4; + JT808SimpleTcpClient SimpleTcpClient5; + + + JT808SimpleUdpClient SimpleUdpClient1; + JT808SimpleUdpClient SimpleUdpClient2; + JT808SimpleUdpClient SimpleUdpClient3; + JT808SimpleUdpClient SimpleUdpClient4; + JT808SimpleUdpClient SimpleUdpClient5; + + + + + public TestBase() + { + SimpleTcpClient1 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient2 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient3 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient4 = new JT808SimpleTcpClient(endPoint); + SimpleTcpClient5 = new JT808SimpleTcpClient(endPoint); + // 心跳会话包 + JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789001"); + SimpleTcpClient1.WriteAsync(JT808Serializer.Serialize(jT808Package1)); + + // 心跳会话包 + JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789002"); + SimpleTcpClient2.WriteAsync(JT808Serializer.Serialize(jT808Package2)); + + // 心跳会话包 + JT808Package jT808Package3 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789003"); + SimpleTcpClient3.WriteAsync(JT808Serializer.Serialize(jT808Package3)); + + // 心跳会话包 + JT808Package jT808Package4 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789004"); + SimpleTcpClient4.WriteAsync(JT808Serializer.Serialize(jT808Package4)); + + // 心跳会话包 + JT808Package jT808Package5 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789005"); + SimpleTcpClient5.WriteAsync(JT808Serializer.Serialize(jT808Package5)); + + SimpleUdpClient1 = new JT808SimpleUdpClient(endPoint1); + SimpleUdpClient2 = new JT808SimpleUdpClient(endPoint1); + SimpleUdpClient3 = new JT808SimpleUdpClient(endPoint1); + SimpleUdpClient4 = new JT808SimpleUdpClient(endPoint1); + SimpleUdpClient5 = new JT808SimpleUdpClient(endPoint1); + // 心跳会话包 + JT808Package jT808Package12 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789011"); + SimpleUdpClient1.WriteAsync(JT808Serializer.Serialize(jT808Package12)); + Thread.Sleep(300); + // 心跳会话包 + JT808Package jT808Package23 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789012"); + SimpleUdpClient2.WriteAsync(JT808Serializer.Serialize(jT808Package23)); + Thread.Sleep(300); + // 心跳会话包 + JT808Package jT808Package34 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789013"); + SimpleUdpClient3.WriteAsync(JT808Serializer.Serialize(jT808Package34)); + Thread.Sleep(300); + // 心跳会话包 + JT808Package jT808Package45 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789014"); + SimpleUdpClient4.WriteAsync(JT808Serializer.Serialize(jT808Package45)); + Thread.Sleep(300); + // 心跳会话包 + JT808Package jT808Package56 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789015"); + SimpleUdpClient5.WriteAsync(JT808Serializer.Serialize(jT808Package56)); + + Thread.Sleep(300); + } + + public void Dispose() + { + SimpleTcpClient1.Down(); + SimpleTcpClient2.Down(); + SimpleTcpClient3.Down(); + SimpleTcpClient4.Down(); + SimpleTcpClient5.Down(); + + SimpleUdpClient1.Down(); + SimpleUdpClient2.Down(); + SimpleUdpClient3.Down(); + SimpleUdpClient4.Down(); + SimpleUdpClient5.Down(); + } + } +} diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/appsettings.json b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/appsettings.json new file mode 100644 index 0000000..66be72e --- /dev/null +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/appsettings.json @@ -0,0 +1,27 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Trace" + } + }, + "Console": { + "LogLevel": { + "Default": "Trace" + } + } + }, + + "JT808Configuration": { + "TcpPort": 12808, + "UdpPort": 12818, + "WebApiPort": 12828, + "ForwardingRemoteIPAddress": [ + "127.0.0.1" + ] + }, + "JT808DotNettyWebApiOptions": { + "WebApiHosts": [ "127.0.0.1:12828" ] + } +} diff --git a/src/JT808.DotNetty.Udp/Handlers/JT808MsgIdDefaultUdpHandler.cs b/src/JT808.DotNetty.Udp/Handlers/JT808MsgIdDefaultUdpHandler.cs new file mode 100644 index 0000000..0092851 --- /dev/null +++ b/src/JT808.DotNetty.Udp/Handlers/JT808MsgIdDefaultUdpHandler.cs @@ -0,0 +1,15 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; + +namespace JT808.DotNetty.Udp.Handlers +{ + /// + /// 默认消息处理业务实现 + /// + internal class JT808MsgIdDefaultUdpHandler : JT808MsgIdUdpHandlerBase + { + public JT808MsgIdDefaultUdpHandler(JT808UdpSessionManager sessionManager) : base(sessionManager) + { + } + } +} diff --git a/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs b/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs new file mode 100644 index 0000000..41bb207 --- /dev/null +++ b/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs @@ -0,0 +1,139 @@ +using DotNetty.Buffers; +using DotNetty.Transport.Channels; +using JT808.Protocol; +using System; +using Microsoft.Extensions.Logging; +using DotNetty.Transport.Channels.Sockets; +using JT808.DotNetty.Core.Metadata; +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Services; +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using System.Threading.Tasks; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Abstractions.Enums; +using JT808.Protocol.Interfaces; + +namespace JT808.DotNetty.Udp.Handlers +{ + /// + /// JT808 Udp服务端处理程序 + /// + internal class JT808UdpServerHandler : SimpleChannelInboundHandler + { + private readonly IJT808SourcePackageDispatcher jT808SourcePackageDispatcher; + + private readonly JT808AtomicCounterService jT808AtomicCounterService; + + private readonly ILogger logger; + + private readonly JT808UdpSessionManager jT808UdpSessionManager; + + private readonly JT808MsgIdUdpHandlerBase handler; + + private readonly JT808TrafficService jT808TrafficService; + + private readonly IJT808UplinkPacket jT808UplinkPacket; + + private readonly IJT808UdpCustomMsgIdHandler jT808UdpCustomMsgIdHandler; + + private readonly IJT808DatagramPacket jT808DatagramPacket; + + private readonly ILogger unknownLogger; + + private readonly JT808Serializer JT808Serializer; + + public JT808UdpServerHandler( + IJT808Config jT808Config, + IJT808DatagramPacket jT808DatagramPacket, + JT808TrafficServiceFactory jT808TrafficServiceFactory, + ILoggerFactory loggerFactory, + IJT808SourcePackageDispatcher jT808SourcePackageDispatcher, + IJT808UplinkPacket jT808UplinkPacket, + JT808MsgIdUdpHandlerBase handler, + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory, + IJT808UdpCustomMsgIdHandler jT808UdpCustomMsgIdHandler, + JT808UdpSessionManager jT808UdpSessionManager) + { + this.jT808UdpCustomMsgIdHandler = jT808UdpCustomMsgIdHandler; + this.jT808DatagramPacket = jT808DatagramPacket; + this.jT808TrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.udp); + this.handler = handler; + this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher; + this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp); + this.jT808UplinkPacket = jT808UplinkPacket; + this.jT808UdpSessionManager = jT808UdpSessionManager; + logger = loggerFactory.CreateLogger(); + JT808Serializer = jT808Config.GetSerializer(); + unknownLogger = loggerFactory.CreateLogger("udp_unknown_msgid"); + } + + protected override void ChannelRead0(IChannelHandlerContext ctx, JT808UdpPackage msg) + { + try + { + jT808SourcePackageDispatcher.SendAsync(msg.Buffer); + jT808UplinkPacket.ProcessorAsync(msg.Buffer, JT808TransportProtocolType.udp); + //解析到头部,然后根据具体的消息Id通过队列去进行消费 + //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息, + //解析具体的消息体,具体调用JT808Serializer.Deserialize + JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize(msg.Buffer); + jT808AtomicCounterService.MsgSuccessIncrement(); + jT808TrafficService.ReceiveSize(msg.Buffer.Length); + jT808UdpSessionManager.TryAdd(ctx.Channel, msg.Sender, jT808HeaderPackage.Header.TerminalPhoneNo); + if (logger.IsEnabled(LogLevel.Trace)) + { + logger.LogTrace("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); + logger.LogTrace("accept msg <<< " + ByteBufferUtil.HexDump(msg.Buffer)); + } + if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out var handlerFunc)) + { + IJT808Reply jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg.Buffer)); + if (jT808Response != null) + { + var sendData = JT808Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize); + ctx.WriteAndFlushAsync(jT808DatagramPacket.Create(sendData,msg.Sender)); + } + } + else + { + IJT808Reply jT808CustomMsgIdResponse = jT808UdpCustomMsgIdHandler.Proccesser(new JT808Request(jT808HeaderPackage, msg.Buffer)); + if (jT808CustomMsgIdResponse != null) + { + var sendData = JT808Serializer.Serialize(jT808CustomMsgIdResponse.Package, jT808CustomMsgIdResponse.MinBufferSize); + ctx.WriteAndFlushAsync(jT808DatagramPacket.Create(sendData, msg.Sender)); + } + else + { + //未知的消息类型已日志形式输出 + if (unknownLogger.IsEnabled(LogLevel.Debug)) + { + unknownLogger.LogDebug(ByteBufferUtil.HexDump(msg.Buffer)); + } + } + } + } + catch (JT808.Protocol.Exceptions.JT808Exception ex) + { + jT808AtomicCounterService.MsgFailIncrement(); + if (logger.IsEnabled(LogLevel.Error)) + { + logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); + logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg.Buffer)); + } + } + catch (Exception ex) + { + jT808AtomicCounterService.MsgFailIncrement(); + if (logger.IsEnabled(LogLevel.Error)) + { + logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); + logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg.Buffer)); + } + } + } + + public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); + + } +} diff --git a/src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs b/src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs new file mode 100644 index 0000000..1fcd18f --- /dev/null +++ b/src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs @@ -0,0 +1,49 @@ +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Udp +{ + class JT1078UdpBuilderDefault : IJT808UdpNettyBuilder + { + public IJT808NettyBuilder Instance { get; } + + public JT1078UdpBuilderDefault(IJT808NettyBuilder builder) + { + Instance = builder; + } + + public IJT808NettyBuilder Builder() + { + return Instance; + } + + public IJT808UdpNettyBuilder ReplaceCustomMsgIdHandler() where T : IJT808UdpCustomMsgIdHandler + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808UdpCustomMsgIdHandler), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808UdpNettyBuilder ReplaceMsgIdHandler() where T : JT808MsgIdUdpHandlerBase + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(JT808MsgIdUdpHandlerBase), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808UdpNettyBuilder ReplaceSessionService() where T : IJT808UdpSessionService + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808UdpSessionService), typeof(T), ServiceLifetime.Singleton)); + return this; + } + + public IJT808UdpNettyBuilder ReplaceUnificationSendService() where T : IJT808UnificationUdpSendService + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808UnificationUdpSendService), typeof(T), ServiceLifetime.Singleton)); + return this; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj b/src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj new file mode 100644 index 0000000..42db860 --- /dev/null +++ b/src/JT808.DotNetty.Udp/JT808.DotNetty.Udp.csproj @@ -0,0 +1,23 @@ + + + + JT808.DotNetty.Udp + JT808.DotNetty.Udp + 基于DotNetty实现的JT808DotNetty的Udp服务 + 基于DotNetty实现的JT808DotNetty的Udp服务 + + + + + + + + + + + + + + + + diff --git a/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs b/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs new file mode 100644 index 0000000..5f93ce9 --- /dev/null +++ b/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs @@ -0,0 +1,38 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Codecs; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Impls; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Jobs; +using JT808.DotNetty.Core.Services; +using JT808.DotNetty.Internal; +using JT808.DotNetty.Udp.Handlers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Internal; +using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("JT808.DotNetty.Udp.Test")] + +namespace JT808.DotNetty.Udp +{ + public static class JT808UdpDotnettyExtensions + { + public static IJT808UdpNettyBuilder AddJT808UdpNettyHost(this IJT808NettyBuilder jT808NettyBuilder) + { + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + return new JT1078UdpBuilderDefault(jT808NettyBuilder); + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.Udp/JT808UdpServerHost.cs b/src/JT808.DotNetty.Udp/JT808UdpServerHost.cs new file mode 100644 index 0000000..5c3a7eb --- /dev/null +++ b/src/JT808.DotNetty.Udp/JT808UdpServerHost.cs @@ -0,0 +1,76 @@ +using DotNetty.Transport.Bootstrapping; +using DotNetty.Transport.Channels; +using DotNetty.Transport.Channels.Sockets; +using JT808.DotNetty.Core.Codecs; +using JT808.DotNetty.Core.Configurations; +using JT808.DotNetty.Udp.Handlers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Udp +{ + /// + /// JT808 Udp网关服务 + /// + internal class JT808UdpServerHost : IHostedService + { + private readonly IServiceProvider serviceProvider; + private readonly JT808Configuration configuration; + private readonly ILogger logger; + private MultithreadEventLoopGroup group; + private IChannel bootstrapChannel; + + public JT808UdpServerHost( + IServiceProvider provider, + ILoggerFactory loggerFactory, + IOptions jT808ConfigurationAccessor) + { + serviceProvider = provider; + configuration = jT808ConfigurationAccessor.Value; + logger=loggerFactory.CreateLogger(); + } + + public Task StartAsync(CancellationToken cancellationToken) + { + group = new MultithreadEventLoopGroup(); + Bootstrap bootstrap = new Bootstrap(); + bootstrap.Group(group); + bootstrap.Channel(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) + || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + bootstrap + .Option(ChannelOption.SoReuseport, true); + } + bootstrap + .Option(ChannelOption.SoBroadcast, true) + .Handler(new ActionChannelInitializer(channel => + { + IChannelPipeline pipeline = channel.Pipeline; + using (var scope = serviceProvider.CreateScope()) + { + pipeline.AddLast("jt808UdpDecoder", scope.ServiceProvider.GetRequiredService()); + pipeline.AddLast("jt808UdpService", scope.ServiceProvider.GetRequiredService()); + } + })); + logger.LogInformation($"JT808 Udp Server start at {IPAddress.Any}:{configuration.UdpPort}."); + return bootstrap.BindAsync(configuration.UdpPort) + .ContinueWith(i => bootstrapChannel = i.Result); + } + + public async Task StopAsync(CancellationToken cancellationToken) + { + await bootstrapChannel.CloseAsync(); + var quietPeriod = configuration.QuietPeriodTimeSpan; + var shutdownTimeout = configuration.ShutdownTimeoutTimeSpan; + await group.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout); + } + } +} diff --git a/src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml b/src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..e572661 --- /dev/null +++ b/src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,13 @@ + + + + + FileSystem + Release + Any CPU + netstandard2.0 + ..\..\nupkgs + + \ No newline at end of file diff --git a/src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml.user b/src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..312c6e3 --- /dev/null +++ b/src/JT808.DotNetty.Udp/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs b/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs new file mode 100644 index 0000000..0c7c775 --- /dev/null +++ b/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs @@ -0,0 +1,334 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Abstractions.Dtos; +using JT808.DotNetty.Abstractions.Enums; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using JT808.DotNetty.Core.Services; +using Newtonsoft.Json; + +namespace JT808.DotNetty.WebApi.Handlers +{ + /// + /// 默认消息处理业务实现 + /// + public class JT808MsgIdDefaultWebApiHandler : JT808MsgIdHttpHandlerBase + { + private readonly JT808AtomicCounterService jT808TcpAtomicCounterService; + + private readonly JT808AtomicCounterService jT808UdpAtomicCounterService; + + private readonly JT808TransmitAddressFilterService jT808TransmitAddressFilterService; + + private readonly IJT808TcpSessionService jT808TcpSessionService; + + private readonly IJT808UdpSessionService jT808UdpSessionService; + + private readonly IJT808UnificationTcpSendService jT808UnificationTcpSendService; + + private readonly IJT808UnificationUdpSendService jT808UnificationUdpSendService; + + private readonly JT808TrafficService jT808TcpTrafficService; + + private readonly JT808TrafficService jT808UdpTrafficService; + + private readonly JT808SimpleSystemCollectService jT808SimpleSystemCollectService; + + /// + /// TCP一套注入 + /// + /// + public JT808MsgIdDefaultWebApiHandler( + JT808SimpleSystemCollectService jT808SimpleSystemCollectService, + JT808TrafficServiceFactory jT808TrafficServiceFactory, + IJT808UnificationTcpSendService jT808UnificationTcpSendService, + IJT808TcpSessionService jT808TcpSessionService, + JT808TransmitAddressFilterService jT808TransmitAddressFilterService, + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory + ) + { + this.jT808SimpleSystemCollectService = jT808SimpleSystemCollectService; + this.jT808TcpTrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.tcp); + this.jT808UnificationTcpSendService = jT808UnificationTcpSendService; + this.jT808TcpSessionService = jT808TcpSessionService; + this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService; + this.jT808TcpAtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.tcp); + InitCommonRoute(); + InitTcpRoute(); + } + + /// + /// UDP一套注入 + /// + /// + public JT808MsgIdDefaultWebApiHandler( + JT808SimpleSystemCollectService jT808SimpleSystemCollectService, + JT808TrafficServiceFactory jT808TrafficServiceFactory, + IJT808UdpSessionService jT808UdpSessionService, + IJT808UnificationUdpSendService jT808UnificationUdpSendService, + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory + ) + { + this.jT808SimpleSystemCollectService = jT808SimpleSystemCollectService; + this.jT808UdpTrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.udp); + this.jT808UdpSessionService = jT808UdpSessionService; + this.jT808UnificationUdpSendService = jT808UnificationUdpSendService; + this.jT808UdpAtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp); + InitCommonRoute(); + InitUdpRoute(); + } + + /// + /// 统一的一套注入 + /// + /// + /// + public JT808MsgIdDefaultWebApiHandler( + JT808SimpleSystemCollectService jT808SimpleSystemCollectService, + JT808TrafficServiceFactory jT808TrafficServiceFactory, + IJT808UnificationTcpSendService jT808UnificationTcpSendService, + IJT808UnificationUdpSendService jT808UnificationUdpSendService, + IJT808TcpSessionService jT808TcpSessionService, + IJT808UdpSessionService jT808UdpSessionService, + JT808TransmitAddressFilterService jT808TransmitAddressFilterService, + JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory + ) + { + this.jT808SimpleSystemCollectService = jT808SimpleSystemCollectService; + this.jT808TcpTrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.tcp); + this.jT808UdpTrafficService = jT808TrafficServiceFactory.Create(JT808TransportProtocolType.udp); + this.jT808UdpSessionService = jT808UdpSessionService; + this.jT808UnificationTcpSendService = jT808UnificationTcpSendService; + this.jT808UnificationUdpSendService = jT808UnificationUdpSendService; + this.jT808TcpSessionService = jT808TcpSessionService; + this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService; + this.jT808TcpAtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.tcp); + this.jT808UdpAtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp); + InitCommonRoute(); + InitTcpRoute(); + InitUdpRoute(); + } + + /// + /// 会话服务集合 + /// + /// + /// + public JT808HttpResponse GetTcpSessionAll(JT808HttpRequest request) + { + var result = jT808TcpSessionService.GetAll(); + return CreateJT808HttpResponse(result); + } + + /// + /// 会话服务-通过设备终端号移除对应会话 + /// + /// + /// + public JT808HttpResponse RemoveTcpSessionByTerminalPhoneNo(JT808HttpRequest request) + { + if (string.IsNullOrEmpty(request.Json)) + { + return EmptyHttpResponse(); + } + var result = jT808TcpSessionService.RemoveByTerminalPhoneNo(request.Json); + return CreateJT808HttpResponse(result); + } + + /// + /// 会话服务集合 + /// + /// + /// + public JT808HttpResponse GetUdpSessionAll(JT808HttpRequest request) + { + var result = jT808UdpSessionService.GetAll(); + return CreateJT808HttpResponse(result); + } + + /// + /// 会话服务-通过设备终端号移除对应会话 + /// + /// + /// + public JT808HttpResponse RemoveUdpSessionByTerminalPhoneNo(JT808HttpRequest request) + { + if (string.IsNullOrEmpty(request.Json)) + { + return EmptyHttpResponse(); + } + var result = jT808UdpSessionService.RemoveByTerminalPhoneNo(request.Json); + return CreateJT808HttpResponse(result); + } + + /// + /// 添加转发过滤地址 + /// + /// + /// + public JT808HttpResponse AddTransmitAddress(JT808HttpRequest request) + { + if (string.IsNullOrEmpty(request.Json)) + { + return EmptyHttpResponse(); + } + return CreateJT808HttpResponse(jT808TransmitAddressFilterService.Add(request.Json)); + } + + /// + /// 删除转发过滤地址(不能删除在网关服务器配置文件配的地址) + /// + /// + /// + public JT808HttpResponse RemoveTransmitAddress(JT808HttpRequest request) + { + if (string.IsNullOrEmpty(request.Json)) + { + return EmptyHttpResponse(); + } + return CreateJT808HttpResponse(jT808TransmitAddressFilterService.Remove(request.Json)); + } + + /// + /// 获取转发过滤地址信息集合 + /// + /// + /// + public JT808HttpResponse GetTransmitAll(JT808HttpRequest request) + { + return CreateJT808HttpResponse(jT808TransmitAddressFilterService.GetAll()); + } + + /// + /// 获取Tcp包计数器 + /// + /// + /// + public JT808HttpResponse GetTcpAtomicCounter(JT808HttpRequest request) + { + JT808AtomicCounterDto jT808AtomicCounterDto = new JT808AtomicCounterDto(); + jT808AtomicCounterDto.MsgFailCount = jT808TcpAtomicCounterService.MsgFailCount; + jT808AtomicCounterDto.MsgSuccessCount = jT808TcpAtomicCounterService.MsgSuccessCount; + return CreateJT808HttpResponse(new JT808ResultDto + { + Code = JT808ResultCode.Ok, + Data = jT808AtomicCounterDto + }); + } + + /// + /// 获取Udp包计数器 + /// + /// + /// + public JT808HttpResponse GetUdpAtomicCounter(JT808HttpRequest request) + { + JT808AtomicCounterDto jT808AtomicCounterDto = new JT808AtomicCounterDto(); + jT808AtomicCounterDto.MsgFailCount = jT808UdpAtomicCounterService.MsgFailCount; + jT808AtomicCounterDto.MsgSuccessCount = jT808UdpAtomicCounterService.MsgSuccessCount; + return CreateJT808HttpResponse(new JT808ResultDto + { + Code = JT808ResultCode.Ok, + Data = jT808AtomicCounterDto + }); + } + + /// + /// 基于Tcp的统一下发信息 + /// + /// + /// + public JT808HttpResponse UnificationTcpSend(JT808HttpRequest request) + { + if (string.IsNullOrEmpty(request.Json)) + { + return EmptyHttpResponse(); + } + JT808UnificationSendRequestDto jT808UnificationSendRequestDto = JsonConvert.DeserializeObject(request.Json); + var result = jT808UnificationTcpSendService.Send(jT808UnificationSendRequestDto.TerminalPhoneNo, jT808UnificationSendRequestDto.Data); + return CreateJT808HttpResponse(result); + } + + /// + /// 基于Udp的统一下发信息 + /// + /// + /// + public JT808HttpResponse UnificationUdpSend(JT808HttpRequest request) + { + if (string.IsNullOrEmpty(request.Json)) + { + return EmptyHttpResponse(); + } + JT808UnificationSendRequestDto jT808UnificationSendRequestDto = JsonConvert.DeserializeObject(request.Json); + var result = jT808UnificationUdpSendService.Send(jT808UnificationSendRequestDto.TerminalPhoneNo, jT808UnificationSendRequestDto.Data); + return CreateJT808HttpResponse(result); + } + + /// + /// 基于Tcp的流量获取 + /// + /// + /// + public JT808HttpResponse TrafficTcpGet(JT808HttpRequest request) + { + JT808ResultDto jT808ResultDto = new JT808ResultDto(); + jT808ResultDto.Data = new JT808TrafficInfoDto(); + jT808ResultDto.Data.TotalReceiveSize = (jT808TcpTrafficService.TotalReceiveSize * 1.0) / 1024; + jT808ResultDto.Data.TotalSendSize = (jT808TcpTrafficService.TotalSendSize * 1.0) / 1024; + return CreateJT808HttpResponse(jT808ResultDto); + } + + /// + /// 基于Udp的流量获取 + /// + /// + /// + public JT808HttpResponse TrafficUdpGet(JT808HttpRequest request) + { + JT808ResultDto jT808ResultDto = new JT808ResultDto(); + jT808ResultDto.Data = new JT808TrafficInfoDto(); + jT808ResultDto.Data.TotalReceiveSize = (jT808UdpTrafficService.TotalReceiveSize * 1.0) / 1024; + jT808ResultDto.Data.TotalSendSize = (jT808UdpTrafficService.TotalSendSize * 1.0) / 1024; + return CreateJT808HttpResponse(jT808ResultDto); + } + + /// + /// 获取当前系统进程使用率 + /// + /// + /// + public JT808HttpResponse SystemCollectGet(JT808HttpRequest request) + { + JT808ResultDto jT808ResultDto = new JT808ResultDto(); + jT808ResultDto.Data = jT808SimpleSystemCollectService.Get(); + return CreateJT808HttpResponse(jT808ResultDto); + } + + protected virtual void InitCommonRoute() + { + CreateRoute(JT808Constants.JT808WebApiRouteTable.SystemCollectGet, SystemCollectGet); + } + + protected virtual void InitTcpRoute() + { + CreateRoute(JT808Constants.JT808WebApiRouteTable.TransmitAdd, AddTransmitAddress); + CreateRoute(JT808Constants.JT808WebApiRouteTable.TransmitRemove, RemoveTransmitAddress); + CreateRoute(JT808Constants.JT808WebApiRouteTable.TransmitGetAll, GetTransmitAll); + CreateRoute(JT808Constants.JT808WebApiRouteTable.GetTcpAtomicCounter, GetTcpAtomicCounter); + CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionTcpGetAll, GetTcpSessionAll); + CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionTcpRemoveByTerminalPhoneNo, RemoveTcpSessionByTerminalPhoneNo); + CreateRoute(JT808Constants.JT808WebApiRouteTable.UnificationTcpSend, UnificationTcpSend); + CreateRoute(JT808Constants.JT808WebApiRouteTable.TrafficTcpGet, TrafficTcpGet); + } + + protected virtual void InitUdpRoute() + { + CreateRoute(JT808Constants.JT808WebApiRouteTable.GetUdpAtomicCounter, GetUdpAtomicCounter); + CreateRoute(JT808Constants.JT808WebApiRouteTable.UnificationUdpSend, UnificationUdpSend); + CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionUdpGetAll, GetUdpSessionAll); + CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionUdpRemoveByTerminalPhoneNo, RemoveUdpSessionByTerminalPhoneNo); + CreateRoute(JT808Constants.JT808WebApiRouteTable.TrafficUdpGet, TrafficUdpGet); + } + } +} diff --git a/src/JT808.DotNetty.WebApi/Handlers/JT808WebAPIServerHandler.cs b/src/JT808.DotNetty.WebApi/Handlers/JT808WebAPIServerHandler.cs new file mode 100644 index 0000000..159625d --- /dev/null +++ b/src/JT808.DotNetty.WebApi/Handlers/JT808WebAPIServerHandler.cs @@ -0,0 +1,82 @@ +using DotNetty.Buffers; +using DotNetty.Codecs.Http; +using DotNetty.Common.Utilities; +using DotNetty.Transport.Channels; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Metadata; +using Microsoft.Extensions.Logging; +using System; +using System.Text; + +namespace JT808.DotNetty.WebApi.Handlers +{ + /// + /// jt808 webapi服务 + /// 请求量不大,只支持JSON格式并且只支持post发数据 + /// ref: dotnetty HttpServer + /// + internal class JT808WebAPIServerHandler : SimpleChannelInboundHandler + { + private static readonly AsciiString TypeJson = AsciiString.Cached("application/json"); + private static readonly AsciiString ServerName = AsciiString.Cached("JT808WebAPINetty"); + private static readonly AsciiString ContentTypeEntity = HttpHeaderNames.ContentType; + private static readonly AsciiString DateEntity = HttpHeaderNames.Date; + private static readonly AsciiString ContentLengthEntity = HttpHeaderNames.ContentLength; + private static readonly AsciiString ServerEntity = HttpHeaderNames.Server; + private readonly JT808MsgIdHttpHandlerBase jT808MsgIdHttpHandlerBase; + private readonly ILogger logger; + + public JT808WebAPIServerHandler( + JT808MsgIdHttpHandlerBase jT808MsgIdHttpHandlerBase, + ILoggerFactory loggerFactory) + { + this.jT808MsgIdHttpHandlerBase = jT808MsgIdHttpHandlerBase; + logger = loggerFactory.CreateLogger(); + } + + protected override void ChannelRead0(IChannelHandlerContext ctx, IFullHttpRequest msg) + { + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug($"Uri:{msg.Uri}"); + logger.LogDebug($"Content:{msg.Content.ToString(Encoding.UTF8)}"); + } + JT808HttpResponse jT808HttpResponse = null; + if (jT808MsgIdHttpHandlerBase.HandlerDict.TryGetValue(msg.Uri,out var funcHandler)) + { + jT808HttpResponse = funcHandler( new JT808HttpRequest() { Json = msg.Content.ToString(Encoding.UTF8)}); + } + else + { + jT808HttpResponse = jT808MsgIdHttpHandlerBase.NotFoundHttpResponse(); + } + if (jT808HttpResponse != null) + { + WriteResponse(ctx, Unpooled.WrappedBuffer(jT808HttpResponse.Data), TypeJson, jT808HttpResponse.Data.Length); + } + } + + private void WriteResponse(IChannelHandlerContext ctx, IByteBuffer buf, ICharSequence contentType, int contentLength) + { + // Build the response object. + var response = new DefaultFullHttpResponse(HttpVersion.Http11, HttpResponseStatus.OK, buf, false); + HttpHeaders headers = response.Headers; + headers.Set(ContentTypeEntity, contentType); + headers.Set(ServerEntity, ServerName); + headers.Set(DateEntity, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + headers.Set(ContentLengthEntity, contentLength); + // Close the non-keep-alive connection after the write operation is done. + ctx.WriteAndFlushAsync(response); + ctx.CloseAsync(); + } + + public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) + { + WriteResponse(context, Unpooled.WrappedBuffer(jT808MsgIdHttpHandlerBase.ErrorHttpResponse(exception).Data), TypeJson, jT808MsgIdHttpHandlerBase.ErrorHttpResponse(exception).Data.Length); + logger.LogError(exception, exception.Message); + context.CloseAsync(); + } + + public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); + } +} diff --git a/src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj b/src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj new file mode 100644 index 0000000..b7ddcd7 --- /dev/null +++ b/src/JT808.DotNetty.WebApi/JT808.DotNetty.WebApi.csproj @@ -0,0 +1,21 @@ + + + + JT808.DotNetty.WebApi + JT808.DotNetty.WebApi + 基于DotNetty实现的JT808DotNetty的WebApi服务 + 基于DotNetty实现的JT808DotNetty的WebApi服务 + + + + + + + + + + + + + + diff --git a/src/JT808.DotNetty.WebApi/JT808WebAPIServerHost.cs b/src/JT808.DotNetty.WebApi/JT808WebAPIServerHost.cs new file mode 100644 index 0000000..66cd93e --- /dev/null +++ b/src/JT808.DotNetty.WebApi/JT808WebAPIServerHost.cs @@ -0,0 +1,82 @@ +using DotNetty.Codecs.Http; +using DotNetty.Transport.Bootstrapping; +using DotNetty.Transport.Channels; +using DotNetty.Transport.Libuv; +using JT808.DotNetty.Core.Configurations; +using JT808.DotNetty.WebApi.Handlers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.WebApi +{ + /// + /// JT808 集成一个webapi服务 + /// + internal class JT808WebAPIServerHost : IHostedService + { + private readonly IServiceProvider serviceProvider; + private readonly JT808Configuration configuration; + private readonly ILogger logger; + private DispatcherEventLoopGroup bossGroup; + private WorkerEventLoopGroup workerGroup; + private IChannel bootstrapChannel; + + public JT808WebAPIServerHost( + IServiceProvider provider, + ILoggerFactory loggerFactory, + IOptions jT808ConfigurationAccessor) + { + serviceProvider = provider; + configuration = jT808ConfigurationAccessor.Value; + logger = loggerFactory.CreateLogger(); + } + + public Task StartAsync(CancellationToken cancellationToken) + { + bossGroup = new DispatcherEventLoopGroup(); + workerGroup = new WorkerEventLoopGroup(bossGroup, 1); + ServerBootstrap bootstrap = new ServerBootstrap(); + bootstrap.Group(bossGroup, workerGroup); + bootstrap.Channel(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) + || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + bootstrap + .Option(ChannelOption.SoReuseport, true) + .ChildOption(ChannelOption.SoReuseaddr, true); + } + bootstrap + .Option(ChannelOption.SoBacklog, 8192) + .ChildHandler(new ActionChannelInitializer(channel => + { + IChannelPipeline pipeline = channel.Pipeline; + using (var scope = serviceProvider.CreateScope()) + { + pipeline.AddLast("http_encoder", new HttpResponseEncoder()); + pipeline.AddLast("http_decoder", new HttpRequestDecoder(4096, 8192, 8192, false)); + //将多个消息转换为单一的request或者response对象 =>IFullHttpRequest + pipeline.AddLast("http_aggregator", new HttpObjectAggregator(int.MaxValue)); + pipeline.AddLast("http_jt808webapihandler", scope.ServiceProvider.GetRequiredService()); + } + })); + logger.LogInformation($"JT808 WebAPI Server start at {IPAddress.Any}:{configuration.WebApiPort}."); + return bootstrap.BindAsync(configuration.WebApiPort).ContinueWith(i => bootstrapChannel = i.Result); + } + + public async Task StopAsync(CancellationToken cancellationToken) + { + await bootstrapChannel.CloseAsync(); + var quietPeriod = configuration.QuietPeriodTimeSpan; + var shutdownTimeout = configuration.ShutdownTimeoutTimeSpan; + await workerGroup.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout); + await bossGroup.ShutdownGracefullyAsync(quietPeriod, shutdownTimeout); + } + } +} diff --git a/src/JT808.DotNetty.WebApi/JT808WebApiBuilderDefault.cs b/src/JT808.DotNetty.WebApi/JT808WebApiBuilderDefault.cs new file mode 100644 index 0000000..53cda12 --- /dev/null +++ b/src/JT808.DotNetty.WebApi/JT808WebApiBuilderDefault.cs @@ -0,0 +1,30 @@ +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.WebApi +{ + public class JT808WebApiBuilderDefault : IJT808WebApiNettyBuilder + { + public JT808WebApiBuilderDefault(IJT808NettyBuilder jT808NettyBuilder) { + Instance = jT808NettyBuilder; + } + + public IJT808NettyBuilder Instance { get; } + + public IJT808NettyBuilder Builder() + { + return Instance; + } + + public IJT808WebApiNettyBuilder ReplaceMsgIdHandler() where T : JT808MsgIdHttpHandlerBase + { + Instance.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHttpHandlerBase), typeof(T), ServiceLifetime.Singleton)); + return this; + } + } +} diff --git a/src/JT808.DotNetty.WebApi/JT808WebApiDotnettyExtensions.cs b/src/JT808.DotNetty.WebApi/JT808WebApiDotnettyExtensions.cs new file mode 100644 index 0000000..f3b30fe --- /dev/null +++ b/src/JT808.DotNetty.WebApi/JT808WebApiDotnettyExtensions.cs @@ -0,0 +1,22 @@ +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.WebApi.Handlers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("JT808.DotNetty.WebApi.Test")] + +namespace JT808.DotNetty.WebApi +{ + public static class JT808WebApiDotnettyExtensions + { + public static IJT808WebApiNettyBuilder AddJT808WebApiNettyHost(this IJT808NettyBuilder jT808NettyBuilder) + { + jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); + jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); + jT808NettyBuilder.JT808Builder.Services.AddHostedService(); + return new JT808WebApiBuilderDefault(jT808NettyBuilder); + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml b/src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..e572661 --- /dev/null +++ b/src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,13 @@ + + + + + FileSystem + Release + Any CPU + netstandard2.0 + ..\..\nupkgs + + \ No newline at end of file diff --git a/src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user b/src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..312c6e3 --- /dev/null +++ b/src/JT808.DotNetty.WebApi/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.WebApiClientTool/IJT808DotNettyWebApi.cs b/src/JT808.DotNetty.WebApiClientTool/IJT808DotNettyWebApi.cs new file mode 100644 index 0000000..3f6613c --- /dev/null +++ b/src/JT808.DotNetty.WebApiClientTool/IJT808DotNettyWebApi.cs @@ -0,0 +1,112 @@ +using JT808.DotNetty.Abstractions.Dtos; +using System.Collections.Generic; +using WebApiClient; +using WebApiClient.Attributes; + +namespace JT808.DotNetty.WebApiClientTool +{ + public interface IJT808DotNettyWebApi : IHttpApi + { + #region 基于Tcp WebApi + /// + /// 会话服务集合 + /// + /// + [HttpGet("Tcp/Session/GetAll")] + ITask>> GetTcpSessionAll(); + /// + /// 会话服务-通过设备终端号移除对应会话 + /// + /// + /// + [HttpPost("Tcp/Session/RemoveByTerminalPhoneNo")] + ITask> RemoveTcpSessionByTerminalPhoneNo([JsonContent] string terminalPhoneNo); + /// + /// 基于Tcp的统一下发信息 + /// + /// + /// + [HttpPost("Tcp/UnificationSend")] + ITask> UnificationTcpSend([JsonContent]JT808UnificationSendRequestDto jT808UnificationSendRequestDto); + /// + /// 添加转发过滤地址 + /// + /// + /// + [HttpPost("Tcp/Transmit/Add")] + ITask> AddTransmitAddress([JsonContent]JT808IPAddressDto jT808IPAddressDto); + /// + /// 删除转发过滤地址(不能删除在网关服务器配置文件配的地址) + /// + /// + /// + [HttpPost("Tcp/Transmit/Remove")] + ITask> RemoveTransmitAddress([JsonContent]JT808IPAddressDto jT808IPAddressDto); + /// + /// 获取转发过滤地址信息集合 + /// + /// + [HttpGet("Tcp/Transmit/GetAll")] + ITask>> GetTransmitAll(); + /// + /// 获取Tcp包计数器 + /// + /// + /// + [HttpGet("Tcp/GetAtomicCounter")] + ITask> GetTcpAtomicCounter(); + /// + /// 基于Tcp的流量获取 + /// + /// + [HttpGet("Tcp/Traffic/Get")] + ITask> GetTcpTraffic(); + + #endregion + + #region 基于Udp WebApi + /// + /// 会话服务集合 + /// + /// + /// + [HttpGet("Udp/Session/GetAll")] + ITask>> GetUdpSessionAll(); + /// + /// 会话服务-通过设备终端号移除对应会话 + /// + /// + /// + [HttpPost("Udp/Session/RemoveByTerminalPhoneNo")] + ITask> RemoveUdpSessionByTerminalPhoneNo([JsonContent] string terminalPhoneNo); + /// + /// /基于Udp的统一下发信息 + /// + /// + /// + [HttpPost("Udp/UnificationSend")] + ITask> UnificationUdpSend([JsonContent]JT808UnificationSendRequestDto jT808UnificationSendRequestDto); + /// + /// 基于Udp的流量获取 + /// + /// + [HttpGet("Udp/Traffic/Get")] + ITask> GetUdpTraffic(); + /// + /// 获取Udp包计数器 + /// + /// + [HttpGet("Udp/GetAtomicCounter")] + ITask> GetUdpAtomicCounter(); + #endregion + + #region 公共部分 + /// + /// 获取当前系统进程使用率 + /// + /// + [HttpGet("SystemCollect/Get")] + ITask> GetSystemCollect(); + #endregion + } +} diff --git a/src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj b/src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj new file mode 100644 index 0000000..a05ec5f --- /dev/null +++ b/src/JT808.DotNetty.WebApiClientTool/JT808.DotNetty.WebApiClientTool.csproj @@ -0,0 +1,18 @@ + + + + JT808.DotNetty.WebApiClientTool + JT808.DotNetty.WebApiClientTool + JT808DotNetty的WebApiClient客户端调用工具 + JT808DotNetty的WebApiClient客户端调用工具 + + + + + + + + + + + diff --git a/src/JT808.DotNetty.WebApiClientTool/JT808DotNettyWebApiOptions.cs b/src/JT808.DotNetty.WebApiClientTool/JT808DotNettyWebApiOptions.cs new file mode 100644 index 0000000..8286ba3 --- /dev/null +++ b/src/JT808.DotNetty.WebApiClientTool/JT808DotNettyWebApiOptions.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace JT808.DotNetty.WebApiClientTool +{ + public class JT808DotNettyWebApiOptions + { + /// + /// 接口服务地址 + /// + public List WebApiHosts { get; set; } + } +} diff --git a/src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml b/src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..e572661 --- /dev/null +++ b/src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,13 @@ + + + + + FileSystem + Release + Any CPU + netstandard2.0 + ..\..\nupkgs + + \ No newline at end of file diff --git a/src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml.user b/src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..312c6e3 --- /dev/null +++ b/src/JT808.DotNetty.WebApiClientTool/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/JT808.DotNetty.sln b/src/JT808.DotNetty.sln new file mode 100644 index 0000000..c5f65be --- /dev/null +++ b/src/JT808.DotNetty.sln @@ -0,0 +1,122 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28922.388 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Udp", "JT808.DotNetty.Udp\JT808.DotNetty.Udp.csproj", "{C960084C-2CF4-4748-AD35-D2384285D6A3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Core", "JT808.DotNetty.Core\JT808.DotNetty.Core.csproj", "{67C5DC72-0004-48B3-BB5A-9CB7069B4F02}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Abstractions", "JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj", "{4DCF33C0-67C5-4179-AF1E-4E919F9F856D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{3BD7FF02-8516-4A77-A385-9FDCDD792E22}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Tcp", "JT808.DotNetty.Tcp\JT808.DotNetty.Tcp.csproj", "{330CD783-5564-4083-ABFC-573CDC369F50}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.WebApi", "JT808.DotNetty.WebApi\JT808.DotNetty.WebApi.csproj", "{B783DE53-CE2A-4225-921F-04E5E57B28F3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Core.Test", "JT808.DotNetty.Tests\JT808.DotNetty.Core.Test\JT808.DotNetty.Core.Test.csproj", "{1C4CCE9B-761B-4581-B5DA-5B6D83572D56}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Tcp.Test", "JT808.DotNetty.Tests\JT808.DotNetty.Tcp.Test\JT808.DotNetty.Tcp.Test.csproj", "{AEF1E1E2-C861-4268-86F6-6F376FAF79A7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Udp.Test", "JT808.DotNetty.Tests\JT808.DotNetty.Udp.Test\JT808.DotNetty.Udp.Test.csproj", "{E503BFD8-D90A-4610-97C7-5B9A0497303B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.WebApi.Test", "JT808.DotNetty.Tests\JT808.DotNetty.WebApi.Test\JT808.DotNetty.WebApi.Test.csproj", "{EDE77A29-0840-450C-8B08-2D3388845AE5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Hosting", "JT808.DotNetty.Tests\JT808.DotNetty.Hosting\JT808.DotNetty.Hosting.csproj", "{A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.WebApiClientTool", "JT808.DotNetty.WebApiClientTool\JT808.DotNetty.WebApiClientTool.csproj", "{9D86C951-94F2-4CBD-B177-8AF31DDB05D8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Client", "JT808.DotNetty.Client\JT808.DotNetty.Client.csproj", "{87C08239-C57F-4FC5-9579-05D0723AA4A0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simples", "simples", "{2459FB59-8A33-49A4-ADBC-A0B12C5886A6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.SimpleClient", "..\simples\JT808.DotNetty.SimpleClient\JT808.DotNetty.SimpleClient.csproj", "{E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.SimpleServer", "..\simples\JT808.DotNetty.SimpleServer\JT808.DotNetty.SimpleServer.csproj", "{CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.CleintBenchmark", "JT808.DotNetty.CleintBenchmark\JT808.DotNetty.CleintBenchmark.csproj", "{C2B1A0F4-2C49-45DA-9F48-7A016FC6E9E1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Release|Any CPU.Build.0 = Release|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Release|Any CPU.Build.0 = Release|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Release|Any CPU.Build.0 = Release|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Release|Any CPU.Build.0 = Release|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Release|Any CPU.Build.0 = Release|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Release|Any CPU.Build.0 = Release|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Release|Any CPU.Build.0 = Release|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Release|Any CPU.Build.0 = Release|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Release|Any CPU.Build.0 = Release|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Release|Any CPU.Build.0 = Release|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Release|Any CPU.Build.0 = Release|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Release|Any CPU.Build.0 = Release|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Release|Any CPU.Build.0 = Release|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Release|Any CPU.Build.0 = Release|Any CPU + {C2B1A0F4-2C49-45DA-9F48-7A016FC6E9E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2B1A0F4-2C49-45DA-9F48-7A016FC6E9E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2B1A0F4-2C49-45DA-9F48-7A016FC6E9E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2B1A0F4-2C49-45DA-9F48-7A016FC6E9E1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {E503BFD8-D90A-4610-97C7-5B9A0497303B} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {EDE77A29-0840-450C-8B08-2D3388845AE5} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FC0FFCEA-E1EF-4C97-A1C5-F89418B6834B} + EndGlobalSection +EndGlobal diff --git a/src/SharedProperties.props b/src/SharedProperties.props new file mode 100644 index 0000000..c5f522f --- /dev/null +++ b/src/SharedProperties.props @@ -0,0 +1,20 @@ + + + netstandard2.0 + 7.3 + Copyright 2018. + SmallChi(Koike) + https://github.com/SmallChi/JT808DotNetty + https://github.com/SmallChi/JT808DotNetty + https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE + https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE + false + 2.1.2 + false + LICENSE + true + + + + +

56gspK#r(FfR&gUJUd<2--yM?Zw%9v^P6 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 W>06m%W7iAVpR)WLxf&Vsp#K9qWUQ+I literal 0 HcmV?d00001 diff --git a/simples/JT808.DotNetty.SimpleClient/JT808.DotNetty.SimpleClient.csproj b/simples/JT808.DotNetty.SimpleClient/JT808.DotNetty.SimpleClient.csproj new file mode 100644 index 0000000..cef4e89 --- /dev/null +++ b/simples/JT808.DotNetty.SimpleClient/JT808.DotNetty.SimpleClient.csproj @@ -0,0 +1,19 @@ + + + + Exe + netcoreapp2.2 + 7.3 + + + + + + + + + + + + + diff --git a/simples/JT808.DotNetty.SimpleClient/Program.cs b/simples/JT808.DotNetty.SimpleClient/Program.cs new file mode 100644 index 0000000..2f549bb --- /dev/null +++ b/simples/JT808.DotNetty.SimpleClient/Program.cs @@ -0,0 +1,38 @@ +using JT808.DotNetty.Client; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using JT808.Protocol.MessageBody; +using System.Text; +using System.Threading.Tasks; +using System.Threading; +using Microsoft.Extensions.Hosting; +using JT808.DotNetty.SimpleClient.Services; + +namespace JT808.DotNetty.SimpleClient +{ + class Program + { + static async Task Main(string[] args) + { + var serverHostBuilder = new HostBuilder() + .ConfigureLogging((context, logging) => + { + logging.AddConsole(); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddLogging(options => { + options.AddConsole(); + options.SetMinimumLevel(LogLevel.Trace); + }); + services.AddJT808Client(); + services.AddHostedService(); + }); + await serverHostBuilder.RunConsoleAsync(); + } + } +} diff --git a/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs b/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs new file mode 100644 index 0000000..f9251cd --- /dev/null +++ b/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs @@ -0,0 +1,68 @@ +using JT808.DotNetty.Client; +using JT808.Protocol.MessageBody; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.SimpleClient.Services +{ + public class UpService : IHostedService + { + private readonly IJT808TcpClientFactory jT808TcpClientFactory; + + public UpService(IJT808TcpClientFactory jT808TcpClientFactory) + { + this.jT808TcpClientFactory = jT808TcpClientFactory; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + JT808TcpClient client1 = jT808TcpClientFactory.Create(new DeviceConfig("12345678910", "127.0.0.1", 12808)); + //1.终端注册 + client1.Send(new JT808_0x0100() + { + PlateNo = "粤A12345", + PlateColor = 2, + AreaID = 0, + CityOrCountyId = 0, + MakerId = "Koike001", + TerminalId = "Koike001", + TerminalModel = "Koike001" + }); + //2.终端鉴权 + client1.Send(new JT808_0x0102() + { + Code = "1234" + }); + Task.Run(() => { + while (true) + { + var i = 0; + //3.每30秒发一次 + client1.Send(new JT808_0x0200() + { + Lat = 110000 + i, + Lng = 100000 + i, + GPSTime = DateTime.Now, + Speed = 50, + Direction = 30, + AlarmFlag = 5, + Altitude = 50, + StatusFlag = 10 + }); + i++; + Thread.Sleep(30000); + } + }); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + } +} diff --git a/simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs b/simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs new file mode 100644 index 0000000..7489978 --- /dev/null +++ b/simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs @@ -0,0 +1,59 @@ +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Interfaces; +using JT808.DotNetty.Core.Metadata; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.SimpleServer.Handlers +{ + public class JT808MsgIdTcpSimpleHandler : JT808MsgIdTcpHandlerBase + { + public JT808MsgIdTcpSimpleHandler( + ILoggerFactory loggerFactory, + JT808TcpSessionManager sessionManager) : base(sessionManager) + { + logger = loggerFactory.CreateLogger(); + } + + private readonly ILogger logger; + + public override IJT808Reply Msg0x0200(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0200"); + return base.Msg0x0200(request); + } + + public override IJT808Reply Msg0x0001(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0001"); + return base.Msg0x0001(request); + } + + public override IJT808Reply Msg0x0002(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0002"); + return base.Msg0x0002(request); + } + + public override IJT808Reply Msg0x0003(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0003"); + return base.Msg0x0003(request); + } + + public override IJT808Reply Msg0x0100(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0100"); + return base.Msg0x0100(request); + } + + public override IJT808Reply Msg0x0102(JT808Request request) + { + logger.LogDebug("Tcp_Msg0x0102"); + return base.Msg0x0102(request); + } + } +} diff --git a/simples/JT808.DotNetty.SimpleServer/JT808.DotNetty.SimpleServer.csproj b/simples/JT808.DotNetty.SimpleServer/JT808.DotNetty.SimpleServer.csproj new file mode 100644 index 0000000..d34d6bc --- /dev/null +++ b/simples/JT808.DotNetty.SimpleServer/JT808.DotNetty.SimpleServer.csproj @@ -0,0 +1,25 @@ + + + + Exe + netcoreapp2.2 + 7.3 + + + + + + + + + + + + + + + Always + + + + diff --git a/simples/JT808.DotNetty.SimpleServer/Program.cs b/simples/JT808.DotNetty.SimpleServer/Program.cs new file mode 100644 index 0000000..65d730f --- /dev/null +++ b/simples/JT808.DotNetty.SimpleServer/Program.cs @@ -0,0 +1,47 @@ + +using JT808.DotNetty.Core; +using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.SimpleServer.Handlers; +using JT808.DotNetty.Tcp; +using JT808.Protocol; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Threading.Tasks; + +namespace JT808.DotNetty.SimpleServer +{ + class Program + { + static async Task Main(string[] args) + { + var serverHostBuilder = new HostBuilder() + .ConfigureAppConfiguration((hostingContext, config) => + { + config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureLogging((context, logging) => + { + logging.AddConsole(); + logging.SetMinimumLevel(LogLevel.Trace); + }) + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddJT808Configure() + .AddJT808NettyCore(hostContext.Configuration) + .AddJT808TcpNettyHost() + // 自定义Tcp消息处理业务 + .ReplaceMsgIdHandler() + .Builder(); + }); + + await serverHostBuilder.RunConsoleAsync(); + } + } +} diff --git a/simples/JT808.DotNetty.Simples.sln b/simples/JT808.DotNetty.Simples.sln new file mode 100644 index 0000000..7619fac --- /dev/null +++ b/simples/JT808.DotNetty.Simples.sln @@ -0,0 +1,125 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.168 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B5A80356-5AF6-449F-9D8B-3C1BBB9D2443}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Protocol", "..\src\JT808.Protocol\src\JT808.Protocol\JT808.Protocol.csproj", "{9FCA2EE9-8253-41AA-A64C-9883413864F9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Udp", "..\src\JT808.DotNetty.Udp\JT808.DotNetty.Udp.csproj", "{C960084C-2CF4-4748-AD35-D2384285D6A3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Core", "..\src\JT808.DotNetty.Core\JT808.DotNetty.Core.csproj", "{67C5DC72-0004-48B3-BB5A-9CB7069B4F02}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Abstractions", "..\src\JT808.DotNetty.Abstractions\JT808.DotNetty.Abstractions.csproj", "{4DCF33C0-67C5-4179-AF1E-4E919F9F856D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{3BD7FF02-8516-4A77-A385-9FDCDD792E22}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Tcp", "..\src\JT808.DotNetty.Tcp\JT808.DotNetty.Tcp.csproj", "{330CD783-5564-4083-ABFC-573CDC369F50}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.WebApi", "..\src\JT808.DotNetty.WebApi\JT808.DotNetty.WebApi.csproj", "{B783DE53-CE2A-4225-921F-04E5E57B28F3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Core.Test", "..\src\JT808.DotNetty.Tests\JT808.DotNetty.Core.Test\JT808.DotNetty.Core.Test.csproj", "{1C4CCE9B-761B-4581-B5DA-5B6D83572D56}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Tcp.Test", "..\src\JT808.DotNetty.Tests\JT808.DotNetty.Tcp.Test\JT808.DotNetty.Tcp.Test.csproj", "{AEF1E1E2-C861-4268-86F6-6F376FAF79A7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Udp.Test", "..\src\JT808.DotNetty.Tests\JT808.DotNetty.Udp.Test\JT808.DotNetty.Udp.Test.csproj", "{E503BFD8-D90A-4610-97C7-5B9A0497303B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.WebApi.Test", "..\src\JT808.DotNetty.Tests\JT808.DotNetty.WebApi.Test\JT808.DotNetty.WebApi.Test.csproj", "{EDE77A29-0840-450C-8B08-2D3388845AE5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Hosting", "..\src\JT808.DotNetty.Tests\JT808.DotNetty.Hosting\JT808.DotNetty.Hosting.csproj", "{A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.WebApiClientTool", "..\src\JT808.DotNetty.WebApiClientTool\JT808.DotNetty.WebApiClientTool.csproj", "{9D86C951-94F2-4CBD-B177-8AF31DDB05D8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Client", "..\src\JT808.DotNetty.Client\JT808.DotNetty.Client.csproj", "{87C08239-C57F-4FC5-9579-05D0723AA4A0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simples", "simples", "{2459FB59-8A33-49A4-ADBC-A0B12C5886A6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.SimpleClient", "JT808.DotNetty.SimpleClient\JT808.DotNetty.SimpleClient.csproj", "{E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.SimpleServer", "JT808.DotNetty.SimpleServer\JT808.DotNetty.SimpleServer.csproj", "{CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9FCA2EE9-8253-41AA-A64C-9883413864F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FCA2EE9-8253-41AA-A64C-9883413864F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FCA2EE9-8253-41AA-A64C-9883413864F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FCA2EE9-8253-41AA-A64C-9883413864F9}.Release|Any CPU.Build.0 = Release|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C960084C-2CF4-4748-AD35-D2384285D6A3}.Release|Any CPU.Build.0 = Release|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67C5DC72-0004-48B3-BB5A-9CB7069B4F02}.Release|Any CPU.Build.0 = Release|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DCF33C0-67C5-4179-AF1E-4E919F9F856D}.Release|Any CPU.Build.0 = Release|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {330CD783-5564-4083-ABFC-573CDC369F50}.Release|Any CPU.Build.0 = Release|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B783DE53-CE2A-4225-921F-04E5E57B28F3}.Release|Any CPU.Build.0 = Release|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56}.Release|Any CPU.Build.0 = Release|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7}.Release|Any CPU.Build.0 = Release|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E503BFD8-D90A-4610-97C7-5B9A0497303B}.Release|Any CPU.Build.0 = Release|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDE77A29-0840-450C-8B08-2D3388845AE5}.Release|Any CPU.Build.0 = Release|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9}.Release|Any CPU.Build.0 = Release|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D86C951-94F2-4CBD-B177-8AF31DDB05D8}.Release|Any CPU.Build.0 = Release|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87C08239-C57F-4FC5-9579-05D0723AA4A0}.Release|Any CPU.Build.0 = Release|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}.Release|Any CPU.Build.0 = Release|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9FCA2EE9-8253-41AA-A64C-9883413864F9} = {B5A80356-5AF6-449F-9D8B-3C1BBB9D2443} + {1C4CCE9B-761B-4581-B5DA-5B6D83572D56} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {AEF1E1E2-C861-4268-86F6-6F376FAF79A7} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {E503BFD8-D90A-4610-97C7-5B9A0497303B} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {EDE77A29-0840-450C-8B08-2D3388845AE5} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {A0F2F006-5AEB-454E-83C5-ABFB58DE17A9} = {3BD7FF02-8516-4A77-A385-9FDCDD792E22} + {E6F61CE8-BFB4-4946-A0D3-AECCE77824E5} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} + {CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88} = {2459FB59-8A33-49A4-ADBC-A0B12C5886A6} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FC0FFCEA-E1EF-4C97-A1C5-F89418B6834B} + EndGlobalSection +EndGlobal diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808AtomicCounterDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808AtomicCounterDto.cs new file mode 100644 index 0000000..b61c2a8 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808AtomicCounterDto.cs @@ -0,0 +1,12 @@ +namespace JT808.DotNetty.Abstractions.Dtos +{ + ///