Files
Ayay/SHH.CameraService/CommandBusProcessor.cs

123 lines
5.5 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 Newtonsoft.Json;
using SHH.CameraSdk;
using SHH.Contracts;
namespace SHH.CameraService
{
/// <summary>
/// 指令业务逻辑分发器 (纯逻辑层)
/// <para>职责:解析业务参数 -> 调用 CameraManager -> 返回执行结果</para>
/// <para>注意:本类不处理网络协议,也不负责 RequestId 的回填,只关注业务本身</para>
/// </summary>
public static class CommandBusProcessor
{
/// <summary>
/// 核心业务入口
/// </summary>
/// <param name="manager">相机管理器实例</param>
/// <param name="payload">已解析的指令包</param>
/// <returns>执行结果 (不含 RequestId由调用方补充)</returns>
public static CommandResult ProcessBusinessLogic(CameraManager manager, CommandPayload payload)
{
string cmd = payload.CmdCode.ToUpper();
// 忽略客户端发回的 ACK (如果是双向确认模式)
if (cmd == "REGISTER_ACK") return CommandResult.Ok();
// 解析 TargetId (CameraId)
long deviceId = 0;
// 只有非 SYSTEM 指令才需要解析设备ID
if (payload.TargetId != "SYSTEM" && !long.TryParse(payload.TargetId, out deviceId))
{
return CommandResult.Fail($"Invalid Device ID: {payload.TargetId}");
}
try
{
switch (cmd)
{
// ==========================================
// 1. PTZ 云台控制
// ==========================================
case "PTZ":
{
var device = manager.GetDevice(deviceId);
if (device == null) return CommandResult.Fail("Device Not Found");
if (!device.IsOnline) return CommandResult.Fail("Device Offline");
// 检查设备是否支持 PTZ 能力 (接口模式匹配)
if (device is IPtzFeature ptzFeature)
{
var ptzDto = JsonConvert.DeserializeObject<PtzControlDto>(payload.JsonParams);
if (ptzDto == null) return CommandResult.Fail("Invalid PTZ Params");
// 异步转同步执行 (Task.Wait 在后台线程是安全的)
if (ptzDto.Duration > 0)
{
// 点动模式 (例如:向左转 500ms)
ptzFeature.PtzStepAsync(ptzDto.Action, ptzDto.Duration, ptzDto.Speed).Wait();
}
else
{
// 持续模式 (开始转/停止转)
ptzFeature.PtzControlAsync(ptzDto.Action, ptzDto.Stop, ptzDto.Speed).Wait();
}
return CommandResult.Ok("PTZ Executed");
}
return CommandResult.Fail("Device does not support PTZ");
}
// ==========================================
// 2. 远程重启
// ==========================================
case "REBOOT":
{
var device = manager.GetDevice(deviceId);
if (device == null) return CommandResult.Fail("Device Not Found");
if (device is IRebootFeature rebootFeature)
{
rebootFeature.RebootAsync().Wait();
return CommandResult.Ok("Reboot command sent");
}
return CommandResult.Fail("Device does not support Reboot");
}
// ==========================================
// 3. 时间同步
// ==========================================
case "SYNC_TIME":
{
var device = manager.GetDevice(deviceId);
if (device == null) return CommandResult.Fail("Device Not Found");
if (device is ITimeSyncFeature timeFeature)
{
timeFeature.SetTimeAsync(DateTime.Now).Wait();
return CommandResult.Ok("Time synced");
}
return CommandResult.Fail("Device does not support TimeSync");
}
// ==========================================
// 4. 系统级指令 (心跳/诊断)
// ==========================================
case "PING":
return CommandResult.Ok("PONG");
default:
return CommandResult.Fail($"Unknown Command: {cmd}");
}
}
catch (AggregateException ae)
{
// 捕获异步任务内部的异常
return CommandResult.Fail($"Execution Error: {ae.InnerException?.Message}");
}
catch (Exception ex)
{
return CommandResult.Fail($"Execution Error: {ex.Message}");
}
}
}
}