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.

197 lines
6.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* 版权所有 (c) 2026 WenJY 保留所有权利。
* CLR版本4.0.30319.42000
* 机器名称Mr.Wen's MacBook Pro
* 命名空间Sln.IntelliBelt.Business
* 唯一标识C4882642-153C-4A66-9D71-9753ACA8EB03
*
* 创建者WenJY
* 电子邮箱:
* 创建时间2026-04-26 11:03:35
* 版本V1.0.0
* 描述:
*
*--------------------------------------------------------------------
* 修改人:
* 时间:
* 修改说明:
*
* 版本V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Sln.IntelliBelt.Business.@base;
using Sln.IntelliBelt.Common;
using Sln.IntelliBelt.Config;
using Sln.IntelliBelt.Model;
using Sln.IntelliBelt.Serilog;
using Sln.IntelliBelt.Socket;
using Sln.IntelliBelt.Socket.Adapter;
using Sln.IntelliBelt.WebSocket;
using TouchSocket.Sockets;
namespace Sln.IntelliBelt.Business;
public class ReaderBufferHandler:BaseBusiness
{
private readonly TcpServer _tcpServer;
public ReaderBufferHandler(SerilogHelper logger, AppConfig appConfig, StringChange stringChange, WebSocketHelper webSocket, TcpServer tcpServer) : base(logger, appConfig, stringChange, webSocket)
{
_tcpServer = tcpServer;
}
public override void BufferAnalysis(TcpSessionClient client, BufferRequestInfo requestInfo, long bodyLength)
{
base.GetObjectTypeStr(requestInfo.objType,out string objTypeStr);
_logger.Info($"{client.Id}链接收到终端{requestInfo.terminalAddr}上报的{objTypeStr}数据:{requestInfo.content}");
base.GetJsonStr(client.Id,requestInfo,out string jsonStr);
_webSocket.PushMsg(jsonStr);
}
public override void ResponseHandle(TcpSessionClient client, BufferRequestInfo requestInfo)
{
//throw new NotImplementedException();
}
/// <summary>
/// 监控平台启动时获取设备参数信息
/// </summary>
/// <param name="msg"></param>
public void GetReaderParams(ReaderCommand readerCommand)
{
try
{
byte[] terminalAddrBytes = _stringChange.HexStrTorbytes(readerCommand.terminalAddr);
byte objType = Convert.ToByte(readerCommand.objType);
List<byte[]> buffers = new List<byte[]>()
{
new byte[] { 0xAA, 0x55, 0x01, 0x70, 0x02,0x73, 0x0D }, //固件版本
new Byte[] {0xAA,0x55,0x00,0x72,0x72,0x0D}, //功率
new byte[] {0xAA,0x55,0x00,0x90,0x90,0x0D} //温度
};
buffers.ForEach(x =>
{
BufferRequestInfo info = GetReaderParam(readerCommand.clientId, terminalAddrBytes,objType,x).Result;
if (info.body.Length > 3)
{
if (info.body[3] == 0x70)
{
this.ReaderVersionAnalysis(info,ref readerCommand);
}else if (info.body[3] == 0x72)
{
this.ReaderPowerAnalysis(info,ref readerCommand);
}else if (info.body[3] == 0x90)
{
this.ReaderTempAnalysis(info,ref readerCommand);
}
}
Thread.Sleep(1000);
});
readerCommand.content = $"获取设备参数成功";
}
catch (Exception e)
{
_logger.Info($"获取设备参数异常:{e.Message}");
readerCommand.content = $"获取设备参数异常:{e.Message}";
}
_webSocket.PushMsg(JsonConvert.SerializeObject(readerCommand,Formatting.Indented));
}
public async Task<BufferRequestInfo> GetReaderParam(string clientId,byte[] terminalAddrBytes,byte objType,byte[] buffer)
{
try
{
ResponsePack responsePack = new ResponsePack()
{
terminalAddr = terminalAddrBytes,
identCode = 0x32,
objType = objType,
contentLen = (byte)buffer.Length,
content = buffer
};
var messagePack = base.GetMessagePack(ref responsePack);
var requestInfo = await _tcpServer.SendMsgToClient(clientId, messagePack);
if (requestInfo == null)
{
throw new ArgumentNullException($"requestInfo为空");
}
return requestInfo;
}
catch (Exception e)
{
throw new InvalidOperationException($"{e.Message}");
}
}
/// <summary>
/// 天线功率解析
/// </summary>
/// <param name="requestInfo"></param>
/// <param name="jsonStr"></param>
public void ReaderPowerAnalysis(BufferRequestInfo requestInfo,ref ReaderCommand readerCommand)
{
int len = Convert.ToInt32(requestInfo.body[2]);
var buffers = requestInfo.body.Skip(5).Take(len).ToArray();
readerCommand.paramInfo.antPowers = new List<AntPowerInfo>();
for (int i = 0; i < len; i=i+5)
{
AntPowerInfo antPowerInfo = new AntPowerInfo();
var buf = buffers.Skip(i).Take(5).ToArray();
antPowerInfo.ant = buf[0];
byte[] readPowerBytes = buf.Skip(1).Take(2).ToArray();
antPowerInfo.readPower= Convert.ToInt32(_stringChange.bytesToHexStr(readPowerBytes,readPowerBytes.Length), 16) / 100;
byte[] writePowerBytes = buf.Skip(3).Take(2).ToArray();
antPowerInfo.writePower= Convert.ToInt32(_stringChange.bytesToHexStr(writePowerBytes,writePowerBytes.Length), 16) / 100;
_logger.Info($"{antPowerInfo.ant}#天线,读取功率:{antPowerInfo.readPower};写入功率:{antPowerInfo.writePower}");
readerCommand.paramInfo.antPowers.Add(antPowerInfo);
}
}
/// <summary>
/// 固件版本解析
/// </summary>
/// <param name="requestInfo"></param>
/// <param name="jsonStr"></param>
public void ReaderVersionAnalysis(BufferRequestInfo requestInfo,ref ReaderCommand readerCommand)
{
int bobyLen = requestInfo.body[2];
var buffer = requestInfo.body.Skip(5).Take(bobyLen).ToArray();
readerCommand.paramInfo.readerVersion = _stringChange.ToAsciiString(buffer);
}
/// <summary>
/// 设备温度解析
/// </summary>
/// <param name="requestInfo"></param>
/// <param name="jsonStr"></param>
public void ReaderTempAnalysis(BufferRequestInfo requestInfo,ref ReaderCommand readerCommand)
{
readerCommand.paramInfo.readerTemp= requestInfo.body[5];
_logger.Info($"设备温度:{readerCommand.paramInfo.readerTemp}");
}
}