using Ayay.SerilogLogs; using Newtonsoft.Json.Linq; using Serilog; using SHH.CameraSdk; using SHH.Contracts; namespace SHH.CameraService; /// /// 设备重启指令处理器 /// 响应 gRpc 指令:ProtocolCodes.Device_Reboot /// public class DeviceRebootHandler : ICommandHandler { private readonly ILogger _sysLog = Log.ForContext("SourceContext", LogModules.Core); private readonly CameraManager _cameraManager; /// 指令名称(需在 ProtocolCodes 中定义 Device_Reboot) 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() ?? 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}"); } } }