using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json.Linq; using SlnMesnac.Model.domain; using SlnMesnac.Repository.service; using SlnMesnac.Repository.service.ScanLog; using TouchSocket.Core; using TouchSocket.Sockets; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:LAPTOP-E0N2L34V * 命名空间:SlnMesnac.TouchSocket * 唯一标识:496f8d2b-70e3-4a05-ae18-a9b0fcd06b82 * * 创建者:WenJY * 电子邮箱:wenjy@mesnac.com * 创建时间:2024-03-27 21:58:35 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace SlnMesnac.TouchSocket { public class TcpServer { private ILogger _logger; private readonly TcpService _service; private readonly IScanLogService _scanService; private readonly IBaseCodeService _baseCodeService; // /// // /// 接收客户端指令委托 // /// // public delegate void ReceivedClientBuffer(byte[] buffer); // public event ReceivedClientBuffer? ReceivedClientBufferEvent; // // public delegate void RefreshClientInfo(TcpService tcpService); // public event RefreshClientInfo? RefreshClientInfoEvent; public Action? ScanLogSocketAction; public Action? ScanStatusSocketAction; public TcpServer(ILogger logger,TcpService tcpService, IScanLogService scan, IBaseCodeService baseCodeService) { _logger = logger; _service = tcpService; _scanService = scan; _baseCodeService = baseCodeService; } public void Init(int serverPort) { try { _service.Connecting = (client, e) => { _logger.LogInformation("客户端{ClientIp}正在接入服务", client.IP); return EasyTask.CompletedTask; }; _service.Connected = (client, e) => { _logger.LogInformation("客户端{ClientIp}接入服务成功", client.IP); // RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; _service.Disconnected = (client, e) => { _logger.LogInformation("客户端{ClientIp}断开连接", client.IP); // RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; _service.Received = (client, e) => { try { var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意:数据长度是byteBlock.Len _logger.LogInformation("收到数据:{Data}",mes); // byte[] receivedBuffer = new byte[e.ByteBlock.Len]; // Array.Copy(e.ByteBlock.Buffer, 0, receivedBuffer, 0, e.ByteBlock.Len); // ReceivedClientBufferEvent?.Invoke(receivedBuffer); int dataType = 0; var jObject = JObject.Parse(mes); if (jObject.TryGetValue("data_type", out var value)) { dataType=value.Value(); } if (dataType == 1) { ScanLogSocket scanStatus= mes.FromJsonString(); ScanLogSocketAction?.Invoke(scanStatus); _scanService.Insert(new ScanLogModel() { CreateTime = scanStatus.CreateTime, DataType = scanStatus.data_type, Code = scanStatus.code, Rfid = scanStatus.rfid, Ocr = scanStatus.ocr, Url = scanStatus.url }); } else { if (dataType == 2) { ScanStatusSocket scanStatus = mes.FromJsonString(); ScanStatusSocketAction?.Invoke(scanStatus); if (scanStatus.is_alarm == 1 && scanStatus.device_status != null && scanStatus.device_status.Count > 0) { List ls = new List(); var baseCodes = _baseCodeService.QuListCache(); foreach (var baseCode in scanStatus.device_status) { var enBaseCode = baseCodes.FirstOrDefault(x=>x.Code==baseCode); if (enBaseCode != null) { ls.Add(enBaseCode.State); } } scanStatus.status_txt = ls; } } } client.SendAsync(new Back().ToJsonString()); } catch (Exception exception) { _logger.LogError(exception,exception.Message); } return EasyTask.CompletedTask; }; _service.Setup(new TouchSocketConfig()//载入配置 .SetListenIPHosts(new IPHost[] { new IPHost($"0.0.0.0:{serverPort}") }) .ConfigureContainer(a =>//容器的配置顺序应该在最前面 { a.AddConsoleLogger(); }) .ConfigurePlugins(a => { //自定义插件 })); _service.Start(); _logger.LogInformation($"TcpServer启动成功,监听端口:{serverPort}"); } catch (Exception ex) { //throw new InvalidOperationException($"TcpServer启动异常:{ex.Message}"); _logger.LogError($"TcpServer启动异常:{ex.Message}"); } } /// /// 向所有客户端发送心跳 /// public void SendHeartBeat() { var clients = _service.SocketClients.GetClients(); foreach (var item in clients) { _service.Send(item.Id,"heartbeat"); } } } }