Просмотр исходного кода

1.增加为请求应答模式

2.修改会话管理(网关重启后,设备没有发送鉴权导致通道关联不了设备号无法下发设备指令),修改为每条消息上来都关联一下
tags/v1.0.0
SmallChi 6 лет назад
Родитель
Сommit
5903bd7179
9 измененных файлов: 115 добавлений и 115 удалений
  1. +3
    -2
      src/JT808.DotNetty.Hosting/JT808MsgIdCustomHandler.cs
  2. +4
    -1
      src/JT808.DotNetty.Hosting/Program.cs
  3. +8
    -0
      src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs
  4. +9
    -4
      src/JT808.DotNetty/Handlers/JT808ServerHandler.cs
  5. +44
    -45
      src/JT808.DotNetty/JT808MsgIdHandlerBase.cs
  6. +4
    -62
      src/JT808.DotNetty/JT808SessionManager.cs
  7. +21
    -0
      src/JT808.DotNetty/Metadata/JT808Request.cs
  8. +21
    -0
      src/JT808.DotNetty/Metadata/JT808Response.cs
  9. +1
    -1
      src/JT808.DotNetty/Metadata/JT808Session.cs

+ 3
- 2
src/JT808.DotNetty.Hosting/JT808MsgIdCustomHandler.cs Просмотреть файл

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using DotNetty.Transport.Channels; using DotNetty.Transport.Channels;
using JT808.DotNetty.Metadata;
using JT808.Protocol; using JT808.Protocol;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;


@@ -17,10 +18,10 @@ namespace JT808.DotNetty.Hosting
logger = loggerFactory.CreateLogger<JT808MsgIdCustomHandler>(); logger = loggerFactory.CreateLogger<JT808MsgIdCustomHandler>();
} }


public override JT808Package Msg0x0102(JT808Package reqJT808Package, IChannelHandlerContext ctx)
public override JT808Response Msg0x0102(JT808Request request)
{ {
logger.LogDebug("Msg0x0102"); logger.LogDebug("Msg0x0102");
return base.Msg0x0102(reqJT808Package, ctx);
return base.Msg0x0102(request);
} }
} }
} }

+ 4
- 1
src/JT808.DotNetty.Hosting/Program.cs Просмотреть файл

@@ -4,6 +4,9 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks; using System.Threading.Tasks;


namespace JT808.DotNetty.Hosting namespace JT808.DotNetty.Hosting
@@ -30,7 +33,7 @@ namespace JT808.DotNetty.Hosting
services.AddSingleton<ILoggerFactory, LoggerFactory>(); services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); 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(); .UseJT808Host();
await serverHostBuilder.RunConsoleAsync(); await serverHostBuilder.RunConsoleAsync();


+ 8
- 0
src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs Просмотреть файл

@@ -13,9 +13,13 @@ namespace JT808.DotNetty.Handlers
{ {
private readonly ILogger<JT808ConnectionHandler> logger; private readonly ILogger<JT808ConnectionHandler> logger;


private readonly JT808SessionManager jT808SessionManager;

public JT808ConnectionHandler( public JT808ConnectionHandler(
JT808SessionManager jT808SessionManager,
ILoggerFactory loggerFactory) ILoggerFactory loggerFactory)
{ {
this.jT808SessionManager = jT808SessionManager;
logger = loggerFactory.CreateLogger<JT808ConnectionHandler>(); logger = loggerFactory.CreateLogger<JT808ConnectionHandler>();
} }


@@ -40,6 +44,7 @@ namespace JT808.DotNetty.Handlers
string channelId = context.Channel.Id.AsShortText(); string channelId = context.Channel.Id.AsShortText();
if (logger.IsEnabled(LogLevel.Debug)) if (logger.IsEnabled(LogLevel.Debug))
logger.LogDebug($">>>{ channelId } The client disconnects from the server."); logger.LogDebug($">>>{ channelId } The client disconnects from the server.");
jT808SessionManager.RemoveSessionByID(channelId);
base.ChannelInactive(context); base.ChannelInactive(context);
} }


@@ -53,6 +58,7 @@ namespace JT808.DotNetty.Handlers
string channelId = context.Channel.Id.AsShortText(); string channelId = context.Channel.Id.AsShortText();
if (logger.IsEnabled(LogLevel.Debug)) if (logger.IsEnabled(LogLevel.Debug))
logger.LogDebug($"<<<{ channelId } The server disconnects from the client."); logger.LogDebug($"<<<{ channelId } The server disconnects from the client.");
jT808SessionManager.RemoveSessionByID(channelId);
return base.CloseAsync(context); return base.CloseAsync(context);
} }


@@ -74,6 +80,7 @@ namespace JT808.DotNetty.Handlers
string channelId = context.Channel.Id.AsShortText(); string channelId = context.Channel.Id.AsShortText();
logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}");
// 由于808是设备发心跳,如果很久没有上报数据,那么就由服务器主动关闭连接。 // 由于808是设备发心跳,如果很久没有上报数据,那么就由服务器主动关闭连接。
jT808SessionManager.RemoveSessionByID(channelId);
context.CloseAsync(); context.CloseAsync();
} }
base.UserEventTriggered(context, evt); base.UserEventTriggered(context, evt);
@@ -83,6 +90,7 @@ namespace JT808.DotNetty.Handlers
{ {
string channelId = context.Channel.Id.AsShortText(); string channelId = context.Channel.Id.AsShortText();
logger.LogError(exception,$"{channelId} {exception.Message}" ); logger.LogError(exception,$"{channelId} {exception.Message}" );
jT808SessionManager.RemoveSessionByID(channelId);
context.CloseAsync(); context.CloseAsync();
} }
} }


+ 9
- 4
src/JT808.DotNetty/Handlers/JT808ServerHandler.cs Просмотреть файл

@@ -4,29 +4,34 @@ using JT808.Protocol;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using JT808.DotNetty.Metadata;


namespace JT808.DotNetty.Handlers namespace JT808.DotNetty.Handlers
{ {
internal class JT808ServerHandler : SimpleChannelInboundHandler<JT808.Protocol.JT808Package> internal class JT808ServerHandler : SimpleChannelInboundHandler<JT808.Protocol.JT808Package>
{ {
private readonly JT808MsgIdHandlerBase handler; private readonly JT808MsgIdHandlerBase handler;
private readonly JT808SessionManager jT808SessionManager;


public JT808ServerHandler(JT808MsgIdHandlerBase handler)
public JT808ServerHandler(JT808MsgIdHandlerBase handler, JT808SessionManager jT808SessionManager)
{ {
this.handler = handler; this.handler = handler;
this.jT808SessionManager = jT808SessionManager;
} }


protected override void ChannelRead0(IChannelHandlerContext ctx, JT808Package msg) protected override void ChannelRead0(IChannelHandlerContext ctx, JT808Package msg)
{ {
try try
{ {
Func<JT808Package, IChannelHandlerContext, JT808Package> handlerFunc;
jT808SessionManager.TryAddOrUpdateSession(new JT808Session(ctx.Channel, msg.Header.TerminalPhoneNo));
Func<JT808Request, JT808Response> handlerFunc;
if (handler.HandlerDict.TryGetValue(msg.Header.MsgId, out handlerFunc)) if (handler.HandlerDict.TryGetValue(msg.Header.MsgId, out handlerFunc))
{ {
JT808Package jT808Package = handlerFunc(msg, ctx);
JT808Response jT808Package = handlerFunc(new JT808Request(msg));
if (jT808Package != null) if (jT808Package != null)
{ {
ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808Package)));
ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808Package.Package)));
} }
} }
} }


+ 44
- 45
src/JT808.DotNetty/JT808MsgIdHandlerBase.cs Просмотреть файл

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using DotNetty.Transport.Channels; using DotNetty.Transport.Channels;
using JT808.DotNetty.Metadata;
using JT808.Protocol; using JT808.Protocol;
using JT808.Protocol.Enums; using JT808.Protocol.Enums;
using JT808.Protocol.Extensions; using JT808.Protocol.Extensions;
@@ -24,7 +25,7 @@ namespace JT808.DotNetty
protected JT808MsgIdHandlerBase(JT808SessionManager sessionManager) protected JT808MsgIdHandlerBase(JT808SessionManager sessionManager)
{ {
this.sessionManager = sessionManager; this.sessionManager = sessionManager;
HandlerDict = new Dictionary<JT808MsgId, Func<JT808Package, IChannelHandlerContext, JT808Package>>
HandlerDict = new Dictionary<JT808MsgId, Func<JT808Request, JT808Response>>
{ {
{JT808MsgId.终端通用应答, Msg0x0001}, {JT808MsgId.终端通用应答, Msg0x0001},
{JT808MsgId.终端鉴权, Msg0x0102}, {JT808MsgId.终端鉴权, Msg0x0102},
@@ -37,21 +38,21 @@ namespace JT808.DotNetty
}; };
} }


public Dictionary<JT808MsgId, Func<JT808Package, IChannelHandlerContext, JT808Package>> HandlerDict { get; }
public Dictionary<JT808MsgId, Func<JT808Request, JT808Response>> HandlerDict { get; }
/// <summary> /// <summary>
/// 终端通用应答 /// 终端通用应答
/// </summary> /// </summary>
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 终端心跳 /// 终端心跳
@@ -59,15 +60,15 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 终端注销 /// 终端注销
@@ -75,15 +76,14 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 终端注册 /// 终端注册
@@ -91,14 +91,14 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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.成功, JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 终端鉴权 /// 终端鉴权
@@ -106,15 +106,14 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 位置信息汇报 /// 位置信息汇报
@@ -122,14 +121,14 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 定位数据批量上传 /// 定位数据批量上传
@@ -137,14 +136,14 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 数据上行透传 /// 数据上行透传
@@ -152,14 +151,14 @@ namespace JT808.DotNetty
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
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, JT808PlatformResult = JT808PlatformResult.Success,
MsgNum = reqJT808Package.Header.MsgNum
});
MsgNum = request.Package.Header.MsgNum
}));
} }
} }
} }

+ 4
- 62
src/JT808.DotNetty/JT808SessionManager.cs Просмотреть файл

@@ -9,6 +9,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using JT808.DotNetty.Metadata;


namespace JT808.DotNetty 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) public JT808Session GetSessionByID(string sessionID)
{ {
if (string.IsNullOrEmpty(sessionID)) if (string.IsNullOrEmpty(sessionID))
@@ -136,31 +124,10 @@ namespace JT808.DotNetty
} }
} }


/// <summary>
/// 通过通道Id和设备终端号进行关联
/// </summary>
/// <param name="sessionID"></param>
/// <param name="terminalPhoneNo"></param>
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) public void RemoveSessionByID(string sessionID)
@@ -181,8 +148,6 @@ namespace JT808.DotNetty
{ {
logger.LogInformation($">>>{sessionID} Session Remove."); logger.LogInformation($">>>{sessionID} Session Remove.");
} }
// call GPS.JT808NettyServer.Handlers.JT808ConnectionHandler.CloseAsync
session.Channel.CloseAsync();
} }
} }
catch (Exception ex) 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() public void Dispose()
{ {
cancellationTokenSource.Cancel(); cancellationTokenSource.Cancel();


+ 21
- 0
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;
}
}
}

+ 21
- 0
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;
}
}
}

src/JT808.DotNetty/JT808Session.cs → src/JT808.DotNetty/Metadata/JT808Session.cs Просмотреть файл

@@ -3,7 +3,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;


namespace JT808.DotNetty
namespace JT808.DotNetty.Metadata
{ {
public class JT808Session public class JT808Session
{ {

Загрузка…
Отмена
Сохранить