@@ -3,6 +3,7 @@ | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<OutputType>Exe</OutputType> | <OutputType>Exe</OutputType> | ||||
<TargetFramework>netcoreapp2.1</TargetFramework> | <TargetFramework>netcoreapp2.1</TargetFramework> | ||||
<ServerGarbageCollection>true</ServerGarbageCollection> | |||||
<LangVersion>latest</LangVersion> | <LangVersion>latest</LangVersion> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
@@ -25,8 +25,8 @@ namespace JT808.DotNetty.Hosting | |||||
}) | }) | ||||
.ConfigureLogging((context, logging) => | .ConfigureLogging((context, logging) => | ||||
{ | { | ||||
logging.AddConsole(); | |||||
logging.SetMinimumLevel(LogLevel.Trace); | |||||
logging.AddConsole(); | |||||
logging.SetMinimumLevel(LogLevel.Error); | |||||
}) | }) | ||||
.ConfigureServices((hostContext, services) => | .ConfigureServices((hostContext, services) => | ||||
{ | { | ||||
@@ -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()); | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -7,7 +7,9 @@ | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" 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="Microsoft.NET.Test.Sdk" Version="15.8.0" /> | ||||
<PackageReference Include="xunit" Version="2.3.1" /> | <PackageReference Include="xunit" Version="2.3.1" /> | ||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> | <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> | ||||
@@ -16,4 +18,10 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<ProjectReference Include="..\JT808.DotNetty\JT808.DotNetty.csproj" /> | <ProjectReference Include="..\JT808.DotNetty\JT808.DotNetty.csproj" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | |||||
<None Update="appsettings.json"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
</ItemGroup> | |||||
</Project> | </Project> |
@@ -10,18 +10,24 @@ namespace JT808.DotNetty.Test | |||||
{ | { | ||||
private static readonly JT808AtomicCounter jT808AtomicCounter = new JT808AtomicCounter(); | private static readonly JT808AtomicCounter jT808AtomicCounter = new JT808AtomicCounter(); | ||||
private string Id { get { return jT808AtomicCounter.Increment().ToString(); } } | |||||
public string AsLongText() | public string AsLongText() | ||||
{ | { | ||||
return jT808AtomicCounter.Increment().ToString(); | |||||
return Id; | |||||
} | } | ||||
public string AsShortText() | public string AsShortText() | ||||
{ | { | ||||
return jT808AtomicCounter.Increment().ToString(); | |||||
return Id; | |||||
} | } | ||||
public int CompareTo(IChannelId other) | public int CompareTo(IChannelId other) | ||||
{ | { | ||||
if(other.AsShortText()== Id) | |||||
{ | |||||
return 1; | |||||
} | |||||
return 0; | return 0; | ||||
} | } | ||||
} | } | ||||
@@ -7,31 +7,14 @@ using Xunit; | |||||
namespace JT808.DotNetty.Test | namespace JT808.DotNetty.Test | ||||
{ | { | ||||
public class JT808SessionManagerTest | |||||
public class JT808SessionManagerTest: SeedSession | |||||
{ | { | ||||
JT808SessionManager jT808SessionManager = new JT808SessionManager(new LoggerFactory()); | |||||
string TerminalPhoneNo = "123456789123"; | 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] | [Fact] | ||||
public void Test3() | public void Test3() | ||||
{ | { | ||||
var channel = new EmbeddedChannel(); | var channel = new EmbeddedChannel(); | ||||
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | |||||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | ||||
var sessionInfo=jT808SessionManager.GetSessionByTerminalPhoneNo(TerminalPhoneNo); | var sessionInfo=jT808SessionManager.GetSessionByTerminalPhoneNo(TerminalPhoneNo); | ||||
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | ||||
@@ -42,7 +25,6 @@ namespace JT808.DotNetty.Test | |||||
public void Test4() | public void Test4() | ||||
{ | { | ||||
var channel = new EmbeddedChannel(); | var channel = new EmbeddedChannel(); | ||||
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | |||||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | ||||
jT808SessionManager.Heartbeat(TerminalPhoneNo); | jT808SessionManager.Heartbeat(TerminalPhoneNo); | ||||
} | } | ||||
@@ -51,7 +33,6 @@ namespace JT808.DotNetty.Test | |||||
public void Test5() | public void Test5() | ||||
{ | { | ||||
var channel = new EmbeddedChannel(); | var channel = new EmbeddedChannel(); | ||||
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | |||||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | ||||
var sessionInfo = jT808SessionManager.GetSessionByID("embedded"); | var sessionInfo = jT808SessionManager.GetSessionByID("embedded"); | ||||
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | ||||
@@ -63,7 +44,6 @@ namespace JT808.DotNetty.Test | |||||
public void Test6() | public void Test6() | ||||
{ | { | ||||
var channel = new EmbeddedChannel(); | var channel = new EmbeddedChannel(); | ||||
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | |||||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | ||||
var sessionInfo = jT808SessionManager.RemoveSessionByID("embedded"); | var sessionInfo = jT808SessionManager.RemoveSessionByID("embedded"); | ||||
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | ||||
@@ -75,8 +55,6 @@ namespace JT808.DotNetty.Test | |||||
public void Test7() | public void Test7() | ||||
{ | { | ||||
var channel = new EmbeddedChannel(); | var channel = new EmbeddedChannel(); | ||||
jT808SessionManager.TryAddSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | |||||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); | |||||
var sessionInfo = jT808SessionManager.RemoveSessionByTerminalPhoneNo(TerminalPhoneNo); | var sessionInfo = jT808SessionManager.RemoveSessionByTerminalPhoneNo(TerminalPhoneNo); | ||||
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); | ||||
Assert.Equal("embedded", sessionInfo.SessionID); | Assert.Equal("embedded", sessionInfo.SessionID); | ||||
@@ -85,9 +63,6 @@ namespace JT808.DotNetty.Test | |||||
[Fact] | [Fact] | ||||
public void Test8() | 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 realSessionInfos = jT808SessionManager.GetRealAll(); | ||||
var relevanceSessionInfos = jT808SessionManager.GetRelevanceAll(); | var relevanceSessionInfos = jT808SessionManager.GetRelevanceAll(); | ||||
} | } | ||||
@@ -95,11 +70,8 @@ namespace JT808.DotNetty.Test | |||||
[Fact] | [Fact] | ||||
public void Test9() | 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 realSessionCount = jT808SessionManager.RealSessionCount; | ||||
var relevanceSessionCount = jT808SessionManager.RealSessionCount; | |||||
var relevanceSessionCount = jT808SessionManager.RelevanceSessionCount; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -1,4 +1,5 @@ | |||||
using DotNetty.Transport.Channels.Embedded; | using DotNetty.Transport.Channels.Embedded; | ||||
using Microsoft.Extensions.Logging; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Text; | using System.Text; | ||||
@@ -10,12 +11,24 @@ namespace JT808.DotNetty.Test | |||||
{ | { | ||||
public List<EmbeddedChannel> embeddedChannels = new List<EmbeddedChannel>(); | 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] | [Fact] | ||||
public void Init() | 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())); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -1,19 +1,41 @@ | |||||
using JT808.DotNetty.Codecs; | |||||
using JT808.DotNetty.Configurations; | using JT808.DotNetty.Configurations; | ||||
using JT808.DotNetty.Handlers; | |||||
using JT808.DotNetty.Interfaces; | |||||
using JT808.DotNetty.Internal; | using JT808.DotNetty.Internal; | ||||
using Microsoft.Extensions.Configuration; | |||||
using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||
using Microsoft.Extensions.DependencyInjection.Extensions; | using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
using Microsoft.Extensions.Hosting; | |||||
using Microsoft.Extensions.Logging; | |||||
using System; | using System; | ||||
using System.Net; | |||||
using Xunit; | using Xunit; | ||||
namespace JT808.DotNetty.Test | 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(); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -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} | |||||
] | |||||
} | |||||
} |
@@ -33,7 +33,6 @@ namespace JT808.DotNetty.Handlers | |||||
string channelId = context.Channel.Id.AsShortText(); | string channelId = context.Channel.Id.AsShortText(); | ||||
if (logger.IsEnabled(LogLevel.Debug)) | if (logger.IsEnabled(LogLevel.Debug)) | ||||
logger.LogDebug($"<<<{ channelId } Successful client connection to server."); | logger.LogDebug($"<<<{ channelId } Successful client connection to server."); | ||||
jT808SessionManager.TryAddSession(new JT808Session(context.Channel)); | |||||
base.ChannelActive(context); | base.ChannelActive(context); | ||||
} | } | ||||
@@ -30,6 +30,7 @@ namespace JT808.DotNetty.Internal | |||||
LastActiveTime=result.LastActiveTime, | LastActiveTime=result.LastActiveTime, | ||||
StartTime=result.StartTime | StartTime=result.StartTime | ||||
}; | }; | ||||
resultDto.Code = 200; | |||||
resultDto.Data = jT808SessionInfoDto; | resultDto.Data = jT808SessionInfoDto; | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
@@ -190,6 +191,7 @@ namespace JT808.DotNetty.Internal | |||||
LastActiveTime = result.LastActiveTime, | LastActiveTime = result.LastActiveTime, | ||||
StartTime = result.StartTime | StartTime = result.StartTime | ||||
}; | }; | ||||
resultDto.Code = 200; | |||||
resultDto.Data = jT808SessionInfoDto; | resultDto.Data = jT808SessionInfoDto; | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Internal | |||||
internal readonly Bootstrap bootstrap = new Bootstrap(); | internal readonly Bootstrap bootstrap = new Bootstrap(); | ||||
internal readonly ConcurrentDictionary<EndPoint, IChannel> channels = new ConcurrentDictionary<EndPoint, IChannel>(); | internal readonly ConcurrentDictionary<EndPoint, IChannel> channels = new ConcurrentDictionary<EndPoint, IChannel>(); | ||||
private readonly ILogger<JT808SourcePackageDispatcherDefaultImpl> logger; | private readonly ILogger<JT808SourcePackageDispatcherDefaultImpl> logger; | ||||
IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor; | |||||
private IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor; | |||||
internal readonly ILoggerFactory loggerFactory; | internal readonly ILoggerFactory loggerFactory; | ||||
public JT808SourcePackageDispatcherDefaultImpl(ILoggerFactory loggerFactory, | public JT808SourcePackageDispatcherDefaultImpl(ILoggerFactory loggerFactory, | ||||
@@ -160,7 +160,7 @@ namespace JT808.DotNetty.Internal | |||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
{ | { | ||||
logger.LogError($"变更后链接远程服务端{item},重连异常:{ex}"); | |||||
logger.LogError(ex,$"重连异常变更后链接远程服务端{item}"); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -22,8 +22,18 @@ namespace JT808.DotNetty.Internal | |||||
try | try | ||||
{ | { | ||||
var session = jT808SessionManager.GetSessionByTerminalPhoneNo(terminalPhoneNo); | 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) | catch (Exception ex) | ||||
{ | { | ||||
@@ -3,6 +3,18 @@ | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<TargetFramework>netstandard2.0</TargetFramework> | <TargetFramework>netstandard2.0</TargetFramework> | ||||
<LangVersion>latest</LangVersion> | <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> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -29,7 +29,7 @@ namespace JT808.DotNetty | |||||
services.TryAddScoped<JT808ServerHandler>(); | services.TryAddScoped<JT808ServerHandler>(); | ||||
services.TryAddSingleton<IJT808SessionService, JT808SessionServiceDefaultImpl>(); | services.TryAddSingleton<IJT808SessionService, JT808SessionServiceDefaultImpl>(); | ||||
services.TryAddSingleton<IJT808UnificationSendService, JT808UnificationSendServiceDefaultImpl>(); | services.TryAddSingleton<IJT808UnificationSendService, JT808UnificationSendServiceDefaultImpl>(); | ||||
services.TryAddScoped<JT808WebAPIService>(); | |||||
services.TryAddSingleton<JT808WebAPIService>(); | |||||
services.TryAddScoped<JT808WebAPIServerHandler>(); | services.TryAddScoped<JT808WebAPIServerHandler>(); | ||||
services.AddHostedService<JT808ServerHost>(); | services.AddHostedService<JT808ServerHost>(); | ||||
services.AddHostedService<JT808WebAPIServerHost>(); | services.AddHostedService<JT808WebAPIServerHost>(); | ||||
@@ -29,6 +29,7 @@ namespace JT808.DotNetty | |||||
private DispatcherEventLoopGroup bossGroup; | private DispatcherEventLoopGroup bossGroup; | ||||
private WorkerEventLoopGroup workerGroup; | private WorkerEventLoopGroup workerGroup; | ||||
private IChannel bootstrapChannel; | private IChannel bootstrapChannel; | ||||
private IByteBufferAllocator serverBufferAllocator; | |||||
public JT808ServerHost( | public JT808ServerHost( | ||||
IServiceProvider provider, | IServiceProvider provider, | ||||
@@ -44,6 +45,7 @@ namespace JT808.DotNetty | |||||
{ | { | ||||
bossGroup = new DispatcherEventLoopGroup(); | bossGroup = new DispatcherEventLoopGroup(); | ||||
workerGroup = new WorkerEventLoopGroup(bossGroup, configuration.EventLoopCount); | workerGroup = new WorkerEventLoopGroup(bossGroup, configuration.EventLoopCount); | ||||
serverBufferAllocator = new PooledByteBufferAllocator(); | |||||
ServerBootstrap bootstrap = new ServerBootstrap(); | ServerBootstrap bootstrap = new ServerBootstrap(); | ||||
bootstrap.Group(bossGroup, workerGroup); | bootstrap.Group(bossGroup, workerGroup); | ||||
bootstrap.Channel<TcpServerChannel>(); | bootstrap.Channel<TcpServerChannel>(); | ||||
@@ -56,6 +58,7 @@ namespace JT808.DotNetty | |||||
} | } | ||||
bootstrap | bootstrap | ||||
.Option(ChannelOption.SoBacklog, configuration.SoBacklog) | .Option(ChannelOption.SoBacklog, configuration.SoBacklog) | ||||
.ChildOption(ChannelOption.Allocator, serverBufferAllocator) | |||||
.ChildHandler(new ActionChannelInitializer<IChannel>(channel => | .ChildHandler(new ActionChannelInitializer<IChannel>(channel => | ||||
{ | { | ||||
IChannelPipeline pipeline = channel.Pipeline; | IChannelPipeline pipeline = channel.Pipeline; | ||||
@@ -120,14 +120,9 @@ namespace JT808.DotNetty | |||||
} | } | ||||
public void TryAddOrUpdateSession(JT808Session appSession) | 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); | 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) | public JT808Session RemoveSessionByID(string sessionID) | ||||
@@ -22,13 +22,17 @@ namespace JT808.DotNetty | |||||
private IChannel clientChannel; | private IChannel clientChannel; | ||||
private IByteBufferAllocator clientBufferAllocator; | |||||
public JT808SimpleTcpClient(EndPoint remoteAddress) | public JT808SimpleTcpClient(EndPoint remoteAddress) | ||||
{ | { | ||||
clientBufferAllocator = new PooledByteBufferAllocator(); | |||||
clientGroup = new MultithreadEventLoopGroup(1); | clientGroup = new MultithreadEventLoopGroup(1); | ||||
cb = new Bootstrap() | cb = new Bootstrap() | ||||
.Group(clientGroup) | .Group(clientGroup) | ||||
.Channel<TcpSocketChannel>() | .Channel<TcpSocketChannel>() | ||||
.Option(ChannelOption.TcpNodelay, true) | .Option(ChannelOption.TcpNodelay, true) | ||||
.Option(ChannelOption.Allocator, clientBufferAllocator) | |||||
.Handler(new ActionChannelInitializer<TcpSocketChannel>(channel => | .Handler(new ActionChannelInitializer<TcpSocketChannel>(channel => | ||||
{ | { | ||||
channel.Pipeline.AddLast("jt808Buffer", new DelimiterBasedFrameDecoder(int.MaxValue, | channel.Pipeline.AddLast("jt808Buffer", new DelimiterBasedFrameDecoder(int.MaxValue, | ||||
@@ -23,7 +23,7 @@ namespace JT808.DotNetty | |||||
/// <summary> | /// <summary> | ||||
/// 初始化消息处理业务 | /// 初始化消息处理业务 | ||||
/// </summary> | /// </summary> | ||||
protected JT808WebAPIService( | |||||
public JT808WebAPIService( | |||||
IJT808SessionService jT808SessionService, | IJT808SessionService jT808SessionService, | ||||
IJT808UnificationSendService jT808UnificationSendService) | IJT808UnificationSendService jT808UnificationSendService) | ||||
{ | { | ||||
@@ -66,7 +66,7 @@ namespace JT808.DotNetty | |||||
/// <returns></returns> | /// <returns></returns> | ||||
public JT808HttpResponse GetRealLinkCount(JT808HttpRequest request) | public JT808HttpResponse GetRealLinkCount(JT808HttpRequest request) | ||||
{ | { | ||||
var result = jT808SessionService.GetRealAll(); | |||||
var result = jT808SessionService.GetRealLinkCount(); | |||||
return CreateJT808HttpResponse(result); | return CreateJT808HttpResponse(result); | ||||
} | } | ||||