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.

134 lines
4.7 KiB
C#

3 months ago
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2025 WenJY
* CLR4.0.30319.42000
* Mr.Wen's MacBook Pro
* Sln.Iot.Business.base
* AA8CCDD9-6D6B-47B7-8309-5C9D41FFC822
*
* WenJY
*
* 2025-04-11 15:04:43
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using System;
using Microsoft.Extensions.Logging;
using Sln.Iot.Common;
using Sln.Iot.Config;
using Sln.Iot.Model.dto;
using Sln.Iot.Serilog;
using Sln.Iot.Socket.Adapter;
using TouchSocket.Core;
using TouchSocket.Sockets;
namespace Sln.Iot.Business.@base
{
public abstract class BaseBusiness
{
public SerilogHelper _logger;
public AppConfig _appConfig;
public StringChange _stringChange;
public BaseBusiness(SerilogHelper logger,AppConfig appConfig,StringChange stringChange)
{
_logger = logger;
_appConfig = appConfig;
_stringChange = stringChange;
}
/// <summary>
/// 指令解析方法
/// </summary>
/// <param name="client"></param>
/// <param name="requestInfo"></param>
public abstract FilterResult BufferAnalysis(ISocketClient client,BufferRequestInfo requestInfo,int bodyLength);
/// <summary>
/// 应答响应
/// </summary>
/// <param name="client"></param>
/// <param name="messagePack"></param>
public abstract void ResponseHandle(ISocketClient client, byte[] buffer);
/// <summary>
/// 封装回复指令
/// </summary>
/// <param name="SendMessagePackInfo"></param>
/// <param name="buffer"></param>
public void GetMessagePack(ref MessagePack SendMessagePackInfo,byte[] buffer)
{
SendMessagePackInfo.m_EnergyType = buffer[1];
Array.Copy(buffer, 2, SendMessagePackInfo.m_Meteraddr, 0, 2);
Array.Copy(buffer, 4, SendMessagePackInfo.m_Msta, 0, 2);
SendMessagePackInfo.m_StartFlag = buffer[6];
}
/// <summary>
/// 发送接收成功指令
/// </summary>
/// <param name="client"></param>
/// <param name="pMessagePack"></param>
/// <returns></returns>
public bool SendMessageAsync(ISocketClient client, MessagePack pMessagePack,byte[] buffer = null)
{
ushort num = 0;
try
{
byte[] SendBuffer = new byte[12];
if (buffer != null)
{
SendBuffer = new byte[12 + buffer.Length];
}
SendBuffer[num] = pMessagePack.m_BeginChar;
num = (ushort)(num + 1);
SendBuffer[num] = pMessagePack.m_EnergyType;
num = (ushort)(num + 1);
Array.Copy(pMessagePack.m_Meteraddr, 0, SendBuffer, num, pMessagePack.m_Meteraddr.Length);
num = (ushort)(num + 2);
Array.Copy(pMessagePack.m_Msta, 0, SendBuffer, num, pMessagePack.m_Msta.Length);
num = (ushort)(num + 2);
SendBuffer[num] = pMessagePack.m_StartFlag;
num = (ushort)(num + 1);
SendBuffer[num] = pMessagePack.m_MessageType;
num = (ushort)(num + 1);
Array.Copy(pMessagePack.m_PackLen, 0, SendBuffer, num, pMessagePack.m_PackLen.Length);
num = (ushort)(num + 2);
if (buffer != null)
{
Array.Copy(buffer, 0, SendBuffer, num, buffer.Length);
num = (ushort)(num + buffer.Length);
}
pMessagePack.m_Verify = _stringChange.CalculateVerifyToArray(SendBuffer, SendBuffer.Length - 1)[0];
SendBuffer[num] = pMessagePack.m_Verify;
num = (ushort)(num + 1);
SendBuffer[num] = pMessagePack.m_EndChar;
_logger.Info($"向客户端:{client.Id};地址:{client.GetIPPort()};发送终端消息:{_stringChange.bytesToHexStr(SendBuffer, SendBuffer.Length)}");
client.SendAsync(SendBuffer);
return true;
}
catch (Exception ex)
{
_logger.Error($"SendMessageToClient异常{ex.Message}");
return false;
}
}
}
}