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

使用通用的消息处理程序(待完善)

tags/pipeline-1.1.0
SmallChi(Koike) 4 лет назад
Родитель
Сommit
017e5d1c7b
27 измененных файлов: 675 добавлений и 212 удалений
  1. +1
    -1
      src/JT808.Gateway.Abstractions/Dtos/JT808UnificationSendRequestDto.cs
  2. +13
    -0
      src/JT808.Gateway.Abstractions/Extensions/JT808SessionExtensions.cs
  3. +7
    -0
      src/JT808.Gateway.Abstractions/JT808.Gateway.Abstractions.csproj
  4. +333
    -0
      src/JT808.Gateway.Abstractions/JT808MessageHandler.cs
  5. +0
    -1
      src/JT808.Gateway.Abstractions/JT808NormalReplyMessageHandler.cs
  6. +1
    -1
      src/JT808.Gateway.Benchmark/JT808.Gateway.ServerBenchmark/Program.cs
  7. +3
    -3
      src/JT808.Gateway.Kafka/JT808ServerKafkaExtensions.cs
  8. +1
    -1
      src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgLoggingExtensions.cs
  9. +24
    -24
      src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageExtensions.cs
  10. +23
    -23
      src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageHostedService.cs
  11. +2
    -2
      src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeExtensions.cs
  12. +2
    -2
      src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficServiceExtensions.cs
  13. +1
    -1
      src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitExtensions.cs
  14. +1
    -0
      src/JT808.Gateway.Tests/JT808.Gateway.NormalHosting/JT808.Gateway.NormalHosting.csproj
  15. +1
    -1
      src/JT808.Gateway.Tests/JT808.Gateway.NormalHosting/Program.cs
  16. +2
    -3
      src/JT808.Gateway.Tests/JT808.Gateway.QueueHosting/Program.cs
  17. +37
    -4
      src/JT808.Gateway.Tests/JT808.Gateway.Test/JT808HttpClientTest.cs
  18. +2
    -2
      src/JT808.Gateway.WebApiClientTool/JT808.Gateway.WebApiClientTool.csproj
  19. +64
    -5
      src/JT808.Gateway.WebApiClientTool/JT808.Gateway.WebApiClientTool.xml
  20. +69
    -10
      src/JT808.Gateway.WebApiClientTool/JT808HttpClient.cs
  21. +16
    -0
      src/JT808.Gateway.WebApiClientTool/JT808HttpClientExtensions.cs
  22. +7
    -7
      src/JT808.Gateway.sln
  23. +1
    -1
      src/JT808.Gateway/Handlers/JT808MsgIdDefaultWebApiHandler.cs
  24. +4
    -0
      src/JT808.Gateway/JT808.Gateway.csproj
  25. +50
    -35
      src/JT808.Gateway/JT808GatewayExtensions.cs
  26. +6
    -48
      src/JT808.Gateway/JT808TcpServer.cs
  27. +4
    -37
      src/JT808.Gateway/JT808UdpServer.cs

+ 1
- 1
src/JT808.Gateway.Abstractions/Dtos/JT808UnificationSendRequestDto.cs Просмотреть файл

@@ -6,6 +6,6 @@
public class JT808UnificationSendRequestDto
{
public string TerminalPhoneNo { get; set; }
public string Data { get; set; }
public string HexData { get; set; }
}
}

+ 13
- 0
src/JT808.Gateway.Abstractions/Extensions/JT808SessionExtensions.cs Просмотреть файл

@@ -3,6 +3,7 @@ using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace JT808.Gateway.Abstractions
{
@@ -19,5 +20,17 @@ namespace JT808.Gateway.Abstractions
await session.Client.SendToAsync(data, SocketFlags.None, session.RemoteEndPoint);
}
}

public static void Send(this IJT808Session session, byte[] data)
{
if (session.TransportProtocolType == JT808TransportProtocolType.tcp)
{
session.Client.Send(data, SocketFlags.None);
}
else
{
session.Client.SendTo(data, SocketFlags.None, session.RemoteEndPoint);
}
}
}
}

+ 7
- 0
src/JT808.Gateway.Abstractions/JT808.Gateway.Abstractions.csproj Просмотреть файл

@@ -25,6 +25,13 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>JT808.Gateway.Abstractions.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Enums\JT808UseType.cs" />
<Compile Remove="IJT808NormalGatewayBuilder.cs" />
<Compile Remove="IJT808QueueGatewayBuilder.cs" />
<Compile Remove="JT808NormalReplyMessageHandler.cs" />
<Compile Remove="JT808QueueReplyMessageHandler.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="JT808" Version="2.2.12" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.7" />


+ 333
- 0
src/JT808.Gateway.Abstractions/JT808MessageHandler.cs Просмотреть файл

@@ -0,0 +1,333 @@
using JT808.Protocol;
using JT808.Protocol.Enums;
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.Gateway.Abstractions
{
/// <summary>
/// 通用消息处理程序
/// </summary>
public class JT808MessageHandler
{
protected Dictionary<ushort, MsgIdMethodDelegate> HandlerDict { get; }

protected delegate byte[] MsgIdMethodDelegate(JT808HeaderPackage package, IJT808Session session);
protected JT808Serializer JT808Serializer { get; }
public JT808MessageHandler(IJT808Config jT808Config)
{
this.JT808Serializer = jT808Config.GetSerializer();
HandlerDict = new Dictionary<ushort, MsgIdMethodDelegate> {
{JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001},
{JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102},
{JT808MsgId.终端心跳.ToUInt16Value(), Msg0x0002},
{JT808MsgId.终端注销.ToUInt16Value(), Msg0x0003},
{JT808MsgId.终端注册.ToUInt16Value(), Msg0x0100},
{JT808MsgId.位置信息汇报.ToUInt16Value(),Msg0x0200 },
{JT808MsgId.定位数据批量上传.ToUInt16Value(),Msg0x0704 },
{JT808MsgId.数据上行透传.ToUInt16Value(),Msg0x0900 },
{JT808MsgId.查询服务器时间请求.ToUInt16Value(),Msg0x0004 },
{JT808MsgId.查询终端参数应答.ToUInt16Value(),Msg0x0104 },
{JT808MsgId.查询终端属性应答.ToUInt16Value(),Msg0x0107 },
{JT808MsgId.终端升级结果通知.ToUInt16Value(),Msg0x0108 },
{JT808MsgId.位置信息查询应答.ToUInt16Value(),Msg0x0201 },
{JT808MsgId.链路检测.ToUInt16Value(),Msg0x8204 },
{JT808MsgId.车辆控制应答.ToUInt16Value(),Msg0x0500 },
{JT808MsgId.摄像头立即拍摄命令.ToUInt16Value(),Msg0x8801 },
{JT808MsgId.多媒体数据上传.ToUInt16Value(),Msg0x0801 },
{JT808MsgId.多媒体事件信息上传.ToUInt16Value(),Msg0x0800 },
{JT808MsgId.CAN总线数据上传.ToUInt16Value(),Msg0x0705 },
};
}
/// <summary>
/// 消息处理
/// </summary>
/// <param name="request">请求数据</param>
/// <param name="session">当前会话</param>
/// <returns>应答消息数据</returns>
public virtual byte[] Processor(JT808HeaderPackage request, IJT808Session session)
{
if (HandlerDict.TryGetValue(request.Header.MsgId, out var func))
{
return func(request, session);
}
return default;
//else
//{
// //处理不了的消息统一回复通用应答
// return CommonReply(request, session);
//}
}
/// <summary>
/// 终端通用应答
/// 平台无需回复
/// 实现自己的业务
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public virtual byte[] Msg0x0001(JT808HeaderPackage request, IJT808Session session)
{
return default;
}
/// <summary>
/// 平台通用应答
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
public virtual byte[] CommonReply(JT808HeaderPackage request, IJT808Session session)
{
if (request.Version == JT808Version.JTT2019)
{
byte[] data = JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001()
{
AckMsgId = request.Header.MsgId,
JT808PlatformResult = JT808PlatformResult.成功,
MsgNum = request.Header.MsgNum
}));
session.Send(data);
return data;
}
else
{
byte[] data = JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001()
{
AckMsgId = request.Header.MsgId,
JT808PlatformResult = JT808PlatformResult.成功,
MsgNum = request.Header.MsgNum
}));
session.Send(data);
return data;
}
}
/// <summary>
/// 终端心跳
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public virtual byte[] Msg0x0002(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 查询服务器时间
/// 2019版本
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0004(JT808HeaderPackage request, IJT808Session session)
{
byte[] data = JT808Serializer.Serialize(JT808MsgId.查询服务器时间应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8004()
{
Time=DateTime.Now
}));
session.Send(data);
return data;
}
/// <summary>
/// 服务器补传分包请求
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x8003(JT808HeaderPackage request, IJT808Session session)
{
throw new NotImplementedException("0x8003-服务器补传分包请求");
}
/// <summary>
/// 终端补传分包请求
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0005(JT808HeaderPackage request, IJT808Session session)
{
throw new NotImplementedException("0x0005-终端补传分包请求");
}
/// <summary>
/// 终端注册
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0100(JT808HeaderPackage request, IJT808Session session)
{
if (request.Version == JT808Version.JTT2019)
{
byte[] data = JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create_终端注册应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8100()
{
Code = "J" + request.Header.TerminalPhoneNo,
JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功,
AckMsgNum = request.Header.MsgNum
}));
session.Send(data);
return data;
}
else
{
byte[] data = JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100()
{
Code = "J" + request.Header.TerminalPhoneNo,
JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功,
AckMsgNum = request.Header.MsgNum
}));
session.Send(data);
return data;
}
}
/// <summary>
/// 终端注销
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0003(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 终端鉴权
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0102(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 查询终端参数应答
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0104(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 查询终端属性应答
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0107(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 终端升级结果应答
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0108(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 位置信息汇报
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0200(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 位置信息查询应答
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0201(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 链路检测
/// 2019版本
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x8204(JT808HeaderPackage request, IJT808Session session)
{
return default;
}
/// <summary>
/// 车辆控制应答
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0500(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 定位数据批量上传
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0704(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// CAN总线数据上传
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0705(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 多媒体事件信息上传
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0800(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
/// <summary>
/// 多媒体数据上传
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0801(JT808HeaderPackage request, IJT808Session session)
{
throw new NotImplementedException("0x8800多媒体数据上传应答");
}
/// <summary>
/// 摄像头立即拍摄命令
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x8801(JT808HeaderPackage request, IJT808Session session)
{
throw new NotImplementedException("0x0805摄像头立即拍摄命令应答");
}
/// <summary>
/// 数据上行透传
/// </summary>
/// <param name="request"></param>
/// <param name="session"></param>
/// <returns></returns>
public virtual byte[] Msg0x0900(JT808HeaderPackage request, IJT808Session session)
{
return CommonReply(request, session);
}
}
}

+ 0
- 1
src/JT808.Gateway.Abstractions/JT808NormalReplyMessageHandler.cs Просмотреть файл

@@ -59,7 +59,6 @@ namespace JT808.Gateway.Abstractions
return CommonReply(request, session);
}
}

/// <summary>
/// 终端通用应答
/// 平台无需回复


+ 1
- 1
src/JT808.Gateway.Benchmark/JT808.Gateway.ServerBenchmark/Program.cs Просмотреть файл

@@ -32,7 +32,7 @@ namespace JT808.Gateway.ServerBenchmark
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.AddJT808Configure()
.AddNormalGateway(hostContext.Configuration)
.AddGateway(hostContext.Configuration)
.AddTcp()
.AddUdp();
});


+ 3
- 3
src/JT808.Gateway.Kafka/JT808ServerKafkaExtensions.cs Просмотреть файл

@@ -14,7 +14,7 @@ namespace JT808.Gateway.Kafka
/// <param name="jT808GatewayBuilder"></param>
/// <param name="configuration">GetSection("JT808MsgProducerConfig")</param>
/// <returns></returns>
public static IJT808QueueGatewayBuilder AddServerKafkaMsgProducer(this IJT808QueueGatewayBuilder jT808GatewayBuilder, IConfiguration configuration)
public static IJT808GatewayBuilder AddServerKafkaMsgProducer(this IJT808GatewayBuilder jT808GatewayBuilder, IConfiguration configuration)
{
jT808GatewayBuilder.JT808Builder.Services.Configure<JT808MsgProducerConfig>(configuration.GetSection("JT808MsgProducerConfig"));
jT808GatewayBuilder.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808MsgProducer), typeof(JT808MsgProducer), ServiceLifetime.Singleton));
@@ -26,7 +26,7 @@ namespace JT808.Gateway.Kafka
/// <param name="jT808GatewayBuilder"></param>
/// <param name="configuration">GetSection("JT808MsgReplyConsumerConfig")</param>
/// <returns></returns>
public static IJT808QueueGatewayBuilder AddServerKafkaMsgReplyConsumer(this IJT808QueueGatewayBuilder jT808GatewayBuilder, IConfiguration configuration)
public static IJT808GatewayBuilder AddServerKafkaMsgReplyConsumer(this IJT808GatewayBuilder jT808GatewayBuilder, IConfiguration configuration)
{
jT808GatewayBuilder.JT808Builder.Services.Configure<JT808MsgReplyConsumerConfig>(configuration.GetSection("JT808MsgReplyConsumerConfig"));
jT808GatewayBuilder.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808MsgReplyConsumer), typeof(JT808MsgReplyConsumer), ServiceLifetime.Singleton));
@@ -38,7 +38,7 @@ namespace JT808.Gateway.Kafka
/// <param name="jT808GatewayBuilder"></param>
/// <param name="configuration">GetSection("JT808SessionProducerConfig")</param>
/// <returns></returns>
public static IJT808QueueGatewayBuilder AddServerKafkaSessionProducer(this IJT808QueueGatewayBuilder jT808GatewayBuilder, IConfiguration configuration)
public static IJT808GatewayBuilder AddServerKafkaSessionProducer(this IJT808GatewayBuilder jT808GatewayBuilder, IConfiguration configuration)
{
jT808GatewayBuilder.JT808Builder.Services.Configure<JT808SessionProducerConfig>(configuration.GetSection("JT808SessionProducerConfig"));
jT808GatewayBuilder.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(IJT808SessionProducer), typeof(JT808SessionProducer), ServiceLifetime.Singleton));


+ 1
- 1
src/JT808.Gateway.Services/JT808.Gateway.MsgLogging/JT808MsgLoggingExtensions.cs Просмотреть файл

@@ -17,7 +17,7 @@ namespace JT808.Gateway.MsgLogging
return jT808ClientBuilder;
}

public static IJT808NormalGatewayBuilder AddMsgLogging<TJT808MsgLogging>(this IJT808NormalGatewayBuilder jT808NormalGatewayBuilder)
public static IJT808GatewayBuilder AddMsgLogging<TJT808MsgLogging>(this IJT808GatewayBuilder jT808NormalGatewayBuilder)
where TJT808MsgLogging : IJT808MsgLogging
{
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808MsgLogging), typeof(TJT808MsgLogging));


+ 24
- 24
src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageExtensions.cs Просмотреть файл

@@ -9,29 +9,29 @@ namespace JT808.Gateway.ReplyMessage
{
public static class JT808ReplyMessageExtensions
{
/// <summary>
/// 消息应答服务(不同的消费者实例)
/// </summary>
/// <param name="jT808ClientBuilder"></param>
/// <returns></returns>
public static IJT808ClientBuilder AddReplyMessage(this IJT808ClientBuilder jT808ClientBuilder)
{
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808QueueReplyMessageHandler>();
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808ReplyMessageHostedService>();
return jT808ClientBuilder;
}
/// <summary>
/// 消息应答服务(不同的消费者实例)
/// </summary>
/// <typeparam name="TReplyMessageService">自定义消息回复服务</typeparam>
/// <param name="jT808ClientBuilder"></param>
/// <returns></returns>
public static IJT808ClientBuilder AddReplyMessage<TReplyMessageHandler>(this IJT808ClientBuilder jT808ClientBuilder)
where TReplyMessageHandler : JT808QueueReplyMessageHandler
{
jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808QueueReplyMessageHandler, TReplyMessageHandler>();
jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808ReplyMessageHostedService>();
return jT808ClientBuilder;
}
///// <summary>
///// 消息应答服务(不同的消费者实例)
///// </summary>
///// <param name="jT808ClientBuilder"></param>
///// <returns></returns>
//public static IJT808ClientBuilder AddReplyMessage(this IJT808ClientBuilder jT808ClientBuilder)
//{
// jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808QueueReplyMessageHandler>();
// jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808ReplyMessageHostedService>();
// return jT808ClientBuilder;
//}
///// <summary>
///// 消息应答服务(不同的消费者实例)
///// </summary>
///// <typeparam name="TReplyMessageService">自定义消息回复服务</typeparam>
///// <param name="jT808ClientBuilder"></param>
///// <returns></returns>
//public static IJT808ClientBuilder AddReplyMessage<TReplyMessageHandler>(this IJT808ClientBuilder jT808ClientBuilder)
// where TReplyMessageHandler : JT808QueueReplyMessageHandler
//{
// jT808ClientBuilder.JT808Builder.Services.AddSingleton<JT808QueueReplyMessageHandler, TReplyMessageHandler>();
// jT808ClientBuilder.JT808Builder.Services.AddHostedService<JT808ReplyMessageHostedService>();
// return jT808ClientBuilder;
//}
}
}

+ 23
- 23
src/JT808.Gateway.Services/JT808.Gateway.ReplyMessage/JT808ReplyMessageHostedService.cs Просмотреть файл

@@ -5,30 +5,30 @@ using JT808.Gateway.Abstractions;

namespace JT808.Gateway.ReplyMessage
{
public class JT808ReplyMessageHostedService : IHostedService
{
private readonly IJT808MsgConsumer jT808MsgConsumer;
private readonly JT808QueueReplyMessageHandler jT808ReplyMessageHandler;
//public class JT808ReplyMessageHostedService : IHostedService
//{
// //private readonly IJT808MsgConsumer jT808MsgConsumer;
// //private readonly JT808QueueReplyMessageHandler jT808ReplyMessageHandler;

public JT808ReplyMessageHostedService(
JT808QueueReplyMessageHandler jT808ReplyMessageHandler,
IJT808MsgConsumer jT808MsgConsumer)
{
this.jT808MsgConsumer = jT808MsgConsumer;
this.jT808ReplyMessageHandler = jT808ReplyMessageHandler;
}
// //public JT808ReplyMessageHostedService(
// // JT808QueueReplyMessageHandler jT808ReplyMessageHandler,
// // IJT808MsgConsumer jT808MsgConsumer)
// //{
// // this.jT808MsgConsumer = jT808MsgConsumer;
// // this.jT808ReplyMessageHandler = jT808ReplyMessageHandler;
// //}

public Task StartAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Subscribe();
jT808MsgConsumer.OnMessage(jT808ReplyMessageHandler.Processor);
return Task.CompletedTask;
}
// //public Task StartAsync(CancellationToken cancellationToken)
// //{
// // jT808MsgConsumer.Subscribe();
// // jT808MsgConsumer.OnMessage(jT808ReplyMessageHandler.Processor);
// // return Task.CompletedTask;
// //}

public Task StopAsync(CancellationToken cancellationToken)
{
jT808MsgConsumer.Unsubscribe();
return Task.CompletedTask;
}
}
// //public Task StopAsync(CancellationToken cancellationToken)
// //{
// // jT808MsgConsumer.Unsubscribe();
// // return Task.CompletedTask;
// //}
//}
}

+ 2
- 2
src/JT808.Gateway.Services/JT808.Gateway.SessionNotice/JT808SessionNoticeExtensions.cs Просмотреть файл

@@ -40,7 +40,7 @@ namespace JT808.Gateway.SessionNotice
/// </summary>
/// <param name="jT808NormalGatewayBuilder"></param>
/// <returns></returns>
public static IJT808NormalGatewayBuilder AddSessionNotice(this IJT808NormalGatewayBuilder jT808NormalGatewayBuilder)
public static IJT808GatewayBuilder AddSessionNotice(this IJT808GatewayBuilder jT808NormalGatewayBuilder)
{
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton<JT808SessionNoticeService>();
jT808NormalGatewayBuilder.JT808Builder.Services.AddHostedService<JT808SessionNoticeHostedService>();
@@ -53,7 +53,7 @@ namespace JT808.Gateway.SessionNotice
/// <typeparam name="TSessionNoticeService">自定义会话通知服务</typeparam>
/// <param name="jT808NormalGatewayBuilder"></param>
/// <returns></returns>
public static IJT808NormalGatewayBuilder AddSessionNotice<TSessionNoticeService>(this IJT808NormalGatewayBuilder jT808NormalGatewayBuilder)
public static IJT808GatewayBuilder AddSessionNotice<TSessionNoticeService>(this IJT808GatewayBuilder jT808NormalGatewayBuilder)
where TSessionNoticeService : JT808SessionNoticeService
{
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton<JT808SessionNoticeService, TSessionNoticeService>();


+ 2
- 2
src/JT808.Gateway.Services/JT808.Gateway.Traffic/JT808TrafficServiceExtensions.cs Просмотреть файл

@@ -38,7 +38,7 @@ namespace JT808.Gateway.Traffic
/// </summary>
/// <param name="jT808NormalGatewayBuilder"></param>
/// <returns></returns>
public static IJT808NormalGatewayBuilder AddTraffic<TIJT808Traffic>(this IJT808NormalGatewayBuilder jT808NormalGatewayBuilder)
public static IJT808GatewayBuilder AddTraffic<TIJT808Traffic>(this IJT808GatewayBuilder jT808NormalGatewayBuilder)
where TIJT808Traffic : IJT808Traffic
{
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808Traffic), typeof(TIJT808Traffic));
@@ -51,7 +51,7 @@ namespace JT808.Gateway.Traffic
/// </summary>
/// <param name="jT808NormalGatewayBuilder"></param>
/// <returns></returns>
public static IJT808NormalGatewayBuilder AddTraffic(this IJT808NormalGatewayBuilder jT808NormalGatewayBuilder)
public static IJT808GatewayBuilder AddTraffic(this IJT808GatewayBuilder jT808NormalGatewayBuilder)
{
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton(typeof(IJT808Traffic), typeof(JT808TrafficDefault));
return jT808NormalGatewayBuilder;


+ 1
- 1
src/JT808.Gateway.Services/JT808.Gateway.Transmit/JT808TransmitExtensions.cs Просмотреть файл

@@ -31,7 +31,7 @@ namespace JT808.Gateway.Transmit
/// <param name="jT808NormalGatewayBuilder"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static IJT808NormalGatewayBuilder AddTransmit(this IJT808NormalGatewayBuilder jT808NormalGatewayBuilder, IConfiguration configuration)
public static IJT808GatewayBuilder AddTransmit(this IJT808GatewayBuilder jT808NormalGatewayBuilder, IConfiguration configuration)
{
jT808NormalGatewayBuilder.JT808Builder.Services.Configure<RemoteServerOptions>(configuration.GetSection("RemoteServerOptions"));
jT808NormalGatewayBuilder.JT808Builder.Services.AddSingleton<JT808TransmitService>();


+ 1
- 0
src/JT808.Gateway.Tests/JT808.Gateway.NormalHosting/JT808.Gateway.NormalHosting.csproj Просмотреть файл

@@ -6,6 +6,7 @@
</PropertyGroup>

<ItemGroup>
<Compile Remove="Impl\JT808NormalReplyMessageHandlerImpl.cs" />
<Compile Remove="Jobs\CallGrpcClientJob.cs" />
</ItemGroup>



+ 1
- 1
src/JT808.Gateway.Tests/JT808.Gateway.NormalHosting/Program.cs Просмотреть файл

@@ -52,7 +52,7 @@ namespace JT808.Gateway.NormalHosting
//// options.TcpPort = 808;
//// options.UdpPort = 808;
////})
.AddNormalGateway(hostContext.Configuration)
.AddGateway(hostContext.Configuration)
//.ReplaceNormalReplyMessageHandler<JT808NormalReplyMessageHandlerImpl>()
//.AddMsgLogging<JT808MsgLogging>()
//.AddTraffic()


+ 2
- 3
src/JT808.Gateway.Tests/JT808.Gateway.QueueHosting/Program.cs Просмотреть файл

@@ -46,7 +46,7 @@ namespace JT808.Gateway.QueueHosting
// options.TcpPort = 808;
// options.UdpPort = 808;
//})
.AddQueueGateway(hostContext.Configuration)
.AddGateway(hostContext.Configuration)
.AddServerKafkaMsgProducer(hostContext.Configuration)
.AddServerKafkaSessionProducer(hostContext.Configuration)
.AddServerKafkaMsgReplyConsumer(hostContext.Configuration)
@@ -61,14 +61,13 @@ namespace JT808.Gateway.QueueHosting
//添加消息应答服务
.AddMsgReplyProducer(hostContext.Configuration)
//添加消息应答处理
.AddReplyMessage()
//.AddReplyMessage()
;
//grpc客户端调用
//services.AddHostedService<CallGrpcClientJob>();
//客户端测试
services.AddHostedService<UpJob>();
});

await serverHostBuilder.RunConsoleAsync();
}
}


+ 37
- 4
src/JT808.Gateway.Tests/JT808.Gateway.Test/JT808HttpClientTest.cs Просмотреть файл

@@ -30,8 +30,7 @@ namespace JT808.Gateway.Test
Assert.Equal("123456", token);
Assert.Equal("http://localhost/", uri);
serviceDescriptors.AddJT808WebApiClientTool(builder.Build());
}

}
[Fact(DisplayName = "使用postman测试")]
public void Test2()
{
@@ -43,8 +42,42 @@ namespace JT808.Gateway.Test
//http://127.0.0.1:828/jt808api/Tcp/Session/RemoveByTerminalPhoneNo
//123456789
///http://127.0.0.1:828/jt808api/UnificationSend
//{"TerminalPhoneNo":"123456789","Data":"7e 01 02 7e"}
//{"TerminalPhoneNo":"123456789","Data":"7e01027e"}
//{"TerminalPhoneNo":"123456789","HexData":"7e 01 02 7e"}
//{"TerminalPhoneNo":"123456789","HexData":"7e01027e"}
//UDP
//http://127.0.0.1:828/jt808api/Udp/Session/GetAll
//http://127.0.0.1:828/jt808api/Udp/Session/RemoveUdpByTerminalPhoneNo
//123456789
//http://127.0.0.1:828/jt808api/Udp/Session/QueryUdpSessionByTerminalPhoneNo
}

[Fact]
public void Test3()
{
IServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddSingleton<A>();

IServiceProvider aa = serviceDescriptors.BuildServiceProvider();
IServiceCollection sc= aa.GetRequiredService<IServiceCollection>();
sc.AddSingleton<B>();

IServiceProvider aa1 = serviceDescriptors.BuildServiceProvider();
B b = aa.GetRequiredService<B>();
}
}

public class A
{

}

public class B
{

}

public class C
{

}
}

+ 2
- 2
src/JT808.Gateway.WebApiClientTool/JT808.Gateway.WebApiClientTool.csproj Просмотреть файл

@@ -16,8 +16,8 @@
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageId>JT808.Gateway.WebApiClientTool</PackageId>
<Product>JT808.Gateway.WebApiClientTool</Product>
<Description>基于Pipeline的WebApiClient客户端调用工具</Description>
<PackageReleaseNotes>基于Pipeline的WebApiClient客户端调用工具</PackageReleaseNotes>
<Description>JT808WebApiClient客户端调用工具</Description>
<PackageReleaseNotes>JT808WebApiClient客户端调用工具</PackageReleaseNotes>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>JT808.Gateway.WebApiClientTool.xml</DocumentationFile>


+ 64
- 5
src/JT808.Gateway.WebApiClientTool/JT808.Gateway.WebApiClientTool.xml Просмотреть файл

@@ -4,24 +4,47 @@
<name>JT808.Gateway.WebApiClientTool</name>
</assembly>
<members>
<member name="T:JT808.Gateway.WebApiClientTool.JT808HttpClient">
<summary>
</summary>
</member>
<member name="P:JT808.Gateway.WebApiClientTool.JT808HttpClient.HttpClient">
<summary>
</summary>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.#ctor(System.Net.Http.HttpClient)">
<summary>
</summary>
<param name="httpClient"></param>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.UnificationSend(JT808.Gateway.Abstractions.Dtos.JT808UnificationSendRequestDto)">
<summary>
统一下发信息
</summary>
<param name="jT808UnificationSendRequestDto"></param>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.GetTcpSessionAll">
<summary>
会话服务集合
</summary>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.RemoveByTerminalPhoneNo(System.String)">
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.QueryTcpSessionByTerminalPhoneNo(System.String)">
<summary>
会话服务-通过设备终端号移除对应会话
会话服务-通过设备终端号查询对应会话信息
</summary>
<param name="terminalPhoneNo"></param>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.UnificationSend(JT808.Gateway.Abstractions.Dtos.JT808UnificationSendRequestDto)">
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.RemoveTcpByTerminalPhoneNo(System.String)">
<summary>
统一下发信息
会话服务-通过设备终端号移除对应会话
</summary>
<param name="jT808UnificationSendRequestDto"></param>
<param name="terminalPhoneNo"></param>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.GetUdpSessionAll">
@@ -30,5 +53,41 @@
</summary>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.QueryUdpSessionByTerminalPhoneNo(System.String)">
<summary>
会话服务-通过设备终端号查询对应会话信息
</summary>
<param name="terminalPhoneNo"></param>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClient.RemoveUdpByTerminalPhoneNo(System.String)">
<summary>
会话服务-通过设备终端号移除对应会话
</summary>
<param name="terminalPhoneNo"></param>
<returns></returns>
</member>
<member name="T:JT808.Gateway.WebApiClientTool.JT808HttpClientExtensions">
<summary>
</summary>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClientExtensions.AddJT808WebApiClientTool(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Uri,System.String)">
<summary>
</summary>
<param name="serviceDescriptors"></param>
<param name="webapiUri"></param>
<param name="token"></param>
<returns></returns>
</member>
<member name="M:JT808.Gateway.WebApiClientTool.JT808HttpClientExtensions.AddJT808WebApiClientTool(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
</summary>
<param name="serviceDescriptors"></param>
<param name="configuration"></param>
<returns></returns>
</member>
</members>
</doc>

+ 69
- 10
src/JT808.Gateway.WebApiClientTool/JT808HttpClient.cs Просмотреть файл

@@ -10,14 +10,41 @@ using System.Threading.Tasks;

namespace JT808.Gateway.WebApiClientTool
{
/// <summary>
///
/// </summary>
public class JT808HttpClient
{
//todo:其余接口待接入
/// <summary>
///
/// </summary>
public HttpClient HttpClient { get; }

/// <summary>
///
/// </summary>
/// <param name="httpClient"></param>
public JT808HttpClient(HttpClient httpClient)
{
HttpClient = httpClient;
}

/// <summary>
/// 统一下发信息
/// </summary>
/// <param name="jT808UnificationSendRequestDto"></param>
/// <returns></returns>
public async ValueTask<JT808ResultDto<bool>> UnificationSend(JT808UnificationSendRequestDto jT808UnificationSendRequestDto)
{
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.UnificationSend);
request.Content = new StringContent(JsonSerializer.Serialize(jT808UnificationSendRequestDto));
var response = await HttpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStreamAsync();
var value = await JsonSerializer.DeserializeAsync<JT808ResultDto<bool>>(data);
return value;
}

/// <summary>
/// 会话服务集合
/// </summary>
@@ -33,30 +60,30 @@ namespace JT808.Gateway.WebApiClientTool
}

/// <summary>
/// 会话服务-通过设备终端号移除对应会话
/// 会话服务-通过设备终端号查询对应会话信息
/// </summary>
/// <param name="terminalPhoneNo"></param>
/// <returns></returns>
public async ValueTask<JT808ResultDto<bool>> RemoveByTerminalPhoneNo(string terminalPhoneNo)
public async ValueTask<JT808ResultDto<JT808TcpSessionInfoDto>> QueryTcpSessionByTerminalPhoneNo(string terminalPhoneNo)
{
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.SessionRemoveByTerminalPhoneNo);
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.QueryTcpSessionByTerminalPhoneNo);
request.Content = new StringContent(terminalPhoneNo);
var response = await HttpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStreamAsync();
var value = await JsonSerializer.DeserializeAsync<JT808ResultDto<bool>>(data);
var value = await JsonSerializer.DeserializeAsync<JT808ResultDto<JT808TcpSessionInfoDto>>(data);
return value;
}

/// <summary>
/// 统一下发信息
/// 会话服务-通过设备终端号移除对应会话
/// </summary>
/// <param name="jT808UnificationSendRequestDto"></param>
/// <param name="terminalPhoneNo"></param>
/// <returns></returns>
public async ValueTask<JT808ResultDto<bool>> UnificationSend(JT808UnificationSendRequestDto jT808UnificationSendRequestDto)
public async ValueTask<JT808ResultDto<bool>> RemoveTcpByTerminalPhoneNo(string terminalPhoneNo)
{
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.UnificationSend);
request.Content = new StringContent(JsonSerializer.Serialize(jT808UnificationSendRequestDto));
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.SessionRemoveByTerminalPhoneNo);
request.Content = new StringContent(terminalPhoneNo);
var response = await HttpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStreamAsync();
@@ -77,5 +104,37 @@ namespace JT808.Gateway.WebApiClientTool
var value = await JsonSerializer.DeserializeAsync<JT808ResultDto<List<JT808UdpSessionInfoDto>>>(data);
return value;
}

/// <summary>
/// 会话服务-通过设备终端号查询对应会话信息
/// </summary>
/// <param name="terminalPhoneNo"></param>
/// <returns></returns>
public async ValueTask<JT808ResultDto<JT808UdpSessionInfoDto>> QueryUdpSessionByTerminalPhoneNo(string terminalPhoneNo)
{
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.QueryUdpSessionByTerminalPhoneNo);
request.Content = new StringContent(terminalPhoneNo);
var response = await HttpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStreamAsync();
var value = await JsonSerializer.DeserializeAsync<JT808ResultDto<JT808UdpSessionInfoDto>>(data);
return value;
}

/// <summary>
/// 会话服务-通过设备终端号移除对应会话
/// </summary>
/// <param name="terminalPhoneNo"></param>
/// <returns></returns>
public async ValueTask<JT808ResultDto<bool>> RemoveUdpByTerminalPhoneNo(string terminalPhoneNo)
{
var request = new HttpRequestMessage(HttpMethod.Post, JT808GatewayConstants.JT808WebApiRouteTable.RemoveUdpByTerminalPhoneNo);
request.Content = new StringContent(terminalPhoneNo);
var response = await HttpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStreamAsync();
var value = await JsonSerializer.DeserializeAsync<JT808ResultDto<bool>>(data);
return value;
}
}
}

+ 16
- 0
src/JT808.Gateway.WebApiClientTool/JT808HttpClientExtensions.cs Просмотреть файл

@@ -6,8 +6,18 @@ using System.Text;

namespace JT808.Gateway.WebApiClientTool
{
/// <summary>
///
/// </summary>
public static class JT808HttpClientExtensions
{
/// <summary>
///
/// </summary>
/// <param name="serviceDescriptors"></param>
/// <param name="webapiUri"></param>
/// <param name="token"></param>
/// <returns></returns>
public static IServiceCollection AddJT808WebApiClientTool(this IServiceCollection serviceDescriptors, Uri webapiUri,string token)
{
serviceDescriptors.AddHttpClient("JT808WebApiClientTool", c =>
@@ -20,6 +30,12 @@ namespace JT808.Gateway.WebApiClientTool
return serviceDescriptors;
}

/// <summary>
///
/// </summary>
/// <param name="serviceDescriptors"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static IServiceCollection AddJT808WebApiClientTool(this IServiceCollection serviceDescriptors, IConfiguration configuration)
{
serviceDescriptors.AddHttpClient("JT808WebApiClientTool", c =>


+ 7
- 7
src/JT808.Gateway.sln Просмотреть файл

@@ -17,8 +17,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.MsgLogging",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.SessionNotice", "JT808.Gateway.Services\JT808.Gateway.SessionNotice\JT808.Gateway.SessionNotice.csproj", "{1CB84599-5F56-4461-A451-DF16E3854AB9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.ReplyMessage", "JT808.Gateway.Services\JT808.Gateway.ReplyMessage\JT808.Gateway.ReplyMessage.csproj", "{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Transmit", "JT808.Gateway.Services\JT808.Gateway.Transmit\JT808.Gateway.Transmit.csproj", "{598E445A-AF2E-42F0-98F4-18EC22E473FC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Client", "JT808.Gateway.Client\JT808.Gateway.Client.csproj", "{AC3070AC-A938-4213-A562-C079BB4A3F9E}"
@@ -41,6 +39,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.Traffic", "JT
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.WebApiClientTool", "JT808.Gateway.WebApiClientTool\JT808.Gateway.WebApiClientTool.csproj", "{479DFD02-4777-4DC2-9E2E-8EA33BFB36C9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JT808.Gateway.ReplyMessage", "JT808.Gateway.Services\JT808.Gateway.ReplyMessage\JT808.Gateway.ReplyMessage.csproj", "{886D0A3F-C974-442B-9820-F1C4C04EAAB6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -71,10 +71,6 @@ Global
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CB84599-5F56-4461-A451-DF16E3854AB9}.Release|Any CPU.Build.0 = Release|Any CPU
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4}.Release|Any CPU.Build.0 = Release|Any CPU
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{598E445A-AF2E-42F0-98F4-18EC22E473FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -111,6 +107,10 @@ Global
{479DFD02-4777-4DC2-9E2E-8EA33BFB36C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{479DFD02-4777-4DC2-9E2E-8EA33BFB36C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{479DFD02-4777-4DC2-9E2E-8EA33BFB36C9}.Release|Any CPU.Build.0 = Release|Any CPU
{886D0A3F-C974-442B-9820-F1C4C04EAAB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{886D0A3F-C974-442B-9820-F1C4C04EAAB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{886D0A3F-C974-442B-9820-F1C4C04EAAB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{886D0A3F-C974-442B-9820-F1C4C04EAAB6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -119,7 +119,6 @@ Global
{D62E3054-6924-4F1A-9BEF-E52B191F16B6} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
{A242A839-4F00-4434-A7E8-7E3BEBA5B75C} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
{1CB84599-5F56-4461-A451-DF16E3854AB9} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
{604BB5CF-9ED1-4D78-9328-59436E2B4EB4} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
{598E445A-AF2E-42F0-98F4-18EC22E473FC} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
{E3DC260E-0B55-4993-B051-402E44D4E883} = {7CBAACEE-19BF-499A-8C41-36A1324D45E9}
{22368AAD-A1F3-446B-B68F-98A0933BF1F6} = {7CBAACEE-19BF-499A-8C41-36A1324D45E9}
@@ -127,6 +126,7 @@ Global
{E34C6B7D-A48B-4871-895C-07AC12F959D3} = {6FAEC008-93CB-4730-8C58-D31FFD342C4F}
{AF0C529A-D3CA-4FE4-93B4-735D0934EBEF} = {6FAEC008-93CB-4730-8C58-D31FFD342C4F}
{E5A0BFB6-4345-4592-A2B1-E3CB1FA423AE} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
{886D0A3F-C974-442B-9820-F1C4C04EAAB6} = {3EF8490D-C993-49D8-8A3D-493B7F259D70}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AA9303A7-6FB3-4572-88AA-3302E85330D1}


+ 1
- 1
src/JT808.Gateway/Handlers/JT808MsgIdDefaultWebApiHandler.cs Просмотреть файл

@@ -225,7 +225,7 @@ namespace JT808.Gateway.Handlers
try
{
JT808UnificationSendRequestDto jT808UnificationSendRequestDto = JsonSerializer.Deserialize<JT808UnificationSendRequestDto>(json);
resultDto.Data = JT808SessionManager.TrySendByTerminalPhoneNoAsync(jT808UnificationSendRequestDto.TerminalPhoneNo, jT808UnificationSendRequestDto.Data.ToHexBytes())
resultDto.Data = JT808SessionManager.TrySendByTerminalPhoneNoAsync(jT808UnificationSendRequestDto.TerminalPhoneNo, jT808UnificationSendRequestDto.HexData.ToHexBytes())
.GetAwaiter()
.GetResult();
resultDto.Code = JT808ResultCode.Ok;


+ 4
- 0
src/JT808.Gateway/JT808.Gateway.csproj Просмотреть файл

@@ -19,6 +19,10 @@
<Product>JT808.Gateway</Product>
<Version>$(JT808GatewayPackageVersion)</Version>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Internal\JT808NormalGatewayBuilderDefault.cs" />
<Compile Remove="Internal\JT808QueueGatewayBuilderDefault.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Options" Version="3.1.7" />


+ 50
- 35
src/JT808.Gateway/JT808GatewayExtensions.cs Просмотреть файл

@@ -1,7 +1,6 @@
using JT808.Gateway.Abstractions;
using JT808.Gateway.Authorization;
using JT808.Gateway.Configurations;
using JT808.Gateway.Enums;
using JT808.Gateway.Handlers;
using JT808.Gateway.Internal;
using JT808.Gateway.Services;
@@ -19,47 +18,63 @@ namespace JT808.Gateway
{
public static partial class JT808GatewayExtensions
{
public static IJT808QueueGatewayBuilder AddQueueGateway(this IJT808Builder jT808Builder, Action<JT808Configuration> config)
{
IJT808QueueGatewayBuilder server = new JT808QueueGatewayBuilderDefault(jT808Builder);
server.JT808Builder.Services.Configure(config);
server.AddJT808Core();
server.JT808Builder.Services.AddHostedService<JT808MsgReplyHostedService>();
return server;
}
//public static IJT808QueueGatewayBuilder AddQueueGateway(this IJT808Builder jT808Builder, Action<JT808Configuration> config)
//{
// IJT808QueueGatewayBuilder server = new JT808QueueGatewayBuilderDefault(jT808Builder);
// server.JT808Builder.Services.Configure(config);
// server.AddJT808Core();
// server.JT808Builder.Services.AddHostedService<JT808MsgReplyHostedService>();
// return server;
//}

public static IJT808NormalGatewayBuilder AddNormalGateway(this IJT808Builder jT808Builder, Action<JT808Configuration> config)
{
IJT808NormalGatewayBuilder server = new JT808NormalGatewayBuilderDefault(jT808Builder);
server.JT808Builder.Services.AddSingleton<JT808NormalReplyMessageHandler>();
server.JT808Builder.Services.Configure(config);
server.AddJT808Core();
return server;
}
//public static IJT808NormalGatewayBuilder AddNormalGateway(this IJT808Builder jT808Builder, Action<JT808Configuration> config)
//{
// IJT808NormalGatewayBuilder server = new JT808NormalGatewayBuilderDefault(jT808Builder);
// server.JT808Builder.Services.AddSingleton<JT808NormalReplyMessageHandler>();
// server.JT808Builder.Services.Configure(config);
// server.AddJT808Core();
// return server;
//}

public static IJT808QueueGatewayBuilder AddQueueGateway(this IJT808Builder jT808Builder, IConfiguration configuration)
{
IJT808QueueGatewayBuilder server = new JT808QueueGatewayBuilderDefault(jT808Builder);
server.JT808Builder.Services.Configure<JT808Configuration>(configuration.GetSection("JT808Configuration"));
server.AddJT808Core();
server.JT808Builder.Services.AddHostedService<JT808MsgReplyHostedService>();
return server;
}
//public static IJT808QueueGatewayBuilder AddQueueGateway(this IJT808Builder jT808Builder, IConfiguration configuration)
//{
// IJT808QueueGatewayBuilder server = new JT808QueueGatewayBuilderDefault(jT808Builder);
// server.JT808Builder.Services.Configure<JT808Configuration>(configuration.GetSection("JT808Configuration"));
// server.AddJT808Core();
// server.JT808Builder.Services.AddHostedService<JT808MsgReplyHostedService>();
// return server;
//}

//public static IJT808NormalGatewayBuilder AddNormalGateway(this IJT808Builder jT808Builder, IConfiguration configuration)
//{
// IJT808NormalGatewayBuilder server = new JT808NormalGatewayBuilderDefault(jT808Builder);
// server.JT808Builder.Services.AddSingleton<JT808NormalReplyMessageHandler>();
// server.JT808Builder.Services.Configure<JT808Configuration>(configuration.GetSection("JT808Configuration"));
// server.AddJT808Core();
// return server;
//}

public static IJT808NormalGatewayBuilder AddNormalGateway(this IJT808Builder jT808Builder, IConfiguration configuration)
//public static IJT808NormalGatewayBuilder ReplaceNormalReplyMessageHandler<TJT808NormalReplyMessageHandler>(this IJT808NormalGatewayBuilder config)
// where TJT808NormalReplyMessageHandler : JT808NormalReplyMessageHandler
//{
// config.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(JT808NormalReplyMessageHandler),typeof(TJT808NormalReplyMessageHandler), ServiceLifetime.Singleton));
// return config;
//}

public static IJT808GatewayBuilder AddGateway(this IJT808Builder jT808Builder, Action<JT808Configuration> config)
{
IJT808NormalGatewayBuilder server = new JT808NormalGatewayBuilderDefault(jT808Builder);
server.JT808Builder.Services.AddSingleton<JT808NormalReplyMessageHandler>();
server.JT808Builder.Services.Configure<JT808Configuration>(configuration.GetSection("JT808Configuration"));
server.AddJT808Core();
return server;
JT808GatewayBuilderDefault jT808GatewayBuilderDefault = new JT808GatewayBuilderDefault(jT808Builder);
jT808GatewayBuilderDefault.JT808Builder.Services.Configure(config);
jT808GatewayBuilderDefault.AddJT808Core();
return jT808GatewayBuilderDefault;
}

public static IJT808NormalGatewayBuilder ReplaceNormalReplyMessageHandler<TJT808NormalReplyMessageHandler>(this IJT808NormalGatewayBuilder config)
where TJT808NormalReplyMessageHandler : JT808NormalReplyMessageHandler
public static IJT808GatewayBuilder AddGateway(this IJT808Builder jT808Builder, IConfiguration configuration)
{
config.JT808Builder.Services.Replace(new ServiceDescriptor(typeof(JT808NormalReplyMessageHandler),typeof(TJT808NormalReplyMessageHandler), ServiceLifetime.Singleton));
return config;
JT808GatewayBuilderDefault jT808GatewayBuilderDefault = new JT808GatewayBuilderDefault(jT808Builder);
jT808GatewayBuilderDefault.JT808Builder.Services.Configure<JT808Configuration>(configuration.GetSection("JT808Configuration"));
jT808GatewayBuilderDefault.AddJT808Core();
return jT808GatewayBuilderDefault;
}

public static IJT808GatewayBuilder AddTcp(this IJT808GatewayBuilder config)


+ 6
- 48
src/JT808.Gateway/JT808TcpServer.cs Просмотреть файл

@@ -1,17 +1,12 @@
using System;
using System.Buffers;
using System.Collections.Generic;
using System.IO.Pipelines;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using JT808.Gateway.Abstractions;
using JT808.Gateway.Abstractions.Enums;
using JT808.Gateway.Configurations;
using JT808.Gateway.Enums;
using JT808.Gateway.Services;
using JT808.Gateway.Session;
using JT808.Protocol;
using JT808.Protocol.Exceptions;
@@ -30,62 +25,32 @@ namespace JT808.Gateway

private readonly JT808SessionManager SessionManager;

private readonly IJT808MsgProducer MsgProducer;

private readonly JT808Serializer Serializer;

private readonly JT808Configuration Configuration;

private readonly JT808NormalReplyMessageHandler JT808NormalReplyMessageHandler;

private JT808UseType JT808UseType;
private readonly JT808MessageHandler MessageHandler;

/// <summary>
/// 使用队列方式
/// </summary>
/// <param name="messageHandler"></param>
/// <param name="jT808ConfigurationAccessor"></param>
/// <param name="jT808Config"></param>
/// <param name="loggerFactory"></param>
/// <param name="jT808SessionManager"></param>
/// <param name="jT808MsgProducer"></param>
/// <param name="jT808AtomicCounterServiceFactory"></param>
public JT808TcpServer(
IOptions<JT808Configuration> jT808ConfigurationAccessor,
IJT808Config jT808Config,
ILoggerFactory loggerFactory,
JT808SessionManager jT808SessionManager,
IJT808MsgProducer jT808MsgProducer)
{
SessionManager = jT808SessionManager;
Logger = loggerFactory.CreateLogger("JT808TcpServer");
Serializer = jT808Config.GetSerializer();
MsgProducer = jT808MsgProducer;
Configuration = jT808ConfigurationAccessor.Value;
JT808UseType = JT808UseType.Queue;
InitServer();
}
/// <summary>
/// 使用正常方式
/// </summary>
/// <param name="jT808ConfigurationAccessor"></param>
/// <param name="jT808Config"></param>
/// <param name="loggerFactory"></param>
/// <param name="jT808SessionManager"></param>
/// <param name="replyMessageHandler"></param>
/// <param name="jT808AtomicCounterServiceFactory"></param>
public JT808TcpServer(
JT808MessageHandler messageHandler,
IOptions<JT808Configuration> jT808ConfigurationAccessor,
IJT808Config jT808Config,
ILoggerFactory loggerFactory,
JT808SessionManager jT808SessionManager,
JT808NormalReplyMessageHandler replyMessageHandler)
JT808SessionManager jT808SessionManager)
{
MessageHandler = messageHandler;
SessionManager = jT808SessionManager;
Logger = loggerFactory.CreateLogger("JT808TcpServer");
Serializer = jT808Config.GetSerializer();
JT808NormalReplyMessageHandler = replyMessageHandler;
Configuration = jT808ConfigurationAccessor.Value;
JT808UseType = JT808UseType.Normal;
InitServer();
}

@@ -231,14 +196,7 @@ namespace JT808.Gateway
var package = Serializer.HeaderDeserialize(contentSpan, minBufferSize: 10240);
if (Logger.IsEnabled(LogLevel.Trace)) Logger.LogTrace($"[Accept Hex {session.Client.RemoteEndPoint}]:{package.OriginalData.ToArray().ToHexString()}");
SessionManager.TryLink(package.Header.TerminalPhoneNo, session);
if(JT808UseType== JT808UseType.Normal)
{
JT808NormalReplyMessageHandler.Processor(package, session);
}
else if(JT808UseType== JT808UseType.Queue)
{
MsgProducer.ProduceAsync(package.Header.TerminalPhoneNo, package.OriginalData.ToArray());
}
MessageHandler.Processor(package, session);
}
}
catch (NotImplementedException ex)


+ 4
- 37
src/JT808.Gateway/JT808UdpServer.cs Просмотреть файл

@@ -8,10 +8,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using JT808.Gateway.Abstractions;
using JT808.Gateway.Abstractions.Enums;
using JT808.Gateway.Configurations;
using JT808.Gateway.Enums;
using JT808.Gateway.Services;
using JT808.Gateway.Session;
using JT808.Protocol;
using JT808.Protocol.Exceptions;
@@ -30,49 +27,26 @@ namespace JT808.Gateway

private readonly JT808SessionManager SessionManager;

private readonly IJT808MsgProducer MsgProducer;

private readonly JT808Serializer Serializer;

private readonly JT808Configuration Configuration;

private readonly IPEndPoint LocalIPEndPoint;

private readonly JT808NormalReplyMessageHandler JT808NormalReplyMessageHandler;

private JT808UseType JT808UseType;
private readonly JT808MessageHandler MessageHandler;

public JT808UdpServer(
IOptions<JT808Configuration> jT808ConfigurationAccessor,
IJT808Config jT808Config,
ILoggerFactory loggerFactory,
JT808SessionManager jT808SessionManager,
IJT808MsgProducer jT808MsgProducer)
{
SessionManager = jT808SessionManager;
Logger = loggerFactory.CreateLogger("JT808UdpServer");
Serializer = jT808Config.GetSerializer();
MsgProducer = jT808MsgProducer;
Configuration = jT808ConfigurationAccessor.Value;
JT808UseType = JT808UseType.Queue;
LocalIPEndPoint = new System.Net.IPEndPoint(IPAddress.Any, Configuration.UdpPort);
server = new Socket(LocalIPEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
server.Bind(LocalIPEndPoint);
}

public JT808UdpServer(
IOptions<JT808Configuration> jT808ConfigurationAccessor,
IJT808Config jT808Config,
ILoggerFactory loggerFactory,
JT808SessionManager jT808SessionManager,
JT808NormalReplyMessageHandler replyMessageHandler)
JT808MessageHandler messageHandler)
{
SessionManager = jT808SessionManager;
Logger = loggerFactory.CreateLogger("JT808UdpServer");
Serializer = jT808Config.GetSerializer();
JT808NormalReplyMessageHandler = replyMessageHandler;
Configuration = jT808ConfigurationAccessor.Value;
JT808UseType = JT808UseType.Normal;
MessageHandler = messageHandler;
LocalIPEndPoint = new System.Net.IPEndPoint(IPAddress.Any, Configuration.UdpPort);
server = new Socket(LocalIPEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
server.Bind(LocalIPEndPoint);
@@ -120,14 +94,7 @@ namespace JT808.Gateway
{
Logger.LogInformation($"[Connected]:{receiveMessageFromResult.RemoteEndPoint}");
}
if (JT808UseType == JT808UseType.Normal)
{
JT808NormalReplyMessageHandler.Processor(package, session);
}
else if (JT808UseType == JT808UseType.Queue)
{
MsgProducer.ProduceAsync(package.Header.TerminalPhoneNo, package.OriginalData.ToArray());
}
MessageHandler.Processor(package, session);
}
catch (NotImplementedException ex)
{


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