@@ -1,5 +1,6 @@ | |||
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; | |||
@@ -19,37 +20,37 @@ namespace JT808.DotNetty.SimpleServer.Handlers | |||
private readonly ILogger<JT808MsgIdTcpSimpleHandler> logger; | |||
public override JT808Response Msg0x0200(JT808Request request) | |||
public override IJT808Reply Msg0x0200(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0200"); | |||
return base.Msg0x0200(request); | |||
} | |||
public override JT808Response Msg0x0001(JT808Request request) | |||
public override IJT808Reply Msg0x0001(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0001"); | |||
return base.Msg0x0001(request); | |||
} | |||
public override JT808Response Msg0x0002(JT808Request request) | |||
public override IJT808Reply Msg0x0002(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0002"); | |||
return base.Msg0x0002(request); | |||
} | |||
public override JT808Response Msg0x0003(JT808Request request) | |||
public override IJT808Reply Msg0x0003(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0003"); | |||
return base.Msg0x0003(request); | |||
} | |||
public override JT808Response Msg0x0100(JT808Request request) | |||
public override IJT808Reply Msg0x0100(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0100"); | |||
return base.Msg0x0100(request); | |||
} | |||
public override JT808Response Msg0x0102(JT808Request request) | |||
public override IJT808Reply Msg0x0102(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0102"); | |||
return base.Msg0x0102(request); | |||
@@ -56,7 +56,6 @@ namespace JT808.DotNetty.Client | |||
channel.Pipeline.AddLast("jt808TcpClientConnection", new JT808TcpClientConnectionHandler(this)); | |||
channel.Pipeline.AddLast("jt808TcpService", new JT808TcpClientHandler(this)); | |||
})); | |||
clientChannel = bootstrap.ConnectAsync(IPAddress.Parse(DeviceConfig.TcpHost), DeviceConfig.TcpPort).Result; | |||
} | |||
@@ -79,7 +78,6 @@ namespace JT808.DotNetty.Client | |||
} | |||
if (disposing) | |||
{ | |||
// 清理托管资源 | |||
group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)); | |||
} | |||
@@ -0,0 +1,52 @@ | |||
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; | |||
namespace JT808.DotNetty.Core.Codecs | |||
{ | |||
/// <summary> | |||
/// tcp统一下发出口 | |||
/// </summary> | |||
public class JT808TcpEncoder : MessageToByteEncoder<IJT808Reply> | |||
{ | |||
private readonly ILogger<JT808TcpEncoder> logger; | |||
private readonly JT808TrafficService jT808TrafficService; | |||
public JT808TcpEncoder(ILoggerFactory loggerFactory, JT808TrafficServiceFactory jT808TrafficServiceFactory) | |||
{ | |||
logger = loggerFactory.CreateLogger<JT808TcpEncoder>(); | |||
this.jT808TrafficService = jT808TrafficServiceFactory.Create(Core.Enums.JT808ModeType.Tcp); | |||
} | |||
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); | |||
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); | |||
output.WriteBytes(Unpooled.WrappedBuffer(message.HexData)); | |||
} | |||
} | |||
} | |||
} |
@@ -1,5 +1,6 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using JT808.DotNetty.Core.Interfaces; | |||
using JT808.DotNetty.Core.Metadata; | |||
using JT808.Protocol.Enums; | |||
using JT808.Protocol.Extensions; | |||
@@ -24,7 +25,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
protected JT808MsgIdTcpHandlerBase(JT808TcpSessionManager sessionManager) | |||
{ | |||
this.sessionManager = sessionManager; | |||
HandlerDict = new Dictionary<ushort, Func<JT808Request, JT808Response>> | |||
HandlerDict = new Dictionary<ushort, Func<JT808Request, IJT808Reply>> | |||
{ | |||
{JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | |||
{JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, | |||
@@ -37,7 +38,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
}; | |||
} | |||
public Dictionary<ushort, Func<JT808Request, JT808Response>> HandlerDict { get; protected set; } | |||
public Dictionary<ushort, Func<JT808Request, IJT808Reply>> HandlerDict { get; protected set; } | |||
/// <summary> | |||
/// 终端通用应答 | |||
/// 平台无需回复 | |||
@@ -45,7 +46,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0001(JT808Request request) | |||
public virtual IJT808Reply Msg0x0001(JT808Request request) | |||
{ | |||
return null; | |||
} | |||
@@ -54,7 +55,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0002(JT808Request request) | |||
public virtual IJT808Reply Msg0x0002(JT808Request request) | |||
{ | |||
sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
@@ -69,7 +70,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0003(JT808Request request) | |||
public virtual IJT808Reply Msg0x0003(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -83,7 +84,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0100(JT808Request request) | |||
public virtual IJT808Reply Msg0x0100(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() | |||
{ | |||
@@ -97,7 +98,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0102(JT808Request request) | |||
public virtual IJT808Reply Msg0x0102(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -111,7 +112,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0200(JT808Request request) | |||
public virtual IJT808Reply Msg0x0200(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -125,7 +126,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0704(JT808Request request) | |||
public virtual IJT808Reply Msg0x0704(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -139,7 +140,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0900(JT808Request request) | |||
public virtual IJT808Reply Msg0x0900(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -1,5 +1,6 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using JT808.DotNetty.Core.Interfaces; | |||
using JT808.DotNetty.Core.Metadata; | |||
using JT808.Protocol.Enums; | |||
using JT808.Protocol.Extensions; | |||
@@ -24,7 +25,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
protected JT808MsgIdUdpHandlerBase(JT808UdpSessionManager sessionManager) | |||
{ | |||
this.sessionManager = sessionManager; | |||
HandlerDict = new Dictionary<ushort, Func<JT808Request, JT808Response>> | |||
HandlerDict = new Dictionary<ushort, Func<JT808Request, IJT808Reply>> | |||
{ | |||
{JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | |||
{JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, | |||
@@ -37,7 +38,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
}; | |||
} | |||
public Dictionary<ushort, Func<JT808Request, JT808Response>> HandlerDict { get; protected set; } | |||
public Dictionary<ushort, Func<JT808Request, IJT808Reply>> HandlerDict { get; protected set; } | |||
/// <summary> | |||
/// 终端通用应答 | |||
/// 平台无需回复 | |||
@@ -45,7 +46,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0001(JT808Request request) | |||
public virtual IJT808Reply Msg0x0001(JT808Request request) | |||
{ | |||
return null; | |||
} | |||
@@ -54,7 +55,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0002(JT808Request request) | |||
public virtual IJT808Reply Msg0x0002(JT808Request request) | |||
{ | |||
sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
@@ -69,7 +70,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0003(JT808Request request) | |||
public virtual IJT808Reply Msg0x0003(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -83,7 +84,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0100(JT808Request request) | |||
public virtual IJT808Reply Msg0x0100(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() | |||
{ | |||
@@ -97,7 +98,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0102(JT808Request request) | |||
public virtual IJT808Reply Msg0x0102(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -112,7 +113,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// <param name="reqJT808Package"></param> | |||
/// <param name="ctx"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0200(JT808Request request) | |||
public virtual IJT808Reply Msg0x0200(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -126,7 +127,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0704(JT808Request request) | |||
public virtual IJT808Reply Msg0x0704(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -140,7 +141,7 @@ namespace JT808.DotNetty.Core.Handlers | |||
/// </summary> | |||
/// <param name="request"></param> | |||
/// <returns></returns> | |||
public virtual JT808Response Msg0x0900(JT808Request request) | |||
public virtual IJT808Reply Msg0x0900(JT808Request request) | |||
{ | |||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | |||
{ | |||
@@ -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; } | |||
/// <summary> | |||
/// 根据实际情况适当调整包的大小 | |||
/// </summary> | |||
int MinBufferSize { get; set; } | |||
} | |||
} |
@@ -27,7 +27,7 @@ | |||
<PackageReference Include="DotNetty.Codecs" Version="0.6.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | |||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" /> | |||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" /> | |||
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> | |||
<PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | |||
</ItemGroup> | |||
@@ -1,17 +1,15 @@ | |||
using JT808.Protocol; | |||
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 | |||
public class JT808Response: IJT808Reply | |||
{ | |||
public JT808Package Package { get; set; } | |||
public byte[] HexData { get; set; } | |||
/// <summary> | |||
/// 根据实际情况适当调整包的大小 | |||
/// </summary> | |||
public int MinBufferSize { get; set; } | |||
public JT808Response() | |||
@@ -2,6 +2,7 @@ | |||
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; | |||
@@ -12,13 +13,9 @@ namespace JT808.DotNetty.Internal | |||
{ | |||
private readonly JT808TcpSessionManager jT808SessionManager; | |||
private readonly JT808TrafficService jT808TrafficService; | |||
public JT808UnificationTcpSendService( | |||
JT808TrafficServiceFactory jT808TrafficServiceFactory, | |||
JT808TcpSessionManager jT808SessionManager) | |||
{ | |||
this.jT808TrafficService = jT808TrafficServiceFactory.Create(Core.Enums.JT808ModeType.Tcp); | |||
this.jT808SessionManager = jT808SessionManager; | |||
} | |||
@@ -27,29 +24,16 @@ namespace JT808.DotNetty.Internal | |||
JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>(); | |||
try | |||
{ | |||
var session = jT808SessionManager.GetSession(terminalPhoneNo); | |||
if (session != null) | |||
if(jT808SessionManager.TrySend(terminalPhoneNo, data, out var message)) | |||
{ | |||
//判断转发数据是下发不了消息的 | |||
if (jT808SessionManager.GetAll().Count(c => c.Channel.Id == session.Channel.Id) > 1) | |||
{ | |||
resultDto.Code = JT808ResultCode.Ok; | |||
resultDto.Data = false; | |||
resultDto.Message = "not support transmit data send."; | |||
} | |||
else | |||
{ | |||
jT808TrafficService.SendSize(data.Length); | |||
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); | |||
resultDto.Code = JT808ResultCode.Ok; | |||
resultDto.Data = true; | |||
} | |||
resultDto.Code = JT808ResultCode.Ok; | |||
resultDto.Data = false; | |||
} | |||
else | |||
{ | |||
resultDto.Code = JT808ResultCode.Ok; | |||
resultDto.Data = false; | |||
resultDto.Message = "offline"; | |||
resultDto.Message = message; | |||
} | |||
} | |||
catch (Exception ex) | |||
@@ -6,6 +6,7 @@ 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 | |||
{ | |||
@@ -60,6 +61,60 @@ namespace JT808.DotNetty.Core | |||
} | |||
} | |||
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 = ""; | |||
} | |||
} | |||
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 = ""; | |||
} | |||
} | |||
else | |||
{ | |||
isSuccessed = false; | |||
message = "offline"; | |||
} | |||
return isSuccessed; | |||
} | |||
public void TryAdd(string terminalPhoneNo,IChannel channel) | |||
{ | |||
// 解决了设备号跟通道绑定到一起,不需要用到通道本身的SessionId | |||
@@ -8,6 +8,7 @@ using Microsoft.Extensions.Logging; | |||
using JT808.DotNetty.Core.Handlers; | |||
using JT808.DotNetty.Core.Services; | |||
using JT808.DotNetty.Core.Metadata; | |||
using JT808.DotNetty.Core.Interfaces; | |||
namespace JT808.DotNetty.Tcp.Handlers | |||
{ | |||
@@ -30,6 +31,8 @@ namespace JT808.DotNetty.Tcp.Handlers | |||
private readonly ILogger<JT808TcpServerHandler> logger; | |||
private readonly ILogger unknownLogger; | |||
public JT808TcpServerHandler( | |||
JT808TrafficServiceFactory jT808TrafficServiceFactory, | |||
ILoggerFactory loggerFactory, | |||
@@ -46,6 +49,7 @@ namespace JT808.DotNetty.Tcp.Handlers | |||
this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher; | |||
this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(Core.Enums.JT808ModeType.Tcp); | |||
logger = loggerFactory.CreateLogger<JT808TcpServerHandler>(); | |||
unknownLogger = loggerFactory.CreateLogger("tcp_unknown_msgid"); | |||
} | |||
@@ -65,20 +69,25 @@ namespace JT808.DotNetty.Tcp.Handlers | |||
logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); | |||
} | |||
jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo,ctx.Channel); | |||
Func<JT808Request, JT808Response> handlerFunc; | |||
if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out handlerFunc)) | |||
if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out var handlerFunc)) | |||
{ | |||
JT808Response jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg)); | |||
IJT808Reply jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg)); | |||
if (jT808Response != null) | |||
{ | |||
if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) | |||
{ | |||
var sendData = JT808Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize); | |||
jT808TrafficService.SendSize(sendData.Length); | |||
ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(sendData)); | |||
ctx.WriteAndFlushAsync(jT808Response); | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
//未知的消息类型已日志形式输出 | |||
if (unknownLogger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
unknownLogger.LogDebug(ByteBufferUtil.HexDump(msg)); | |||
} | |||
} | |||
} | |||
catch (JT808.Protocol.Exceptions.JT808Exception ex) | |||
{ | |||
@@ -24,6 +24,7 @@ namespace JT808.DotNetty.Tcp | |||
serviceDescriptors.TryAddSingleton<JT808TransmitAddressFilterService>(); | |||
serviceDescriptors.TryAddSingleton<JT808MsgIdTcpHandlerBase, JT808MsgIdDefaultTcpHandler>(); | |||
serviceDescriptors.TryAddScoped<JT808TcpConnectionHandler>(); | |||
serviceDescriptors.TryAddScoped<JT808TcpEncoder>(); | |||
serviceDescriptors.TryAddScoped<JT808TcpDecoder>(); | |||
serviceDescriptors.TryAddScoped<JT808TcpServerHandler>(); | |||
serviceDescriptors.AddHostedService<JT808TcpAtomicCouterResetDailyJob>(); | |||
@@ -65,15 +65,16 @@ namespace JT808.DotNetty.Tcp | |||
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<JT808TcpDecoder>()); | |||
channel.Pipeline.AddLast("jt808TcpEncode", scope.ServiceProvider.GetRequiredService<JT808TcpEncoder>()); | |||
channel.Pipeline.AddLast("systemIdleState", new IdleStateHandler( | |||
configuration.ReaderIdleTimeSeconds, | |||
configuration.WriterIdleTimeSeconds, | |||
configuration.AllIdleTimeSeconds)); | |||
channel.Pipeline.AddLast("jt808TcpConnection", scope.ServiceProvider.GetRequiredService<JT808TcpConnectionHandler>()); | |||
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<JT808TcpDecoder>()); | |||
channel.Pipeline.AddLast("jt808TcpService", scope.ServiceProvider.GetRequiredService<JT808TcpServerHandler>()); | |||
} | |||
})); | |||
@@ -1,5 +1,6 @@ | |||
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; | |||
@@ -19,7 +20,7 @@ namespace JT808.DotNetty.Hosting.Handlers | |||
private readonly ILogger<JT808MsgIdTcpCustomHandler> logger; | |||
public override JT808Response Msg0x0200(JT808Request request) | |||
public override IJT808Reply Msg0x0200(JT808Request request) | |||
{ | |||
logger.LogDebug("Tcp_Msg0x0200"); | |||
return base.Msg0x0200(request); | |||
@@ -1,5 +1,6 @@ | |||
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; | |||
@@ -19,7 +20,7 @@ namespace JT808.DotNetty.Hosting.Handlers | |||
private readonly ILogger<JT808MsgIdUdpCustomHandler> logger; | |||
public override JT808Response Msg0x0200(JT808Request request) | |||
public override IJT808Reply Msg0x0200(JT808Request request) | |||
{ | |||
logger.LogDebug("Udp_Msg0x0200"); | |||
return base.Msg0x0200(request); | |||
@@ -10,6 +10,7 @@ using JT808.DotNetty.Core.Services; | |||
using JT808.DotNetty.Core; | |||
using JT808.DotNetty.Core.Handlers; | |||
using System.Threading.Tasks; | |||
using JT808.DotNetty.Core.Interfaces; | |||
namespace JT808.DotNetty.Udp.Handlers | |||
{ | |||
@@ -62,10 +63,9 @@ namespace JT808.DotNetty.Udp.Handlers | |||
{ | |||
logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); | |||
} | |||
Func<JT808Request, JT808Response> handlerFunc; | |||
if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out handlerFunc)) | |||
if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out var handlerFunc)) | |||
{ | |||
JT808Response jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg.Buffer)); | |||
IJT808Reply jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg.Buffer)); | |||
if (jT808Response != null) | |||
{ | |||
var sendData = JT808Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize); | |||
@@ -62,7 +62,7 @@ namespace JT808.DotNetty.WebApi | |||
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(65536)); | |||
pipeline.AddLast("http_aggregator", new HttpObjectAggregator(int.MaxValue)); | |||
pipeline.AddLast("http_jt808webapihandler", scope.ServiceProvider.GetRequiredService<JT808WebAPIServerHandler>()); | |||
} | |||
})); | |||
@@ -1,7 +1,7 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
# Visual Studio 15 | |||
VisualStudioVersion = 15.0.28307.168 | |||
# Visual Studio Version 16 | |||
VisualStudioVersion = 16.0.28922.388 | |||
MinimumVisualStudioVersion = 10.0.40219.1 | |||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B5A80356-5AF6-449F-9D8B-3C1BBB9D2443}" | |||
EndProject | |||
@@ -35,9 +35,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Client", "JT | |||
EndProject | |||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simples", "simples", "{2459FB59-8A33-49A4-ADBC-A0B12C5886A6}" | |||
EndProject | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.SimpleClient", "..\simples\JT808.DotNetty.SimpleClient\JT808.DotNetty.SimpleClient.csproj", "{E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}" | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.SimpleClient", "..\simples\JT808.DotNetty.SimpleClient\JT808.DotNetty.SimpleClient.csproj", "{E6F61CE8-BFB4-4946-A0D3-AECCE77824E5}" | |||
EndProject | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JT808.DotNetty.SimpleServer", "..\simples\JT808.DotNetty.SimpleServer\JT808.DotNetty.SimpleServer.csproj", "{CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}" | |||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.SimpleServer", "..\simples\JT808.DotNetty.SimpleServer\JT808.DotNetty.SimpleServer.csproj", "{CCE6AEFB-1AB0-4BD9-8EA2-8B4CDD097E88}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||