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

1.完善webapi服务文档

2.原先远程地址转发配置服务修改为转发地址过滤服务
tags/v1.0.0
SmallChi 6 лет назад
Родитель
Сommit
c68061ab84
7 измененных файлов: 466 добавлений и 189 удалений
  1. +10
    -166
      README.md
  2. +384
    -0
      api/README.md
  3. +14
    -14
      src/JT808.DotNetty.Test/Internal/JT808TransmitAddressFilterServiceTest.cs
  4. +4
    -4
      src/JT808.DotNetty/Handlers/JT808ServerHandler.cs
  5. +3
    -3
      src/JT808.DotNetty/Internal/JT808TransmitAddressFilterService.cs
  6. +50
    -1
      src/JT808.DotNetty/Internal/JT808WebAPIService.cs
  7. +1
    -1
      src/JT808.DotNetty/JT808DotnettyExtensions.cs

+ 10
- 166
README.md Просмотреть файл

@@ -31,11 +31,7 @@

### 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.集成业务消息处理程序

@@ -45,7 +41,7 @@

### 举个栗子1

#### 1.实现业务消息处理程序JT808MsgIdHandlerBase
#### 3.1.实现业务消息处理程序JT808MsgIdHandlerBase

```business Imp
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));
```
#### 3.使用JT808 Host

#### 3.3.使用JT808 Host

``` host
UseJT808Host()
```

#### 4.完整示例
#### 3.4.完整示例

``` demo
// 默认网关端口:808
// 默认webapi端口:828
@@ -103,159 +102,4 @@ static async Task Main(string[] args)
.UseJT808Host();
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
}
```
```

+ 384
- 0
api/README.md Просмотреть файл

@@ -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
}
}
```

src/JT808.DotNetty.Test/Internal/JT808RemoteAddressTransmitConfigurationServiceTest.cs → src/JT808.DotNetty.Test/Internal/JT808TransmitAddressFilterServiceTest.cs Просмотреть файл

@@ -12,11 +12,11 @@ using Xunit;

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()
.ConfigureAppConfiguration((hostingContext, config) =>
@@ -29,26 +29,26 @@ namespace JT808.DotNetty.Test.Internal
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration"));
services.AddSingleton<JT808RemoteAddressTransmitConfigurationService>();
services.AddSingleton<JT808TransmitAddressFilterService>();
});
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",
Port = 12345
});
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto
{
Host = "127.0.0.1",
Port = 12346
});
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto
{
Host = "127.0.0.1",
Port = 12347
});
jT808RemoteAddressTransmitConfigurationService.Add(new Dtos.JT808IPAddressDto
jT808TransmitAddressFilterService.Add(new Dtos.JT808IPAddressDto
{
Host = "127.0.0.1",
Port = 12348
@@ -58,7 +58,7 @@ namespace JT808.DotNetty.Test.Internal
[Fact]
public void Test1()
{
Assert.True(jT808RemoteAddressTransmitConfigurationService.ContainsKey(new Dtos.JT808IPAddressDto
Assert.True(jT808TransmitAddressFilterService.ContainsKey(new Dtos.JT808IPAddressDto
{
Host = "127.0.0.1",
Port = 12348
@@ -68,7 +68,7 @@ namespace JT808.DotNetty.Test.Internal
[Fact]
public void Test2()
{
var result = jT808RemoteAddressTransmitConfigurationService.GetAll();
var result = jT808TransmitAddressFilterService.GetAll();
}

[Fact]
@@ -79,10 +79,10 @@ namespace JT808.DotNetty.Test.Internal
Host = "127.0.0.1",
Port = 12349
};
var result1= jT808RemoteAddressTransmitConfigurationService.Add(ip1);
var result1= jT808TransmitAddressFilterService.Add(ip1);
Assert.Equal(JT808ResultCode.Ok, result1.Code);
Assert.True(result1.Data);
var result2 = jT808RemoteAddressTransmitConfigurationService.Remove(ip1);
var result2 = jT808TransmitAddressFilterService.Remove(ip1);
Assert.Equal(JT808ResultCode.Ok, result2.Code);
Assert.True(result2.Data);
}
@@ -95,7 +95,7 @@ namespace JT808.DotNetty.Test.Internal
Host = "127.0.0.1",
Port = 6561
};
var result2 = jT808RemoteAddressTransmitConfigurationService.Remove(configIp);
var result2 = jT808TransmitAddressFilterService.Remove(configIp);
Assert.Equal(JT808ResultCode.Ok, result2.Code);
Assert.False(result2.Data);
Assert.Equal("不能删除服务器配置的地址", result2.Message);

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

@@ -18,14 +18,14 @@ namespace JT808.DotNetty.Handlers
private readonly JT808SessionManager jT808SessionManager;

private readonly JT808RemoteAddressTransmitConfigurationService jT808RemoteAddressTransmitConfigurationService;
private readonly JT808TransmitAddressFilterService jT808TransmitAddressFilterService;

public JT808ServerHandler(
JT808RemoteAddressTransmitConfigurationService jT808RemoteAddressTransmitConfigurationService,
JT808TransmitAddressFilterService jT808TransmitAddressFilterService,
JT808MsgIdHandlerBase handler,
JT808SessionManager jT808SessionManager)
{
this.jT808RemoteAddressTransmitConfigurationService = jT808RemoteAddressTransmitConfigurationService;
this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService;
this.handler = handler;
this.jT808SessionManager = jT808SessionManager;
}
@@ -42,7 +42,7 @@ namespace JT808.DotNetty.Handlers
JT808Response jT808Package = handlerFunc(new JT808Request(msg));
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)));
}


src/JT808.DotNetty/Internal/JT808RemoteAddressTransmitConfigurationService.cs → src/JT808.DotNetty/Internal/JT808TransmitAddressFilterService.cs Просмотреть файл

@@ -11,14 +11,14 @@ using System.Text;
namespace JT808.DotNetty.Internal
{
/// <summary>
/// JT808远程地址转发配置服务
/// JT808转发地址过滤服务
/// 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括:
// 1.消息的序列化
// 2.消息的下发
// 都有一定的性能损耗,那么不需要判断写超时 IdleState.WriterIdle
// 就跟神兽貔貅一样。。。
/// </summary>
public class JT808RemoteAddressTransmitConfigurationService : IDisposable
public class JT808TransmitAddressFilterService : IDisposable
{
private readonly IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor;

@@ -26,7 +26,7 @@ namespace JT808.DotNetty.Internal

private IDisposable jT808ConfigurationOptionsMonitorDisposable;

public JT808RemoteAddressTransmitConfigurationService(
public JT808TransmitAddressFilterService(
IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor)
{
this.jT808ConfigurationOptionsMonitor = jT808ConfigurationOptionsMonitor;

+ 50
- 1
src/JT808.DotNetty/Internal/JT808WebAPIService.cs Просмотреть файл

@@ -21,6 +21,8 @@ namespace JT808.DotNetty.Internal

private const string sourcePackagePrefix = "SourcePackage";

private const string transmitPrefix = "Transmit";
private readonly IJT808SessionService jT808SessionService;

private readonly IJT808UnificationSendService jT808UnificationSendService;
@@ -29,17 +31,21 @@ namespace JT808.DotNetty.Internal

private readonly JT808SourcePackageChannelService jT808SourcePackageChannelService;

private readonly JT808TransmitAddressFilterService jT808TransmitAddressFilterService;

/// <summary>
/// 初始化消息处理业务
/// </summary>
public JT808WebAPIService(
JT808AtomicCounterService jT808AtomicCounterService,
JT808SourcePackageChannelService jT808SourcePackageChannelService,
JT808TransmitAddressFilterService jT808TransmitAddressFilterService,
IJT808SessionService jT808SessionService,
IJT808UnificationSendService jT808UnificationSendService)
{
this.jT808AtomicCounterService = jT808AtomicCounterService;
this.jT808SourcePackageChannelService = jT808SourcePackageChannelService;
this.jT808TransmitAddressFilterService = jT808TransmitAddressFilterService;
this.jT808SessionService = jT808SessionService;
this.jT808UnificationSendService = jT808UnificationSendService;
HandlerDict = new Dictionary<string, Func<JT808HttpRequest, JT808HttpResponse>>
@@ -51,7 +57,10 @@ namespace JT808.DotNetty.Internal
{$"{RouteTablePrefix}/GetAtomicCounter", GetAtomicCounter},
{$"{RouteTablePrefix}/{sourcePackagePrefix}/Add", AddSourcePackageAddress},
{$"{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());
}

/// <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)
{
byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dynamicObject));


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

@@ -37,7 +37,7 @@ namespace JT808.DotNetty
services.Configure<JT808Configuration>(hostContext.Configuration.GetSection("JT808Configuration"));
services.TryAddSingleton<JT808SessionManager>();
services.TryAddSingleton<JT808AtomicCounterService>();
services.TryAddSingleton<JT808RemoteAddressTransmitConfigurationService>();
services.TryAddSingleton<JT808TransmitAddressFilterService>();
services.TryAddSingleton<JT808MsgIdHandlerBase,JT808MsgIdDefaultHandler>();
services.TryAddSingleton<JT808SourcePackageChannelService>();
services.TryAddSingleton<IJT808SourcePackageDispatcher, JT808SourcePackageDispatcherDefaultImpl>();


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