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;
|
}
|
}
|
}
|