using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.Protocol.Contracts.Models; using TouchSocket.Core; using TouchSocket.Sockets; using JiShe.CollectBus.RabbitMQ.Senders; using Microsoft.Extensions.Logging; using JiShe.CollectBus.MongoDB; using MassTransit; namespace JiShe.CollectBus.Core.Plugins { public partial class TcpServicePlugin : PluginBase { private readonly INSender _nSender; private readonly ILogger _logger; public readonly IMongoRepository _mongoHeartbeatRepository; public readonly IMongoRepository _mongoLoginRepository; public readonly IServiceProvider _serviceProvider; public TcpServicePlugin(INSender nSender, ILogger logger,IMongoRepository mongoHeartbeatRepository, IMongoRepository mongoLoginRepository, IServiceProvider serviceProvider) { _nSender = nSender; _logger = logger; _mongoHeartbeatRepository = mongoHeartbeatRepository; _mongoLoginRepository = mongoLoginRepository; _serviceProvider = serviceProvider; } [GeneratorPlugin(typeof(ITcpReceivedPlugin))] public async Task OnTcpReceived(ITcpSessionClient client, ReceivedDataEventArgs e) { 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); var aTuple = (Tuple)hexStringList.GetAnalyzeValue(CommandChunkEnum.A); if (aFn.HasValue && fn.HasValue) { if ((AFN)aFn == AFN.链路接口检测) { switch (fn) { case 1://登录 var messageReceivedLoginEvent = new MessageReceivedLoginEvent { ClientId = client.Id, ClientIp = client.IP, ClientPort = client.Port, MessageHexString = messageHexString, ReceivedTime = DateTime.Now, DeviceNo = aTuple.Item1, MessageId = NewId.NextGuid().ToString() }; await _mongoLoginRepository.AddAsync(messageReceivedLoginEvent); await _nSender.SendToReceivedLoginAsync(messageReceivedLoginEvent); break; case 2://退出登录 var messageReceivedExitLoginEvent = new MessageReceivedLoginEvent { ClientId = client.Id, ClientIp = client.IP, ClientPort = client.Port, MessageHexString = messageHexString, ReceivedTime = DateTime.Now, DeviceNo = aTuple.Item1, MessageId = NewId.NextGuid().ToString() }; await _mongoLoginRepository.AddAsync(messageReceivedExitLoginEvent); await _nSender.SendToReceivedLoginAsync(messageReceivedExitLoginEvent); break; case 3://心跳 var messageReceivedHeartbeatEvent = new MessageReceivedHeartbeatEvent { ClientId = client.Id, ClientIp = client.IP, ClientPort = client.Port, MessageHexString = messageHexString, ReceivedTime = DateTime.Now, DeviceNo = aTuple.Item1, MessageId = NewId.NextGuid().ToString() }; await _mongoHeartbeatRepository.AddAsync(messageReceivedHeartbeatEvent); await _nSender.SendToReceivedHeartbeatAsync(messageReceivedHeartbeatEvent); break; } } else { await _nSender.SendToReceivedAsync(new MessageReceivedEvent { ClientId = client.Id, ClientIp = client.IP, ClientPort = client.Port, MessageHexString = messageHexString, DeviceNo = aTuple.Item1, MessageId = NewId.NextGuid().ToString() }); } } else { _logger.LogError($"指令初步解析失败,指令内容:{messageHexString}"); } await e.InvokeNext(); } [GeneratorPlugin(typeof(ITcpConnectingPlugin))] public async Task OnTcpConnecting(ITcpSessionClient client,ConnectingEventArgs e) { _logger.LogInformation($"[TCP] ID:{client.Id} IP:{client.GetIPPort()}正在连接中..."); await e.InvokeNext(); } [GeneratorPlugin(typeof(ITcpConnectedPlugin))] public async Task OnTcpConnected(ITcpSessionClient client,ConnectedEventArgs e) { _logger.LogInformation($"[TCP] ID:{client.Id} IP:{client.GetIPPort()}已连接"); await e.InvokeNext(); } [GeneratorPlugin(typeof(ITcpClosedPlugin))] public async Task OnTcpClosed(ITcpSessionClient client, ClosedEventArgs e) { _logger.LogInformation($"[TCP] ID:{client.Id} IP:{client.GetIPPort()}已关闭连接"); await e.InvokeNext(); } } }