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.

155 lines
5.5 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) 2025 WenJY 保留所有权利。
* CLR版本4.0.30319.42000
* 机器名称Mr.Wen's MacBook Pro
* 命名空间Sln.Iot.Business
* 唯一标识97943988-8BBA-44B7-9139-BB7D4EC7FC3A
*
* 创建者WenJY
* 电子邮箱:
* 创建时间2025-05-09 13:55:47
* 版本V1.0.0
* 描述:
*
*--------------------------------------------------------------------
* 修改人:
* 时间:
* 修改说明:
*
* 版本V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using System;
using Newtonsoft.Json;
using Sln.Iot.Common;
using Sln.Iot.Config;
using Sln.Iot.Model.dto;
using Sln.Iot.Serilog;
using Sln.Iot.Socket;
using Sln.Iot.Socket.Adapter;
using TouchSocket.Core;
using TouchSocket.Rpc;
using TouchSocket.WebApi;
namespace Sln.Iot.Business
{
/// <summary>
/// 设备控制执行处理
/// </summary>
public class DevControlBusiness : RpcServer
{
private SerilogHelper _logger;
private StringChange _stringChange;
private readonly TcpServer _tcpServer;
public DevControlBusiness(SerilogHelper logger, StringChange stringChange, TcpServer tcpServer)
{
_logger = logger;
_stringChange = stringChange;
_tcpServer = tcpServer;
}
/// <summary>
/// 开锁
/// </summary>
/// <param name="idStr"></param>
/// <param name="password"></param>
[EnableCors("cors")]
[WebApi(HttpMethodType.POST)]
public ApiResInfo Unlock(string idStr,string password)
{
BufferRequestInfo bufferRequestInfo = new BufferRequestInfo();
ApiResInfo apiResInfo = new ApiResInfo();
try
{
BufferPack(idStr, password,0x35,out byte[] buffer);
_logger.Info($"向客户端:{idStr};发送开锁指令:{_stringChange.bytesToHexStr(buffer,buffer.Length)}");
bufferRequestInfo = _tcpServer.SendMsgToClient(idStr, buffer).Result;
if (bufferRequestInfo.DataType == 0x35)
{
_logger.Info($"开锁指令下发成功,已收到设备回复");
apiResInfo = ApiResInfo.Success("开锁指令下发成功,已收到设备回复",bufferRequestInfo);
}
else
{
throw new InvalidOperationException($"关锁指令下发成功,设备回复控制码不为 0x35");
}
}
catch (Exception e)
{
_logger.Info($"开锁异常:{e.Message}");
apiResInfo = ApiResInfo.Fail($"开锁异常:{e.Message}",bufferRequestInfo);
}
return apiResInfo;
}
/// <summary>
/// 关锁
/// </summary>
/// <param name="idStr"></param>
/// <param name="password"></param>
[EnableCors("cors")]
[WebApi(HttpMethodType.POST)]
public ApiResInfo LockUp(string idStr,string password)
{
BufferRequestInfo bufferRequestInfo = new BufferRequestInfo();
ApiResInfo apiResInfo = new ApiResInfo();
try
{
BufferPack(idStr, password,0x37,out byte[] buffer);
_logger.Info($"向客户端:{idStr};发送关锁指令:{_stringChange.bytesToHexStr(buffer,buffer.Length)}");
bufferRequestInfo = _tcpServer.SendMsgToClient(idStr, buffer).Result;
if (bufferRequestInfo.DataType == 0x37)
{
_logger.Info($"关锁指令下发成功,已收到设备回复");
apiResInfo = ApiResInfo.Success("关锁指令下发成功,已收到设备回复",bufferRequestInfo);
}
else
{
throw new InvalidOperationException($"关锁指令下发成功,设备回复控制码不为 0x37");
}
}
catch (Exception e)
{
_logger.Info($"关锁异常:{e.Message}");
apiResInfo = ApiResInfo.Fail($"关锁异常:{e.Message}",bufferRequestInfo);
}
return apiResInfo;
}
/// <summary>
/// 指令封装
/// </summary>
/// <param name="idStr"></param>
/// <param name="password"></param>
/// <param name="dataType"></param>
/// <param name="buffer"></param>
private void BufferPack(string idStr,string password,byte dataType,out byte[] buffer)
{
ushort num = 0;
byte[] idBytes = _stringChange.HexStrTorbytes(idStr);
byte[] pwdBytes = _stringChange.HexStrTorbytes(password);
buffer = new byte[5 + idBytes.Length + pwdBytes.Length];
buffer[num] = 0x68;
num = (ushort)(num + 1);
Array.Copy(idBytes, 0, buffer, num, idBytes.Length);
num = (ushort)(num + idBytes.Length);
buffer[num] = 0x68;
num = (ushort)(num + 1);
buffer[num] = dataType;
num = (ushort)(num + 1);
Array.Copy(pwdBytes, 0, buffer, num, pwdBytes.Length);
num = (ushort)(num + pwdBytes.Length);
buffer[num] = _stringChange.CalculateVerifyToArray(buffer, buffer.Length - 1)[0];
num = (ushort)(num + 1);
buffer[num] = 0x16;
}
}
}