From 5903bd7179aa26489a838e30287855e2b1371b7c Mon Sep 17 00:00:00 2001 From: SmallChi <564952747@qq.com> Date: Wed, 17 Oct 2018 17:44:05 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E4=B8=BA=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=BA=94=E7=AD=94=E6=A8=A1=E5=BC=8F=202.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E7=AE=A1=E7=90=86=EF=BC=88=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E5=90=8E=EF=BC=8C=E8=AE=BE=E5=A4=87=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=8F=91=E9=80=81=E9=89=B4=E6=9D=83=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E9=80=9A=E9=81=93=E5=85=B3=E8=81=94=E4=B8=8D=E4=BA=86=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=8F=B7=E6=97=A0=E6=B3=95=E4=B8=8B=E5=8F=91=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=8C=87=E4=BB=A4=EF=BC=89=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=AF=8F=E6=9D=A1=E6=B6=88=E6=81=AF=E4=B8=8A=E6=9D=A5?= =?UTF-8?q?=E9=83=BD=E5=85=B3=E8=81=94=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JT808MsgIdCustomHandler.cs | 5 +- src/JT808.DotNetty.Hosting/Program.cs | 5 +- .../Handlers/JT808ConnectionHandler.cs | 8 ++ .../Handlers/JT808ServerHandler.cs | 13 ++- src/JT808.DotNetty/JT808MsgIdHandlerBase.cs | 89 +++++++++---------- src/JT808.DotNetty/JT808SessionManager.cs | 66 +------------- src/JT808.DotNetty/Metadata/JT808Request.cs | 21 +++++ src/JT808.DotNetty/Metadata/JT808Response.cs | 21 +++++ .../{ => Metadata}/JT808Session.cs | 2 +- 9 files changed, 115 insertions(+), 115 deletions(-) create mode 100644 src/JT808.DotNetty/Metadata/JT808Request.cs create mode 100644 src/JT808.DotNetty/Metadata/JT808Response.cs rename src/JT808.DotNetty/{ => Metadata}/JT808Session.cs (95%) diff --git a/src/JT808.DotNetty.Hosting/JT808MsgIdCustomHandler.cs b/src/JT808.DotNetty.Hosting/JT808MsgIdCustomHandler.cs index 59c39b2..6dbf591 100644 --- a/src/JT808.DotNetty.Hosting/JT808MsgIdCustomHandler.cs +++ b/src/JT808.DotNetty.Hosting/JT808MsgIdCustomHandler.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using DotNetty.Transport.Channels; +using JT808.DotNetty.Metadata; using JT808.Protocol; using Microsoft.Extensions.Logging; @@ -17,10 +18,10 @@ namespace JT808.DotNetty.Hosting logger = loggerFactory.CreateLogger(); } - public override JT808Package Msg0x0102(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public override JT808Response Msg0x0102(JT808Request request) { logger.LogDebug("Msg0x0102"); - return base.Msg0x0102(reqJT808Package, ctx); + return base.Msg0x0102(request); } } } diff --git a/src/JT808.DotNetty.Hosting/Program.cs b/src/JT808.DotNetty.Hosting/Program.cs index 26b7ae8..bed0717 100644 --- a/src/JT808.DotNetty.Hosting/Program.cs +++ b/src/JT808.DotNetty.Hosting/Program.cs @@ -4,6 +4,9 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; using System.Threading.Tasks; namespace JT808.DotNetty.Hosting @@ -30,7 +33,7 @@ namespace JT808.DotNetty.Hosting services.AddSingleton(); services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); // 自定义消息处理业务 - services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase),typeof(JT808MsgIdCustomHandler),ServiceLifetime.Singleton)); + services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase), typeof(JT808MsgIdCustomHandler), ServiceLifetime.Singleton)); }) .UseJT808Host(); await serverHostBuilder.RunConsoleAsync(); diff --git a/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs b/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs index e31aaed..ef39504 100644 --- a/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs +++ b/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs @@ -13,9 +13,13 @@ namespace JT808.DotNetty.Handlers { private readonly ILogger logger; + private readonly JT808SessionManager jT808SessionManager; + public JT808ConnectionHandler( + JT808SessionManager jT808SessionManager, ILoggerFactory loggerFactory) { + this.jT808SessionManager = jT808SessionManager; logger = loggerFactory.CreateLogger(); } @@ -40,6 +44,7 @@ namespace JT808.DotNetty.Handlers string channelId = context.Channel.Id.AsShortText(); if (logger.IsEnabled(LogLevel.Debug)) logger.LogDebug($">>>{ channelId } The client disconnects from the server."); + jT808SessionManager.RemoveSessionByID(channelId); base.ChannelInactive(context); } @@ -53,6 +58,7 @@ namespace JT808.DotNetty.Handlers string channelId = context.Channel.Id.AsShortText(); if (logger.IsEnabled(LogLevel.Debug)) logger.LogDebug($"<<<{ channelId } The server disconnects from the client."); + jT808SessionManager.RemoveSessionByID(channelId); return base.CloseAsync(context); } @@ -74,6 +80,7 @@ namespace JT808.DotNetty.Handlers string channelId = context.Channel.Id.AsShortText(); logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); // 由于808是设备发心跳,如果很久没有上报数据,那么就由服务器主动关闭连接。 + jT808SessionManager.RemoveSessionByID(channelId); context.CloseAsync(); } base.UserEventTriggered(context, evt); @@ -83,6 +90,7 @@ namespace JT808.DotNetty.Handlers { string channelId = context.Channel.Id.AsShortText(); logger.LogError(exception,$"{channelId} {exception.Message}" ); + jT808SessionManager.RemoveSessionByID(channelId); context.CloseAsync(); } } diff --git a/src/JT808.DotNetty/Handlers/JT808ServerHandler.cs b/src/JT808.DotNetty/Handlers/JT808ServerHandler.cs index e824053..0819111 100644 --- a/src/JT808.DotNetty/Handlers/JT808ServerHandler.cs +++ b/src/JT808.DotNetty/Handlers/JT808ServerHandler.cs @@ -4,29 +4,34 @@ using JT808.Protocol; using System; using System.Collections.Generic; using System.Text; +using JT808.DotNetty.Metadata; namespace JT808.DotNetty.Handlers { internal class JT808ServerHandler : SimpleChannelInboundHandler { private readonly JT808MsgIdHandlerBase handler; + + private readonly JT808SessionManager jT808SessionManager; - public JT808ServerHandler(JT808MsgIdHandlerBase handler) + public JT808ServerHandler(JT808MsgIdHandlerBase handler, JT808SessionManager jT808SessionManager) { this.handler = handler; + this.jT808SessionManager = jT808SessionManager; } protected override void ChannelRead0(IChannelHandlerContext ctx, JT808Package msg) { try { - Func handlerFunc; + jT808SessionManager.TryAddOrUpdateSession(new JT808Session(ctx.Channel, msg.Header.TerminalPhoneNo)); + Func handlerFunc; if (handler.HandlerDict.TryGetValue(msg.Header.MsgId, out handlerFunc)) { - JT808Package jT808Package = handlerFunc(msg, ctx); + JT808Response jT808Package = handlerFunc(new JT808Request(msg)); if (jT808Package != null) { - ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808Package))); + ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808Package.Package))); } } } diff --git a/src/JT808.DotNetty/JT808MsgIdHandlerBase.cs b/src/JT808.DotNetty/JT808MsgIdHandlerBase.cs index fbd62f6..db571c9 100644 --- a/src/JT808.DotNetty/JT808MsgIdHandlerBase.cs +++ b/src/JT808.DotNetty/JT808MsgIdHandlerBase.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using DotNetty.Transport.Channels; +using JT808.DotNetty.Metadata; using JT808.Protocol; using JT808.Protocol.Enums; using JT808.Protocol.Extensions; @@ -24,7 +25,7 @@ namespace JT808.DotNetty protected JT808MsgIdHandlerBase(JT808SessionManager sessionManager) { this.sessionManager = sessionManager; - HandlerDict = new Dictionary> + HandlerDict = new Dictionary> { {JT808MsgId.终端通用应答, Msg0x0001}, {JT808MsgId.终端鉴权, Msg0x0102}, @@ -37,21 +38,21 @@ namespace JT808.DotNetty }; } - public Dictionary> HandlerDict { get; } + public Dictionary> HandlerDict { get; } /// /// 终端通用应答 /// /// /// /// - public virtual JT808Package Msg0x0001(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0001(JT808Request request) { - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 终端心跳 @@ -59,15 +60,15 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0002(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0002(JT808Request request) { - sessionManager.Heartbeat(reqJT808Package.Header.TerminalPhoneNo); - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 终端注销 @@ -75,15 +76,14 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0003(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0003(JT808Request request) { - sessionManager.RemoveSessionByTerminalPhoneNo(reqJT808Package.Header.TerminalPhoneNo); - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 终端注册 @@ -91,14 +91,14 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0100(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0100(JT808Request request) { - return JT808MsgId.终端注册应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8100() + return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() { - Code = "J" + reqJT808Package.Header.TerminalPhoneNo, + Code = "J" + request.Package.Header.TerminalPhoneNo, JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 终端鉴权 @@ -106,15 +106,14 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0102(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0102(JT808Request request) { - sessionManager.RegisterSession(new JT808Session(ctx.Channel, reqJT808Package.Header.TerminalPhoneNo)); - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 位置信息汇报 @@ -122,14 +121,14 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0200(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0200(JT808Request request) { - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 定位数据批量上传 @@ -137,14 +136,14 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0704(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0704(JT808Request request) { - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } /// /// 数据上行透传 @@ -152,14 +151,14 @@ namespace JT808.DotNetty /// /// /// - public virtual JT808Package Msg0x0900(JT808Package reqJT808Package, IChannelHandlerContext ctx) + public virtual JT808Response Msg0x0900(JT808Request request) { - return JT808MsgId.平台通用应答.Create(reqJT808Package.Header.TerminalPhoneNo, new JT808_0x8001() + return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() { - MsgId = reqJT808Package.Header.MsgId, + MsgId = request.Package.Header.MsgId, JT808PlatformResult = JT808PlatformResult.Success, - MsgNum = reqJT808Package.Header.MsgNum - }); + MsgNum = request.Package.Header.MsgNum + })); } } } diff --git a/src/JT808.DotNetty/JT808SessionManager.cs b/src/JT808.DotNetty/JT808SessionManager.cs index 7f2a2f9..e49643c 100644 --- a/src/JT808.DotNetty/JT808SessionManager.cs +++ b/src/JT808.DotNetty/JT808SessionManager.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using JT808.DotNetty.Metadata; namespace JT808.DotNetty { @@ -60,19 +61,6 @@ namespace JT808.DotNetty } } - public void RegisterSession(JT808Session appSession) - { - if (TerminalPhoneNo_SessionId_Dict.ContainsKey(appSession.TerminalPhoneNo)) - { - return; - } - if (SessionIdDict.TryAdd(appSession.SessionID, appSession) && - TerminalPhoneNo_SessionId_Dict.TryAdd(appSession.TerminalPhoneNo, appSession.SessionID)) - { - return; - } - } - public JT808Session GetSessionByID(string sessionID) { if (string.IsNullOrEmpty(sessionID)) @@ -136,31 +124,10 @@ namespace JT808.DotNetty } } - /// - /// 通过通道Id和设备终端号进行关联 - /// - /// - /// - public void UpdateSessionByID(string sessionID, string terminalPhoneNo) + public void TryAddOrUpdateSession(JT808Session appSession) { - try - { - if (SessionIdDict.TryGetValue(sessionID, out JT808Session oldjT808Session)) - { - oldjT808Session.TerminalPhoneNo = terminalPhoneNo; - if (SessionIdDict.TryUpdate(sessionID, oldjT808Session, oldjT808Session)) - { - TerminalPhoneNo_SessionId_Dict.AddOrUpdate(terminalPhoneNo, sessionID, (tpn, sid) => - { - return sessionID; - }); - } - } - } - catch (Exception ex) - { - logger.LogError(ex, $"{sessionID},{terminalPhoneNo}"); - } + SessionIdDict.AddOrUpdate(appSession.SessionID, appSession, (x, y) => appSession); + TerminalPhoneNo_SessionId_Dict.AddOrUpdate(appSession.TerminalPhoneNo, appSession.SessionID, (x, y) => appSession.SessionID); } public void RemoveSessionByID(string sessionID) @@ -181,8 +148,6 @@ namespace JT808.DotNetty { logger.LogInformation($">>>{sessionID} Session Remove."); } - // call GPS.JT808NettyServer.Handlers.JT808ConnectionHandler.CloseAsync - session.Channel.CloseAsync(); } } catch (Exception ex) @@ -191,29 +156,6 @@ namespace JT808.DotNetty } } - public void RemoveSessionByTerminalPhoneNo(string terminalPhoneNo) - { - if (terminalPhoneNo == null) return; - try - { - if (TerminalPhoneNo_SessionId_Dict.TryRemove(terminalPhoneNo, out string sessionid)) - { - if (SessionIdDict.TryRemove(sessionid, out JT808Session session)) - { - logger.LogInformation($">>>{terminalPhoneNo}-{sessionid} TerminalPhoneNo Remove."); - } - else - { - logger.LogInformation($">>>{terminalPhoneNo} TerminalPhoneNo Remove."); - } - } - } - catch (Exception ex) - { - logger.LogError(ex, $">>>{terminalPhoneNo} TerminalPhoneNo Remove Exception."); - } - } - public void Dispose() { cancellationTokenSource.Cancel(); diff --git a/src/JT808.DotNetty/Metadata/JT808Request.cs b/src/JT808.DotNetty/Metadata/JT808Request.cs new file mode 100644 index 0000000..a81d4d1 --- /dev/null +++ b/src/JT808.DotNetty/Metadata/JT808Request.cs @@ -0,0 +1,21 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Metadata +{ + public class JT808Request + { + public JT808Package Package { get; set; } + + public JT808Request() + { + + } + public JT808Request(JT808Package package) + { + Package = package; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty/Metadata/JT808Response.cs b/src/JT808.DotNetty/Metadata/JT808Response.cs new file mode 100644 index 0000000..ff8c6ff --- /dev/null +++ b/src/JT808.DotNetty/Metadata/JT808Response.cs @@ -0,0 +1,21 @@ +using JT808.Protocol; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace JT808.DotNetty.Metadata +{ + public class JT808Response + { + public JT808Package Package { get; set; } + + public JT808Response() + { + + } + public JT808Response(JT808Package package) + { + Package = package; + } + } +} \ No newline at end of file diff --git a/src/JT808.DotNetty/JT808Session.cs b/src/JT808.DotNetty/Metadata/JT808Session.cs similarity index 95% rename from src/JT808.DotNetty/JT808Session.cs rename to src/JT808.DotNetty/Metadata/JT808Session.cs index da7aa9e..ba56136 100644 --- a/src/JT808.DotNetty/JT808Session.cs +++ b/src/JT808.DotNetty/Metadata/JT808Session.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Text; -namespace JT808.DotNetty +namespace JT808.DotNetty.Metadata { public class JT808Session {