137 lines
5.9 KiB
C#
Raw Normal View History

2024-10-29 16:28:14 +08:00
using JiShe.CollectBus.Common.Enums;
using JiShe.CollectBus.Common.Extensions;
using JiShe.CollectBus.Protocol.Contracts.Models;
2024-09-30 17:10:43 +08:00
using TouchSocket.Core;
using TouchSocket.Sockets;
2024-10-28 16:23:39 +08:00
using JiShe.CollectBus.RabbitMQ.Senders;
2024-10-29 16:28:14 +08:00
using Microsoft.Extensions.Logging;
2024-10-30 17:49:05 +08:00
using JiShe.CollectBus.MongoDB;
2024-11-08 13:50:47 +08:00
using MassTransit;
2024-09-30 17:10:43 +08:00
namespace JiShe.CollectBus.Core.Plugins
{
2024-10-30 18:01:33 +08:00
public partial class TcpServicePlugin : PluginBase
2024-09-30 17:10:43 +08:00
{
2024-10-28 16:23:39 +08:00
private readonly INSender _nSender;
2024-10-30 18:01:33 +08:00
private readonly ILogger<TcpServicePlugin> _logger;
2024-10-30 17:49:05 +08:00
public readonly IMongoRepository<MessageReceivedHeartbeatEvent> _mongoHeartbeatRepository;
public readonly IMongoRepository<MessageReceivedLoginEvent> _mongoLoginRepository;
2024-10-26 22:27:19 +08:00
2024-10-29 16:28:14 +08:00
2024-10-30 18:01:33 +08:00
public TcpServicePlugin(INSender nSender, ILogger<TcpServicePlugin> logger,IMongoRepository<MessageReceivedHeartbeatEvent> mongoHeartbeatRepository, IMongoRepository<MessageReceivedLoginEvent> mongoLoginRepository)
2024-10-26 22:27:19 +08:00
{
2024-10-28 16:23:39 +08:00
_nSender = nSender;
2024-10-29 16:28:14 +08:00
_logger = logger;
2024-10-30 17:49:05 +08:00
_mongoHeartbeatRepository = mongoHeartbeatRepository;
_mongoLoginRepository = mongoLoginRepository;
2024-10-26 22:27:19 +08:00
}
2024-10-28 16:23:39 +08:00
2024-10-22 20:57:26 +08:00
[GeneratorPlugin(typeof(ITcpReceivedPlugin))]
public async Task OnTcpReceived(ITcpSessionClient client, ReceivedDataEventArgs e)
2024-09-30 17:10:43 +08:00
{
2024-10-29 16:28:14 +08:00
var messageHexString = Convert.ToHexString(e.ByteBlock.Span);
var hexStringList = messageHexString.StringToPairs();
var aFn = (int?)hexStringList.GetAnalyzeValue(CommandChunkEnum.AFN);
var fn = (int?)hexStringList.GetAnalyzeValue(CommandChunkEnum.FN);
2024-10-30 17:49:05 +08:00
var aTuple = (Tuple<string, int>)hexStringList.GetAnalyzeValue(CommandChunkEnum.A);
2024-10-29 16:28:14 +08:00
if (aFn.HasValue && fn.HasValue)
2024-10-25 19:11:43 +08:00
{
2024-10-29 16:28:14 +08:00
if ((AFN)aFn == AFN.)
{
switch (fn)
{
case 1://登录
2024-10-30 17:49:05 +08:00
var messageReceivedLoginEvent = new MessageReceivedLoginEvent
{
ClientId = client.Id,
ClientIp = client.IP,
ClientPort = client.Port,
MessageHexString = messageHexString,
ReceivedTime = DateTime.Now,
DeviceNo = aTuple.Item1,
2024-11-08 13:50:47 +08:00
MessageId = NewId.NextGuid().ToString()
2024-10-30 17:49:05 +08:00
};
await _mongoLoginRepository.AddAsync(messageReceivedLoginEvent);
await _nSender.SendToReceivedLoginAsync(messageReceivedLoginEvent);
2024-10-29 16:28:14 +08:00
break;
case 2://退出登录
2024-10-30 17:49:05 +08:00
var messageReceivedExitLoginEvent = new MessageReceivedLoginEvent
{
ClientId = client.Id,
ClientIp = client.IP,
ClientPort = client.Port,
MessageHexString = messageHexString,
ReceivedTime = DateTime.Now,
DeviceNo = aTuple.Item1,
2024-11-08 13:50:47 +08:00
MessageId = NewId.NextGuid().ToString()
2024-10-30 17:49:05 +08:00
};
await _mongoLoginRepository.AddAsync(messageReceivedExitLoginEvent);
await _nSender.SendToReceivedLoginAsync(messageReceivedExitLoginEvent);
2024-10-29 16:28:14 +08:00
break;
case 3://心跳
2024-10-30 17:49:05 +08:00
var messageReceivedHeartbeatEvent = new MessageReceivedHeartbeatEvent
{
ClientId = client.Id,
ClientIp = client.IP,
ClientPort = client.Port,
MessageHexString = messageHexString,
ReceivedTime = DateTime.Now,
DeviceNo = aTuple.Item1,
2024-11-08 13:50:47 +08:00
MessageId = NewId.NextGuid().ToString()
2024-10-30 17:49:05 +08:00
};
await _mongoHeartbeatRepository.AddAsync(messageReceivedHeartbeatEvent);
await _nSender.SendToReceivedHeartbeatAsync(messageReceivedHeartbeatEvent);
2024-10-29 16:28:14 +08:00
break;
}
}
else
{
2024-10-30 17:49:05 +08:00
await _nSender.SendToReceivedAsync(new MessageReceivedEvent
{
ClientId = client.Id,
ClientIp = client.IP,
ClientPort = client.Port,
MessageHexString = messageHexString,
DeviceNo = aTuple.Item1,
2024-11-08 13:50:47 +08:00
MessageId = NewId.NextGuid().ToString()
2024-10-30 17:49:05 +08:00
});
2024-10-29 16:28:14 +08:00
}
}
else
{
_logger.LogError($"指令初步解析失败,指令内容:{messageHexString}");
}
2024-09-30 17:10:43 +08:00
await e.InvokeNext();
}
2024-10-22 20:57:26 +08:00
[GeneratorPlugin(typeof(ITcpConnectingPlugin))]
2024-10-29 16:28:14 +08:00
public async Task OnTcpConnecting(ITcpSessionClient client,ConnectingEventArgs e)
2024-09-30 17:10:43 +08:00
{
2024-10-29 16:28:14 +08:00
_logger.LogInformation($"[TCP] ID:{client.Id} IP:{client.GetIPPort()}正在连接中...");
2024-09-30 17:10:43 +08:00
await e.InvokeNext();
}
2024-10-22 20:57:26 +08:00
[GeneratorPlugin(typeof(ITcpConnectedPlugin))]
2024-10-29 16:28:14 +08:00
public async Task OnTcpConnected(ITcpSessionClient client,ConnectedEventArgs e)
2024-09-30 17:10:43 +08:00
{
2024-10-29 16:28:14 +08:00
_logger.LogInformation($"[TCP] ID:{client.Id} IP:{client.GetIPPort()}已连接");
2024-09-30 17:10:43 +08:00
await e.InvokeNext();
}
2024-10-22 20:57:26 +08:00
[GeneratorPlugin(typeof(ITcpClosedPlugin))]
public async Task OnTcpClosed(ITcpSessionClient client, ClosedEventArgs e)
2024-09-30 17:10:43 +08:00
{
2024-10-29 16:28:14 +08:00
_logger.LogInformation($"[TCP] ID:{client.Id} IP:{client.GetIPPort()}已关闭连接");
2024-09-30 17:10:43 +08:00
await e.InvokeNext();
}
}
}