| | |
| | | public async Task<string?> HandleMessageReceivedAsync(string message, bool isJson, TcpClient client) |
| | | { |
| | | var state = _stateManager.GetState(client.Client.RemoteEndPoint.ToString()); |
| | | if (state.OperStatus == message) |
| | | { |
| | | // 处理成功后,将原消息回写到客户端(保持原有行为) |
| | | await _socketClientGateway.SendMessageAsync(client, message); |
| | | } |
| | | // 记录接收到的消息日志 |
| | | QuartzLogHelper.LogInfo(_logger, $"接收到客户端【{state.RobotCrane?.DeviceName}】发送消息【{message}】", state.RobotCrane?.DeviceName); |
| | | |
| | | // 检查任务总数是否未达到上限 |
| | | if (state.RobotTaskTotalNum > RobotConst.MaxTaskTotalNum) |
| | | // 设备状态不存在时直接返回,避免后续空引用 |
| | | if (state == null) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | // 获取该设备的互斥锁,确保消息处理与 Job 执行互斥 |
| | | // Job 在处理任务时会等待此锁释放后才继续执行 |
| | | var robotLock = _stateManager.GetOrCreateLock(state.IPAddress); |
| | | await robotLock.WaitAsync(); |
| | | try |
| | | { |
| | | // 记录接收到的消息日志 |
| | | QuartzLogHelper.LogInfo(_logger, $"接收到客户端【{state.RobotCrane?.DeviceName}】发送消息【{message}】", state.RobotCrane?.DeviceName); |
| | | await _socketClientGateway.SendMessageAsync(client, message); |
| | | return null; |
| | | |
| | | // 检查任务总数是否未达到上限 |
| | | if (state.RobotTaskTotalNum > RobotConst.MaxTaskTotalNum) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"接收到客户端【{state.RobotCrane?.DeviceName}】发送消息【{message}】", state.RobotCrane?.DeviceName); |
| | | await _socketClientGateway.SendMessageAsync(client, message); |
| | | return null; |
| | | } |
| | | |
| | | // 将消息转换为小写(用于简单命令匹配) |
| | | string messageLower = message.ToLowerInvariant(); |
| | | |
| | | // 尝试用简单命令处理器处理 |
| | | // 简单命令包括:homing、homed、running、pausing、runmode、controlmode 等 |
| | | if (await _simpleCommandHandler.HandleAsync(messageLower, state)) |
| | | { |
| | | //if (messageLower != "batteryarrived") |
| | | //{ |
| | | // 处理成功后,将原消息回写到客户端(保持原有行为) |
| | | //await _socketClientGateway.SendMessageAsync(client, message); |
| | | QuartzLogHelper.LogInfo(_logger, $"接收到消息消息【{message}】,约定不返回发送消息:【{message}】", state.RobotCrane?.DeviceName); |
| | | //} |
| | | |
| | | //// 安全更新状态到数据库 |
| | | //_stateManager.TryUpdateStateSafely(state.IPAddress, state); |
| | | return null; |
| | | } |
| | | |
| | | // 如果不是简单命令,检查是否是前缀命令 |
| | | // 前缀命令包括:pickfinished、putfinished(后面跟逗号分隔的位置参数) |
| | | if (_prefixCommandHandler.IsPrefixCommand(messageLower)) |
| | | { |
| | | // 调用前缀命令处理器 |
| | | await _prefixCommandHandler.HandleAsync(message, state, client); |
| | | } |
| | | } |
| | | |
| | | // 将消息转换为小写(用于简单命令匹配) |
| | | string messageLower = message.ToLowerInvariant(); |
| | | |
| | | // 尝试用简单命令处理器处理 |
| | | // 简单命令包括:homing、homed、running、pausing、runmode、controlmode 等 |
| | | if (await _simpleCommandHandler.HandleAsync(messageLower, state)) |
| | | finally |
| | | { |
| | | //if (messageLower != "batteryarrived") |
| | | //{ |
| | | // 处理成功后,将原消息回写到客户端(保持原有行为) |
| | | //await _socketClientGateway.SendMessageAsync(client, message); |
| | | QuartzLogHelper.LogInfo(_logger, $"接收到消息消息【{message}】,约定不返回发送消息:【{message}】", state.RobotCrane?.DeviceName); |
| | | //} |
| | | |
| | | // 安全更新状态到数据库 |
| | | _stateManager.TryUpdateStateSafely(state.IPAddress, state); |
| | | return null; |
| | | } |
| | | |
| | | // 如果不是简单命令,检查是否是前缀命令 |
| | | // 前缀命令包括:pickfinished、putfinished(后面跟逗号分隔的位置参数) |
| | | if (_prefixCommandHandler.IsPrefixCommand(messageLower)) |
| | | { |
| | | // 调用前缀命令处理器 |
| | | await _prefixCommandHandler.HandleAsync(message, state, client); |
| | | robotLock.Release(); |
| | | } |
| | | |
| | | return null; |