@@ -1,5 +1,6 @@ | |||||
using JT808.DotNetty.Core; | using JT808.DotNetty.Core; | ||||
using JT808.DotNetty.Core.Handlers; | using JT808.DotNetty.Core.Handlers; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using System; | using System; | ||||
@@ -19,37 +20,37 @@ namespace JT808.DotNetty.SimpleServer.Handlers | |||||
private readonly ILogger<JT808MsgIdTcpSimpleHandler> logger; | private readonly ILogger<JT808MsgIdTcpSimpleHandler> logger; | ||||
public override JT808Response Msg0x0200(JT808Request request) | |||||
public override IJT808Reply Msg0x0200(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0200"); | logger.LogDebug("Tcp_Msg0x0200"); | ||||
return base.Msg0x0200(request); | return base.Msg0x0200(request); | ||||
} | } | ||||
public override JT808Response Msg0x0001(JT808Request request) | |||||
public override IJT808Reply Msg0x0001(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0001"); | logger.LogDebug("Tcp_Msg0x0001"); | ||||
return base.Msg0x0001(request); | return base.Msg0x0001(request); | ||||
} | } | ||||
public override JT808Response Msg0x0002(JT808Request request) | |||||
public override IJT808Reply Msg0x0002(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0002"); | logger.LogDebug("Tcp_Msg0x0002"); | ||||
return base.Msg0x0002(request); | return base.Msg0x0002(request); | ||||
} | } | ||||
public override JT808Response Msg0x0003(JT808Request request) | |||||
public override IJT808Reply Msg0x0003(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0003"); | logger.LogDebug("Tcp_Msg0x0003"); | ||||
return base.Msg0x0003(request); | return base.Msg0x0003(request); | ||||
} | } | ||||
public override JT808Response Msg0x0100(JT808Request request) | |||||
public override IJT808Reply Msg0x0100(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0100"); | logger.LogDebug("Tcp_Msg0x0100"); | ||||
return base.Msg0x0100(request); | return base.Msg0x0100(request); | ||||
} | } | ||||
public override JT808Response Msg0x0102(JT808Request request) | |||||
public override IJT808Reply Msg0x0102(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0102"); | logger.LogDebug("Tcp_Msg0x0102"); | ||||
return base.Msg0x0102(request); | return base.Msg0x0102(request); | ||||
@@ -56,7 +56,6 @@ namespace JT808.DotNetty.Client | |||||
channel.Pipeline.AddLast("jt808TcpClientConnection", new JT808TcpClientConnectionHandler(this)); | channel.Pipeline.AddLast("jt808TcpClientConnection", new JT808TcpClientConnectionHandler(this)); | ||||
channel.Pipeline.AddLast("jt808TcpService", new JT808TcpClientHandler(this)); | channel.Pipeline.AddLast("jt808TcpService", new JT808TcpClientHandler(this)); | ||||
})); | })); | ||||
clientChannel = bootstrap.ConnectAsync(IPAddress.Parse(DeviceConfig.TcpHost), DeviceConfig.TcpPort).Result; | clientChannel = bootstrap.ConnectAsync(IPAddress.Parse(DeviceConfig.TcpHost), DeviceConfig.TcpPort).Result; | ||||
} | } | ||||
@@ -79,7 +78,6 @@ namespace JT808.DotNetty.Client | |||||
} | } | ||||
if (disposing) | if (disposing) | ||||
{ | { | ||||
// 清理托管资源 | // 清理托管资源 | ||||
group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)); | 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; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using JT808.Protocol.Enums; | using JT808.Protocol.Enums; | ||||
using JT808.Protocol.Extensions; | using JT808.Protocol.Extensions; | ||||
@@ -24,7 +25,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
protected JT808MsgIdTcpHandlerBase(JT808TcpSessionManager sessionManager) | protected JT808MsgIdTcpHandlerBase(JT808TcpSessionManager sessionManager) | ||||
{ | { | ||||
this.sessionManager = sessionManager; | this.sessionManager = sessionManager; | ||||
HandlerDict = new Dictionary<ushort, Func<JT808Request, JT808Response>> | |||||
HandlerDict = new Dictionary<ushort, Func<JT808Request, IJT808Reply>> | |||||
{ | { | ||||
{JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | {JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | ||||
{JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, | {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> | /// <summary> | ||||
/// 终端通用应答 | /// 终端通用应答 | ||||
/// 平台无需回复 | /// 平台无需回复 | ||||
@@ -45,7 +46,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public virtual JT808Response Msg0x0001(JT808Request request) | |||||
public virtual IJT808Reply Msg0x0001(JT808Request request) | |||||
{ | { | ||||
return null; | return null; | ||||
} | } | ||||
@@ -54,7 +55,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public virtual JT808Response Msg0x0002(JT808Request request) | |||||
public virtual IJT808Reply Msg0x0002(JT808Request request) | |||||
{ | { | ||||
sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); | sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); | ||||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
@@ -69,7 +70,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -83,7 +84,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() | ||||
{ | { | ||||
@@ -97,7 +98,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -111,7 +112,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -125,7 +126,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -139,7 +140,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -1,5 +1,6 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using JT808.Protocol.Enums; | using JT808.Protocol.Enums; | ||||
using JT808.Protocol.Extensions; | using JT808.Protocol.Extensions; | ||||
@@ -24,7 +25,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
protected JT808MsgIdUdpHandlerBase(JT808UdpSessionManager sessionManager) | protected JT808MsgIdUdpHandlerBase(JT808UdpSessionManager sessionManager) | ||||
{ | { | ||||
this.sessionManager = sessionManager; | this.sessionManager = sessionManager; | ||||
HandlerDict = new Dictionary<ushort, Func<JT808Request, JT808Response>> | |||||
HandlerDict = new Dictionary<ushort, Func<JT808Request, IJT808Reply>> | |||||
{ | { | ||||
{JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | {JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, | ||||
{JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, | {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> | /// <summary> | ||||
/// 终端通用应答 | /// 终端通用应答 | ||||
/// 平台无需回复 | /// 平台无需回复 | ||||
@@ -45,7 +46,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public virtual JT808Response Msg0x0001(JT808Request request) | |||||
public virtual IJT808Reply Msg0x0001(JT808Request request) | |||||
{ | { | ||||
return null; | return null; | ||||
} | } | ||||
@@ -54,7 +55,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <returns></returns> | ||||
public virtual JT808Response Msg0x0002(JT808Request request) | |||||
public virtual IJT808Reply Msg0x0002(JT808Request request) | |||||
{ | { | ||||
sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); | sessionManager.Heartbeat(request.Package.Header.TerminalPhoneNo); | ||||
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
@@ -69,7 +70,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -83,7 +84,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.终端注册应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8100() | ||||
{ | { | ||||
@@ -97,7 +98,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | 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="reqJT808Package"></param> | ||||
/// <param name="ctx"></param> | /// <param name="ctx"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -126,7 +127,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() | ||||
{ | { | ||||
@@ -140,7 +141,7 @@ namespace JT808.DotNetty.Core.Handlers | |||||
/// </summary> | /// </summary> | ||||
/// <param name="request"></param> | /// <param name="request"></param> | ||||
/// <returns></returns> | /// <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() | 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="DotNetty.Codecs" Version="0.6.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" 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" /> | <PackageReference Include="Microsoft.Extensions.Options" Version="2.2.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -1,17 +1,15 @@ | |||||
using JT808.Protocol; | |||||
using JT808.DotNetty.Core.Interfaces; | |||||
using JT808.Protocol; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Reflection; | using System.Reflection; | ||||
namespace JT808.DotNetty.Core.Metadata | namespace JT808.DotNetty.Core.Metadata | ||||
{ | { | ||||
public class JT808Response | |||||
public class JT808Response: IJT808Reply | |||||
{ | { | ||||
public JT808Package Package { get; set; } | public JT808Package Package { get; set; } | ||||
public byte[] HexData { get; set; } | public byte[] HexData { get; set; } | ||||
/// <summary> | |||||
/// 根据实际情况适当调整包的大小 | |||||
/// </summary> | |||||
public int MinBufferSize { get; set; } | public int MinBufferSize { get; set; } | ||||
public JT808Response() | public JT808Response() | ||||
@@ -2,6 +2,7 @@ | |||||
using JT808.DotNetty.Abstractions.Dtos; | using JT808.DotNetty.Abstractions.Dtos; | ||||
using JT808.DotNetty.Core; | using JT808.DotNetty.Core; | ||||
using JT808.DotNetty.Core.Interfaces; | using JT808.DotNetty.Core.Interfaces; | ||||
using JT808.DotNetty.Core.Metadata; | |||||
using JT808.DotNetty.Core.Services; | using JT808.DotNetty.Core.Services; | ||||
using System; | using System; | ||||
using System.Linq; | using System.Linq; | ||||
@@ -12,13 +13,9 @@ namespace JT808.DotNetty.Internal | |||||
{ | { | ||||
private readonly JT808TcpSessionManager jT808SessionManager; | private readonly JT808TcpSessionManager jT808SessionManager; | ||||
private readonly JT808TrafficService jT808TrafficService; | |||||
public JT808UnificationTcpSendService( | public JT808UnificationTcpSendService( | ||||
JT808TrafficServiceFactory jT808TrafficServiceFactory, | |||||
JT808TcpSessionManager jT808SessionManager) | JT808TcpSessionManager jT808SessionManager) | ||||
{ | { | ||||
this.jT808TrafficService = jT808TrafficServiceFactory.Create(Core.Enums.JT808ModeType.Tcp); | |||||
this.jT808SessionManager = jT808SessionManager; | this.jT808SessionManager = jT808SessionManager; | ||||
} | } | ||||
@@ -27,29 +24,16 @@ namespace JT808.DotNetty.Internal | |||||
JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>(); | JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>(); | ||||
try | 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 | else | ||||
{ | { | ||||
resultDto.Code = JT808ResultCode.Ok; | resultDto.Code = JT808ResultCode.Ok; | ||||
resultDto.Data = false; | resultDto.Data = false; | ||||
resultDto.Message = "offline"; | |||||
resultDto.Message = message; | |||||
} | } | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
@@ -6,6 +6,7 @@ using System.Linq; | |||||
using DotNetty.Transport.Channels; | using DotNetty.Transport.Channels; | ||||
using JT808.DotNetty.Abstractions; | using JT808.DotNetty.Abstractions; | ||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
namespace JT808.DotNetty.Core | 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) | public void TryAdd(string terminalPhoneNo,IChannel channel) | ||||
{ | { | ||||
// 解决了设备号跟通道绑定到一起,不需要用到通道本身的SessionId | // 解决了设备号跟通道绑定到一起,不需要用到通道本身的SessionId | ||||
@@ -8,6 +8,7 @@ using Microsoft.Extensions.Logging; | |||||
using JT808.DotNetty.Core.Handlers; | using JT808.DotNetty.Core.Handlers; | ||||
using JT808.DotNetty.Core.Services; | using JT808.DotNetty.Core.Services; | ||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
namespace JT808.DotNetty.Tcp.Handlers | namespace JT808.DotNetty.Tcp.Handlers | ||||
{ | { | ||||
@@ -30,6 +31,8 @@ namespace JT808.DotNetty.Tcp.Handlers | |||||
private readonly ILogger<JT808TcpServerHandler> logger; | private readonly ILogger<JT808TcpServerHandler> logger; | ||||
private readonly ILogger unknownLogger; | |||||
public JT808TcpServerHandler( | public JT808TcpServerHandler( | ||||
JT808TrafficServiceFactory jT808TrafficServiceFactory, | JT808TrafficServiceFactory jT808TrafficServiceFactory, | ||||
ILoggerFactory loggerFactory, | ILoggerFactory loggerFactory, | ||||
@@ -46,6 +49,7 @@ namespace JT808.DotNetty.Tcp.Handlers | |||||
this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher; | this.jT808SourcePackageDispatcher = jT808SourcePackageDispatcher; | ||||
this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(Core.Enums.JT808ModeType.Tcp); | this.jT808AtomicCounterService = jT808AtomicCounterServiceFactory.Create(Core.Enums.JT808ModeType.Tcp); | ||||
logger = loggerFactory.CreateLogger<JT808TcpServerHandler>(); | 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()); | logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); | ||||
} | } | ||||
jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo,ctx.Channel); | 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 (jT808Response != null) | ||||
{ | { | ||||
if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) | 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) | catch (JT808.Protocol.Exceptions.JT808Exception ex) | ||||
{ | { | ||||
@@ -24,6 +24,7 @@ namespace JT808.DotNetty.Tcp | |||||
serviceDescriptors.TryAddSingleton<JT808TransmitAddressFilterService>(); | serviceDescriptors.TryAddSingleton<JT808TransmitAddressFilterService>(); | ||||
serviceDescriptors.TryAddSingleton<JT808MsgIdTcpHandlerBase, JT808MsgIdDefaultTcpHandler>(); | serviceDescriptors.TryAddSingleton<JT808MsgIdTcpHandlerBase, JT808MsgIdDefaultTcpHandler>(); | ||||
serviceDescriptors.TryAddScoped<JT808TcpConnectionHandler>(); | serviceDescriptors.TryAddScoped<JT808TcpConnectionHandler>(); | ||||
serviceDescriptors.TryAddScoped<JT808TcpEncoder>(); | |||||
serviceDescriptors.TryAddScoped<JT808TcpDecoder>(); | serviceDescriptors.TryAddScoped<JT808TcpDecoder>(); | ||||
serviceDescriptors.TryAddScoped<JT808TcpServerHandler>(); | serviceDescriptors.TryAddScoped<JT808TcpServerHandler>(); | ||||
serviceDescriptors.AddHostedService<JT808TcpAtomicCouterResetDailyJob>(); | serviceDescriptors.AddHostedService<JT808TcpAtomicCouterResetDailyJob>(); | ||||
@@ -65,15 +65,16 @@ namespace JT808.DotNetty.Tcp | |||||
IChannelPipeline pipeline = channel.Pipeline; | IChannelPipeline pipeline = channel.Pipeline; | ||||
using (var scope = serviceProvider.CreateScope()) | 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( | channel.Pipeline.AddLast("systemIdleState", new IdleStateHandler( | ||||
configuration.ReaderIdleTimeSeconds, | configuration.ReaderIdleTimeSeconds, | ||||
configuration.WriterIdleTimeSeconds, | configuration.WriterIdleTimeSeconds, | ||||
configuration.AllIdleTimeSeconds)); | configuration.AllIdleTimeSeconds)); | ||||
channel.Pipeline.AddLast("jt808TcpConnection", scope.ServiceProvider.GetRequiredService<JT808TcpConnectionHandler>()); | 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>()); | channel.Pipeline.AddLast("jt808TcpService", scope.ServiceProvider.GetRequiredService<JT808TcpServerHandler>()); | ||||
} | } | ||||
})); | })); | ||||
@@ -1,5 +1,6 @@ | |||||
using JT808.DotNetty.Core; | using JT808.DotNetty.Core; | ||||
using JT808.DotNetty.Core.Handlers; | using JT808.DotNetty.Core.Handlers; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using System; | using System; | ||||
@@ -19,7 +20,7 @@ namespace JT808.DotNetty.Hosting.Handlers | |||||
private readonly ILogger<JT808MsgIdTcpCustomHandler> logger; | private readonly ILogger<JT808MsgIdTcpCustomHandler> logger; | ||||
public override JT808Response Msg0x0200(JT808Request request) | |||||
public override IJT808Reply Msg0x0200(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Tcp_Msg0x0200"); | logger.LogDebug("Tcp_Msg0x0200"); | ||||
return base.Msg0x0200(request); | return base.Msg0x0200(request); | ||||
@@ -1,5 +1,6 @@ | |||||
using JT808.DotNetty.Core; | using JT808.DotNetty.Core; | ||||
using JT808.DotNetty.Core.Handlers; | using JT808.DotNetty.Core.Handlers; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
using JT808.DotNetty.Core.Metadata; | using JT808.DotNetty.Core.Metadata; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using System; | using System; | ||||
@@ -19,7 +20,7 @@ namespace JT808.DotNetty.Hosting.Handlers | |||||
private readonly ILogger<JT808MsgIdUdpCustomHandler> logger; | private readonly ILogger<JT808MsgIdUdpCustomHandler> logger; | ||||
public override JT808Response Msg0x0200(JT808Request request) | |||||
public override IJT808Reply Msg0x0200(JT808Request request) | |||||
{ | { | ||||
logger.LogDebug("Udp_Msg0x0200"); | logger.LogDebug("Udp_Msg0x0200"); | ||||
return base.Msg0x0200(request); | return base.Msg0x0200(request); | ||||
@@ -10,6 +10,7 @@ using JT808.DotNetty.Core.Services; | |||||
using JT808.DotNetty.Core; | using JT808.DotNetty.Core; | ||||
using JT808.DotNetty.Core.Handlers; | using JT808.DotNetty.Core.Handlers; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using JT808.DotNetty.Core.Interfaces; | |||||
namespace JT808.DotNetty.Udp.Handlers | namespace JT808.DotNetty.Udp.Handlers | ||||
{ | { | ||||
@@ -62,10 +63,9 @@ namespace JT808.DotNetty.Udp.Handlers | |||||
{ | { | ||||
logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); | 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) | if (jT808Response != null) | ||||
{ | { | ||||
var sendData = JT808Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize); | 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_encoder", new HttpResponseEncoder()); | ||||
pipeline.AddLast("http_decoder", new HttpRequestDecoder(4096, 8192, 8192, false)); | pipeline.AddLast("http_decoder", new HttpRequestDecoder(4096, 8192, 8192, false)); | ||||
//将多个消息转换为单一的request或者response对象 =>IFullHttpRequest | //将多个消息转换为单一的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>()); | pipeline.AddLast("http_jt808webapihandler", scope.ServiceProvider.GetRequiredService<JT808WebAPIServerHandler>()); | ||||
} | } | ||||
})); | })); | ||||
@@ -1,7 +1,7 @@ | |||||
| | ||||
Microsoft Visual Studio Solution File, Format Version 12.00 | 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 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B5A80356-5AF6-449F-9D8B-3C1BBB9D2443}" | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B5A80356-5AF6-449F-9D8B-3C1BBB9D2443}" | ||||
EndProject | EndProject | ||||
@@ -35,9 +35,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.DotNetty.Client", "JT | |||||
EndProject | EndProject | ||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simples", "simples", "{2459FB59-8A33-49A4-ADBC-A0B12C5886A6}" | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simples", "simples", "{2459FB59-8A33-49A4-ADBC-A0B12C5886A6}" | ||||
EndProject | 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 | 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 | EndProject | ||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||