Przeglądaj źródła

1.修改会话管理,去掉通道Id,直接依赖设备终端号

2.去掉移除通道Id接口
3.修改计数器
tags/v1.0.0
SmallChi 6 lat temu
rodzic
commit
2044efa9c6
15 zmienionych plików z 84 dodań i 262 usunięć
  1. +1
    -29
      api/README.md
  2. +0
    -4
      src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs
  3. +9
    -12
      src/JT808.DotNetty.Test/JT808SessionManagerTest.cs
  4. +2
    -2
      src/JT808.DotNetty.Test/SeedSession.cs
  5. +4
    -4
      src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs
  6. +1
    -1
      src/JT808.DotNetty/Handlers/JT808ServerHandler.cs
  7. +1
    -1
      src/JT808.DotNetty/Handlers/JT808SourcePackageDispatcherHandler.cs
  8. +0
    -6
      src/JT808.DotNetty/Interfaces/IJT808SessionService.cs
  9. +5
    -31
      src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs
  10. +1
    -1
      src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs
  11. +0
    -16
      src/JT808.DotNetty/Internal/JT808WebAPIService.cs
  12. +3
    -6
      src/JT808.DotNetty/JT808MsgIdHandlerBase.cs
  13. +57
    -130
      src/JT808.DotNetty/JT808SessionManager.cs
  14. +0
    -8
      src/JT808.DotNetty/Metadata/JT808AtomicCounter.cs
  15. +0
    -11
      src/JT808.DotNetty/Metadata/JT808Session.cs

+ 1
- 29
api/README.md Wyświetl plik

@@ -110,35 +110,7 @@
} }
``` ```


#### 2.通过通道Id移除对应会话 #### 2.通过设备终端号移除对应会话

请求地址:Session/RemoveByChannelId

请求方式:POST

请求参数:

|属性|数据类型|参数说明|
|:------:|:------:|:------|
| channelId| string| 通道Id|

返回数据:

|属性|数据类型|参数说明|
|:------:|:------:|:------|
| Data| bool | 是否成功 |

返回结果:

``` session2
{
"Message":"",
"Code":200,
"Data":true
}
```

#### 3.通过设备终端号移除对应会话


请求地址:Session/RemoveByTerminalPhoneNo 请求地址:Session/RemoveByTerminalPhoneNo




+ 0
- 4
src/JT808.DotNetty.Test/Internal/JT808SessionServiceDefaultImplTest.cs Wyświetl plik

@@ -48,10 +48,6 @@ namespace JT808.DotNetty.Test.Internal
Thread.Sleep(1000); Thread.Sleep(1000);
var result = jT808SessionServiceDefaultImpl.GetAll(); var result = jT808SessionServiceDefaultImpl.GetAll();


var info5 = result.Data.FirstOrDefault(f => f.TerminalPhoneNo == "123456789005");

var remove5 = jT808SessionServiceDefaultImpl.RemoveByChannelId(info5.ChannelId);

var result1 = jT808SessionServiceDefaultImpl.GetAll(); var result1 = jT808SessionServiceDefaultImpl.GetAll();


Thread.Sleep(10000); Thread.Sleep(10000);


+ 9
- 12
src/JT808.DotNetty.Test/JT808SessionManagerTest.cs Wyświetl plik

@@ -15,17 +15,17 @@ namespace JT808.DotNetty.Test
public void Test3() public void Test3()
{ {
var channel = new EmbeddedChannel(); var channel = new EmbeddedChannel();
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); jT808SessionManager.TryAdd(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo=jT808SessionManager.GetSessionByTerminalPhoneNo(TerminalPhoneNo); var sessionInfo=jT808SessionManager.GetSession(TerminalPhoneNo);
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
Assert.Equal("embedded", sessionInfo.SessionID); Assert.Equal("123456789123", sessionInfo.TerminalPhoneNo);
} }


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


@@ -33,10 +33,9 @@ namespace JT808.DotNetty.Test
public void Test5() public void Test5()
{ {
var channel = new EmbeddedChannel(); var channel = new EmbeddedChannel();
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); jT808SessionManager.TryAdd(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo = jT808SessionManager.GetSessionByID("embedded"); var sessionInfo = jT808SessionManager.GetSession(TerminalPhoneNo);
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
Assert.Equal("embedded", sessionInfo.SessionID);
} }




@@ -44,10 +43,9 @@ namespace JT808.DotNetty.Test
public void Test6() public void Test6()
{ {
var channel = new EmbeddedChannel(); var channel = new EmbeddedChannel();
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, TerminalPhoneNo)); jT808SessionManager.TryAdd(new Metadata.JT808Session(channel, TerminalPhoneNo));
var sessionInfo = jT808SessionManager.RemoveSessionByID("embedded"); var sessionInfo = jT808SessionManager.RemoveSession(TerminalPhoneNo);
Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo); Assert.Equal(TerminalPhoneNo, sessionInfo.TerminalPhoneNo);
Assert.Equal("embedded", sessionInfo.SessionID);
} }




@@ -69,8 +67,7 @@ namespace JT808.DotNetty.Test
[Fact] [Fact]
public void Test9() public void Test9()
{ {
var realSessionCount = jT808SessionManager.RealSessionCount; var realSessionCount = jT808SessionManager.SessionCount;
var relevanceSessionCount = jT808SessionManager.RelevanceSessionCount;
} }
} }
} }

+ 2
- 2
src/JT808.DotNetty.Test/SeedSession.cs Wyświetl plik

@@ -18,7 +18,7 @@ namespace JT808.DotNetty.Test
for (var i = 0; i < 10; i++) for (var i = 0; i < 10; i++)
{ {
var channel = new EmbeddedChannel(new JT808DefaultChannelId()); var channel = new EmbeddedChannel(new JT808DefaultChannelId());
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, i.ToString())); jT808SessionManager.TryAdd(new Metadata.JT808Session(channel, i.ToString()));
} }
} }


@@ -28,7 +28,7 @@ namespace JT808.DotNetty.Test
for (var i = 0; i < 10; i++) for (var i = 0; i < 10; i++)
{ {
var channel = new EmbeddedChannel(new JT808DefaultChannelId()); var channel = new EmbeddedChannel(new JT808DefaultChannelId());
jT808SessionManager.TryAddOrUpdateSession(new Metadata.JT808Session(channel, i.ToString())); jT808SessionManager.TryAdd(new Metadata.JT808Session(channel, i.ToString()));
} }
} }
} }


+ 4
- 4
src/JT808.DotNetty/Handlers/JT808ConnectionHandler.cs Wyświetl plik

@@ -48,7 +48,7 @@ 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 } The client disconnects from the server."); logger.LogDebug($">>>{ channelId } The client disconnects from the server.");
jT808SessionManager.RemoveSessionByID(channelId); jT808SessionManager.RemoveSessionByChannel(context.Channel);
base.ChannelInactive(context); base.ChannelInactive(context);
} }


@@ -62,7 +62,7 @@ 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 } The server disconnects from the client."); logger.LogDebug($"<<<{ channelId } The server disconnects from the client.");
jT808SessionManager.RemoveSessionByID(channelId); jT808SessionManager.RemoveSessionByChannel(context.Channel);
return base.CloseAsync(context); return base.CloseAsync(context);
} }


@@ -83,7 +83,7 @@ namespace JT808.DotNetty.Handlers
string channelId = context.Channel.Id.AsShortText(); string channelId = context.Channel.Id.AsShortText();
logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}"); logger.LogInformation($"{idleStateEvent.State.ToString()}>>>{channelId}");
// 由于808是设备发心跳,如果很久没有上报数据,那么就由服务器主动关闭连接。 // 由于808是设备发心跳,如果很久没有上报数据,那么就由服务器主动关闭连接。
jT808SessionManager.RemoveSessionByID(channelId); jT808SessionManager.RemoveSessionByChannel(context.Channel);
context.CloseAsync(); context.CloseAsync();
} }
// 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括: // 按照808的消息,有些请求必须要应答,但是转发可以不需要有应答可以节省部分资源包括:
@@ -99,7 +99,7 @@ namespace JT808.DotNetty.Handlers
{ {
string channelId = context.Channel.Id.AsShortText(); string channelId = context.Channel.Id.AsShortText();
logger.LogError(exception,$"{channelId} {exception.Message}" ); logger.LogError(exception,$"{channelId} {exception.Message}" );
jT808SessionManager.RemoveSessionByID(channelId); jT808SessionManager.RemoveSessionByChannel(context.Channel);
context.CloseAsync(); context.CloseAsync();
} }
} }


+ 1
- 1
src/JT808.DotNetty/Handlers/JT808ServerHandler.cs Wyświetl plik

@@ -59,7 +59,7 @@ namespace JT808.DotNetty.Handlers
{ {
logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString());
} }
jT808SessionManager.TryAddOrUpdateSession(new JT808Session(ctx.Channel, jT808Package.Header.TerminalPhoneNo)); jT808SessionManager.TryAdd(new JT808Session(ctx.Channel, jT808Package.Header.TerminalPhoneNo));
Func<JT808Request, JT808Response> handlerFunc; Func<JT808Request, JT808Response> handlerFunc;
if (handler.HandlerDict.TryGetValue(jT808Package.Header.MsgId, out handlerFunc)) if (handler.HandlerDict.TryGetValue(jT808Package.Header.MsgId, out handlerFunc))
{ {


+ 1
- 1
src/JT808.DotNetty/Handlers/JT808SourcePackageDispatcherHandler.cs Wyświetl plik

@@ -58,7 +58,7 @@ namespace JT808.DotNetty.Handlers
public override void ChannelRead(IChannelHandlerContext context, object message) public override void ChannelRead(IChannelHandlerContext context, object message)
{ {
if(logger.IsEnabled(LogLevel.Debug)) if(logger.IsEnabled(LogLevel.Debug))
logger.LogError($"The server returns a message {message.ToString()}"); logger.LogDebug($"The server returns a message {message.ToString()}");
} }


public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)


+ 0
- 6
src/JT808.DotNetty/Interfaces/IJT808SessionService.cs Wyświetl plik

@@ -16,12 +16,6 @@ namespace JT808.DotNetty.Interfaces
/// <returns></returns> /// <returns></returns>
JT808ResultDto<List<JT808SessionInfoDto>> GetAll(); JT808ResultDto<List<JT808SessionInfoDto>> GetAll();
/// <summary> /// <summary>
/// 通过通道Id移除对应会话
/// </summary>
/// <param name="channelId"></param>
/// <returns></returns>
JT808ResultDto<bool> RemoveByChannelId(string channelId);
/// <summary>
/// 通过设备终端号移除对应会话 /// 通过设备终端号移除对应会话
/// </summary> /// </summary>
/// <param name="terminalPhoneNo"></param> /// <param name="terminalPhoneNo"></param>


+ 5
- 31
src/JT808.DotNetty/Internal/JT808SessionServiceDefaultImpl.cs Wyświetl plik

@@ -27,7 +27,6 @@ namespace JT808.DotNetty.Internal
{ {
resultDto.Data = jT808SessionManager.GetAll().Select(s => new JT808SessionInfoDto resultDto.Data = jT808SessionManager.GetAll().Select(s => new JT808SessionInfoDto
{ {
ChannelId = s.SessionID,
LastActiveTime = s.LastActiveTime, LastActiveTime = s.LastActiveTime,
StartTime = s.StartTime, StartTime = s.StartTime,
TerminalPhoneNo = s.TerminalPhoneNo, TerminalPhoneNo = s.TerminalPhoneNo,
@@ -44,43 +43,18 @@ namespace JT808.DotNetty.Internal
return resultDto; return resultDto;
} }


public JT808ResultDto<bool> RemoveByChannelId(string channelId)
{
JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>();
try
{
var session = jT808SessionManager.RemoveSessionByID(channelId);
if (session != null)
{
session.Channel.CloseAsync();
}
resultDto.Code = JT808ResultCode.Ok;
resultDto.Data = true;
}
catch (AggregateException ex)
{
resultDto.Data = false;
resultDto.Code = JT808ResultCode.Error;
resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex);
}
catch (Exception ex)
{
resultDto.Data = false;
resultDto.Code = JT808ResultCode.Error;
resultDto.Message = Newtonsoft.Json.JsonConvert.SerializeObject(ex);
}
return resultDto;
}

public JT808ResultDto<bool> RemoveByTerminalPhoneNo(string terminalPhoneNo) public JT808ResultDto<bool> RemoveByTerminalPhoneNo(string terminalPhoneNo)
{ {
JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>(); JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>();
try try
{ {
var session = jT808SessionManager.RemoveSessionByTerminalPhoneNo(terminalPhoneNo); var session = jT808SessionManager.RemoveSession(terminalPhoneNo);
if (session != null) if (session != null)
{ {
session.Channel.CloseAsync(); if(session.Channel.Open)
{
session.Channel.CloseAsync();
}
} }
resultDto.Code = JT808ResultCode.Ok; resultDto.Code = JT808ResultCode.Ok;
resultDto.Data = true; resultDto.Data = true;


+ 1
- 1
src/JT808.DotNetty/Internal/JT808UnificationSendServiceDefaultImpl.cs Wyświetl plik

@@ -21,7 +21,7 @@ namespace JT808.DotNetty.Internal
JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>(); JT808ResultDto<bool> resultDto = new JT808ResultDto<bool>();
try try
{ {
var session = jT808SessionManager.GetSessionByTerminalPhoneNo(terminalPhoneNo); var session = jT808SessionManager.GetSession(terminalPhoneNo);
if (session != null) if (session != null)
{ {
if (session.Channel.Open) if (session.Channel.Open)


+ 0
- 16
src/JT808.DotNetty/Internal/JT808WebAPIService.cs Wyświetl plik

@@ -52,7 +52,6 @@ namespace JT808.DotNetty.Internal
{ {
{$"{RouteTablePrefix}/UnificationSend", UnificationSend}, {$"{RouteTablePrefix}/UnificationSend", UnificationSend},
{$"{RouteTablePrefix}/{sessionRoutePrefix}/GetAll", GetSessionAll}, {$"{RouteTablePrefix}/{sessionRoutePrefix}/GetAll", GetSessionAll},
{$"{RouteTablePrefix}/{sessionRoutePrefix}/RemoveByChannelId", RemoveByChannelId},
{$"{RouteTablePrefix}/{sessionRoutePrefix}/RemoveByTerminalPhoneNo", RemoveByTerminalPhoneNo}, {$"{RouteTablePrefix}/{sessionRoutePrefix}/RemoveByTerminalPhoneNo", RemoveByTerminalPhoneNo},
{$"{RouteTablePrefix}/GetAtomicCounter", GetAtomicCounter}, {$"{RouteTablePrefix}/GetAtomicCounter", GetAtomicCounter},
{$"{RouteTablePrefix}/{sourcePackagePrefix}/Add", AddSourcePackageAddress}, {$"{RouteTablePrefix}/{sourcePackagePrefix}/Add", AddSourcePackageAddress},
@@ -91,21 +90,6 @@ namespace JT808.DotNetty.Internal
return CreateJT808HttpResponse(result); return CreateJT808HttpResponse(result);
} }


/// <summary>
/// 会话服务-通过通道Id移除对应会话
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public JT808HttpResponse RemoveByChannelId(JT808HttpRequest request)
{
if (string.IsNullOrEmpty(request.Json))
{
return EmptyHttpResponse();
}
var result = jT808SessionService.RemoveByChannelId(request.Json);
return CreateJT808HttpResponse(result);
}

/// <summary> /// <summary>
/// 会话服务-通过设备终端号移除对应会话 /// 会话服务-通过设备终端号移除对应会话
/// </summary> /// </summary>


+ 3
- 6
src/JT808.DotNetty/JT808MsgIdHandlerBase.cs Wyświetl plik

@@ -42,18 +42,15 @@ namespace JT808.DotNetty
public Dictionary<ushort, Func<JT808Request, JT808Response>> HandlerDict { get; protected set; } public Dictionary<ushort, Func<JT808Request, JT808Response>> HandlerDict { get; protected set; }
/// <summary> /// <summary>
/// 终端通用应答 /// 终端通用应答
/// 平台无需回复
/// 实现自己的业务
/// </summary> /// </summary>
/// <param name="reqJT808Package"></param> /// <param name="reqJT808Package"></param>
/// <param name="ctx"></param> /// <param name="ctx"></param>
/// <returns></returns> /// <returns></returns>
public virtual JT808Response Msg0x0001(JT808Request request) public virtual JT808Response Msg0x0001(JT808Request request)
{ {
return new JT808Response(JT808MsgId.平台通用应答.Create(request.Package.Header.TerminalPhoneNo, new JT808_0x8001() return null;
{
MsgId = request.Package.Header.MsgId,
JT808PlatformResult = JT808PlatformResult.成功,
MsgNum = request.Package.Header.MsgNum
}));
} }
/// <summary> /// <summary>
/// 终端心跳 /// 终端心跳


+ 57
- 130
src/JT808.DotNetty/JT808SessionManager.cs Wyświetl plik

@@ -4,6 +4,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using JT808.DotNetty.Metadata; using JT808.DotNetty.Metadata;
using DotNetty.Transport.Channels;


namespace JT808.DotNetty namespace JT808.DotNetty
{ {
@@ -20,23 +21,9 @@ namespace JT808.DotNetty
logger = loggerFactory.CreateLogger<JT808SessionManager>(); logger = loggerFactory.CreateLogger<JT808SessionManager>();
} }


/// <summary>
/// Netty生成的sessionID和Session的对应关系
/// key = seession id
/// value = Session
/// </summary>
private ConcurrentDictionary<string, JT808Session> SessionIdDict = new ConcurrentDictionary<string, JT808Session>(StringComparer.OrdinalIgnoreCase); private ConcurrentDictionary<string, JT808Session> SessionIdDict = new ConcurrentDictionary<string, JT808Session>(StringComparer.OrdinalIgnoreCase);
/// <summary>
/// 终端手机号和netty生成的sessionID的对应关系
/// key = 终端手机号
/// value = seession id
/// </summary>
private ConcurrentDictionary<string, string> TerminalPhoneNo_SessionId_Dict = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);


/// <summary> public int SessionCount
/// 获取实际连接数
/// </summary>
public int RealSessionCount
{ {
get get
{ {
@@ -44,166 +31,106 @@ namespace JT808.DotNetty
} }
} }


/// <summary> public JT808Session GetSession(string terminalPhoneNo)
/// 获取设备相关连的连接数
/// </summary>
public int RelevanceSessionCount
{ {
get if (string.IsNullOrEmpty(terminalPhoneNo))
{
return TerminalPhoneNo_SessionId_Dict.Count;
}
}

public JT808Session GetSessionByID(string sessionID)
{
if (string.IsNullOrEmpty(sessionID))
return default; return default;
JT808Session targetSession; if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808Session targetSession))
SessionIdDict.TryGetValue(sessionID, out targetSession);
return targetSession;
}

public JT808Session GetSessionByTerminalPhoneNo(string terminalPhoneNo)
{
try
{ {
if (string.IsNullOrEmpty(terminalPhoneNo)) return targetSession;
return default;
if (TerminalPhoneNo_SessionId_Dict.TryGetValue(terminalPhoneNo, out string sessionId))
{
if (SessionIdDict.TryGetValue(sessionId, out JT808Session targetSession))
{
return targetSession;
}
else
{
return default;
}
}
else
{
return default;
}
} }
catch (Exception ex) else
{ {
logger.LogError(ex, terminalPhoneNo);
return default; return default;
} }
} }


public void Heartbeat(string terminalPhoneNo) public void Heartbeat(string terminalPhoneNo)
{ {
try if (string.IsNullOrEmpty(terminalPhoneNo)) return;
if (SessionIdDict.TryGetValue(terminalPhoneNo, out JT808Session oldjT808Session))
{ {
if (TerminalPhoneNo_SessionId_Dict.TryGetValue(terminalPhoneNo, out string sessionId)) oldjT808Session.LastActiveTime = DateTime.Now;
{ SessionIdDict.TryUpdate(terminalPhoneNo, oldjT808Session, oldjT808Session);
if (SessionIdDict.TryGetValue(sessionId, out JT808Session oldjT808Session))
{
if (oldjT808Session.Channel.Active)
{
oldjT808Session.LastActiveTime = DateTime.Now;
if (SessionIdDict.TryUpdate(sessionId, oldjT808Session, oldjT808Session))
{

}
}
}
}
}
catch (Exception ex)
{
logger.LogError(ex, terminalPhoneNo);
} }
} }


public void TryAddOrUpdateSession(JT808Session appSession) public void TryAdd(JT808Session appSession)
{ {
SessionIdDict.TryAdd(appSession.SessionID, appSession); // 解决了设备号跟通道绑定到一起,不需要用到通道本身的SessionId
if(TerminalPhoneNo_SessionId_Dict.TryAdd(appSession.TerminalPhoneNo, appSession.SessionID)) // 不管设备下发更改了设备终端号,只要是没有在内存中就当是新的
// todo:
// 存在的问题:
// 1.原先老的如何销毁
// 2.这时候用的通道是相同的,设备终端是不同的
if (SessionIdDict.TryAdd(appSession.TerminalPhoneNo, appSession))
{ {
//使用场景: //使用场景:
//部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接, //部标的超长待机设备,不会像正常的设备一样一直连着,可能10几分钟连上了,然后发完就关闭连接,
//这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。 //这时候想下发数据需要知道设备什么时候上线,在这边做通知最好不过了。
//todo: 有设备关联上来可以进行通知 //todo: 有设备关联上来可以进行通知
//todo: 使用Redis发布订阅 //todo: 使用Redis发布订阅
//todo: 平台更改设备号的时候,这时候通道和设备号是绑定在一起的,那么要是同样的通道上来,是关联不到新的设备,需要考虑 //todo: 平台下发更改设备号的时候,这时候通道和设备号是绑定在一起的,那么要是同样的通道上来,是关联不到新的设备,需要考虑
} }
} }


public JT808Session RemoveSessionByID(string sessionID) public JT808Session RemoveSession(string terminalPhoneNo)
{ {
if (sessionID == null) return null; //todo: 设备离线可以进行通知
try //todo: 使用Redis 发布订阅
if (string.IsNullOrEmpty(terminalPhoneNo)) return default;
if (!SessionIdDict.TryGetValue(terminalPhoneNo, out JT808Session jT808Session))
{ {
if (SessionIdDict.TryRemove(sessionID, out JT808Session session)) return default;
}
// 处理转发过来的是数据 这时候通道对设备是1对多关系,需要清理垃圾数据
//1.用当前会话的通道Id找出通过转发过来的其他设备的终端号
var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == jT808Session.Channel.Id).Select(s => s.Key).ToList();
//2.存在则一个个移除
if (terminalPhoneNos.Count > 1)
{
//3.移除包括当前的设备号
foreach (var key in terminalPhoneNos)
{ {
// 处理转发过来的是数据 这时候通道对设备是1对多关系 SessionIdDict.TryRemove(key, out JT808Session jT808SessionRemove);
var removeKeys = TerminalPhoneNo_SessionId_Dict.Where(s => s.Value == sessionID).Select(s => s.Key).ToList();
foreach(var key in removeKeys)
{
TerminalPhoneNo_SessionId_Dict.TryRemove(key, out string sessionid);
}
//todo: 设备离线可以进行通知
//todo: 使用Redis 发布订阅

logger.LogInformation($">>>{sessionID}-{string.Join(",",removeKeys)} Session Remove.");
return session;
} }
return null; logger.LogInformation($">>>{terminalPhoneNo}-{string.Join(",", terminalPhoneNos)} 1-n Session Remove.");
return jT808Session;
} }
catch (Exception ex) else
{ {
logger.LogError(ex, $">>>{sessionID} Session Remove Exception"); if (SessionIdDict.TryRemove(terminalPhoneNo, out JT808Session jT808SessionRemove))
{
logger.LogInformation($">>>{terminalPhoneNo} Session Remove.");
return jT808SessionRemove;
}
else
{
return default;
}
} }
return null;
} }


public JT808Session RemoveSessionByTerminalPhoneNo(string terminalPhoneNo) internal void RemoveSessionByChannel(IChannel channel)
{ {
if (terminalPhoneNo == null) return null; //todo: 设备离线可以进行通知
try //todo: 使用Redis 发布订阅
{ var terminalPhoneNos = SessionIdDict.Where(w => w.Value.Channel.Id == channel.Id).Select(s => s.Key).ToList();
if (TerminalPhoneNo_SessionId_Dict.TryRemove(terminalPhoneNo, out string sessionid)) foreach (var key in terminalPhoneNos)
{
// 处理转发过来的是数据 这时候通道对设备是1对多关系
var removeKeys = TerminalPhoneNo_SessionId_Dict.Where(w => w.Value == sessionid).Select(s=>s.Key).ToList();
if (removeKeys.Count > 0)
{
foreach (var key in removeKeys)
{
TerminalPhoneNo_SessionId_Dict.TryRemove(key, out string sessionid1);
}
logger.LogInformation($">>>{sessionid}-{string.Join(",", removeKeys)} 1-n Session Remove.");
}
if (SessionIdDict.TryRemove(sessionid, out JT808Session session))
{
logger.LogInformation($">>>{sessionid}-{session.TerminalPhoneNo} 1-1 Session Remove.");
return session;
}
else
{
return null;
}
}
}
catch (Exception ex)
{ {
logger.LogError(ex, $">>>{terminalPhoneNo} Session Remove Exception"); SessionIdDict.TryRemove(key, out JT808Session jT808SessionRemove);
} }
return null; logger.LogInformation($">>>{string.Join(",", terminalPhoneNos)} Channel Remove.");
} }


public IEnumerable<JT808Session> GetAll() public IEnumerable<JT808Session> GetAll()
{ {
return TerminalPhoneNo_SessionId_Dict.Join(SessionIdDict, m => m.Value, s => s.Key, (m, s) => new JT808Session return SessionIdDict.Select(s => new JT808Session
{ {
Channel= s.Value.Channel, Channel= s.Value.Channel,
LastActiveTime= s.Value.LastActiveTime, LastActiveTime= s.Value.LastActiveTime,
SessionID= s.Value.SessionID,
StartTime= s.Value.StartTime, StartTime= s.Value.StartTime,
TerminalPhoneNo= m.Key TerminalPhoneNo= s.Key
}).ToList(); }).ToList();
} }
} }


+ 0
- 8
src/JT808.DotNetty/Metadata/JT808AtomicCounter.cs Wyświetl plik

@@ -20,19 +20,11 @@ namespace JT808.DotNetty.Metadata


public long Increment() public long Increment()
{ {
if (counter < 0)
{
Interlocked.Exchange(ref counter,0);
}
return Interlocked.Increment(ref counter); return Interlocked.Increment(ref counter);
} }


public long Add(long len) public long Add(long len)
{ {
if (counter < 0)
{
Interlocked.Exchange(ref counter, 0);
}
return Interlocked.Add(ref counter,len); return Interlocked.Add(ref counter,len);
} }




+ 0
- 11
src/JT808.DotNetty/Metadata/JT808Session.cs Wyświetl plik

@@ -13,15 +13,6 @@ namespace JT808.DotNetty.Metadata
TerminalPhoneNo = terminalPhoneNo; TerminalPhoneNo = terminalPhoneNo;
StartTime = DateTime.Now; StartTime = DateTime.Now;
LastActiveTime = DateTime.Now; LastActiveTime = DateTime.Now;
SessionID = Channel.Id.AsShortText();
}

public JT808Session(IChannel channel)
{
Channel = channel;
StartTime = DateTime.Now;
LastActiveTime = DateTime.Now;
SessionID = Channel.Id.AsShortText();
} }


public JT808Session() { } public JT808Session() { }
@@ -31,8 +22,6 @@ namespace JT808.DotNetty.Metadata
/// </summary> /// </summary>
public string TerminalPhoneNo { get; set; } public string TerminalPhoneNo { get; set; }


public string SessionID { get; set; }

public IChannel Channel { get; set; } public IChannel Channel { get; set; }


public DateTime LastActiveTime { get; set; } public DateTime LastActiveTime { get; set; }


||||||
x
 
000:0
Ładowanie…
Anuluj
Zapisz