Ejemplo n.º 1
0
        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");
            }
        }
Ejemplo n.º 2
0
        //只重发成功发送的指令
        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");
            }
        }