From 10029f36f9e390006f16534b62b2d8707bf5d300 Mon Sep 17 00:00:00 2001
From: SmallChi <564952747@qq.com>
Date: Mon, 26 Nov 2018 19:17:59 +0800
Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E4=BC=9A=E8=AF=9D=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=202.=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E4=BF=A1=E6=81=AF=E4=B8=8B=E5=8F=91=E6=B5=8B=E8=AF=95?=
=?UTF-8?q?=E7=94=A8=E4=BE=8B=203.=E4=BF=AE=E5=A4=8D=E6=9C=8D=E5=8A=A1bug?=
=?UTF-8?q?=204.=E4=BF=AE=E6=94=B9session=E7=9A=84=E6=B3=A8=E5=86=8C?=
=?UTF-8?q?=E6=96=B9=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../JT808.DotNetty.Hosting.csproj | 1 +
src/JT808.DotNetty.Hosting/Program.cs | 4 +-
.../JT808SessionServiceDefaultImplTest.cs | 12 --
...8SourcePackageDispatcherDefaultImplTest.cs | 62 ++++++
...08UnificationSendServiceDefaultImplTest.cs | 87 ++++++++
.../JT808.DotNetty.Test.csproj | 8 +
.../JT808DefaultChannelId.cs | 10 +-
.../JT808SessionManagerTest.cs | 32 +--
.../JT808WebAPIServiceTest.cs | 200 ++++++++++++++++++
src/JT808.DotNetty.Test/SeedSession.cs | 17 +-
src/JT808.DotNetty.Test/TestBase.cs | 30 ++-
src/JT808.DotNetty.Test/appsettings.json | 21 ++
.../Handlers/JT808ConnectionHandler.cs | 1 -
.../JT808SessionServiceDefaultImpl.cs | 2 +
...JT808SourcePackageDispatcherDefaultImpl.cs | 4 +-
.../JT808UnificationSendServiceDefaultImpl.cs | 14 +-
src/JT808.DotNetty/JT808.DotNetty.csproj | 12 ++
src/JT808.DotNetty/JT808DotnettyExtensions.cs | 2 +-
src/JT808.DotNetty/JT808ServerHost.cs | 3 +
src/JT808.DotNetty/JT808SessionManager.cs | 7 +-
src/JT808.DotNetty/JT808SimpleTcpClient.cs | 4 +
src/JT808.DotNetty/JT808WebAPIService.cs | 4 +-
22 files changed, 471 insertions(+), 66 deletions(-)
delete mode 100644 src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs
create mode 100644 src/JT808.DotNetty.Test/Internal/JT808SourcePackageDispatcherDefaultImplTest.cs
create mode 100644 src/JT808.DotNetty.Test/Internal/JT808UnificationSendServiceDefaultImplTest.cs
create mode 100644 src/JT808.DotNetty.Test/JT808WebAPIServiceTest.cs
create mode 100644 src/JT808.DotNetty.Test/appsettings.json
diff --git a/src/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj b/src/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj
index 31c64fd..2671cdd 100644
--- a/src/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj
+++ b/src/JT808.DotNetty.Hosting/JT808.DotNetty.Hosting.csproj
@@ -3,6 +3,7 @@
Exe
netcoreapp2.1
+ true
latest
diff --git a/src/JT808.DotNetty.Hosting/Program.cs b/src/JT808.DotNetty.Hosting/Program.cs
index 7890985..a843df9 100644
--- a/src/JT808.DotNetty.Hosting/Program.cs
+++ b/src/JT808.DotNetty.Hosting/Program.cs
@@ -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) =>
{
diff --git a/src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs b/src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs
deleted file mode 100644
index 866247f..0000000
--- a/src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs
+++ /dev/null
@@ -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());
- }
-}
diff --git a/src/JT808.DotNetty.Test/Internal/JT808SourcePackageDispatcherDefaultImplTest.cs b/src/JT808.DotNetty.Test/Internal/JT808SourcePackageDispatcherDefaultImplTest.cs
new file mode 100644
index 0000000..d81ba8e
--- /dev/null
+++ b/src/JT808.DotNetty.Test/Internal/JT808SourcePackageDispatcherDefaultImplTest.cs
@@ -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();
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
+ || RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+ {
+ bootstrap
+ .Option(ChannelOption.SoReuseport, true)
+ .ChildOption(ChannelOption.SoReuseaddr, true);
+ }
+ bootstrap
+ .ChildHandler(new ActionChannelInitializer(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();
+ }
+ }
+}
diff --git a/src/JT808.DotNetty.Test/Internal/JT808UnificationSendServiceDefaultImplTest.cs b/src/JT808.DotNetty.Test/Internal/JT808UnificationSendServiceDefaultImplTest.cs
new file mode 100644
index 0000000..87b64ca
--- /dev/null
+++ b/src/JT808.DotNetty.Test/Internal/JT808UnificationSendServiceDefaultImplTest.cs
@@ -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 jt808Result = JsonConvert.DeserializeObject>(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 jt808Result = JsonConvert.DeserializeObject>(content);
+ Assert.Equal(200, jt808Result.Code);
+ Assert.True(jt808Result.Data);
+ SimpleTcpClient.Down();
+ }
+ }
+}
diff --git a/src/JT808.DotNetty.Test/JT808.DotNetty.Test.csproj b/src/JT808.DotNetty.Test/JT808.DotNetty.Test.csproj
index bb87711..e09e23b 100644
--- a/src/JT808.DotNetty.Test/JT808.DotNetty.Test.csproj
+++ b/src/JT808.DotNetty.Test/JT808.DotNetty.Test.csproj
@@ -7,7 +7,9 @@
+
+
@@ -16,4 +18,10 @@
+
+
+
+ Always
+
+
diff --git a/src/JT808.DotNetty.Test/JT808DefaultChannelId.cs b/src/JT808.DotNetty.Test/JT808DefaultChannelId.cs
index be2c1bd..68ba9e3 100644
--- a/src/JT808.DotNetty.Test/JT808DefaultChannelId.cs
+++ b/src/JT808.DotNetty.Test/JT808DefaultChannelId.cs
@@ -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;
}
}
diff --git a/src/JT808.DotNetty.Test/JT808SessionManagerTest.cs b/src/JT808.DotNetty.Test/JT808SessionManagerTest.cs
index 4eba9a1..d722d52 100644
--- a/src/JT808.DotNetty.Test/JT808SessionManagerTest.cs
+++ b/src/JT808.DotNetty.Test/JT808SessionManagerTest.cs
@@ -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;
}
}
}
diff --git a/src/JT808.DotNetty.Test/JT808WebAPIServiceTest.cs b/src/JT808.DotNetty.Test/JT808WebAPIServiceTest.cs
new file mode 100644
index 0000000..4544f7c
--- /dev/null
+++ b/src/JT808.DotNetty.Test/JT808WebAPIServiceTest.cs
@@ -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 jt808Result = JsonConvert.DeserializeObject>(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 jt808Result = JsonConvert.DeserializeObject>(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> jt808Result = JsonConvert.DeserializeObject>>(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> jt808Result = JsonConvert.DeserializeObject>>(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 jt808Result1 = JsonConvert.DeserializeObject>(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 jt808Result2 = JsonConvert.DeserializeObject>(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 jt808Result3 = JsonConvert.DeserializeObject>(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 jt808Result4= JsonConvert.DeserializeObject>(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 jt808Result5 = JsonConvert.DeserializeObject>(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 jt808Result1 = JsonConvert.DeserializeObject>(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 jt808Result2 = JsonConvert.DeserializeObject>(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 jt808Result3 = JsonConvert.DeserializeObject>(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 jt808Result4 = JsonConvert.DeserializeObject>(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 jt808Result5 = JsonConvert.DeserializeObject>(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> jt808Result1 = JsonConvert.DeserializeObject>>(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 jt808Result2 = JsonConvert.DeserializeObject>(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> jt808Result1 = JsonConvert.DeserializeObject>>(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 jt808Result2 = JsonConvert.DeserializeObject>(content2);
+ Assert.Equal(200, jt808Result2.Code);
+ Assert.Equal(sessionInfo1.TerminalPhoneNo, jt808Result2.Data.TerminalPhoneNo);
+ }
+
+ public override void Dispose()
+ {
+ base.Dispose();
+ SimpleTcpClient.Down();
+ }
+ }
+}
diff --git a/src/JT808.DotNetty.Test/SeedSession.cs b/src/JT808.DotNetty.Test/SeedSession.cs
index 9acbb98..6309843 100644
--- a/src/JT808.DotNetty.Test/SeedSession.cs
+++ b/src/JT808.DotNetty.Test/SeedSession.cs
@@ -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 embeddedChannels = new List();
+ 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()));
}
}
}
diff --git a/src/JT808.DotNetty.Test/TestBase.cs b/src/JT808.DotNetty.Test/TestBase.cs
index abf185f..aadb76c 100644
--- a/src/JT808.DotNetty.Test/TestBase.cs
+++ b/src/JT808.DotNetty.Test/TestBase.cs
@@ -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();
+ services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
+ })
+ .UseJT808Host();
+ serverHostBuilder.RunConsoleAsync();
+ }
- public TestBase()
+ public virtual void Dispose()
{
- serviceDescriptors = new ServiceCollection();
+
}
}
}
diff --git a/src/JT808.DotNetty.Test/appsettings.json b/src/JT808.DotNetty.Test/appsettings.json
new file mode 100644
index 0000000..45b9b82
--- /dev/null
+++ b/src/JT808.DotNetty.Test/appsettings.json
@@ -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}
+ ]
+ }
+}
diff --git a/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs b/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs
index 8646687..8d7073e 100644
--- a/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs
+++ b/src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs
@@ -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);
}
diff --git a/src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs b/src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs
index 7929453..95365bb 100644
--- a/src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs
+++ b/src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs
@@ -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)
diff --git a/src/JT808.DotNetty/Internal/JT808SourcePackageDispatcherDefaultImpl.cs b/src/JT808.DotNetty/Internal/JT808SourcePackageDispatcherDefaultImpl.cs
index bd141ee..5f27cfc 100644
--- a/src/JT808.DotNetty/Internal/JT808SourcePackageDispatcherDefaultImpl.cs
+++ b/src/JT808.DotNetty/Internal/JT808SourcePackageDispatcherDefaultImpl.cs
@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Internal
internal readonly Bootstrap bootstrap = new Bootstrap();
internal readonly ConcurrentDictionary channels = new ConcurrentDictionary();
private readonly ILogger logger;
- IOptionsMonitor jT808ConfigurationOptionsMonitor;
+ private IOptionsMonitor 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}");
}
}
}
diff --git a/src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs b/src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs
index 9784732..79fa3d4 100644
--- a/src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs
+++ b/src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs
@@ -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)
{
diff --git a/src/JT808.DotNetty/JT808.DotNetty.csproj b/src/JT808.DotNetty/JT808.DotNetty.csproj
index 11c8ee7..c06b862 100644
--- a/src/JT808.DotNetty/JT808.DotNetty.csproj
+++ b/src/JT808.DotNetty/JT808.DotNetty.csproj
@@ -3,6 +3,18 @@
netstandard2.0
latest
+ Copyright 2018.
+ SmallChi
+ JT808DotNetty
+ JT808DotNetty
+ 基于DotNetty封装的JT808DotNetty专注消息业务处理
+ 基于DotNetty封装的JT808DotNetty专注消息业务处理
+ false
+ https://github.com/SmallChi/JT808DotNetty
+ https://github.com/SmallChi/JT808DotNetty
+ https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE
+ true
+ 1.0.0
diff --git a/src/JT808.DotNetty/JT808DotnettyExtensions.cs b/src/JT808.DotNetty/JT808DotnettyExtensions.cs
index 091d6a5..b89a9d9 100644
--- a/src/JT808.DotNetty/JT808DotnettyExtensions.cs
+++ b/src/JT808.DotNetty/JT808DotnettyExtensions.cs
@@ -29,7 +29,7 @@ namespace JT808.DotNetty
services.TryAddScoped();
services.TryAddSingleton();
services.TryAddSingleton();
- services.TryAddScoped();
+ services.TryAddSingleton();
services.TryAddScoped();
services.AddHostedService();
services.AddHostedService();
diff --git a/src/JT808.DotNetty/JT808ServerHost.cs b/src/JT808.DotNetty/JT808ServerHost.cs
index 1674583..d2cdcfd 100644
--- a/src/JT808.DotNetty/JT808ServerHost.cs
+++ b/src/JT808.DotNetty/JT808ServerHost.cs
@@ -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();
@@ -56,6 +58,7 @@ namespace JT808.DotNetty
}
bootstrap
.Option(ChannelOption.SoBacklog, configuration.SoBacklog)
+ .ChildOption(ChannelOption.Allocator, serverBufferAllocator)
.ChildHandler(new ActionChannelInitializer(channel =>
{
IChannelPipeline pipeline = channel.Pipeline;
diff --git a/src/JT808.DotNetty/JT808SessionManager.cs b/src/JT808.DotNetty/JT808SessionManager.cs
index cb0e6cd..d58df46 100644
--- a/src/JT808.DotNetty/JT808SessionManager.cs
+++ b/src/JT808.DotNetty/JT808SessionManager.cs
@@ -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)
diff --git a/src/JT808.DotNetty/JT808SimpleTcpClient.cs b/src/JT808.DotNetty/JT808SimpleTcpClient.cs
index fcadd98..c2955f9 100644
--- a/src/JT808.DotNetty/JT808SimpleTcpClient.cs
+++ b/src/JT808.DotNetty/JT808SimpleTcpClient.cs
@@ -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()
.Option(ChannelOption.TcpNodelay, true)
+ .Option(ChannelOption.Allocator, clientBufferAllocator)
.Handler(new ActionChannelInitializer(channel =>
{
channel.Pipeline.AddLast("jt808Buffer", new DelimiterBasedFrameDecoder(int.MaxValue,
diff --git a/src/JT808.DotNetty/JT808WebAPIService.cs b/src/JT808.DotNetty/JT808WebAPIService.cs
index bf75288..0bfd754 100644
--- a/src/JT808.DotNetty/JT808WebAPIService.cs
+++ b/src/JT808.DotNetty/JT808WebAPIService.cs
@@ -23,7 +23,7 @@ namespace JT808.DotNetty
///
/// 初始化消息处理业务
///
- protected JT808WebAPIService(
+ public JT808WebAPIService(
IJT808SessionService jT808SessionService,
IJT808UnificationSendService jT808UnificationSendService)
{
@@ -66,7 +66,7 @@ namespace JT808.DotNetty
///
public JT808HttpResponse GetRealLinkCount(JT808HttpRequest request)
{
- var result = jT808SessionService.GetRealAll();
+ var result = jT808SessionService.GetRealLinkCount();
return CreateJT808HttpResponse(result);
}