HHRCSHub.cs
4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using Microsoft.AspNetCore.SignalR;
namespace Rcs.Api.Hubs
{
/// <summary>
/// 机器人状态实时推送 Hub(支持地图隔离)
/// @author zzy
/// </summary>
public class HHRCSHub : Hub
{
private readonly ILogger<HHRCSHub> _logger;
public HHRCSHub(ILogger<HHRCSHub> logger)
{
_logger = logger;
}
/// <summary>
/// 从路径参数获取地图 ID
/// @author zzy
/// </summary>
private string GetMapId()
{
if (Context.GetHttpContext()?.Request.RouteValues.TryGetValue("mapId", out var mapId) == true)
{
return mapId?.ToString() ?? "default";
}
return "default";
}
/// <summary>
/// 生成带地图隔离的组名
/// @author zzy
/// </summary>
private string GetMapGroupName(string baseGroup)
{
var mapId = GetMapId();
return $"{mapId}_{baseGroup}";
}
public override async Task OnConnectedAsync()
{
var mapId = GetMapId();
_logger.LogInformation("[HHRCSHub] 客户端连接: {ConnectionId}, 地图ID: {MapId}", Context.ConnectionId, mapId);
await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception? exception)
{
var mapId = GetMapId();
_logger.LogInformation("[HHRCSHub] 客户端断开: {ConnectionId}, 地图ID: {MapId}", Context.ConnectionId, mapId);
await base.OnDisconnectedAsync(exception);
}
/// <summary>
/// 订阅指定的数据类型(支持多选)
/// 可选值: "robot_status" - 机器人状态, "storage_location" - 库位信息
/// @author zzy
/// </summary>
/// <param name="types">订阅类型数组,如 ["robot_status", "storage_location"]</param>
public async Task Subscribe(string[] types)
{
var mapId = GetMapId();
foreach (var type in types)
{
switch (type)
{
case "robot_status":
await Groups.AddToGroupAsync(Context.ConnectionId, GetMapGroupName("robot_status"));
_logger.LogInformation("[HHRCSHub] 客户端 {ConnectionId} 订阅机器人状态, 地图ID: {MapId}", Context.ConnectionId, mapId);
break;
case "storage_location":
await Groups.AddToGroupAsync(Context.ConnectionId, GetMapGroupName("storage_location"));
_logger.LogInformation("[HHRCSHub] 客户端 {ConnectionId} 订阅库位信息, 地图ID: {MapId}", Context.ConnectionId, mapId);
break;
default:
_logger.LogWarning("[HHRCSHub] 客户端 {ConnectionId} 尝试订阅未知类型: {Type}, 地图ID: {MapId}", Context.ConnectionId, type, mapId);
break;
}
}
}
/// <summary>
/// 取消订阅指定的数据类型
/// @author zzy
/// </summary>
/// <param name="types">订阅类型数组,如 ["robot_status", "storage_location"]</param>
public async Task Unsubscribe(string[] types)
{
var mapId = GetMapId();
foreach (var type in types)
{
switch (type)
{
case "robot_status":
await Groups.RemoveFromGroupAsync(Context.ConnectionId, GetMapGroupName("robot_status"));
_logger.LogInformation("[HHRCSHub] 客户端 {ConnectionId} 取消订阅机器人状态, 地图ID: {MapId}", Context.ConnectionId, mapId);
break;
case "storage_location":
await Groups.RemoveFromGroupAsync(Context.ConnectionId, GetMapGroupName("storage_location"));
_logger.LogInformation("[HHRCSHub] 客户端 {ConnectionId} 取消订阅库位信息, 地图ID: {MapId}", Context.ConnectionId, mapId);
break;
default:
_logger.LogWarning("[HHRCSHub] 客户端 {ConnectionId} 尝试取消订阅未知类型: {Type}, 地图ID: {MapId}", Context.ConnectionId, type, mapId);
break;
}
}
}
}
}