@@ -31,11 +31,7 @@ | |||||
### 2.集成WebApi服务器 | ### 2.集成WebApi服务器 | ||||
#### [2.1.统一下发设备消息服务 IJT808UnificationSendService](#send) | |||||
#### [2.2.管理会话服务 IJT808SessionService](#session) | |||||
#### [2.3.消息包计数服务 JT808AtomicCounterService 接口尚未实现](#counter) | |||||
[WebApi接口服务](https://github.com/SmallChi/JT808DotNetty/blob/master/api/README.md) | |||||
### 3.集成业务消息处理程序 | ### 3.集成业务消息处理程序 | ||||
@@ -45,7 +41,7 @@ | |||||
### 举个栗子1 | ### 举个栗子1 | ||||
#### 1.实现业务消息处理程序JT808MsgIdHandlerBase | |||||
#### 3.1.实现业务消息处理程序JT808MsgIdHandlerBase | |||||
```business Imp | ```business Imp | ||||
public class JT808MsgIdCustomHandler : JT808MsgIdHandlerBase | public class JT808MsgIdCustomHandler : JT808MsgIdHandlerBase | ||||
@@ -66,18 +62,21 @@ public class JT808MsgIdCustomHandler : JT808MsgIdHandlerBase | |||||
} | } | ||||
``` | ``` | ||||
#### 2.自定义业务消息处理程序替换默认实现 | |||||
``` | |||||
#### 3.2.自定义业务消息处理程序替换默认实现 | |||||
``` handler | |||||
services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase), typeof(JT808MsgIdCustomHandler), ServiceLifetime.Singleton)); | services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase), typeof(JT808MsgIdCustomHandler), ServiceLifetime.Singleton)); | ||||
``` | ``` | ||||
#### 3.使用JT808 Host | |||||
#### 3.3.使用JT808 Host | |||||
``` host | ``` host | ||||
UseJT808Host() | UseJT808Host() | ||||
``` | ``` | ||||
#### 4.完整示例 | |||||
#### 3.4.完整示例 | |||||
``` demo | ``` demo | ||||
// 默认网关端口:808 | // 默认网关端口:808 | ||||
// 默认webapi端口:828 | // 默认webapi端口:828 | ||||
@@ -103,159 +102,4 @@ static async Task Main(string[] args) | |||||
.UseJT808Host(); | .UseJT808Host(); | ||||
await serverHostBuilder.RunConsoleAsync(); | await serverHostBuilder.RunConsoleAsync(); | ||||
} | } | ||||
``` | |||||
## 提供WebApi接口服务(默认端口828) | |||||
基地址:<a href="#">http://localhost:828/jt808api/</a> | |||||
数据格式:只支持Json格式 | |||||
#### 统一对象返回 JT808ResultDto\<T> | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Message| string| 消息描述| | |||||
| Code| int| 状态码| | |||||
| Data| T(泛型)| 数据| | |||||
返回Code[状态码]说明: | |||||
|状态码|说明| | |||||
|:------:|:------:| | |||||
| 200 | 返回成功 | | |||||
| 201 | 内容为空 | | |||||
| 404 | 没有该服务 | | |||||
| 500 | 服务内部错误 | | |||||
#### <span id="send">统一下发设备消息接口</span> | |||||
请求地址:UnificationSend | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| TerminalPhoneNo| string| 设备终端号| | |||||
| Data| byte[]| JT808 byte[]数组| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool| 是否成功| | |||||
返回结果: | |||||
``` result1 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
#### <span id="session">会话服务接口</span> | |||||
##### 统一会话信息对象返回 JT808SessionInfoDto | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| ChannelId| string| 通道Id| | |||||
| LastActiveTime| DateTime| 最后上线时间| | |||||
| StartTime| DateTime| 上线时间| | |||||
| TerminalPhoneNo|string| 终端手机号| | |||||
| LoaclAddressIP| string| 本地ip地址| | |||||
| WebApiPort| string| WebApi端口号| | |||||
| RemoteAddressIP| string| 远程ip地址| | |||||
##### 1.获取会话集合 | |||||
请求地址:Session/GetAll | |||||
请求方式:GET | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| List\<JT808SessionInfoDto> | 实际会话信息集合 | | |||||
返回结果: | |||||
``` session1 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":[ | |||||
{ | |||||
"ChannelId":"eadad23", | |||||
"LastActiveTime":"2018-11-27 20:00:00", | |||||
"StartTime":"2018-11-25 20:00:00", | |||||
"TerminalPhoneNo":"123456789012", | |||||
"LoaclAddressIP":"127.0.0.1:808", | |||||
"WebApiPort":828, | |||||
"RemoteAddressIP":"127.0.0.1:11808" | |||||
},{ | |||||
"ChannelId":"eadad23", | |||||
"LastActiveTime":"2018-11-27 20:00:00", | |||||
"StartTime":"2018-11-25 20:00:00", | |||||
"TerminalPhoneNo":"123456789013", | |||||
"LoaclAddressIP":"127.0.0.1:808", | |||||
"WebApiPort":828, | |||||
"RemoteAddressIP":"127.0.0.1:11808" | |||||
} | |||||
] | |||||
} | |||||
``` | |||||
##### 2.通过通道Id移除对应会话 | |||||
请求地址:Session/RemoveByChannelId | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| channelId| string| 通道Id| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功 | | |||||
返回结果: | |||||
``` session2 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
##### 3.通过设备终端号移除对应会话 | |||||
请求地址:Session/RemoveByTerminalPhoneNo | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| terminalPhoneNo| string| 设备终端号| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功 | |||||
返回结果: | |||||
``` session3 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
``` |
@@ -0,0 +1,384 @@ | |||||
# JT808 WebApi服务 | |||||
基地址:<a href="#">http://localhost:828/jt808api/</a> | |||||
数据格式:只支持Json格式 | |||||
默认端口:828 | |||||
## [统一下发设备消息服务](#send) | |||||
## [管理会话服务](#session) | |||||
## [原包分发器通道服务](#sourcepackage) | |||||
## [转发地址过滤服务](#transmit) | |||||
## [消息包计数服务](#counter) | |||||
### 统一对象返回 JT808ResultDto\<T> | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Message| string| 消息描述| | |||||
| Code| int| 状态码| | |||||
| Data| T(泛型)| 数据| | |||||
返回Code[状态码]说明: | |||||
|状态码|说明| | |||||
|:------:|:------:| | |||||
| 200 | 返回成功 | | |||||
| 201 | 内容为空 | | |||||
| 404 | 没有该服务 | | |||||
| 500 | 服务内部错误 | | |||||
### <span id="send">统一下发设备消息接口</span> | |||||
请求地址:UnificationSend | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|------|:------:|:------| | |||||
| TerminalPhoneNo| string| 设备终端号| | |||||
| Data| byte[]| JT808 byte[]数组| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool| 是否成功| | |||||
返回结果: | |||||
``` result1 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
### <span id="session">会话服务接口</span> | |||||
#### 统一会话信息对象返回 JT808SessionInfoDto | |||||
|属性|数据类型|参数说明| | |||||
|------|------|------| | |||||
| ChannelId| string| 通道Id| | |||||
| LastActiveTime| DateTime| 最后上线时间| | |||||
| StartTime| DateTime| 上线时间| | |||||
| TerminalPhoneNo|string| 终端手机号| | |||||
| LoaclAddressIP| string| 本地ip地址| | |||||
| WebApiPort| string| WebApi端口号| | |||||
| RemoteAddressIP| string| 远程ip地址| | |||||
#### 1.获取会话集合 | |||||
请求地址:Session/GetAll | |||||
请求方式:GET | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| List\<JT808SessionInfoDto> | 实际会话信息集合 | | |||||
返回结果: | |||||
``` session1 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":[ | |||||
{ | |||||
"ChannelId":"eadad23", | |||||
"LastActiveTime":"2018-11-27 20:00:00", | |||||
"StartTime":"2018-11-25 20:00:00", | |||||
"TerminalPhoneNo":"123456789012", | |||||
"LoaclAddressIP":"127.0.0.1:808", | |||||
"WebApiPort":828, | |||||
"RemoteAddressIP":"127.0.0.1:11808" | |||||
},{ | |||||
"ChannelId":"eadad23", | |||||
"LastActiveTime":"2018-11-27 20:00:00", | |||||
"StartTime":"2018-11-25 20:00:00", | |||||
"TerminalPhoneNo":"123456789013", | |||||
"LoaclAddressIP":"127.0.0.1:808", | |||||
"WebApiPort":828, | |||||
"RemoteAddressIP":"127.0.0.1:11808" | |||||
} | |||||
] | |||||
} | |||||
``` | |||||
#### 2.通过通道Id移除对应会话 | |||||
请求地址:Session/RemoveByChannelId | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| channelId| string| 通道Id| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功 | | |||||
返回结果: | |||||
``` session2 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
#### 3.通过设备终端号移除对应会话 | |||||
请求地址:Session/RemoveByTerminalPhoneNo | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| terminalPhoneNo| string| 设备终端号| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功 | |||||
返回结果: | |||||
``` session3 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
### <span id="sourcepackage">原包分发器通道服务</span> | |||||
#### 1.添加原包转发地址 | |||||
请求地址:SourcePackage/Add | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Host| string| ip地址| | |||||
| Port| int| 端口号| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功 | |||||
返回结果: | |||||
``` sp1 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
#### 2.删除原包转发地址(不能删除在网关服务器配置文件配的地址) | |||||
请求地址:SourcePackage/Remove | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Host| string| ip地址| | |||||
| Port| int| 端口号| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功| | |||||
返回结果: | |||||
``` sp2 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
#### 3.获取原包信息集合 | |||||
请求地址:SourcePackage/GetAll | |||||
请求方式:GET | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|------|:------:|:------| | |||||
| RemoteAddress| string | 远程ip地址| | |||||
| LocalAddress| string | 本地ip地址| | |||||
| Registered| bool | 通道是否注册| | |||||
| Active| bool | 通道是否激活| | |||||
| Open| bool | 通道是否打开| | |||||
返回结果: | |||||
``` sp3 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":[ | |||||
{ | |||||
"RemoteAddress":"127.0.0.1:6665", | |||||
"LocalAddress":"127.0.0.1:6664", | |||||
"Registered":true, | |||||
"Active":true, | |||||
"Open":true | |||||
},{ | |||||
"RemoteAddress":"127.0.0.1:6667", | |||||
"LocalAddress":"127.0.0.1:6666", | |||||
"Registered":true, | |||||
"Active":true, | |||||
"Open":true | |||||
} | |||||
] | |||||
} | |||||
``` | |||||
### <span id="transmit">转发地址过滤服务</span> | |||||
#### 1.添加转发过滤地址 | |||||
请求地址:Transmit/Add | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Host| string| ip地址| | |||||
| Port| int| 端口号| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功 | |||||
返回结果: | |||||
``` tr1 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
#### 2.删除转发过滤地址(不能删除在网关服务器配置文件配的地址) | |||||
请求地址:Transmit/Remove | |||||
请求方式:POST | |||||
请求参数: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Host| string| ip地址| | |||||
| Port| int| 端口号| | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|:------:|:------:|:------| | |||||
| Data| bool | 是否成功| | |||||
返回结果: | |||||
``` tr2 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":true | |||||
} | |||||
``` | |||||
#### 3.获取转发过滤地址信息集合 | |||||
请求地址:Transmit/GetAll | |||||
请求方式:GET | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|------|:------:|:------| | |||||
| Data| List\<string> | 远程ip地址| | |||||
返回结果: | |||||
``` tr3 | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":[ | |||||
"127.0.0.1:6665", | |||||
"127.0.0.1:6667" | |||||
] | |||||
} | |||||
``` | |||||
### <span id="counter">计数服务接口</span> | |||||
请求地址:GetAtomicCounter | |||||
请求方式:GET | |||||
返回数据: | |||||
|属性|数据类型|参数说明| | |||||
|------|:------:|:------| | |||||
| MsgSuccessCount| long| 消息包成功数| | |||||
| MsgFailCount| long| 消息包失败数| | |||||
返回结果: | |||||
``` counter | |||||
{ | |||||
"Message":"", | |||||
"Code":200, | |||||
"Data":{ | |||||
"MsgSuccessCount":10000, | |||||
"MsgFailCount":0 | |||||
} | |||||
} | |||||
``` |
@@ -12,11 +12,11 @@ using Xunit; | |||||
namespace JT808.DotNetty.Test.Internal | namespace JT808.DotNetty.Test.Internal | ||||
{ | { | ||||
public class JT808RemoteAddressTransmitConfigurationServiceTest | |||||
public class JT808TransmitAddressFilterServiceTest | |||||
{ | { | ||||
private JT808RemoteAddressTransmitConfigurationService jT808RemoteAddressTransmitConfigurationService; | |||||
private JT808TransmitAddressFilterService jT808TransmitAddressFilterService; | |||||
public JT808RemoteAddressTransmitConfigurationServiceTest() | |||||
public JT808TransmitAddressFilterServiceTest() | |||||
{ | { | ||||
var serverHostBuilder = new HostBuilder() | var serverHostBuilder = new HostBuilder() | ||||
.ConfigureAppConfiguration((hostingContext, config) => | .ConfigureAppConfiguration((hostingContext, config) => | ||||
@@ -29,26 +29,26 @@ namespace JT808.DotNetty.Test.Internal | |||||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | services.AddSingleton<ILoggerFactory, LoggerFactory>(); | ||||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | ||||
services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration")); | services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration")); | ||||
services.AddSingleton<JT808RemoteAddressTransmitConfigurationService>(); | |||||
services.AddSingleton<JT808TransmitAddressFilterService>(); | |||||
}); | }); | ||||
var serviceProvider = serverHostBuilder.Build().Services; | var serviceProvider = serverHostBuilder.Build().Services; | ||||
jT808RemoteAddressTransmitConfigurationService = serviceProvider.GetService<JT808RemoteAddressTransmitConfigurationService>(); | |||||
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto | |||||
jT808TransmitAddressFilterService = serviceProvider.GetService<JT808TransmitAddressFilterService>(); | |||||
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto | |||||
{ | { | ||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 12345 | Port = 12345 | ||||
}); | }); | ||||
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto | |||||
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto | |||||
{ | { | ||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 12346 | Port = 12346 | ||||
}); | }); | ||||
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto | |||||
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto | |||||
{ | { | ||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 12347 | Port = 12347 | ||||
}); | }); | ||||
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto | |||||
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto | |||||
{ | { | ||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 12348 | Port = 12348 | ||||
@@ -58,7 +58,7 @@ namespace JT808.DotNetty.Test.Internal | |||||
[Fact] | [Fact] | ||||
public void Test1() | public void Test1() | ||||
{ | { | ||||
Assert.True(jT808RemoteAddressTransmitConfigurationService.ContainsKey(new Dtos.JT808IPAddressDto | |||||
Assert.True(jT808TransmitAddressFilterService.ContainsKey(new Dtos.JT808IPAddressDto | |||||
{ | { | ||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 12348 | Port = 12348 | ||||
@@ -68,7 +68,7 @@ namespace JT808.DotNetty.Test.Internal | |||||
[Fact] | [Fact] | ||||
public void Test2() | public void Test2() | ||||
{ | { | ||||
var result = jT808RemoteAddressTransmitConfigurationService.GetAll(); | |||||
var result = jT808TransmitAddressFilterService.GetAll(); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -79,10 +79,10 @@ namespace JT808.DotNetty.Test.Internal | |||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 12349 | Port = 12349 | ||||
}; | }; | ||||
var result1= jT808RemoteAddressTransmitConfigurationService.Add(ip1); | |||||
var result1= jT808TransmitAddressFilterService.Add(ip1); | |||||
Assert.Equal(JT808ResultCode.Ok, result1.Code); | Assert.Equal(JT808ResultCode.Ok, result1.Code); | ||||
Assert.True(result1.Data); | Assert.True(result1.Data); | ||||
var result2 = jT808RemoteAddressTransmitConfigurationService.Remove(ip1); | |||||
var result2 = jT808TransmitAddressFilterService.Remove(ip1); | |||||
Assert.Equal(JT808ResultCode.Ok, result2.Code); | Assert.Equal(JT808ResultCode.Ok, result2.Code); | ||||
Assert.True(result2.Data); | Assert.True(result2.Data); | ||||
} | } | ||||
@@ -95,7 +95,7 @@ namespace JT808.DotNetty.Test.Internal | |||||
Host = "127.0.0.1", | Host = "127.0.0.1", | ||||
Port = 6561 | Port = 6561 | ||||
}; | }; | ||||
var result2 = jT808RemoteAddressTransmitConfigurationService.Remove(configIp); | |||||
var result2 = jT808TransmitAddressFilterService.Remove(configIp); | |||||
Assert.Equal(JT808ResultCode.Ok, result2.Code); | Assert.Equal(JT808ResultCode.Ok, result2.Code); | ||||
Assert.False(result2.Data); | Assert.False(result2.Data); | ||||
Assert.Equal("不能删除服务器配置的地址", result2.Message); | Assert.Equal("不能删除服务器配置的地址", result2.Message); |
@@ -18,14 +18,14 @@ namespace JT808.DotNetty.Handlers | |||||
private readonly JT808SessionManager jT808SessionManager; | private readonly JT808SessionManager jT808SessionManager; | ||||
private readonly JT808RemoteAddressTransmitConfigurationService jT808RemoteAddressTransmitConfigurationService; | |||||
private readonly JT808TransmitAddressFilterService jT808TransmitAddressFilterService; | |||||
public JT808ServerHandler( | public JT808ServerHandler( | ||||
JT808RemoteAddressTransmitConfigurationService jT808RemoteAddressTransmitConfigurationService, | |||||
JT808TransmitAddressFilterService jT808TransmitAddressFilterService, | |||||
JT808MsgIdHandlerBase handler, | JT808MsgIdHandlerBase handler, | ||||
JT808SessionManager jT808SessionManager) | JT808SessionManager jT808SessionManager) | ||||
{ | { | ||||
this.jT808RemoteAddressTransmitConfigurationService = jT808RemoteAddressTransmitConfigurationService; | |||||
this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService; | |||||
this.handler = handler; | this.handler = handler; | ||||
this.jT808SessionManager = jT808SessionManager; | this.jT808SessionManager = jT808SessionManager; | ||||
} | } | ||||
@@ -42,7 +42,7 @@ namespace JT808.DotNetty.Handlers | |||||
JT808Response jT808Package = handlerFunc(new JT808Request(msg)); | JT808Response jT808Package = handlerFunc(new JT808Request(msg)); | ||||
if (jT808Package != null) | if (jT808Package != null) | ||||
{ | { | ||||
if (!jT808RemoteAddressTransmitConfigurationService.ContainsKey(ctx.Channel.RemoteAddress)) | |||||
if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) | |||||
{ | { | ||||
ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808Package.Package, jT808Package.MinBufferSize))); | ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT808Serializer.Serialize(jT808Package.Package, jT808Package.MinBufferSize))); | ||||
} | } | ||||
@@ -11,14 +11,14 @@ using System.Text; | |||||
namespace JT808.DotNetty.Internal | namespace JT808.DotNetty.Internal | ||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// JT808远程地址转发配置服务 | |||||
/// JT808转发地址过滤服务 | |||||
/// 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括: | /// 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括: | ||||
// 1.消息的序列化 | // 1.消息的序列化 | ||||
// 2.消息的下发 | // 2.消息的下发 | ||||
// 都有一定的性能损耗,那么不需要判断写超时 IdleState.WriterIdle | // 都有一定的性能损耗,那么不需要判断写超时 IdleState.WriterIdle | ||||
// 就跟神兽貔貅一样。。。 | // 就跟神兽貔貅一样。。。 | ||||
/// </summary> | /// </summary> | ||||
public class JT808RemoteAddressTransmitConfigurationService : IDisposable | |||||
public class JT808TransmitAddressFilterService : IDisposable | |||||
{ | { | ||||
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor; | private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor; | ||||
@@ -26,7 +26,7 @@ namespace JT808.DotNetty.Internal | |||||
private IDisposable jT808ConfigurationOptionsMonitorDisposable; | private IDisposable jT808ConfigurationOptionsMonitorDisposable; | ||||
public JT808RemoteAddressTransmitConfigurationService( | |||||
public JT808TransmitAddressFilterService( | |||||
IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor) | IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor) | ||||
{ | { | ||||
this.jT808ConfigurationOptionsMonitor = jT808ConfigurationOptionsMonitor; | this.jT808ConfigurationOptionsMonitor = jT808ConfigurationOptionsMonitor; |
@@ -21,6 +21,8 @@ namespace JT808.DotNetty.Internal | |||||
private const string sourcePackagePrefix = "SourcePackage"; | private const string sourcePackagePrefix = "SourcePackage"; | ||||
private const string transmitPrefix = "Transmit"; | |||||
private readonly IJT808SessionService jT808SessionService; | private readonly IJT808SessionService jT808SessionService; | ||||
private readonly IJT808UnificationSendService jT808UnificationSendService; | private readonly IJT808UnificationSendService jT808UnificationSendService; | ||||
@@ -29,17 +31,21 @@ namespace JT808.DotNetty.Internal | |||||
private readonly JT808SourcePackageChannelService jT808SourcePackageChannelService; | private readonly JT808SourcePackageChannelService jT808SourcePackageChannelService; | ||||
private readonly JT808TransmitAddressFilterService jT808TransmitAddressFilterService; | |||||
/// <summary> | /// <summary> | ||||
/// 初始化消息处理业务 | /// 初始化消息处理业务 | ||||
/// </summary> | /// </summary> | ||||
public JT808WebAPIService( | public JT808WebAPIService( | ||||
JT808AtomicCounterService jT808AtomicCounterService, | JT808AtomicCounterService jT808AtomicCounterService, | ||||
JT808SourcePackageChannelService jT808SourcePackageChannelService, | JT808SourcePackageChannelService jT808SourcePackageChannelService, | ||||
JT808TransmitAddressFilterService jT808TransmitAddressFilterService, | |||||
IJT808SessionService jT808SessionService, | IJT808SessionService jT808SessionService, | ||||
IJT808UnificationSendService jT808UnificationSendService) | IJT808UnificationSendService jT808UnificationSendService) | ||||
{ | { | ||||
this.jT808AtomicCounterService = jT808AtomicCounterService; | this.jT808AtomicCounterService = jT808AtomicCounterService; | ||||
this.jT808SourcePackageChannelService = jT808SourcePackageChannelService; | this.jT808SourcePackageChannelService = jT808SourcePackageChannelService; | ||||
this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService; | |||||
this.jT808SessionService = jT808SessionService; | this.jT808SessionService = jT808SessionService; | ||||
this.jT808UnificationSendService = jT808UnificationSendService; | this.jT808UnificationSendService = jT808UnificationSendService; | ||||
HandlerDict = new Dictionary<string, Func<JT808HttpRequest, JT808HttpResponse>> | HandlerDict = new Dictionary<string, Func<JT808HttpRequest, JT808HttpResponse>> | ||||
@@ -51,7 +57,10 @@ namespace JT808.DotNetty.Internal | |||||
{$"{RouteTablePrefix}/GetAtomicCounter", GetAtomicCounter}, | {$"{RouteTablePrefix}/GetAtomicCounter", GetAtomicCounter}, | ||||
{$"{RouteTablePrefix}/{sourcePackagePrefix}/Add", AddSourcePackageAddress}, | {$"{RouteTablePrefix}/{sourcePackagePrefix}/Add", AddSourcePackageAddress}, | ||||
{$"{RouteTablePrefix}/{sourcePackagePrefix}/Remove", RemoveSourcePackageAddress}, | {$"{RouteTablePrefix}/{sourcePackagePrefix}/Remove", RemoveSourcePackageAddress}, | ||||
{$"{RouteTablePrefix}/{sourcePackagePrefix}/GetAll", GetSourcePackageAll} | |||||
{$"{RouteTablePrefix}/{sourcePackagePrefix}/GetAll", GetSourcePackageAll}, | |||||
{$"{RouteTablePrefix}/{transmitPrefix}/Add", AddTransmitAddress}, | |||||
{$"{RouteTablePrefix}/{transmitPrefix}/Remove", RemoveTransmitAddress}, | |||||
{$"{RouteTablePrefix}/{transmitPrefix}/GetAll", GetTransmitAll}, | |||||
}; | }; | ||||
} | } | ||||
@@ -169,6 +178,46 @@ namespace JT808.DotNetty.Internal | |||||
return CreateJT808HttpResponse(jT808SourcePackageChannelService.GetAll()); | return CreateJT808HttpResponse(jT808SourcePackageChannelService.GetAll()); | ||||
} | } | ||||
/// <summary> | |||||
/// 添加转发过滤地址 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public JT808HttpResponse AddTransmitAddress(JT808HttpRequest request) | |||||
{ | |||||
if (string.IsNullOrEmpty(request.Json)) | |||||
{ | |||||
return EmptyHttpResponse(); | |||||
} | |||||
JT808IPAddressDto jT808IPAddressDto = JsonConvert.DeserializeObject<JT808IPAddressDto>(request.Json); | |||||
return CreateJT808HttpResponse(jT808TransmitAddressFilterService.Add(jT808IPAddressDto)); | |||||
} | |||||
/// <summary> | |||||
/// 删除转发过滤地址(不能删除在网关服务器配置文件配的地址) | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public JT808HttpResponse RemoveTransmitAddress(JT808HttpRequest request) | |||||
{ | |||||
if (string.IsNullOrEmpty(request.Json)) | |||||
{ | |||||
return EmptyHttpResponse(); | |||||
} | |||||
JT808IPAddressDto jT808IPAddressDto = JsonConvert.DeserializeObject<JT808IPAddressDto>(request.Json); | |||||
return CreateJT808HttpResponse(jT808TransmitAddressFilterService.Remove(jT808IPAddressDto)); | |||||
} | |||||
/// <summary> | |||||
/// 获取转发过滤地址信息集合 | |||||
/// </summary> | |||||
/// <param name="request"></param> | |||||
/// <returns></returns> | |||||
public JT808HttpResponse GetTransmitAll(JT808HttpRequest request) | |||||
{ | |||||
return CreateJT808HttpResponse(jT808TransmitAddressFilterService.GetAll()); | |||||
} | |||||
private JT808HttpResponse CreateJT808HttpResponse(dynamic dynamicObject) | private JT808HttpResponse CreateJT808HttpResponse(dynamic dynamicObject) | ||||
{ | { | ||||
byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dynamicObject)); | byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dynamicObject)); | ||||
@@ -37,7 +37,7 @@ namespace JT808.DotNetty | |||||
services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration")); | services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration")); | ||||
services.TryAddSingleton<JT808SessionManager>(); | services.TryAddSingleton<JT808SessionManager>(); | ||||
services.TryAddSingleton<JT808AtomicCounterService>(); | services.TryAddSingleton<JT808AtomicCounterService>(); | ||||
services.TryAddSingleton<JT808RemoteAddressTransmitConfigurationService>(); | |||||
services.TryAddSingleton<JT808TransmitAddressFilterService>(); | |||||
services.TryAddSingleton<JT808MsgIdHandlerBase,JT808MsgIdDefaultHandler>(); | services.TryAddSingleton<JT808MsgIdHandlerBase,JT808MsgIdDefaultHandler>(); | ||||
services.TryAddSingleton<JT808SourcePackageChannelService>(); | services.TryAddSingleton<JT808SourcePackageChannelService>(); | ||||
services.TryAddSingleton<IJT808SourcePackageDispatcher, JT808SourcePackageDispatcherDefaultImpl>(); | services.TryAddSingleton<IJT808SourcePackageDispatcher, JT808SourcePackageDispatcherDefaultImpl>(); | ||||