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.

143 lines
4.7 KiB
C#

#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2026 WenJY
* CLR4.0.30319.42000
* Mr.Wen's MacBook Pro
* Sln.IntelliBelt.Socket.Adapter
* B09DFB64-3AE1-4CD4-A3A3-478B6EF97A48
*
* WenJY
*
* 2026-04-24 10:58:37
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using System.Buffers;
using System.Data;
using System.Text;
using Sln.IntelliBelt.Common;
using Sln.IntelliBelt.Config;
using Sln.IntelliBelt.Serilog;
using TouchSocket.Core;
using Exception = System.Exception;
namespace Sln.IntelliBelt.Socket.Adapter;
public class CustomDataHandlingAdapter:CustomDataHandlingAdapter<BufferRequestInfo>
{
private readonly SerilogHelper _logger;
private readonly StringChange _stringChange;
public CustomDataHandlingAdapter(SerilogHelper logger, StringChange stringChange)
{
_logger = logger;
_stringChange = stringChange;
}
protected override FilterResult Filter<TReader>(ref TReader reader, bool beCached, ref BufferRequestInfo request)
{
CacheTimeoutEnable = true;
CacheTimeout = new TimeSpan(0, 0, 0, 0, 5000);
//ByteBlock byteBlock = new ByteBlock(reader.Sequence.ToArray());
try
{
if (reader.BytesRemaining < 5)
{
reader.BytesRead = 0;
return FilterResult.Cache;
}
byte[] buffer = reader.Sequence.ToArray();
_logger.Info($"收到终端指令:{_stringChange.bytesToHexStr(buffer,buffer.Length)}");
//读取帧头
byte headerByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取终端类型
byte terminalTypeByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取终端地址
byte[] terminalAddressBytes = reader.GetSpan(2).ToArray();
reader.Advance(2);
string terminalAddrStr = _stringChange.ConverToString(terminalAddressBytes);
//读取指令序号
byte serialNumberByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取功能标识码
byte identCodeByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取对象类别
byte objTypeByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取数据内容的数据长度
int contentLen = (int)reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取数据内容
byte[] contentBytes = reader.GetSpan(contentLen).ToArray();
reader.Advance(contentLen);
string contentStr = _stringChange.ConverToString(contentBytes);
//读取 CS 校验
byte checksumByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//读取帧尾
byte tailByte = reader.GetSpan(1).ToArray()[0];
reader.Advance(1);
//Byte[] checkBitBytes = new Byte[buffer.Length - 2];
Byte[] checkBitBytes = new Byte[contentLen + 8];
Array.Copy(buffer, 0, checkBitBytes, 0, checkBitBytes.Length);
byte checkRes = _stringChange.CalculateChecksum(checkBitBytes);
if (checkRes != checksumByte)
{
_logger.Info($"指令校验失败:{_stringChange.bytesToHexStr(buffer,buffer.Length)}");
return FilterResult.Cache;
}
request = new BufferRequestInfo()
{
header = headerByte,
terminalType = terminalTypeByte,
terminalAddr = terminalAddrStr,
serialNumber = serialNumberByte,
identCode = identCodeByte,
objType = objTypeByte,
contentLen = contentLen,
content = contentStr,
body = contentBytes,
checkBit = checksumByte,
tail = tailByte,
buffer = new ByteBlock(buffer),
};
return FilterResult.Success;
}
catch (Exception e)
{
return FilterResult.Cache;
}
}
}