Files
Ayay/SHH.CameraService/GrpcImpls/Handlers/DeviceRebootHandler.cs

69 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Ayay.SerilogLogs;
using Newtonsoft.Json.Linq;
using Serilog;
using SHH.CameraSdk;
using SHH.Contracts;
namespace SHH.CameraService;
/// <summary>
/// 设备重启指令处理器
/// 响应 gRpc 指令ProtocolCodes.Device_Reboot
/// </summary>
public class DeviceRebootHandler : ICommandHandler
{
private readonly ILogger _sysLog = Log.ForContext("SourceContext", LogModules.Core);
private readonly CameraManager _cameraManager;
/// <summary>指令名称(需在 ProtocolCodes 中定义 Device_Reboot</summary>
public string ActionName => ProtocolCodes.Device_Reboot;
public DeviceRebootHandler(CameraManager cameraManager)
{
_cameraManager = cameraManager ?? throw new ArgumentNullException(nameof(cameraManager));
}
public async Task ExecuteAsync(JToken payload)
{
// 1. 解析参数(假设重启指令至少包含 DeviceId
// Optimized: 使用通用的基础 DTO 或直接解析 DeviceId避免为简单的重启创建过多复杂 DTO
var deviceId = payload["DeviceId"]?.Value<int>() ?? 0;
if (deviceId <= 0)
{
_sysLog.Warning("[Reboot] 无效指令设备ID非法");
return;
}
// 2. 获取设备实例
var device = _cameraManager.GetDevice(deviceId);
if (device == null)
{
_sysLog.Warning($"[Reboot] 设备 {deviceId} 不存在");
return;
}
// 3. 校验重启能力 (参考 PtzControlHandler 模式)
// Modified: 根据 ISyncFeature.cs 定义,检查是否实现了 IRebootFeature 接口
if (!(device is IRebootFeature rebootFeature))
{
_sysLog.Warning($"[Reboot] 设备 {deviceId} 不支持远程重启接口");
return;
}
// 4. 执行重启
try
{
_sysLog.Information($"[Reboot] 正在向设备 {deviceId} 发送重启指令...");
// 调用接口定义的异步方法
await rebootFeature.RebootAsync();
_sysLog.Information($"[Reboot] 设备 {deviceId} 重启指令发送成功");
}
catch (Exception ex)
{
_sysLog.Error($"[Reboot] 设备 {deviceId} 重启失败: {ex.Message}");
}
}
}