diff --git a/api/README.md b/api/README.md index 14437a5..559eb3c 100644 --- a/api/README.md +++ b/api/README.md @@ -22,12 +22,18 @@ [基于Tcp转发地址过滤服务](#tcp_transmit) -## 4.消息包计数服务 +## 4.消息包计数服务(次日清零) [基于Tcp消息包计数服务](#tcp_counter) [基于Udp消息包计数服务](#udp_counter) +## 5.流量统计服务(次日清零) + +[基于Tcp流量统计服务](#tcp_traffic) + +[基于Udp流量统计服务](#udp_traffic) + ### 统一对象返回 JT808ResultDto\ |属性|数据类型|参数说明| @@ -385,3 +391,55 @@ } } ``` + +### 基于Tcp流量统计服务 + +请求地址:Tcp/Traffic/Get + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| TotalReceiveSize| double| 总接收大小(单位KB)| +| TotalSendSize| double| 总发送大小(单位KB)| + +返回结果: + +``` traffic1 +{ + "Message":"", + "Code":200, + "Data":{ + "TotalReceiveSize":0.0478515625, + "TotalSendSize":0.01953125 + } +} +``` + +### 基于Udp流量统计服务 + +请求地址:Udp/Traffic/Get + +请求方式:GET + +返回数据: + +|属性|数据类型|参数说明| +|------|:------:|:------| +| TotalReceiveSize| double| 总接收大小(单位KB)| +| TotalSendSize| double| 总发送大小(单位KB)| + +返回结果: + +``` traffic2 +{ + "Message":"", + "Code":200, + "Data":{ + "TotalReceiveSize":0.0478515625, + "TotalSendSize":0.01953125 + } +} +``` \ No newline at end of file diff --git a/src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs b/src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs new file mode 100644 index 0000000..594c355 --- /dev/null +++ b/src/JT808.DotNetty.Abstractions/Dtos/JT808TrafficInfoDto.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.DotNetty.Abstractions.Dtos +{ + public class JT808TrafficInfoDto + { + /// + /// 总接收大小 + /// 单位KB + /// + public double TotalReceiveSize { get; set; } + /// + /// 总发送大小 + /// 单位KB + /// + public double TotalSendSize { get; set; } + } +} diff --git a/src/JT808.DotNetty.Abstractions/JT808Constants.cs b/src/JT808.DotNetty.Abstractions/JT808Constants.cs index 14e3965..b331acb 100644 --- a/src/JT808.DotNetty.Abstractions/JT808Constants.cs +++ b/src/JT808.DotNetty.Abstractions/JT808Constants.cs @@ -14,24 +14,26 @@ public const string TransmitPrefix = "Transmit"; + public const string TrafficPrefix = "Traffic"; + public const string TcpPrefix = "Tcp"; public const string UdpPrefix = "Udp"; /// - /// 添加转发过滤地址 + ///基于Tcp的添加转发过滤地址 /// public static string TransmitAdd = $"{RouteTablePrefix}/{TcpPrefix}/{TransmitPrefix}/Add"; /// - /// 删除转发过滤地址(不能删除在网关服务器配置文件配的地址) + /// 基于Tcp的删除转发过滤地址(不能删除在网关服务器配置文件配的地址) /// public static string TransmitRemove = $"{RouteTablePrefix}/{TcpPrefix}/{TransmitPrefix}/Remove"; /// - /// 获取转发过滤地址信息集合 + ///基于Tcp的获取转发过滤地址信息集合 /// public static string TransmitGetAll = $"{RouteTablePrefix}/{TcpPrefix}/{TransmitPrefix}/GetAll"; /// - /// 获取Tcp包计数器 + /// 基于Tcp的包计数器 /// public static string GetTcpAtomicCounter = $"{RouteTablePrefix}/{TcpPrefix}/GetAtomicCounter"; /// @@ -46,6 +48,11 @@ /// 基于Tcp的统一下发信息 /// public static string UnificationTcpSend = $"{RouteTablePrefix}/{TcpPrefix}/UnificationSend"; + /// + /// 基于Tcp的流量服务获取 + /// + public static string TrafficTcpGet = $"{RouteTablePrefix}/{TcpPrefix}/{TrafficPrefix}/Get"; + /// /// 获取Udp包计数器 /// @@ -62,7 +69,10 @@ /// 基于Udp的会话服务-通过设备终端号移除对应会话 /// public static string SessionUdpRemoveByTerminalPhoneNo = $"{RouteTablePrefix}/{UdpPrefix}/{SessionPrefix}/RemoveByTerminalPhoneNo"; - + /// + /// 基于Udp的流量服务获取 + /// c.Channel.Id == session.Channel.Id) > 1) + { + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = false; + resultDto.Message = "not support transmit data send."; + } + else + { + jT808TcpTrafficService.SendSize(data.Length); + session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data)); + resultDto.Code = JT808ResultCode.Ok; + resultDto.Data = true; + } } else { diff --git a/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs b/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs index b75cf1e..ab8c81d 100644 --- a/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs +++ b/src/JT808.DotNetty.Core/Session/JT808TcpSessionManager.cs @@ -73,15 +73,15 @@ namespace JT808.DotNetty.Core //使用场景: //部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, //这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 - //todo: 有设备关联上来可以进行通知 例如:使用Redis发布订阅 + //有设备关联上来可以进行通知 例如:使用Redis发布订阅 jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo); } } public JT808TcpSession RemoveSession(string terminalPhoneNo) { - //todo: 设备离线可以进行通知 - //todo: 使用Redis 发布订阅 + //设备离线可以进行通知 + //使用Redis 发布订阅 if (string.IsNullOrEmpty(terminalPhoneNo)) return default; if (!SessionIdDict.TryGetValue(terminalPhoneNo, out JT808TcpSession jT808Session)) { @@ -120,8 +120,8 @@ namespace JT808.DotNetty.Core public void RemoveSessionByChannel(IChannel channel) { - //todo: 设备离线可以进行通知 - //todo: 使用Redis 发布订阅 + //设备离线可以进行通知 + //使用Redis 发布订阅 var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == channel.Id).Select(s => s.Key).ToList(); if (terminalPhoneNos.Count > 0) { diff --git a/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs b/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs index 4ee8061..4e43f38 100644 --- a/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs +++ b/src/JT808.DotNetty.Core/Session/JT808UdpSessionManager.cs @@ -11,7 +11,7 @@ namespace JT808.DotNetty.Core { /// /// JT808 udp会话管理 - /// todo:估计要轮询下 + /// 估计要轮询下 /// public class JT808UdpSessionManager { @@ -81,7 +81,7 @@ namespace JT808.DotNetty.Core //使用场景: //部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, //这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 - //todo: 有设备关联上来可以进行通知 例如:使用Redis发布订阅 + //有设备关联上来可以进行通知 例如:使用Redis发布订阅 jT808SessionPublishing.PublishAsync(JT808Constants.SessionOnline, appSession.TerminalPhoneNo); } } @@ -99,8 +99,8 @@ namespace JT808.DotNetty.Core public JT808UdpSession RemoveSession(string terminalPhoneNo) { - //todo: 设备离线可以进行通知 - //todo: 使用Redis 发布订阅 + //设备离线可以进行通知 + //使用Redis 发布订阅 if (string.IsNullOrEmpty(terminalPhoneNo)) return default; if (!SessionIdDict.TryGetValue(terminalPhoneNo, out JT808UdpSession jT808Session)) { @@ -120,8 +120,8 @@ namespace JT808.DotNetty.Core public void RemoveSessionByChannel(IChannel channel) { - //todo: 设备离线可以进行通知 - //todo: 使用Redis 发布订阅 + //设备离线可以进行通知 + //使用Redis 发布订阅 var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == channel.Id).Select(s => s.Key).ToList(); if (terminalPhoneNos.Count > 0) { diff --git a/src/JT808.DotNetty.Hosting/Program.cs b/src/JT808.DotNetty.Hosting/Program.cs index d92f966..52ffd61 100644 --- a/src/JT808.DotNetty.Hosting/Program.cs +++ b/src/JT808.DotNetty.Hosting/Program.cs @@ -21,6 +21,7 @@ namespace JT808.DotNetty.Hosting { static async Task Main(string[] args) { + //7E020000220138123456780085000000010000000101EA2A3F08717931000C015400201901032000020104000000E6F87E var serverHostBuilder = new HostBuilder() .ConfigureAppConfiguration((hostingContext, config) => { diff --git a/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs b/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs index 55aca29..ee0b637 100644 --- a/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs +++ b/src/JT808.DotNetty.WebApi/Handlers/JT808MsgIdDefaultWebApiHandler.cs @@ -27,17 +27,23 @@ namespace JT808.DotNetty.WebApi.Handlers private readonly IJT808UnificationUdpSendService jT808UnificationUdpSendService; + private readonly JT808TcpTrafficService jT808TcpTrafficService; + + private readonly JT808UdpTrafficService jT808UdpTrafficService; + /// /// TCP一套注入 /// /// public JT808MsgIdDefaultWebApiHandler( + JT808TcpTrafficService jT808TcpTrafficService, IJT808UnificationTcpSendService jT808UnificationTcpSendService, IJT808TcpSessionService jT808TcpSessionService, JT808TransmitAddressFilterService jT808TransmitAddressFilterService, JT808TcpAtomicCounterService jT808TcpAtomicCounterService ) { + this.jT808TcpTrafficService = jT808TcpTrafficService; this.jT808UnificationTcpSendService = jT808UnificationTcpSendService; this.jT808TcpSessionService = jT808TcpSessionService; this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService; @@ -50,11 +56,13 @@ namespace JT808.DotNetty.WebApi.Handlers /// /// public JT808MsgIdDefaultWebApiHandler( + JT808UdpTrafficService jT808UdpTrafficService, IJT808UdpSessionService jT808UdpSessionService, IJT808UnificationUdpSendService jT808UnificationUdpSendService, JT808UdpAtomicCounterService jT808UdpAtomicCounterService ) { + this.jT808UdpTrafficService = jT808UdpTrafficService; this.jT808UdpSessionService = jT808UdpSessionService; this.jT808UnificationUdpSendService = jT808UnificationUdpSendService; this.jT808UdpAtomicCounterService = jT808UdpAtomicCounterService; @@ -67,6 +75,8 @@ namespace JT808.DotNetty.WebApi.Handlers /// /// public JT808MsgIdDefaultWebApiHandler( + JT808TcpTrafficService jT808TcpTrafficService, + JT808UdpTrafficService jT808UdpTrafficService, IJT808UnificationTcpSendService jT808UnificationTcpSendService, IJT808UnificationUdpSendService jT808UnificationUdpSendService, IJT808TcpSessionService jT808TcpSessionService, @@ -76,6 +86,8 @@ namespace JT808.DotNetty.WebApi.Handlers JT808UdpAtomicCounterService jT808UdpAtomicCounterService ) { + this.jT808TcpTrafficService = jT808TcpTrafficService; + this.jT808UdpTrafficService = jT808UdpTrafficService; this.jT808UdpSessionService = jT808UdpSessionService; this.jT808UnificationTcpSendService = jT808UnificationTcpSendService; this.jT808UnificationUdpSendService = jT808UnificationUdpSendService; @@ -245,6 +257,32 @@ namespace JT808.DotNetty.WebApi.Handlers return CreateJT808HttpResponse(result); } + /// + /// 基于Tcp的流量获取 + /// + /// + /// + public JT808HttpResponse TrafficTcpGet(JT808HttpRequest request) + { + JT808TrafficInfoDto jT808TrafficInfoDto = new JT808TrafficInfoDto(); + jT808TrafficInfoDto.TotalReceiveSize = (jT808TcpTrafficService.TotalReceiveSize * 1.0) / 1024; + jT808TrafficInfoDto.TotalSendSize = (jT808TcpTrafficService.TotalSendSize * 1.0) / 1024; + return CreateJT808HttpResponse(jT808TrafficInfoDto); + } + + /// + /// 基于Udp的流量获取 + /// + /// + /// + public JT808HttpResponse TrafficUdpGet(JT808HttpRequest request) + { + JT808TrafficInfoDto jT808TrafficInfoDto = new JT808TrafficInfoDto(); + jT808TrafficInfoDto.TotalReceiveSize = (jT808UdpTrafficService.TotalReceiveSize * 1.0) / 1024; + jT808TrafficInfoDto.TotalSendSize = (jT808UdpTrafficService.TotalSendSize * 1.0) / 1024; + return CreateJT808HttpResponse(jT808TrafficInfoDto); + } + protected virtual void InitTcpRoute() { CreateRoute(JT808Constants.JT808WebApiRouteTable.TransmitAdd, AddTransmitAddress); @@ -254,6 +292,7 @@ namespace JT808.DotNetty.WebApi.Handlers CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionTcpGetAll, GetTcpSessionAll); CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionTcpRemoveByTerminalPhoneNo, RemoveTcpSessionByTerminalPhoneNo); CreateRoute(JT808Constants.JT808WebApiRouteTable.UnificationTcpSend, UnificationTcpSend); + CreateRoute(JT808Constants.JT808WebApiRouteTable.TrafficTcpGet, TrafficTcpGet); } protected virtual void InitUdpRoute() @@ -262,6 +301,7 @@ namespace JT808.DotNetty.WebApi.Handlers CreateRoute(JT808Constants.JT808WebApiRouteTable.UnificationUdpSend, UnificationUdpSend); CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionUdpGetAll, GetUdpSessionAll); CreateRoute(JT808Constants.JT808WebApiRouteTable.SessionUdpRemoveByTerminalPhoneNo, RemoveUdpSessionByTerminalPhoneNo); + CreateRoute(JT808Constants.JT808WebApiRouteTable.TrafficUdpGet, TrafficUdpGet); } } }