private void HandleFeedback(DirectiveResult recvData, byte[] directiveBytes) { WaitForFeedBack metadata = null; if (!_waitForFeedbackDirectives.ContainsKey(recvData.Data.DirectiveId)) { LogFactory.Create().Warnning($"waitForFeedbackDirectives not ContainsKey {recvData.Data.DirectiveId}"); return; } var feedback = _waitForFeedbackDirectives[recvData.Data.DirectiveId]; //修正同一个指令id,发送和反馈对应的设备不同或者类型不同 if (feedback?.Directive == null || feedback.Directive.TargetDeviceId != recvData.Data.DeviceId) { LogFactory.Create().Warnning("send and feedback not match"); return; } if (_waitForFeedbackDirectives.TryRemove(recvData.Data.DirectiveId, out metadata) && null != metadata) { var args = new SerialPortEventArgs { IsSucceed = true, Result = recvData, Command = directiveBytes }; OnSerialPortEvent(args); } else { LogFactory.Create().Warnning($"waitForFeedbackDirectives TryRemove {recvData.Data.DirectiveId} failed"); } }
//只重发成功发送的指令 private async Task RetrySend(CancellationToken token) { try { token.ThrowIfCancellationRequested(); while (!_cancelTokenSource.IsCancellationRequested) { if (_waitForFeedbackDirectives.Count != 0) { var waitForFeedback = _waitForFeedbackDirectives.Values.FirstOrDefault(); if (waitForFeedback != null) { var now = DateTime.Now; if ((now - waitForFeedback.CreatedAt).TotalMilliseconds >= Config.RETRY_TIMEOUT) { var p = Shunxi.Common.Utility.Common.BytesToString( _protocolProvider.GenerateDirectiveBuffer(waitForFeedback.Directive)); if (waitForFeedback.RetrySendTimes < Config.RETRY_TIMES) { LogFactory.Create() .Info( $"{waitForFeedback.CreatedAt:yyyy-MM-dd HH:mm:ss.fff}<-timeout->{now:yyyy-MM-dd HH:mm:ss.fff}"); WaitForFeedBack metadata = null; if (_isRetry) { LogFactory.Create() .Info( $"{_waitForFeedbackDirectives.Count}count,{waitForFeedback.RetrySendTimes}times retry ->{p}<- retry end"); PrepareDirective(waitForFeedback.Directive, ++waitForFeedback.RetrySendTimes); } else { OnSerialPortEvent(new SerialPortEventArgs() { IsSucceed = false, Message = waitForFeedback.Directive.TargetDeviceId.ToString() }); } _waitForFeedbackDirectives.TryRemove(waitForFeedback.Directive.DirectiveId, out metadata); } else { LogFactory.Create() .Info( $"{_waitForFeedbackDirectives.Count}count,{p}, {waitForFeedback.RetrySendTimes}times retry failed"); OnErrorEvent(new CustomException($"{Config.RETRY_TIMES}重试发送指令失败", this.GetType().FullName, ExceptionPriority.Unrecoverable), waitForFeedback.Directive); return; } } } } await Task.Delay(Config.RETRY_INTERVAL, token); } } catch (TaskCanceledException) { LogFactory.Create().Info("RetrySend cancel"); } }