@@ -3,6 +3,7 @@ | |||
<PropertyGroup> | |||
<OutputType>Exe</OutputType> | |||
<TargetFramework>netcoreapp2.1</TargetFramework> | |||
<ServerGarbageCollection>true</ServerGarbageCollection> | |||
<LangVersion>latest</LangVersion> | |||
</PropertyGroup> | |||
@@ -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) => | |||
{ | |||
@@ -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> | |||
<ItemGroup> | |||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" /> | |||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.1" /> | |||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" /> | |||
<PackageReference Include="xunit" Version="2.3.1" /> | |||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> | |||
@@ -16,4 +18,10 @@ | |||
<ItemGroup> | |||
<ProjectReference Include="..\JT808.DotNetty\JT808.DotNetty.csproj" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Update="appsettings.json"> | |||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||
</None> | |||
</ItemGroup> | |||
</Project> |
@@ -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; | |||
} | |||
} | |||
@@ -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; | |||
} | |||
} | |||
} |
@@ -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 Microsoft.Extensions.Logging; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Text; | |||
@@ -10,12 +11,24 @@ namespace JT808.DotNetty.Test | |||
{ | |||
public List<EmbeddedChannel> embeddedChannels = new List<EmbeddedChannel>(); | |||
public JT808SessionManager jT808SessionManager = new JT808SessionManager(new LoggerFactory()); | |||
public SeedSession() | |||
{ | |||
for (var i = 0; i < 10; i++) | |||
{ | |||
var channel = new EmbeddedChannel(new JT808DefaultChannelId()); | |||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, i.ToString())); | |||
} | |||
} | |||
[Fact] | |||
public void Init() | |||
{ | |||
for(var i = 0; i < 10; i++) | |||
for (var i = 0; i < 10; i++) | |||
{ | |||
embeddedChannels.Add(new EmbeddedChannel(new JT808DefaultChannelId())); | |||
var channel = new EmbeddedChannel(new JT808DefaultChannelId()); | |||
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, i.ToString())); | |||
} | |||
} | |||
} | |||
@@ -1,19 +1,41 @@ | |||
using JT808.DotNetty.Codecs; | |||
using JT808.DotNetty.Configurations; | |||
using JT808.DotNetty.Handlers; | |||
using JT808.DotNetty.Interfaces; | |||
using JT808.DotNetty.Internal; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.Extensions.DependencyInjection.Extensions; | |||
using Microsoft.Extensions.Hosting; | |||
using Microsoft.Extensions.Logging; | |||
using System; | |||
using System.Net; | |||
using Xunit; | |||
namespace JT808.DotNetty.Test | |||
{ | |||
public class TestBase | |||
public class TestBase:IDisposable | |||
{ | |||
private IServiceCollection serviceDescriptors; | |||
static TestBase() | |||
{ | |||
var serverHostBuilder = new HostBuilder() | |||
.ConfigureAppConfiguration((hostingContext, config) => | |||
{ | |||
config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory); | |||
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); | |||
}) | |||
.ConfigureServices((hostContext, services) => | |||
{ | |||
services.AddSingleton<ILoggerFactory, LoggerFactory>(); | |||
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); | |||
}) | |||
.UseJT808Host(); | |||
serverHostBuilder.RunConsoleAsync(); | |||
} | |||
public TestBase() | |||
public virtual void Dispose() | |||
{ | |||
serviceDescriptors = new ServiceCollection(); | |||
} | |||
} | |||
} |
@@ -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(); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
logger.LogDebug($"<<<{ channelId } Successful client connection to server."); | |||
jT808SessionManager.TryAddSession(new JT808Session(context.Channel)); | |||
base.ChannelActive(context); | |||
} | |||
@@ -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) | |||
@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Internal | |||
internal readonly Bootstrap bootstrap = new Bootstrap(); | |||
internal readonly ConcurrentDictionary<EndPoint, IChannel> channels = new ConcurrentDictionary<EndPoint, IChannel>(); | |||
private readonly ILogger<JT808SourcePackageDispatcherDefaultImpl> logger; | |||
IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor; | |||
private IOptionsMonitor<JT808Configuration> jT808ConfigurationOptionsMonitor; | |||
internal readonly ILoggerFactory loggerFactory; | |||
public JT808SourcePackageDispatcherDefaultImpl(ILoggerFactory loggerFactory, | |||
@@ -160,7 +160,7 @@ namespace JT808.DotNetty.Internal | |||
} | |||
catch (Exception ex) | |||
{ | |||
logger.LogError($"变更后链接远程服务端{item},重连异常:{ex}"); | |||
logger.LogError(ex,$"重连异常变更后链接远程服务端{item}"); | |||
} | |||
} | |||
} | |||
@@ -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) | |||
{ | |||
@@ -3,6 +3,18 @@ | |||
<PropertyGroup> | |||
<TargetFramework>netstandard2.0</TargetFramework> | |||
<LangVersion>latest</LangVersion> | |||
<Copyright>Copyright 2018.</Copyright> | |||
<Authors>SmallChi</Authors> | |||
<PackageId>JT808DotNetty</PackageId> | |||
<Product>JT808DotNetty</Product> | |||
<Description>基于DotNetty封装的JT808DotNetty专注消息业务处理</Description> | |||
<PackageReleaseNotes>基于DotNetty封装的JT808DotNetty专注消息业务处理</PackageReleaseNotes> | |||
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> | |||
<RepositoryUrl>https://github.com/SmallChi/JT808DotNetty</RepositoryUrl> | |||
<PackageProjectUrl>https://github.com/SmallChi/JT808DotNetty</PackageProjectUrl> | |||
<PackageLicenseUrl>https://github.com/SmallChi/JT808DotNetty/blob/master/LICENSE</PackageLicenseUrl> | |||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> | |||
<Version>1.0.0</Version> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
@@ -29,7 +29,7 @@ namespace JT808.DotNetty | |||
services.TryAddScoped<JT808ServerHandler>(); | |||
services.TryAddSingleton<IJT808SessionService, JT808SessionServiceDefaultImpl>(); | |||
services.TryAddSingleton<IJT808UnificationSendService, JT808UnificationSendServiceDefaultImpl>(); | |||
services.TryAddScoped<JT808WebAPIService>(); | |||
services.TryAddSingleton<JT808WebAPIService>(); | |||
services.TryAddScoped<JT808WebAPIServerHandler>(); | |||
services.AddHostedService<JT808ServerHost>(); | |||
services.AddHostedService<JT808WebAPIServerHost>(); | |||
@@ -29,6 +29,7 @@ namespace JT808.DotNetty | |||
private DispatcherEventLoopGroup bossGroup; | |||
private WorkerEventLoopGroup workerGroup; | |||
private IChannel bootstrapChannel; | |||
private IByteBufferAllocator serverBufferAllocator; | |||
public JT808ServerHost( | |||
IServiceProvider provider, | |||
@@ -44,6 +45,7 @@ namespace JT808.DotNetty | |||
{ | |||
bossGroup = new DispatcherEventLoopGroup(); | |||
workerGroup = new WorkerEventLoopGroup(bossGroup, configuration.EventLoopCount); | |||
serverBufferAllocator = new PooledByteBufferAllocator(); | |||
ServerBootstrap bootstrap = new ServerBootstrap(); | |||
bootstrap.Group(bossGroup, workerGroup); | |||
bootstrap.Channel<TcpServerChannel>(); | |||
@@ -56,6 +58,7 @@ namespace JT808.DotNetty | |||
} | |||
bootstrap | |||
.Option(ChannelOption.SoBacklog, configuration.SoBacklog) | |||
.ChildOption(ChannelOption.Allocator, serverBufferAllocator) | |||
.ChildHandler(new ActionChannelInitializer<IChannel>(channel => | |||
{ | |||
IChannelPipeline pipeline = channel.Pipeline; | |||
@@ -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) | |||
@@ -22,13 +22,17 @@ namespace JT808.DotNetty | |||
private IChannel clientChannel; | |||
private IByteBufferAllocator clientBufferAllocator; | |||
public JT808SimpleTcpClient(EndPoint remoteAddress) | |||
{ | |||
clientBufferAllocator = new PooledByteBufferAllocator(); | |||
clientGroup = new MultithreadEventLoopGroup(1); | |||
cb = new Bootstrap() | |||
.Group(clientGroup) | |||
.Channel<TcpSocketChannel>() | |||
.Option(ChannelOption.TcpNodelay, true) | |||
.Option(ChannelOption.Allocator, clientBufferAllocator) | |||
.Handler(new ActionChannelInitializer<TcpSocketChannel>(channel => | |||
{ | |||
channel.Pipeline.AddLast("jt808Buffer", new DelimiterBasedFrameDecoder(int.MaxValue, | |||
@@ -23,7 +23,7 @@ namespace JT808.DotNetty | |||
/// <summary> | |||
/// 初始化消息处理业务 | |||
/// </summary> | |||
protected JT808WebAPIService( | |||
public JT808WebAPIService( | |||
IJT808SessionService jT808SessionService, | |||
IJT808UnificationSendService jT808UnificationSendService) | |||
{ | |||
@@ -66,7 +66,7 @@ namespace JT808.DotNetty | |||
/// <returns></returns> | |||
public JT808HttpResponse GetRealLinkCount(JT808HttpRequest request) | |||
{ | |||
var result = jT808SessionService.GetRealAll(); | |||
var result = jT808SessionService.GetRealLinkCount(); | |||
return CreateJT808HttpResponse(result); | |||
} | |||