#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; } } }