#region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2025 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:Mr.Wen's MacBook Pro * 命名空间:Sln.Iot.Socket * 唯一标识:6D821766-EAFA-4C51-A757-8786E77645AC * * 创建者:WenJY * 电子邮箱: * 创建时间:2025-04-11 13:51:11 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using System; using System.Text; using Sln.Iot.Common; using Sln.Iot.Serilog; using Sln.Iot.Socket.Adapter; using TouchSocket.Core; using TouchSocket.Sockets; namespace Sln.Iot.Socket { public class TcpServer { private readonly SerilogHelper _logger; private readonly TcpService _service; private readonly StringChange _stringChange; public TcpServer(SerilogHelper logger, TcpService service, StringChange stringChange) { _logger = logger; _service = service; _stringChange = stringChange; } /// /// 接收客户端指令委托 /// public delegate void ReceivedClientBuffer(byte[] buffer); public event ReceivedClientBuffer? ReceivedClientBufferEvent; public delegate void RefreshClientInfo(TcpService tcpService); public event RefreshClientInfo? RefreshClientInfoEvent; [Obsolete("Obsolete")] public delegate void ReceivedBufferRequestInfo(SocketClient client,BufferRequestInfo requestInfo); public event ReceivedBufferRequestInfo ReceivedBufferRequestInfoEvent; public void Init(int serverPort) { try { _service.Connecting = (client, e) => { _logger.Info($"客户端{client.IP}正在接入服务"); return EasyTask.CompletedTask; }; _service.Connected = (client, e) => { _logger.Info($"客户端{client.IP}接入服务成功"); RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; _service.Disconnected = (client, e) => { _logger.Info($"客户端{client.IP}断开连接"); RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; _service.Received = (client, e) => { if (e.RequestInfo is BufferRequestInfo request) { _logger.Iot($"收到客户端:{client.Id};原始指令====>>>>{_stringChange.bytesToHexStr(request.buffer.Buffer, request.buffer.Len)}"); string msg = $"收到客户端:{client.Id};指令====>>>>Header:{BitConverter.ToString(request.header).Replace("-", "")};DataType:{request.DataType.ToString("X2")};BufferLength:{request.BufferLength};Body:{BitConverter.ToString(request.Body).Replace("-", "")};CheckBit:{request.CheckBit.ToString("X2")};Tail:{BitConverter.ToString(request.Tail).Replace("-", "")};"; _logger.Info($"{msg}"); ReceivedBufferRequestInfoEvent?.Invoke(client,request); } return EasyTask.CompletedTask; }; _service.Setup(new TouchSocketConfig()//载入配置 .SetListenIPHosts(new IPHost[] { new IPHost($"0.0.0.0:{serverPort}") }) .SetTcpDataHandlingAdapter(() => new CustomDataHandlingAdapter()) .ConfigureContainer(a =>//容器的配置顺序应该在最前面 { a.AddConsoleLogger(); }) .ConfigurePlugins(a => { //自定义插件 })); _service.Start(); _logger.Info($"TcpServer启动成功,监听端口:{serverPort}"); } catch (Exception ex) { //throw new InvalidOperationException($"TcpServer启动异常:{ex.Message}"); _logger.Error($"TcpServer启动异常:{ex.Message}"); } } /// /// 向所有客户端发送心跳 /// public void SendHeartBeat() { var clients = _service.SocketClients.GetClients(); foreach (var item in clients) { _service.Send(item.Id,"heartbeat"); } } public void SendDataToRecevieDevice(byte[] bytes) { var clientInfos = _service.SocketClients.GetClients().Where(x => x.Id.Contains("450")).ToList(); if (clientInfos == null) { _logger.Info($"连接中不存在450设备"); } else { foreach (var item in clientInfos) { item.Send(bytes); _logger.Info($"向接收设备{item.Id};发送数据:{_stringChange.bytesToHexStr(bytes, bytes.Length)}"); } } } } }