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(); }; }
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); }
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()}" }); } }