Example #1
0
        public PackageHelper(BinInfo info, IDownloadSender downloadSender)
        {
            _binInfo       = info;
            DownloadSender = downloadSender;
            var rest              = info.BinConfigFileLength % info.PackageBinLength;
            var fullPackageCount  = info.BinConfigFileLength / info.PackageBinLength;
            var totalPackageCount = rest == 0 ? (ushort)fullPackageCount : (ushort)(fullPackageCount + 1);

            _package       = new FirmwareUpdatePackage(totalPackageCount, info);
            _timerOutTimer = new Timer
            {
                Interval = _binInfo.TimeOut * 1000,
                Enabled  = true
            };
            _timerOutTimer.Elapsed += (sender, args) =>
            {
                _isDownloading           = false;
                DownloadSender.Received -= Received;
                DownloadInterrupt(new DownloadInterruptedEventArgs
                {
                    Message = "等待回复超时。"
                });
                _timerOutTimer.Stop();
            };
        }
Example #2
0
        private bool CheckPayloadDataContent(FirmwareUpdatePackage package, out string message)
        {
            message = string.Empty;
            if (package == null)
            {
                return(true);
            }
            if (package.PayloadData[0] != _lastSendPayloadData[0])
            {
                message = "文件发起者ID不匹配。";
                return(false);
            }
            if (package.PayloadData[0] != _lastSendPayloadData[0])
            {
                message = "文件接收者ID不匹配。";
                return(false);
            }
            if (!package.PayloadData.SubArray(2, 2).SequenceEqual(_lastSendPayloadData.SubArray(2, 2)))
            {
                message = "当前包号不匹配。";
                return(false);
            }
            if (!package.PayloadData.SubArray(4, 2).SequenceEqual(_lastSendPayloadData.SubArray(4, 2)))
            {
                message = "总包号不匹配。";
                return(false);
            }
            if (!package.PayloadData.SubArray(6, 2).SequenceEqual(_lastSendPayloadData.SubArray(6, 2)))
            {
                message = "本包固件长度不匹配。";
                return(false);
            }
            if (!package.PayloadData.SubArray(8, 4).SequenceEqual(_lastSendPayloadData.SubArray(8, 4)))
            {
                message = "固件文件总长度不匹配。";
                return(false);
            }
            if (!package.PayloadData.SubArray(12, 2).SequenceEqual(_lastSendPayloadData.SubArray(12, 2)))
            {
                message = "超时时间不匹配。";
                return(false);
            }

            return(true);
        }
Example #3
0
        private void Received(DownloadSenderReceivedArgs e)
        {
            if (!_isDownloading)
            {
                return;
            }
            LastReceiveDateTime    = DateTime.Now;
            LastReceiveByteCount   = e.ReceiveContent.Length;
            TotalReceiveByteCount += LastReceiveByteCount;

            if (e.Package.PackageStatus == PackageStatus.DecodeCompleted)
            {
                if (e.Package.StatusCode != 0)
                {
                    DownloadInterrupt(new DownloadInterruptedEventArgs
                    {
                        Message = $"数据下载错误,错误信息:{e.Package.Description}。"
                    });
                }
                else if (!CheckPayloadDataContent(e.Package, out var msg))
                {
                    DownloadInterrupt(new DownloadInterruptedEventArgs
                    {
                        Message = msg
                    });
                }
                else
                {
                    _lastReceivedPackage = e.Package;
                    Send();
                }
            }
            else if (e.Package.PackageStatus == PackageStatus.CrcCheckFaild)
            {
                DownloadInterrupt(new DownloadInterruptedEventArgs
                {
                    Message = $"接收到错误的协议包数据,错误原因:{e.Package.PackageStatus},数据包:{e.Package.DecodeBuffer.ToHexString()}"
                });
            }
        }