Parcourir la source

1.增加会话服务测试用例

2.增加信息下发测试用例
3.修复服务bug
4.修改session的注册方式
tags/v1.0.0
SmallChi il y a 6 ans
Parent
révision
10029f36f9
22 fichiers modifiés avec 471 ajouts et 66 suppressions
  1. +1
    -0
      src/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj
  2. +2
    -2
      src/JT808.DotNetty.Hosting/Program.cs
  3. +0
    -12
      src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs
  4. +62
    -0
      src/JT808.DotNetty.Test/Internal/JT808SourcePackageDispatcherDefaultImplTest.cs
  5. +87
    -0
      src/JT808.DotNetty.Test/Internal/JT808UnificationSendServiceDefaultImplTest.cs
  6. +8
    -0
      src/JT808.DotNetty.Test/JT808.DotNetty.Test.csproj
  7. +8
    -2
      src/JT808.DotNetty.Test/JT808DefaultChannelId.cs
  8. +2
    -30
      src/JT808.DotNetty.Test/JT808SessionManagerTest.cs
  9. +200
    -0
      src/JT808.DotNetty.Test/JT808WebAPIServiceTest.cs
  10. +15
    -2
      src/JT808.DotNetty.Test/SeedSession.cs
  11. +26
    -4
      src/JT808.DotNetty.Test/TestBase.cs
  12. +21
    -0
      src/JT808.DotNetty.Test/appsettings.json
  13. +0
    -1
      src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs
  14. +2
    -0
      src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs
  15. +2
    -2
      src/JT808.DotNetty/Internal/JT808SourcePackageDispatcherDefaultImpl.cs
  16. +12
    -2
      src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs
  17. +12
    -0
      src/JT808.DotNetty/JT808.DotNetty.csproj
  18. +1
    -1
      src/JT808.DotNetty/JT808DotnettyExtensions.cs
  19. +3
    -0
      src/JT808.DotNetty/JT808ServerHost.cs
  20. +1
    -6
      src/JT808.DotNetty/JT808SessionManager.cs
  21. +4
    -0
      src/JT808.DotNetty/JT808SimpleTcpClient.cs
  22. +2
    -2
      src/JT808.DotNetty/JT808WebAPIService.cs

+ 1
- 0
src/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj Voir le fichier

@@ -3,6 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<ServerGarbageCollection>true</ServerGarbageCollection>
<LangVersion>latest</LangVersion>
</PropertyGroup>



+ 2
- 2
src/JT808.DotNetty.Hosting/Program.cs Voir le fichier

@@ -25,8 +25,8 @@ namespace JT808.DotNetty.Hosting
})
.ConfigureLogging((context, logging) =>
{
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Trace);
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Error);
})
.ConfigureServices((hostContext, services) =>
{


+ 0
- 12
src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs Voir le fichier

@@ -1,12 +0,0 @@
using JT808.DotNetty.Internal;
using System;
using System.Collections.Generic;
using System.Text;

namespace JT808.DotNetty.Test.Internal
{
public class JT808SessionServiceDefaultImplTest
{
//JT808SessionServiceDefaultImpl jT808SessionServiceDefaultImpl = new JT808SessionServiceDefaultImpl(new JT808SessionManager());
}
}

+ 62
- 0
src/JT808.DotNetty.Test/Internal/JT808SourcePackageDispatcherDefaultImplTest.cs Voir le fichier

@@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using Xunit;
using JT808.Protocol.Extensions;
using System.Threading;
using DotNetty.Transport.Channels;
using System.Runtime.InteropServices;
using DotNetty.Transport.Libuv;
using DotNetty.Transport.Bootstrapping;
using DotNetty.Buffers;
using DotNetty.Codecs;
using JT808.DotNetty.Codecs;

namespace JT808.DotNetty.Test.Internal
{
public class JT808SourcePackageDispatcherDefaultImplTest: TestBase
{
private IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6565);

public JT808SimpleTcpClient SimpleTcpClient;

public JT808SourcePackageDispatcherDefaultImplTest()
{
SimpleTcpClient = new JT808SimpleTcpClient(endPoint);
}

[Fact]
public void Test1()
{
// 作为源包转发服务端
DispatcherEventLoopGroup bossGroup = new DispatcherEventLoopGroup();
WorkerEventLoopGroup workerGroup = new WorkerEventLoopGroup(bossGroup, 1);
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.Group(bossGroup, workerGroup);
bootstrap.Channel<TcpServerChannel>();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
|| RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
bootstrap
.Option(ChannelOption.SoReuseport, true)
.ChildOption(ChannelOption.SoReuseaddr, true);
}
bootstrap
.ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
{
IChannelPipeline pipeline = channel.Pipeline;
channel.Pipeline.AddLast("jt808Buffer", new DelimiterBasedFrameDecoder(int.MaxValue,
Unpooled.CopiedBuffer(new byte[] { JT808.Protocol.JT808Package.BeginFlag }),
Unpooled.CopiedBuffer(new byte[] { JT808.Protocol.JT808Package.EndFlag })));
channel.Pipeline.AddLast("jt808Decode", new JT808ClientDecoder());
}));
bootstrap.BindAsync(6655);
//作为设备上传
byte[] bytes = "7E 02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 13 7E".ToHexBytes();
SimpleTcpClient.WriteAsync(bytes);
Thread.Sleep(10000);
SimpleTcpClient.Down();
}
}
}

+ 87
- 0
src/JT808.DotNetty.Test/Internal/JT808UnificationSendServiceDefaultImplTest.cs Voir le fichier

@@ -0,0 +1,87 @@
using DotNetty.Buffers;
using DotNetty.Codecs;
using DotNetty.Transport.Bootstrapping;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Libuv;
using JT808.DotNetty.Codecs;
using JT808.DotNetty.Dtos;
using JT808.Protocol;
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using Xunit;

namespace JT808.DotNetty.Test.Internal
{
public class JT808UnificationSendServiceDefaultImplTest : TestBase
{
private IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6565);

public JT808SimpleTcpClient SimpleTcpClient;

public JT808UnificationSendServiceDefaultImplTest()
{
SimpleTcpClient = new JT808SimpleTcpClient(endPoint);
}

[Fact]
public void Test1()
{
// 文本信息包
JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.文本信息下发.Create("123456789012", new JT808_0x8300
{
TextFlag = 5,
TextInfo = "smallchi 518"
});
var data = JT808Serializer.Serialize(jT808Package2);

JT808UnificationSendRequestDto jT808UnificationSendRequestDto = new JT808UnificationSendRequestDto();
jT808UnificationSendRequestDto.TerminalPhoneNo = "123456789012";
jT808UnificationSendRequestDto.Data = data;

HttpClient httpClient = new HttpClient();
// 调用内置的http服务接收文本信息下发
var result = httpClient.PostAsync("http://127.0.0.1:828/jt808api/UnificationSend", new StringContent(JsonConvert.SerializeObject(jT808UnificationSendRequestDto))).Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<bool> jt808Result = JsonConvert.DeserializeObject<JT808ResultDto<bool>>(content);
Assert.Equal(200, jt808Result.Code);
Assert.False(jt808Result.Data);
}

[Fact]
public void Test2()
{
// 心跳会话包
JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("123456789012");
SimpleTcpClient.WriteAsync(JT808Serializer.Serialize(jT808Package1));

// 文本信息包
JT808Package jT808Package2 = JT808.Protocol.Enums.JT808MsgId.文本信息下发.Create("123456789012", new JT808_0x8300
{
TextFlag=5,
TextInfo= "smallchi 518"
});
var data = JT808Serializer.Serialize(jT808Package2);

JT808UnificationSendRequestDto jT808UnificationSendRequestDto = new JT808UnificationSendRequestDto();
jT808UnificationSendRequestDto.TerminalPhoneNo = "123456789012";
jT808UnificationSendRequestDto.Data = data;

HttpClient httpClient = new HttpClient();
// 调用内置的http服务接收文本信息下发
var result =httpClient.PostAsync("http://127.0.0.1:828/jt808api/UnificationSend", new StringContent(JsonConvert.SerializeObject(jT808UnificationSendRequestDto))).Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<bool> jt808Result = JsonConvert.DeserializeObject<JT808ResultDto<bool>>(content);
Assert.Equal(200, jt808Result.Code);
Assert.True(jt808Result.Data);
SimpleTcpClient.Down();
}
}
}

+ 8
- 0
src/JT808.DotNetty.Test/JT808.DotNetty.Test.csproj Voir le fichier

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

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
@@ -16,4 +18,10 @@
<ItemGroup>
<ProjectReference Include="..\JT808.DotNetty\JT808.DotNetty.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

+ 8
- 2
src/JT808.DotNetty.Test/JT808DefaultChannelId.cs Voir le fichier

@@ -10,18 +10,24 @@ namespace JT808.DotNetty.Test
{
private static readonly JT808AtomicCounter jT808AtomicCounter = new JT808AtomicCounter();

private string Id { get { return jT808AtomicCounter.Increment().ToString(); } }

public string AsLongText()
{
return jT808AtomicCounter.Increment().ToString();
return Id;
}

public string AsShortText()
{
return jT808AtomicCounter.Increment().ToString();
return Id;
}

public int CompareTo(IChannelId other)
{
if(other.AsShortText()== Id)
{
return 1;
}
return 0;
}
}


+ 2
- 30
src/JT808.DotNetty.Test/JT808SessionManagerTest.cs Voir le fichier

@@ -7,31 +7,14 @@ using Xunit;

namespace JT808.DotNetty.Test
{
public class JT808SessionManagerTest
public class JT808SessionManagerTest: SeedSession
{
JT808SessionManager jT808SessionManager = new JT808SessionManager(new LoggerFactory());

string TerminalPhoneNo = "123456789123";

[Fact]
public void Test1()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
}

[Fact]
public void Test2()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
}

[Fact]
public void Test3()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo=jT808SessionManager.GetSessionByTerminalPhoneNo(TerminalPhoneNo);
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
@@ -42,7 +25,6 @@ namespace JT808.DotNetty.Test
public void Test4()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.Heartbeat(TerminalPhoneNo);
}
@@ -51,7 +33,6 @@ namespace JT808.DotNetty.Test
public void Test5()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo = jT808SessionManager.GetSessionByID("embedded");
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
@@ -63,7 +44,6 @@ namespace JT808.DotNetty.Test
public void Test6()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo = jT808SessionManager.RemoveSessionByID("embedded");
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
@@ -75,8 +55,6 @@ namespace JT808.DotNetty.Test
public void Test7()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo = jT808SessionManager.RemoveSessionByTerminalPhoneNo(TerminalPhoneNo);
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
Assert.Equal("embedded", sessionInfo.SessionID);
@@ -85,9 +63,6 @@ namespace JT808.DotNetty.Test
[Fact]
public void Test8()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
var realSessionInfos = jT808SessionManager.GetRealAll();
var relevanceSessionInfos = jT808SessionManager.GetRelevanceAll();
}
@@ -95,11 +70,8 @@ namespace JT808.DotNetty.Test
[Fact]
public void Test9()
{
var channel = new EmbeddedChannel();
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo));
var realSessionCount = jT808SessionManager.RealSessionCount;
var relevanceSessionCount = jT808SessionManager.RealSessionCount;
var relevanceSessionCount = jT808SessionManager.RelevanceSessionCount;
}
}
}

+ 200
- 0
src/JT808.DotNetty.Test/JT808WebAPIServiceTest.cs Voir le fichier

@@ -0,0 +1,200 @@
using JT808.DotNetty.Dtos;
using JT808.Protocol;
using JT808.Protocol.Extensions;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using Xunit;

namespace JT808.DotNetty.Test
{
public class JT808WebAPIServiceTest: TestBase
{
private IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6565);

public JT808SimpleTcpClient SimpleTcpClient;

private HttpClient httpClient;

private const string Url = "http://127.0.0.1:828/jt808api";

private const string sessionRoutePrefix = "Session";

private const int length = 10;

public JT808WebAPIServiceTest()
{
SimpleTcpClient = new JT808SimpleTcpClient(endPoint);
httpClient = new HttpClient();
for (var i = 1; i <= length; i++)
{
// 心跳会话包
JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create($"{i.ToString()}");
SimpleTcpClient.WriteAsync(JT808Serializer.Serialize(jT808Package1));
}
Thread.Sleep(300);
}

[Fact]
public void GetRealLinkCountTest()
{
var result = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRealLinkCount").Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content);
Assert.Equal(200, jt808Result.Code);
Assert.Equal(1,jt808Result.Data);
}

[Fact]
public void GetRelevanceLinkCountTest()
{
var result = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content);
Assert.Equal(200, jt808Result.Code);
Assert.Equal(length, jt808Result.Data);
}

[Fact]
public void GetRealAllTest()
{
var result = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRealAll").Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<IEnumerable<JT808SessionInfoDto>> jt808Result = JsonConvert.DeserializeObject<JT808ResultDto<IEnumerable<JT808SessionInfoDto>>>(content);
Assert.Equal(200, jt808Result.Code);
Assert.Single(jt808Result.Data);
}

[Fact]
public void GetRelevanceAllTest()
{
var result = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceAll").Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<IEnumerable<JT808SessionInfoDto>> jt808Result = JsonConvert.DeserializeObject<JT808ResultDto<IEnumerable<JT808SessionInfoDto>>>(content);
Assert.Equal(200, jt808Result.Code);
Assert.Equal(length,jt808Result.Data.Count());
}

[Fact]
public void RemoveByChannelIdTest()
{
var result1 = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content1 = result1.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result1 = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content1);
Assert.Equal(200, jt808Result1.Code);
Assert.Equal(length, jt808Result1.Data);

// 心跳会话包
JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("99");
SimpleTcpClient.WriteAsync(JT808Serializer.Serialize(jT808Package1));

var result2 = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content2 = result2.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result2 = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content2);
Assert.Equal(200, jt808Result2.Code);
Assert.Equal(length + 1, jt808Result2.Data);

var result3 = httpClient.PostAsync($"{Url}/{sessionRoutePrefix}/GetByTerminalPhoneNo", new StringContent("99")).Result;
string content3 = result3.Content.ReadAsStringAsync().Result;

JT808ResultDto<JT808SessionInfoDto> jt808Result3 = JsonConvert.DeserializeObject<JT808ResultDto<JT808SessionInfoDto>>(content3);
Assert.Equal(200, jt808Result3.Code);
Assert.Equal("99", jt808Result3.Data.TerminalPhoneNo);

var result4 = httpClient.PostAsync($"{Url}/{sessionRoutePrefix}/RemoveByChannelId", new StringContent(jt808Result3.Data.ChannelId)).Result;
string content4 = result4.Content.ReadAsStringAsync().Result;
JT808ResultDto<bool> jt808Result4= JsonConvert.DeserializeObject<JT808ResultDto<bool>>(content4);
Assert.Equal(200, jt808Result4.Code);
Assert.True(jt808Result4.Data);

var result5 = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content5 = result5.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result5 = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content5);
Assert.Equal(200, jt808Result5.Code);
Assert.Equal(length, jt808Result5.Data);
}


[Fact]
public void RemoveByTerminalPhoneNoTest()
{
var result1 = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content1 = result1.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result1 = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content1);
Assert.Equal(200, jt808Result1.Code);
Assert.Equal(length, jt808Result1.Data);

// 心跳会话包
JT808Package jT808Package1 = JT808.Protocol.Enums.JT808MsgId.终端心跳.Create("999");
SimpleTcpClient.WriteAsync(JT808Serializer.Serialize(jT808Package1));

var result2 = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content2 = result2.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result2 = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content2);
Assert.Equal(200, jt808Result2.Code);
Assert.Equal(length + 1, jt808Result2.Data);

var result3 = httpClient.PostAsync($"{Url}/{sessionRoutePrefix}/GetByTerminalPhoneNo", new StringContent("999")).Result;
string content3 = result3.Content.ReadAsStringAsync().Result;

JT808ResultDto<JT808SessionInfoDto> jt808Result3 = JsonConvert.DeserializeObject<JT808ResultDto<JT808SessionInfoDto>>(content3);
Assert.Equal(200, jt808Result3.Code);
Assert.Equal("999", jt808Result3.Data.TerminalPhoneNo);

var result4 = httpClient.PostAsync($"{Url}/{sessionRoutePrefix}/RemoveByTerminalPhoneNo", new StringContent("999")).Result;
string content4 = result4.Content.ReadAsStringAsync().Result;
JT808ResultDto<bool> jt808Result4 = JsonConvert.DeserializeObject<JT808ResultDto<bool>>(content4);
Assert.Equal(200, jt808Result4.Code);
Assert.True(jt808Result4.Data);

var result5 = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceLinkCount").Result;
string content5 = result5.Content.ReadAsStringAsync().Result;
JT808ResultDto<int> jt808Result5 = JsonConvert.DeserializeObject<JT808ResultDto<int>>(content5);
Assert.Equal(200, jt808Result5.Code);
Assert.Equal(length, jt808Result5.Data);
}

[Fact]
public void GetByChannelIdTest()
{
var result = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRealAll").Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<IEnumerable<JT808SessionInfoDto>> jt808Result1 = JsonConvert.DeserializeObject<JT808ResultDto<IEnumerable<JT808SessionInfoDto>>>(content);
var sessionInfo1 = jt808Result1.Data.FirstOrDefault();

var result2 = httpClient.PostAsync($"{Url}/{sessionRoutePrefix}/GetByChannelId",new StringContent(sessionInfo1.ChannelId)).Result;
string content2 = result2.Content.ReadAsStringAsync().Result;

JT808ResultDto<JT808SessionInfoDto> jt808Result2 = JsonConvert.DeserializeObject<JT808ResultDto<JT808SessionInfoDto>>(content2);
Assert.Equal(200, jt808Result2.Code);
Assert.Equal(sessionInfo1.ChannelId, jt808Result2.Data.ChannelId);
}

[Fact]
public void GetByTerminalPhoneNoTest()
{
var result = httpClient.GetAsync($"{Url}/{sessionRoutePrefix}/GetRelevanceAll").Result;
string content = result.Content.ReadAsStringAsync().Result;
JT808ResultDto<IEnumerable<JT808SessionInfoDto>> jt808Result1 = JsonConvert.DeserializeObject<JT808ResultDto<IEnumerable<JT808SessionInfoDto>>>(content);
var sessionInfo1 = jt808Result1.Data.FirstOrDefault();

var result2 = httpClient.PostAsync($"{Url}/{sessionRoutePrefix}/GetByTerminalPhoneNo", new StringContent(sessionInfo1.TerminalPhoneNo)).Result;
string content2 = result2.Content.ReadAsStringAsync().Result;

JT808ResultDto<JT808SessionInfoDto> jt808Result2 = JsonConvert.DeserializeObject<JT808ResultDto<JT808SessionInfoDto>>(content2);
Assert.Equal(200, jt808Result2.Code);
Assert.Equal(sessionInfo1.TerminalPhoneNo, jt808Result2.Data.TerminalPhoneNo);
}

public override void Dispose()
{
base.Dispose();
SimpleTcpClient.Down();
}
}
}

+ 15
- 2
src/JT808.DotNetty.Test/SeedSession.cs Voir le fichier

@@ -1,4 +1,5 @@
using DotNetty.Transport.Channels.Embedded;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
@@ -10,12 +11,24 @@ namespace JT808.DotNetty.Test
{
public List<EmbeddedChannel> embeddedChannels = new List<EmbeddedChannel>();

public JT808SessionManager jT808SessionManager = new JT808SessionManager(new LoggerFactory());

public SeedSession()
{
for (var i = 0; i < 10; i++)
{
var channel = new EmbeddedChannel(new JT808DefaultChannelId());
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, i.ToString()));
}
}

[Fact]
public void Init()
{
for(var i = 0; i < 10; i++)
for (var i = 0; i < 10; i++)
{
embeddedChannels.Add(new EmbeddedChannel(new JT808DefaultChannelId()));
var channel = new EmbeddedChannel(new JT808DefaultChannelId());
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, i.ToString()));
}
}
}


+ 26
- 4
src/JT808.DotNetty.Test/TestBase.cs Voir le fichier

@@ -1,19 +1,41 @@
using JT808.DotNetty.Codecs;
using JT808.DotNetty.Configurations;
using JT808.DotNetty.Handlers;
using JT808.DotNetty.Interfaces;
using JT808.DotNetty.Internal;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Net;
using Xunit;

namespace JT808.DotNetty.Test
{
public class TestBase
public class TestBase:IDisposable
{
private IServiceCollection serviceDescriptors;
static TestBase()
{
var serverHostBuilder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory);
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
})
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
})
.UseJT808Host();
serverHostBuilder.RunConsoleAsync();
}

public TestBase()
public virtual void Dispose()
{
serviceDescriptors = new ServiceCollection();
}
}
}

+ 21
- 0
src/JT808.DotNetty.Test/appsettings.json Voir le fichier

@@ -0,0 +1,21 @@
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Trace"
}
},
"Console": {
"LogLevel": {
"Default": "Trace"
}
}
},
"JT808Configuration": {
"Port": 6565,
"SourcePackageDispatcherClientConfigurations": [
{"Host": "127.0.0.1","Port": 6655}
]
}
}

+ 0
- 1
src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs Voir le fichier

@@ -33,7 +33,6 @@ namespace JT808.DotNetty.Handlers
string channelId = context.Channel.Id.AsShortText();
if (logger.IsEnabled(LogLevel.Debug))
logger.LogDebug($"<<<{ channelId } Successful client connection to server.");
jT808SessionManager.TryAddSession(new JT808Session(context.Channel));
base.ChannelActive(context);
}



+ 2
- 0
src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs Voir le fichier

@@ -30,6 +30,7 @@ namespace JT808.DotNetty.Internal
LastActiveTime=result.LastActiveTime,
StartTime=result.StartTime
};
resultDto.Code = 200;
resultDto.Data = jT808SessionInfoDto;
}
catch (Exception ex)
@@ -190,6 +191,7 @@ namespace JT808.DotNetty.Internal
LastActiveTime = result.LastActiveTime,
StartTime = result.StartTime
};
resultDto.Code = 200;
resultDto.Data = jT808SessionInfoDto;
}
catch (Exception ex)


+ 2
- 2
src/JT808.DotNetty/Internal/JT808SourcePackageDispatcherDefaultImpl.cs Voir le fichier

@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Internal
internal readonly Bootstrap bootstrap = new Bootstrap();
internal readonly ConcurrentDictionary<EndPoint, IChannel> channels = new ConcurrentDictionary<EndPoint, IChannel>();
private readonly ILogger<JT808SourcePackageDispatcherDefaultImpl> logger;
IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor;
private IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor;
internal readonly ILoggerFactory loggerFactory;

public JT808SourcePackageDispatcherDefaultImpl(ILoggerFactory loggerFactory,
@@ -160,7 +160,7 @@ namespace JT808.DotNetty.Internal
}
catch (Exception ex)
{
logger.LogError($"变更后链接远程服务端{item},重连异常:{ex}");
logger.LogError(ex,$"重连异常变更后链接远程服务端{item}");
}
}
}


+ 12
- 2
src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs Voir le fichier

@@ -22,8 +22,18 @@ namespace JT808.DotNetty.Internal
try
{
var session = jT808SessionManager.GetSessionByTerminalPhoneNo(terminalPhoneNo);
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data));
resultDto.Data = true;
if (session != null)
{
session.Channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(data));
resultDto.Code = 200;
resultDto.Data = true;
}
else
{
resultDto.Code = 200;
resultDto.Data = false;
resultDto.Message = "not session";
}
}
catch (Exception ex)
{


+ 12
- 0
src/JT808.DotNetty/JT808.DotNetty.csproj Voir le fichier

@@ -3,6 +3,18 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Copyright>Copyright 2018.</Copyright>
<Authors>SmallChi</Authors>
<PackageId>JT808DotNetty</PackageId>
<Product>JT808DotNetty</Product>
<Description>基于DotNetty封装的JT808DotNetty专注消息业务处理</Description>
<PackageReleaseNotes>基于DotNetty封装的JT808DotNetty专注消息业务处理</PackageReleaseNotes>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl>
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>1.0.0</Version>
</PropertyGroup>

<ItemGroup>


+ 1
- 1
src/JT808.DotNetty/JT808DotnettyExtensions.cs Voir le fichier

@@ -29,7 +29,7 @@ namespace JT808.DotNetty
services.TryAddScoped<JT808ServerHandler>();
services.TryAddSingleton<IJT808SessionService, JT808SessionServiceDefaultImpl>();
services.TryAddSingleton<IJT808UnificationSendService, JT808UnificationSendServiceDefaultImpl>();
services.TryAddScoped<JT808WebAPIService>();
services.TryAddSingleton<JT808WebAPIService>();
services.TryAddScoped<JT808WebAPIServerHandler>();
services.AddHostedService<JT808ServerHost>();
services.AddHostedService<JT808WebAPIServerHost>();


+ 3
- 0
src/JT808.DotNetty/JT808ServerHost.cs Voir le fichier

@@ -29,6 +29,7 @@ namespace JT808.DotNetty
private DispatcherEventLoopGroup bossGroup;
private WorkerEventLoopGroup workerGroup;
private IChannel bootstrapChannel;
private IByteBufferAllocator serverBufferAllocator;

public JT808ServerHost(
IServiceProvider provider,
@@ -44,6 +45,7 @@ namespace JT808.DotNetty
{
bossGroup = new DispatcherEventLoopGroup();
workerGroup = new WorkerEventLoopGroup(bossGroup, configuration.EventLoopCount);
serverBufferAllocator = new PooledByteBufferAllocator();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.Group(bossGroup, workerGroup);
bootstrap.Channel<TcpServerChannel>();
@@ -56,6 +58,7 @@ namespace JT808.DotNetty
}
bootstrap
.Option(ChannelOption.SoBacklog, configuration.SoBacklog)
.ChildOption(ChannelOption.Allocator, serverBufferAllocator)
.ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
{
IChannelPipeline pipeline = channel.Pipeline;


+ 1
- 6
src/JT808.DotNetty/JT808SessionManager.cs Voir le fichier

@@ -120,14 +120,9 @@ namespace JT808.DotNetty
}

public void TryAddOrUpdateSession(JT808Session appSession)
{
//SessionIdDict.AddOrUpdate(appSession.SessionID, appSession, (x, y) => appSession);
TerminalPhoneNo_SessionId_Dict.AddOrUpdate(appSession.TerminalPhoneNo, appSession.SessionID, (x, y) => appSession.SessionID);
}

public void TryAddSession(JT808Session appSession)
{
SessionIdDict.AddOrUpdate(appSession.SessionID, appSession, (x, y) => appSession);
TerminalPhoneNo_SessionId_Dict.AddOrUpdate(appSession.TerminalPhoneNo, appSession.SessionID, (x, y) => appSession.SessionID);
}

public JT808Session RemoveSessionByID(string sessionID)


+ 4
- 0
src/JT808.DotNetty/JT808SimpleTcpClient.cs Voir le fichier

@@ -22,13 +22,17 @@ namespace JT808.DotNetty

private IChannel clientChannel;

private IByteBufferAllocator clientBufferAllocator;

public JT808SimpleTcpClient(EndPoint remoteAddress)
{
clientBufferAllocator = new PooledByteBufferAllocator();
clientGroup = new MultithreadEventLoopGroup(1);
cb = new Bootstrap()
.Group(clientGroup)
.Channel<TcpSocketChannel>()
.Option(ChannelOption.TcpNodelay, true)
.Option(ChannelOption.Allocator, clientBufferAllocator)
.Handler(new ActionChannelInitializer<TcpSocketChannel>(channel =>
{
channel.Pipeline.AddLast("jt808Buffer", new DelimiterBasedFrameDecoder(int.MaxValue,


+ 2
- 2
src/JT808.DotNetty/JT808WebAPIService.cs Voir le fichier

@@ -23,7 +23,7 @@ namespace JT808.DotNetty
/// <summary>
/// 初始化消息处理业务
/// </summary>
protected JT808WebAPIService(
public JT808WebAPIService(
IJT808SessionService jT808SessionService,
IJT808UnificationSendService jT808UnificationSendService)
{
@@ -66,7 +66,7 @@ namespace JT808.DotNetty
/// <returns></returns>
public JT808HttpResponse GetRealLinkCount(JT808HttpRequest request)
{
var result = jT808SessionService.GetRealAll();
var result = jT808SessionService.GetRealLinkCount();
return CreateJT808HttpResponse(result);
}



Chargement…
Annuler
Enregistrer