#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
{
///
/// 设备控制执行处理
///
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;
}
///
/// 开锁
///
///
///
[EnableCors("cors")]
[WebApi(HttpMethodType.GET)]
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");
}*/
_logger.Info($"开锁指令下发成功,已收到设备回复");
apiResInfo = ApiResInfo.Success("开锁指令下发成功,已收到设备回复",bufferRequestInfo);
}
catch (Exception e)
{
_logger.Info($"开锁异常:{e.Message}");
apiResInfo = ApiResInfo.Fail($"开锁异常:{e.Message}",bufferRequestInfo);
}
return apiResInfo;
}
///
/// 关锁
///
///
///
[EnableCors("cors")]
[WebApi(HttpMethodType.GET)]
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;
}
///
/// 指令封装
///
///
///
///
///
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;
}
}
}