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; namespace JiShe.CollectBus.Core.Plugins { public partial class TcpServiceReceivedPlugin : PluginBase { private readonly INSender _nSender; private readonly ILogger _logger; public TcpServiceReceivedPlugin(INSender nSender, ILogger logger) { _nSender = nSender; _logger = logger; } [GeneratorPlugin(typeof(ITcpReceivedPlugin))] public async Task OnTcpReceived(ITcpSessionClient client, ReceivedDataEventArgs e) { ////TODO: 电表主站到集中器的协议都是376.1协议,集中器下发到电表协议分为645-07和modbus ////TODO: 水表主站到集中器的协议分为118和645-97协议 ////TODO: 连接成功时获取档案信息,根据档案信息匹配协议正则获取协议服务进行监听发送 //const string protocolType = "StandardProtocol"; //var protocolPlugin = _serviceProvider.GetKeyedService(protocolType); //var protocolPluginInfo = await protocolPlugin.GetAsync(); //client.Logger.Info($"{protocolPluginInfo.Name},{protocolPluginInfo.RegularExpression}"); ////从客户端收到信息 //var messageHexString = Convert.ToHexString(e.ByteBlock.Span); //client.Logger.Info($"[TCP] 已从{client.GetIPPort()}接收到信息:{messageHexString}"); //await protocolPlugin.ReceivedAsync(client,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); if (aFn.HasValue && fn.HasValue) { if ((AFN)aFn == AFN.链路接口检测) { switch (fn) { case 1://登录 await _nSender.SendToReceivedLoginAsync(new MessageReceivedLoginEvent(client.Id,client.IP, client.Port, messageHexString,"")); break; case 2://退出登录 await _nSender.SendToReceivedLoginAsync(new MessageReceivedLoginEvent(client.Id, client.IP, client.Port, messageHexString, "")); break; case 3://心跳 await _nSender.SendToReceivedHeartbeatAsync(new MessageReceivedHeartbeatEvent(client.Id, client.IP, client.Port, messageHexString, "")); break; } } else { await _nSender.SendToReceivedAsync(new MessageReceivedEvent(client.Id, client.IP, client.Port, messageHexString, "")); } } 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(); } } }