You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
5.7 KiB
C#

3 months ago
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2025 WenJY
* CLR4.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.Linq;
using System.Text;
using System.Threading.Tasks;
using Sln.Iot.Common;
using Sln.Iot.Model.dto;
3 months ago
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;
public readonly TcpService _service;
private readonly StringChange _stringChange;
3 months ago
public TcpServer(SerilogHelper logger, TcpService service, StringChange stringChange)
3 months ago
{
_logger = logger;
_service = service;
_stringChange = stringChange;
3 months ago
}
/// <summary>
/// 接收客户端指令委托
/// </summary>
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)}");
3 months ago
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("-", "")};";
3 months ago
_logger.Info($"{msg}");
3 months ago
ReceivedBufferRequestInfoEvent?.Invoke(client,request);
3 months ago
}
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}");
}
}
/// <summary>
/// 向指定客户端发送指令
3 months ago
/// </summary>
/// <param name="clientId"></param>
/// <param name="buffer"></param>
public async Task<BufferRequestInfo> SendMsgToClient(string clientId, byte[] buffer)
3 months ago
{
if (_service.TryGetSocketClient(clientId, out SocketClient tcpSessionClient))
{
var waitClinet = tcpSessionClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response => //设置用于筛选的fun委托当返回为true时才会响应返回
{
return true;
}
});
ResponsedData responsedData = waitClinet.SendThenResponse(buffer, 5000);
IRequestInfo requestInfo = responsedData.RequestInfo;
BufferRequestInfo bufferRequestInfo = (BufferRequestInfo)requestInfo ;
return bufferRequestInfo;
}
else
3 months ago
{
return new BufferRequestInfo();
3 months ago
}
}
}
}