Files
Ayay/SHH.CameraDashboard/Invokes/CameraHub.cs
2026-01-15 09:31:57 +08:00

74 lines
2.8 KiB
C#
Raw Permalink 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 Microsoft.AspNetCore.SignalR;
using SHH.Contracts;
using System.Collections.Concurrent;
namespace SHH.CameraDashboard
{
/// <summary>
/// [SignalR 中心]
/// 职责:负责物理链路的维护,将网络消息路由到业务层 (CommandServer)
/// </summary>
public class CameraHub : Hub
{
// 静态映射表InstanceId -> ConnectionId (用于定向发指令)
private static readonly ConcurrentDictionary<string, string> _instanceMapping = new();
// =================================================================
// 1. 注册逻辑 (替代原 CommandServer.HandleRegistration)
// =================================================================
/// <summary>
/// 供 CameraService 调用
/// </summary>
public async Task Register(RegisterPayload payload)
{
string connectionId = Context.ConnectionId;
// 1. 记录映射关系
_instanceMapping[payload.InstanceId] = connectionId;
// 2. 将连接加入组 (按 InstanceId 组队,方便 CommandServer 发指令)
await Groups.AddToGroupAsync(connectionId, payload.InstanceId);
// 3. 回调业务单例处理 UI 逻辑
CommandServer.Instance.HandleClientRegister(payload);
Console.WriteLine($"[Hub] 收到注册: {payload.InstanceId}, 连接ID: {connectionId}");
}
// =================================================================
// 2. 指令回执
// =================================================================
/// <summary>
/// 供 CameraService 执行完指令后调用
/// </summary>
public void ReportCommandResult(CommandResult result)
{
CommandServer.Instance.HandleCommandResult(result);
}
// =================================================================
// 3. 视频流中转
// =================================================================
/// <summary>
/// 供 CameraService 上传图片
/// </summary>
public async Task UploadFrame(VideoPayload payload)
{
// 转发给订阅了该摄像头的组 (例如 Dashboard UI 订阅了该组)
await Clients.Group($"Watch_{payload.CameraId}").SendAsync("OnFrameRecv", payload);
}
// =================================================================
// 生命周期管理
// =================================================================
public override async Task OnDisconnectedAsync(Exception? exception)
{
// 清理映射逻辑可以在这里扩展
await base.OnDisconnectedAsync(exception);
}
}
}