wanshenmean
2026-03-19 cde6ad77663a80d78d77568428a6287b53347716
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
using Microsoft.Extensions.Logging;
using System.Net.Sockets;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core.Caches;
using WIDESEAWCS_Tasks.Workflow.Abstractions;
 
namespace WIDESEAWCS_Tasks
{
    /// <summary>
    /// 机器人消息路由入口:负责缓存状态读取、命令分发和回包触发。
    /// </summary>
    public class RobotMessageHandler : IRobotMessageRouter
    {
        private readonly ISocketClientGateway _socketClientGateway;
        private readonly RobotStateManager _stateManager;
        private readonly ICacheService _cache;
        private readonly IRobotSimpleCommandHandler _simpleCommandHandler;
        private readonly IRobotPrefixCommandHandler _prefixCommandHandler;
        private readonly ILogger<RobotJob> _logger;
 
        public RobotMessageHandler(
            ISocketClientGateway socketClientGateway,
            RobotStateManager stateManager,
            ICacheService cache,
            IRobotSimpleCommandHandler simpleCommandHandler,
            IRobotPrefixCommandHandler prefixCommandHandler,
            ILogger<RobotJob> logger)
        {
            _socketClientGateway = socketClientGateway;
            _stateManager = stateManager;
            _cache = cache;
            _simpleCommandHandler = simpleCommandHandler;
            _prefixCommandHandler = prefixCommandHandler;
            _logger = logger;
        }
 
        /// <summary>
        /// 处理接收到的消息。保持原有行为:简单命令和前缀命令都回写原消息。
        /// </summary>
        public async Task<string?> HandleMessageReceivedAsync(string message, bool isJson, TcpClient client, RobotSocketState state)
        {
            _logger.LogInformation($"接收到客户端【{state.RobotCrane.DeviceName}】发送消息【{message}】");
            var cacheKey = $"{RedisPrefix.Code}:{RedisName.SocketDevices}:{client.Client.RemoteEndPoint}";
            if (!_cache.TryGetValue(cacheKey, out RobotSocketState? cachedState) || cachedState == null)
            {
                return null;
            }
 
            var activeState = cachedState;
            string messageLower = message.ToLowerInvariant();
 
            if (await _simpleCommandHandler.HandleAsync(messageLower, activeState))
            {
                await _socketClientGateway.SendMessageAsync(client, message);
                _stateManager.TryUpdateStateSafely(activeState.IPAddress, activeState);
                return null;
            }
 
            if (_prefixCommandHandler.IsPrefixCommand(messageLower))
            {
                await _prefixCommandHandler.HandleAsync(message, activeState, client);
            }
 
            return null;
        }
    }
}