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); }