diff --git a/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs b/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs index f9251cd..38eae07 100644 --- a/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs +++ b/simples/JT808.DotNetty.SimpleClient/Services/UpService.cs @@ -20,7 +20,7 @@ namespace JT808.DotNetty.SimpleClient.Services public Task StartAsync(CancellationToken cancellationToken) { - JT808TcpClient client1 = jT808TcpClientFactory.Create(new DeviceConfig("12345678910", "127.0.0.1", 12808)); + JT808TcpClient client1 = jT808TcpClientFactory.Create(new DeviceConfig("12345678910", "127.0.0.1", 808)); //1.终端注册 client1.Send(new JT808_0x0100() { @@ -41,7 +41,7 @@ namespace JT808.DotNetty.SimpleClient.Services while (true) { var i = 0; - //3.每30秒发一次 + //3.每5000秒发一次 client1.Send(new JT808_0x0200() { Lat = 110000 + i, @@ -54,7 +54,7 @@ namespace JT808.DotNetty.SimpleClient.Services StatusFlag = 10 }); i++; - Thread.Sleep(30000); + Thread.Sleep(5000); } }); return Task.CompletedTask; diff --git a/simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs b/simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs deleted file mode 100644 index 66260c9..0000000 --- a/simples/JT808.DotNetty.SimpleServer/Handlers/JT808MsgIdTcpSimpleHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ -using JT808.DotNetty.Core; -using JT808.DotNetty.Core.Handlers; -using JT808.DotNetty.Core.Interfaces; -using JT808.DotNetty.Core.Metadata; -using JT808.DotNetty.Core.Session; -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, - JT808SessionManager 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/Program.cs b/simples/JT808.DotNetty.SimpleServer/Program.cs index b51f6c9..8aaf524 100644 --- a/simples/JT808.DotNetty.SimpleServer/Program.cs +++ b/simples/JT808.DotNetty.SimpleServer/Program.cs @@ -1,7 +1,6 @@  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; diff --git a/src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs b/src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs deleted file mode 100644 index 9969bd0..0000000 --- a/src/JT808.DotNetty.Abstractions/IJT808DownlinkPacket.cs +++ /dev/null @@ -1,22 +0,0 @@ -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/IJT808MsgConsumer.cs b/src/JT808.DotNetty.Abstractions/IJT808MsgConsumer.cs new file mode 100644 index 0000000..4cc774d --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808MsgConsumer.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace JT808.DotNetty.Abstractions +{ + public interface IJT808MsgConsumer : IJT808PubSub, IDisposable + { + void OnMessage(Action<(string TerminalNo, byte[] Data)> callback); + CancellationTokenSource Cts { get; } + void Subscribe(); + void Unsubscribe(); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808MsgProducer.cs b/src/JT808.DotNetty.Abstractions/IJT808MsgProducer.cs new file mode 100644 index 0000000..8c5698f --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808MsgProducer.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Abstractions +{ + public interface IJT808MsgProducer : IJT808PubSub, IDisposable + { + /// + /// + /// + /// 设备终端号 + /// 808 hex data + Task ProduceAsync(string terminalNo, byte[] data); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808MsgReplyConsumer.cs b/src/JT808.DotNetty.Abstractions/IJT808MsgReplyConsumer.cs new file mode 100644 index 0000000..4464fe3 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808MsgReplyConsumer.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace JT808.DotNetty.Abstractions +{ + public interface IJT808MsgReplyConsumer : IJT808PubSub, IDisposable + { + void OnMessage(Action<(string TerminalNo, byte[] Data)> callback); + CancellationTokenSource Cts { get; } + void Subscribe(); + void Unsubscribe(); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808MsgReplyProducer.cs b/src/JT808.DotNetty.Abstractions/IJT808MsgReplyProducer.cs new file mode 100644 index 0000000..d3d7eec --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808MsgReplyProducer.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Abstractions +{ + public interface IJT808MsgReplyProducer : IJT808PubSub, IDisposable + { + /// + /// + /// + /// 设备终端号 + /// 808 hex data + Task ProduceAsync(string terminalNo, byte[] data); + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808PubSub.cs b/src/JT808.DotNetty.Abstractions/IJT808PubSub.cs new file mode 100644 index 0000000..69ff828 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/IJT808PubSub.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions +{ + public interface IJT808PubSub + { + string TopicName { get; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs b/src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs deleted file mode 100644 index f3fa1dd..0000000 --- a/src/JT808.DotNetty.Abstractions/IJT808SourcePackageDispatcher.cs +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 5198855..0000000 --- a/src/JT808.DotNetty.Abstractions/IJT808UplinkPacket.cs +++ /dev/null @@ -1,19 +0,0 @@ -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/JT808Constants.cs b/src/JT808.DotNetty.Abstractions/JT808Constants.cs index 616005a..5b1ad3b 100644 --- a/src/JT808.DotNetty.Abstractions/JT808Constants.cs +++ b/src/JT808.DotNetty.Abstractions/JT808Constants.cs @@ -6,6 +6,9 @@ public const string SessionOffline = "JT808SessionOffline"; + public const string MsgTopic = "jt808msgdefault"; + public const string MsgReplyTopic = "jt808msgreplydefault"; + public static class JT808WebApiRouteTable { public const string RouteTablePrefix = "/jt808api"; diff --git a/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs b/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs index d20a92b..ce7a395 100644 --- a/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs +++ b/src/JT808.DotNetty.CleintBenchmark/Services/CleintBenchmarkHostedService.cs @@ -49,7 +49,6 @@ namespace JT808.DotNetty.CleintBenchmark.Services { 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); diff --git a/src/JT808.DotNetty.CleintBenchmark/appsettings.json b/src/JT808.DotNetty.CleintBenchmark/appsettings.json index 0b507a3..fe9b3c0 100644 --- a/src/JT808.DotNetty.CleintBenchmark/appsettings.json +++ b/src/JT808.DotNetty.CleintBenchmark/appsettings.json @@ -13,8 +13,8 @@ } }, "ClientBenchmarkOptions": { - "IP": "127.0.0.1", + "IP": "", "Port": 808, - "DeviceCount": 10 + "DeviceCount": 1 } } diff --git a/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj b/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj index f08d5ee..7eb3e17 100644 --- a/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj +++ b/src/JT808.DotNetty.Client/JT808.DotNetty.Client.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs b/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs index 2c8790d..9550e2f 100644 --- a/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs +++ b/src/JT808.DotNetty.Client/JT808ClientDotnettyExtensions.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; +using JT808.Protocol; namespace JT808.DotNetty.Client { @@ -10,6 +11,7 @@ namespace JT808.DotNetty.Client { public static IServiceCollection AddJT808Client(this IServiceCollection serviceDescriptors) { + serviceDescriptors.AddJT808Configure(); serviceDescriptors.AddSingleton(); serviceDescriptors.AddSingleton(); serviceDescriptors.AddSingleton(); diff --git a/src/JT808.DotNetty.Client/JT808TcpClient.cs b/src/JT808.DotNetty.Client/JT808TcpClient.cs index 9967add..66ecdde 100644 --- a/src/JT808.DotNetty.Client/JT808TcpClient.cs +++ b/src/JT808.DotNetty.Client/JT808TcpClient.cs @@ -4,20 +4,16 @@ 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; +using JT808.Protocol; namespace JT808.DotNetty.Client { diff --git a/src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs b/src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs deleted file mode 100644 index b83aae4..0000000 --- a/src/JT808.DotNetty.Core/Handlers/JT808MsgIdTcpHandlerBase.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections.Generic; -using JT808.DotNetty.Core.Interfaces; -using JT808.DotNetty.Core.Metadata; -using JT808.DotNetty.Core.Session; -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 JT808SessionManager sessionManager { get; } - /// - /// 初始化消息处理业务 - /// - protected JT808MsgIdTcpHandlerBase(JT808SessionManager 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 deleted file mode 100644 index a8d798e..0000000 --- a/src/JT808.DotNetty.Core/Handlers/JT808MsgIdUdpHandlerBase.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Collections.Generic; -using JT808.DotNetty.Core.Interfaces; -using JT808.DotNetty.Core.Metadata; -using JT808.DotNetty.Core.Session; -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 JT808SessionManager sessionManager { get; } - /// - /// 初始化消息处理业务 - /// - protected JT808MsgIdUdpHandlerBase(JT808SessionManager 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 index 1a482ec..ef494bd 100644 --- a/src/JT808.DotNetty.Core/Impls/JT808DatagramPacketImpl.cs +++ b/src/JT808.DotNetty.Core/Impls/JT808DatagramPacketImpl.cs @@ -13,16 +13,8 @@ namespace JT808.DotNetty.Core.Impls { class JT808DatagramPacketImpl : IJT808DatagramPacket { - private readonly IJT808DownlinkPacket jT808DownlinkPacket; - public JT808DatagramPacketImpl( - IJT808DownlinkPacket jT808DownlinkPacket) - { - this.jT808DownlinkPacket = jT808DownlinkPacket; - } - public DatagramPacket Create(byte[] message, EndPoint recipient) { - jT808DownlinkPacket.ProcessorAsync(message, JT808TransportProtocolType.udp); return new DatagramPacket(Unpooled.WrappedBuffer(message), recipient); } } diff --git a/src/JT808.DotNetty.Core/Impls/JT808MsgProducerDefaultImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808MsgProducerDefaultImpl.cs new file mode 100644 index 0000000..5f2cde1 --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808MsgProducerDefaultImpl.cs @@ -0,0 +1,29 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Services; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Impls +{ + internal class JT808MsgProducerDefaultImpl : IJT808MsgProducer + { + private readonly JT808MsgService JT808MsgService; + public string TopicName => JT808Constants.MsgTopic; + public JT808MsgProducerDefaultImpl(JT808MsgService jT808MsgService) + { + JT808MsgService = jT808MsgService; + } + public void Dispose() + { + + } + + public Task ProduceAsync(string terminalNo, byte[] data) + { + JT808MsgService.MsgQueue.Add((terminalNo, data)); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808MsgReplyConsumerDefaultImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808MsgReplyConsumerDefaultImpl.cs new file mode 100644 index 0000000..a5d05f4 --- /dev/null +++ b/src/JT808.DotNetty.Core/Impls/JT808MsgReplyConsumerDefaultImpl.cs @@ -0,0 +1,193 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Services; +using JT808.Protocol; +using JT808.Protocol.Enums; +using JT808.Protocol.Extensions; +using JT808.Protocol.MessageBody; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using JT808Constants = JT808.DotNetty.Abstractions.JT808Constants; + +namespace JT808.DotNetty.Core.Impls +{ + internal class JT808MsgReplyConsumerDefaultImpl : IJT808MsgReplyConsumer + { + private readonly JT808MsgService JT808MsgService; + private readonly JT808Serializer JT808Serializer; + private Dictionary> HandlerDict; + public JT808MsgReplyConsumerDefaultImpl( + IJT808Config jT808Config, + JT808MsgService jT808MsgService) + { + JT808MsgService = jT808MsgService; + this.JT808Serializer = jT808Config.GetSerializer(); + 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 CancellationTokenSource Cts =>new CancellationTokenSource(); + + public string TopicName => JT808Constants.MsgReplyTopic; + + public void Dispose() + { + Cts.Dispose(); + } + + public void OnMessage(Action<(string TerminalNo, byte[] Data)> callback) + { + Task.Run(() => + { + foreach(var item in JT808MsgService.MsgQueue.GetConsumingEnumerable(Cts.Token)) + { + try + { + var package = JT808Serializer.HeaderDeserialize(item.Data); + if (HandlerDict.TryGetValue(package.Header.MsgId, out var func)) + { + var buffer = func(package); + if (buffer != null) + { + callback((item.TerminalNo, item.Data)); + } + } + } + catch (Exception ex) + { + + } + } + }, Cts.Token); + } + + public void Subscribe() + { + + } + + public void Unsubscribe() + { + Cts.Cancel(); + } + + /// + /// 终端通用应答 + /// 平台无需回复 + /// 实现自己的业务 + /// + /// + /// + public byte[] Msg0x0001(JT808HeaderPackage request) + { + return null; + } + /// + /// 终端心跳 + /// + /// + /// + public byte[] Msg0x0002(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 终端注销 + /// + /// + /// + public byte[] Msg0x0003(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 终端注册 + /// + /// + /// + public byte[] Msg0x0100(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100() + { + Code = "J" + request.Header.TerminalPhoneNo, + JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 终端鉴权 + /// + /// + /// + public byte[] Msg0x0102(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 位置信息汇报 + /// + /// + /// + public byte[] Msg0x0200(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 定位数据批量上传 + /// + /// + /// + public byte[] Msg0x0704(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + /// + /// 数据上行透传 + /// + /// + /// + public byte[] Msg0x0900(JT808HeaderPackage request) + { + return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() + { + MsgId = request.Header.MsgId, + JT808PlatformResult = JT808PlatformResult.成功, + MsgNum = request.Header.MsgNum + })); + } + } +} diff --git a/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs b/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs index 237bb6d..50341fc 100644 --- a/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs +++ b/src/JT808.DotNetty.Core/Impls/JT808NettyBuilderDefault.cs @@ -18,38 +18,26 @@ namespace JT808.DotNetty.Core.Impls 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 + public IJT808NettyBuilder ReplaceSessionPublishing() where T : IJT808SessionPublishing { - JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808DownlinkPacket), typeof(T), ServiceLifetime.Singleton)); + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808SessionPublishing), typeof(T), ServiceLifetime.Singleton)); return this; } - public IJT808NettyBuilder ReplaceUplinkPacket() where T : IJT808UplinkPacket + public IJT808NettyBuilder ReplaceMsgProducer() where T : IJT808MsgProducer { - JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808UplinkPacket), typeof(T), ServiceLifetime.Singleton)); + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808MsgProducer), typeof(T), ServiceLifetime.Singleton)); return this; } - public IJT808NettyBuilder ReplaceSessionPublishing() where T : IJT808SessionPublishing + public IJT808NettyBuilder ReplaceMsgReplyConsumer() where T : IJT808MsgReplyConsumer { - JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808SessionPublishing), typeof(T), ServiceLifetime.Singleton)); + JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808MsgReplyConsumer), typeof(T), ServiceLifetime.Singleton)); return this; } } diff --git a/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs b/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs index af7aa6c..859273b 100644 --- a/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs +++ b/src/JT808.DotNetty.Core/Impls/JT808SessionPublishingEmptyImpl.cs @@ -1,12 +1,22 @@ using JT808.DotNetty.Abstractions; +using Microsoft.Extensions.Logging; using System.Threading.Tasks; namespace JT808.DotNetty.Core { internal class JT808SessionPublishingEmptyImpl : IJT808SessionPublishing { + private readonly ILogger logger; + public JT808SessionPublishingEmptyImpl(ILoggerFactory loggerFactory) + { + logger = loggerFactory.CreateLogger(); + } public Task PublishAsync(string topicName, string value) { + if (logger.IsEnabled(LogLevel.Debug)) + { + logger.LogDebug($"{topicName}-{value}"); + } return Task.CompletedTask; } } diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs index 5ffc289..d495cae 100644 --- a/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs +++ b/src/JT808.DotNetty.Core/Interfaces/IJT808NettyBuilder.cs @@ -11,6 +11,7 @@ namespace JT808.DotNetty.Core.Interfaces { IJT808Builder JT808Builder { get; } IJT808NettyBuilder ReplaceSessionPublishing() where T : IJT808SessionPublishing; + IJT808NettyBuilder ReplaceMsgProducer() where T : IJT808MsgProducer; IJT808Builder Builder(); } } diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs deleted file mode 100644 index c7a5527..0000000 --- a/src/JT808.DotNetty.Core/Interfaces/IJT808TcpNettyBuilder.cs +++ /dev/null @@ -1,13 +0,0 @@ -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(); - } -} diff --git a/src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs b/src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs deleted file mode 100644 index 870fcd5..0000000 --- a/src/JT808.DotNetty.Core/Interfaces/IJT808UdpNettyBuilder.cs +++ /dev/null @@ -1,13 +0,0 @@ -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(); - } -} diff --git a/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj b/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj index ce0e709..6efc62c 100644 --- a/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj +++ b/src/JT808.DotNetty.Core/JT808.DotNetty.Core.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs b/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs index e859a83..54228cb 100644 --- a/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs +++ b/src/JT808.DotNetty.Core/JT808CoreDotnettyExtensions.cs @@ -63,6 +63,11 @@ namespace JT808.DotNetty.Core 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(); + nettyBuilder.JT808Builder.Services.AddHostedService(); return nettyBuilder; } @@ -85,6 +90,11 @@ namespace JT808.DotNetty.Core 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(); + nettyBuilder.JT808Builder.Services.AddHostedService(); return nettyBuilder; } } diff --git a/src/JT808.DotNetty.Core/Services/JT808MsgReplyHostedService.cs b/src/JT808.DotNetty.Core/Services/JT808MsgReplyHostedService.cs new file mode 100644 index 0000000..633e574 --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808MsgReplyHostedService.cs @@ -0,0 +1,42 @@ +using JT808.DotNetty.Abstractions; +using JT808.DotNetty.Core.Session; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace JT808.DotNetty.Core.Services +{ + internal class JT808MsgReplyHostedService : IHostedService + { + private readonly JT808SessionManager JT808SessionManager; + + private readonly IJT808MsgReplyConsumer JT808MsgReplyConsumer; + + public JT808MsgReplyHostedService( + IJT808MsgReplyConsumer jT808MsgReplyConsumer, + JT808SessionManager jT808SessionManager) + { + JT808MsgReplyConsumer = jT808MsgReplyConsumer; + JT808SessionManager = jT808SessionManager; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + JT808MsgReplyConsumer.OnMessage(item => + { + JT808SessionManager.Send(item.TerminalNo, item.Data); + }); + JT808MsgReplyConsumer.Subscribe(); + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + JT808MsgReplyConsumer.Unsubscribe(); + return Task.CompletedTask; + } + } +} diff --git a/src/JT808.DotNetty.Core/Services/JT808MsgService.cs b/src/JT808.DotNetty.Core/Services/JT808MsgService.cs new file mode 100644 index 0000000..2c271aa --- /dev/null +++ b/src/JT808.DotNetty.Core/Services/JT808MsgService.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Core.Services +{ + internal class JT808MsgService + { + public System.Collections.Concurrent.BlockingCollection<(string TerminalNo, byte[] Data)> MsgQueue { get; set; } = new System.Collections.Concurrent.BlockingCollection<(string TerminalNo, byte[] Data)>(); + } +} diff --git a/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs b/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs index 887ae91..b9d7770 100644 --- a/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs +++ b/src/JT808.DotNetty.Core/Session/JT808SessionManager.cs @@ -120,6 +120,21 @@ namespace JT808.DotNetty.Core.Session } return isSuccessed; } + public void Send(string terminalPhoneNo, byte[] data) + { + var session = GetSessionByTerminalPhoneNo(terminalPhoneNo); + if (session != null) + { + if (session.TransportProtocolType == JT808TransportProtocolType.tcp) + { + session.Channel.WriteAndFlushAsync(new JT808Response(data)); + } + else if (session.TransportProtocolType == JT808TransportProtocolType.udp) + { + session.Channel.WriteAndFlushAsync(jT808DatagramPacket.Create(data, ((JT808UdpSession)session).Sender)); + } + } + } public bool TrySend(string terminalPhoneNo, IJT808Reply reply, out string message) { bool isSuccessed; diff --git a/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs b/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs index b5534ed..f815e1f 100644 --- a/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs +++ b/src/JT808.DotNetty.Tcp/Handlers/JT808TcpServerHandler.cs @@ -9,6 +9,7 @@ using JT808.DotNetty.Abstractions.Enums; using JT808.Protocol.Interfaces; using JT808.Protocol.Exceptions; using JT808.DotNetty.Core.Session; +using JT808.DotNetty.Abstractions; namespace JT808.DotNetty.Tcp.Handlers { @@ -25,13 +26,17 @@ namespace JT808.DotNetty.Tcp.Handlers private readonly JT808Serializer JT808Serializer; + private readonly IJT808MsgProducer JT808MsgProducer; + public JT808TcpServerHandler( + IJT808MsgProducer jT808MsgProducer, IJT808Config jT808Config, ILoggerFactory loggerFactory, JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory, JT808SessionManager jT808SessionManager) { this.jT808SessionManager = jT808SessionManager; + this.JT808MsgProducer = jT808MsgProducer; this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.tcp); this.JT808Serializer = jT808Config.GetSerializer(); logger = loggerFactory.CreateLogger(); @@ -51,6 +56,7 @@ namespace JT808.DotNetty.Tcp.Handlers logger.LogTrace($"accept package success count=>{jT808AtomicCounterService.MsgSuccessCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg)}"); } jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo,ctx.Channel); + JT808MsgProducer.ProduceAsync(jT808HeaderPackage.Header.TerminalPhoneNo, msg); } catch (JT808Exception ex) { diff --git a/src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs b/src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs deleted file mode 100644 index 6050716..0000000 --- a/src/JT808.DotNetty.Tcp/JT808TcpBuilderDefault.cs +++ /dev/null @@ -1,25 +0,0 @@ -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; - } - } -} diff --git a/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs b/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs index b6e9b3a..203075d 100644 --- a/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs +++ b/src/JT808.DotNetty.Tcp/JT808TcpDotnettyExtensions.cs @@ -1,17 +1,9 @@ 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.Interfaces; -using JT808.DotNetty.Internal; [assembly: InternalsVisibleTo("JT808.DotNetty.Tcp.Test")] @@ -19,14 +11,14 @@ namespace JT808.DotNetty.Tcp { public static class JT808TcpDotnettyExtensions { - public static IJT808TcpNettyBuilder AddJT808TcpNettyHost(this IJT808NettyBuilder jT808NettyBuilder) + public static IJT808NettyBuilder AddJT808TcpNettyHost(this IJT808NettyBuilder jT808NettyBuilder) { jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); jT808NettyBuilder.JT808Builder.Services.AddHostedService(); - return new JT808TcpBuilderDefault(jT808NettyBuilder); + return jT808NettyBuilder; } } } \ No newline at end of file diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs index edb4002..cf98510 100644 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Core.Test/SeedTcpSession.cs @@ -13,7 +13,7 @@ namespace JT808.DotNetty.Core.Test public class SeedTcpSession { public JT808SessionManager jT80TcpSessionManager = new JT808SessionManager( - new JT808SessionPublishingEmptyImpl(), + new JT808SessionPublishingEmptyImpl(new LoggerFactory()), new LoggerFactory()); public SeedTcpSession() diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs deleted file mode 100644 index 146eb99..0000000 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdTcpCustomHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ -using JT808.DotNetty.Core; -using JT808.DotNetty.Core.Handlers; -using JT808.DotNetty.Core.Interfaces; -using JT808.DotNetty.Core.Metadata; -using JT808.DotNetty.Core.Session; -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, - JT808SessionManager 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 deleted file mode 100644 index e153b44..0000000 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Handlers/JT808MsgIdUdpCustomHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ -using JT808.DotNetty.Core; -using JT808.DotNetty.Core.Handlers; -using JT808.DotNetty.Core.Interfaces; -using JT808.DotNetty.Core.Metadata; -using JT808.DotNetty.Core.Session; -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, - JT808SessionManager 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 deleted file mode 100644 index af0abb1..0000000 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Impls/JT808DownlinkPacketLogging.cs +++ /dev/null @@ -1,25 +0,0 @@ -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/Program.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs index b786a06..3402aa0 100644 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/Program.cs @@ -1,8 +1,6 @@ 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; @@ -55,20 +53,18 @@ namespace JT808.DotNetty.Hosting services.AddJT808Configure() .AddJT808NettyCore(hostContext.Configuration) .AddJT808TcpNettyHost() - .Builder() - .AddJT808UdpNettyHost() - .Builder() + //.AddJT808UdpNettyHost() .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; + //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 index 6603db6..f656c3e 100644 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/appsettings.json +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.Hosting/appsettings.json @@ -15,9 +15,6 @@ "JT808Configuration": { "TcpPort": 808, "UdpPort": 808, - "WebApiPort": 828, - "ForwardingRemoteIPAddress": [ - //"172.16.19.209" - ] + "WebApiPort": 828 } } diff --git a/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs index 8309c83..6970417 100644 --- a/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs +++ b/src/JT808.DotNetty.Tests/JT808.DotNetty.WebApi.Test/TestBase.cs @@ -38,9 +38,7 @@ namespace JT808.DotNetty.WebApi.Test services.AddJT808Configure() .AddJT808NettyCore(hostContext.Configuration) .AddJT808TcpNettyHost() - .Builder() .AddJT808UdpNettyHost() - .Builder() .AddJT808WebApiNettyHost(); }); var build = serverHostBuilder.Build(); diff --git a/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs b/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs index ccf589d..6242579 100644 --- a/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs +++ b/src/JT808.DotNetty.Udp/Handlers/JT808UdpServerHandler.cs @@ -9,6 +9,7 @@ using JT808.DotNetty.Core; using JT808.DotNetty.Abstractions.Enums; using JT808.Protocol.Interfaces; using JT808.DotNetty.Core.Session; +using JT808.DotNetty.Abstractions; namespace JT808.DotNetty.Udp.Handlers { @@ -25,12 +26,16 @@ namespace JT808.DotNetty.Udp.Handlers private readonly JT808Serializer JT808Serializer; + private readonly IJT808MsgProducer JT808MsgProducer; + public JT808UdpServerHandler( + IJT808MsgProducer jT808MsgProducer, IJT808Config jT808Config, ILoggerFactory loggerFactory, JT808AtomicCounterServiceFactory jT808AtomicCounterServiceFactory, JT808SessionManager jT808UdpSessionManager) { + this.JT808MsgProducer = jT808MsgProducer; this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(JT808TransportProtocolType.udp); this.jT808UdpSessionManager = jT808UdpSessionManager; logger = loggerFactory.CreateLogger(); @@ -47,6 +52,7 @@ namespace JT808.DotNetty.Udp.Handlers JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize(msg.Buffer); jT808AtomicCounterService.MsgSuccessIncrement(); jT808UdpSessionManager.TryAdd(ctx.Channel, msg.Sender, jT808HeaderPackage.Header.TerminalPhoneNo); + JT808MsgProducer.ProduceAsync(jT808HeaderPackage.Header.TerminalPhoneNo, msg.Buffer); if (logger.IsEnabled(LogLevel.Trace)) { logger.LogTrace($"accept package success count=>{jT808AtomicCounterService.MsgFailCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg.Buffer)}"); diff --git a/src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs b/src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs deleted file mode 100644 index ddec822..0000000 --- a/src/JT808.DotNetty.Udp/JT1078UdpBuilderDefault.cs +++ /dev/null @@ -1,21 +0,0 @@ -using JT808.DotNetty.Core.Interfaces; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; - -namespace JT808.DotNetty.Udp -{ - class JT1078UdpBuilderDefault : IJT808UdpNettyBuilder - { - public IJT808NettyBuilder Instance { get; } - - public JT1078UdpBuilderDefault(IJT808NettyBuilder builder) - { - Instance = builder; - } - - public IJT808NettyBuilder Builder() - { - return Instance; - } - } -} \ No newline at end of file diff --git a/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs b/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs index 9d405bc..ce55477 100644 --- a/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs +++ b/src/JT808.DotNetty.Udp/JT808UdpDotnettyExtensions.cs @@ -1,14 +1,9 @@ -using JT808.DotNetty.Core; -using JT808.DotNetty.Core.Codecs; -using JT808.DotNetty.Core.Handlers; +using JT808.DotNetty.Core.Codecs; using JT808.DotNetty.Core.Impls; using JT808.DotNetty.Core.Interfaces; -using JT808.DotNetty.Core.Services; -using JT808.DotNetty.Internal; using JT808.DotNetty.Udp.Handlers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using System; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("JT808.DotNetty.Udp.Test")] @@ -17,13 +12,13 @@ namespace JT808.DotNetty.Udp { public static class JT808UdpDotnettyExtensions { - public static IJT808UdpNettyBuilder AddJT808UdpNettyHost(this IJT808NettyBuilder jT808NettyBuilder) + public static IJT808NettyBuilder AddJT808UdpNettyHost(this IJT808NettyBuilder jT808NettyBuilder) { jT808NettyBuilder.JT808Builder.Services.TryAddSingleton(); jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); jT808NettyBuilder.JT808Builder.Services.TryAddScoped(); jT808NettyBuilder.JT808Builder.Services.AddHostedService(); - return new JT1078UdpBuilderDefault(jT808NettyBuilder); + return jT808NettyBuilder; } } } \ No newline at end of file diff --git a/src/SharedProperties.props b/src/SharedProperties.props index c5f522f..fc09c39 100644 --- a/src/SharedProperties.props +++ b/src/SharedProperties.props @@ -9,7 +9,7 @@ https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE false - 2.1.2 + 2.2.0 false LICENSE true