文件差分服務設計

需求

OTA(Over-The-Air)升級是一種至關重要的技術,用于更新嵌入式設備的固件或軟件,以確保設備具備最新功能和修復漏洞。在OTA升級過程中,使用差異算法工具(如bsdiff、hdiffpatch和xdelta3)能夠有效減小升級包的大小,從而降低帶寬消耗并提高升級效率。以下是對差異算法在OTA升級中的重要性的更詳細說明:

  1. 帶寬節省:通過使用差異算法,云端可以提取新舊升級包之間的差異數據,生成相對較小的差異包。這意味著只需傳輸差異包,而不是整個新升級包。這極大地降低了數據傳輸所需的帶寬,尤其對于大型升級包而言。

  2. 成本降低:減少傳輸數據量不僅有助于帶寬節省,還能減少數據傳輸費用。這對于云端提供OTA服務的成本管理非常關鍵。

  3. 快速升級:較小的差異包能更快速地下載到設備上,且設備更容易處理和應用差異數據。這減少了升級過程所需的時間,有助于確保用戶設備迅速獲取最新功能和修復。

  4. 存儲空間節省:設備的存儲空間是有限的,較小的差異包需要更少的存儲空間,對設備而言非常有益。

  5. 版本控制:差異算法還能輕松進行版本控制,確保設備獲取正確的升級。

升級流程

OTA升級流程:

  1. 計算差分包:云端根據升級需求,調用差分服務,輸入文件 V1(當前版本)和文件 V2(新版本)來計算差分包 PATCH(差異數據)。hdiffpatch 將生成一個相對較小的 PATCH 差分包,其中包含了新版本相對于當前版本的差異信息。

  2. 通知設備下載差分包:云端通知設備有可用的升級。設備收到通知后,開始下載差分包 PATCH。

  3. 應用差分包:設備成功下載差分包 PATCH 后,它使用文件 V1(當前版本)和差分包 PATCH 來還原文件 V2(新版本)。設備內部的 hdiffpatch 工具將應用 PATCH 差異數據到當前版本文件 V1 上,生成新版本文件 V2。這個過程是快速的,因為 PATCH 包是相對較小的,只包含了需要修改的數據。

  4. 安全性檢查:設備在應用差分包后,可以進行安全性檢查來確保新版本文件 V2 完整和正確。這可以包括校驗文件的哈希值或數字簽名,以防止潛在的數據損壞或惡意修改。

  5. 更新完成通知:設備在成功應用差分包且通過安全性檢查后,通知云端升級完成。云端記錄設備已完成升級,以便進行版本跟蹤和管理。

通過這一流程,我們能夠充分利用 hdiffpatch 差異算法,將升級包的大小減小,降低了升級過程中的帶寬需求,同時保持了升級的效率。這對于嵌入式設備的OTA升級是一個優化的、可行的方案。

方案設計

技術路線

  • BsDiff:BsDiff(Binary Software Differential)是一種用于生成二進制文件差異(差異數據)的算法。通常用于比較原始文件和新文件,生成差異文件,然后將差異文件應用到原始文件,生成新文件。BsDiff的核心思想是將二進制文件劃分成塊,計算塊之間的差異,然后將這些差異編碼成差異文件。BsDiff算法的目標是生成最小的差異數據,以在生成和應用差異時盡可能減小文件大小并提高效率。它在軟件更新、版本控制等領域非常有用,因為它減小升級文件的大小,降低下載和存儲成本。

  • hdiffpatch:hdiffpatch 是另一個差異生成和應用工具,專門用于減小文件大小,特別是用于固件和軟件的更新。它被設計為高性能、低內存占用的工具,可以生成小差異文件以減小升級包的大小,從而節省帶寬和提高升級效率。hdiffpatch的基本原理是將文件劃分成塊,找到相匹配的塊,計算不匹配塊之間的差異,將差異數據編碼成差異文件,然后使用差異文件來應用差異數據以生成新文件。hdiffpatch強調高性能和低內存占用,適用于嵌入式設備和固件更新等場景。它的主要優勢在于生成較小的差異文件,減小升級包的大小,降低帶寬消耗,以及節省存儲空間。

技術對比

BsDiff 和 hdiffpatch 都是用于生成和應用二進制文件差異的算法,用于減小升級包的大小,從而節省帶寬和降低成本。它們有各自的特點和優勢,下面對它們進行比較:

BsDiff:

  1. 基本原理:BsDiff 將文件劃分成塊,找到匹配的塊,計算不匹配塊之間的差異,然后編碼差異文件。差異文件可以應用到原始文件上,生成新文件。

  2. 優勢

    • 生成的差異文件通常較小,節省帶寬。
    • 被廣泛用于軟件更新、版本控制等領域。
    • 相對成熟的開源實現可供使用。
  3. 劣勢

    • 生成和應用差異的性能可能不如 hdiffpatch。
    • 對于某些文件類型,可能生成較大的差異文件。

hdiffpatch:

  1. 基本原理:hdiffpatch 也將文件劃分成塊,找到匹配的塊,計算不匹配塊之間的差異,然后編碼差異文件。差異文件可以應用到原始文件上,生成新文件。

  2. 優勢

    • 高性能,生成和應用差異的速度較快。
    • 低內存占用,適合嵌入式設備等資源受限的環境。
    • 生成的差異文件通常較小,節省帶寬和存儲空間。
    • 支持多平臺,可在不同操作系統上使用。
  3. 劣勢

    • 可能不如 BsDiff 在某些文件類型上表現出色。
    • 開源實現相對較新,可能需要更多的定制和集成工作。

技術選型

考慮到本次方案將面向多種嵌入式設備arm和x86架構,我們決定采用 hdiffpatch 作為差異算法的核心。主要原因如下:

  1. 通用性:hdiffpatch 是一種通用性較強的差異算法,適用于各種嵌入式設備。這意味著我們可以在不同設備上實現統一的OTA升級方案,而不需要為每種設備單獨開發和維護不同的差異算法。

  2. 高性能:hdiffpatch 被設計為高性能工具,特別是在生成和應用差異數據時表現出色。對于無人車等對性能要求較高的設備,這一特點尤為重要,因為它可以加速升級過程,降低用戶設備的升級時間。

  3. 低內存占用:嵌入式設備通常擁有有限的內存資源,hdiffpatch 的低內存占用使其非常適合這些資源受限的環境。這將有助于確保升級過程不會占用過多內存,從而不影響設備的正常運行。

  4. 小差異文件:hdiffpatch 生成的差異文件通常較小,減小了升級包的大小。這對于需要在有限帶寬下進行OTA升級的設備(例如無人車)非常重要。

  5. 多平臺支持:hdiffpatch 支持多種操作系統和平臺,這意味著可以在不同嵌入式設備上使用,無論其運行的操作系統是什么。這種靈活性將簡化方案的部署和維護。

  6. 版本控制:差異算法允許進行版本控制,確保設備得到正確的升級。這在嵌入式設備的OTA升級中至關重要,因為需要確保安全性和正確性。

因此,通過采用 hdiffpatch 差異算法,我們可以實現一種通用、高性能、低內存占用的OTA升級方案,適用于多種嵌入式設備。這將有助于確保設備快速、安全地獲得最新的功能和修復,同時減小了部署和維護成本,提高了升級效率。

基本測試

升級示意圖

下圖展示了通過兩種方式,將圖1升級到圖片2升級的過程
在這里插入圖片描述

極端情況測試
  • 文件完全不一致

    在文件完全不一致的情況下,采用2張完全不一樣的圖片進行測試,1.jpg2.jpg 內容完全不一致,普通升級需要傳輸 596KB 數據,差分升級需要傳輸 488KB 數據。

    文件類型普通升級差分升級
    1.jpg629 KB629 KB
    2.jpg596 KB0 KB
    PATCHA文件0 KB488 KB
  • 文件增量

    在文件增量情況下,采用2份txt文件進行測試,2.txt1.txt 基礎上進行了字符串增加,普通升級需要傳輸 119KB 數據,差分升級僅需要傳輸 0.11KB 數據。

    文件類型普通升級差分升級
    1.txt11.9 KB11.9 KB
    2.txt119 KB0 KB
    PATCHA文件0 KB0.11KB

參考資料

  • 項目地址

    https://github.com/sisong/HDiffPatch/releases/tag/v4.6.7

  • SDK

    linux64

    arm64

    android

    windows64

    source code

  • java參考代碼

    HDiffPatch 的官方實現是基于 C/C++ 的庫。雖然它沒有官方的 Java 實現,但你可以通過 Java 的 JNI(Java Native Interface)機制來調用 C/C++ 庫中的函數。以下是一個簡單的示例,演示如何使用 JNI 在 Java 中調用 HDiffPatch 的 C/C++ 函數。

    首先,需要編寫一個 Java 類,用于加載 HDiffPatch 動態鏈接庫并定義與 C/C++ 函數的映射。以下是一個示例 Java 類:

    import java.io.*;
    import java.nio.file.*;
    import java.nio.ByteBuffer;public class HDiffPatch {static {System.loadLibrary("hdiff");  // 請根據你的庫名稱進行修改}// JNI 聲明:生成差異數據private static native int createDiff(byte[] oldData, byte[] newData, byte[] diffData);// JNI 聲明:應用差異數據private static native int applyDiff(byte[] oldData, byte[] diffData, byte[] newData);public static void generateDiffData(String oldFilePath, String newFilePath, String diffFilePath) {try {byte[] oldData = Files.readAllBytes(Paths.get(oldFilePath));byte[] newData = Files.readAllBytes(Paths.get(newFilePath));byte[] diffData = new byte[Math.max(oldData.length, newData.length)]; // 設置差異數據的大小int result = createDiff(oldData, newData, diffData);if (result == 0) {Files.write(Paths.get(diffFilePath), diffData);System.out.println("差異數據生成成功!");} else {System.out.println("差異數據生成失敗。");}} catch (IOException e) {e.printStackTrace();}}public static void applyDiffData(String oldFilePath, String diffFilePath, String newFilePath) {try {byte[] oldData = Files.readAllBytes(Paths.get(oldFilePath));byte[] diffData = Files.readAllBytes(Paths.get(diffFilePath));byte[] newData = new byte[oldData.length + diffData.length]; // 設置新文件的最大可能大小int result = applyDiff(oldData, diffData, newData);if (result == 0) {Files.write(Paths.get(newFilePath), newData);System.out.println("差異數據應用成功!");} else {System.out.println("差異數據應用失敗。");}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {String oldFile = "old.bin";String newFile = "new.bin";String diffFile = "diff.bin";String restoredFile = "restored.bin";// 生成差異數據generateDiffData(oldFile, newFile, diffFile);// 應用差異數據applyDiffData(oldFile, diffFile, restoredFile);}
    }
    

    上述示例代碼假定你已經編譯了 HDiffPatch 的 C/C++ 動態鏈接庫(.so 文件),并將其放在正確的位置。你需要根據你的庫文件名和路徑進行修改。請注意,這是一個簡單的示例,你可能需要根據你的項目需求和環境進行更復雜的設置和錯誤處理。

  • c++參考代碼

    下面是一個基本的 C++ 示例,展示如何使用 HDiffPatch 來生成差異數據和應用差異數據以還原文件。請注意,HDiffPatch 需要在項目中添加相關的頭文件和鏈接到庫文件。

    #include <iostream>
    #include <vector>
    #include "HDiff/diff.h"  // 請根據你的項目實際情況包含正確的頭文件int main() {// 原始文件數據std::vector<uint8_t> oldData = {1, 2, 3, 4, 5};// 新文件數據std::vector<uint8_t> newData = {1, 2, 3, 9, 5};  // 更改第四個字節的值// 差異數據存儲std::vector<uint8_t> diffData;// 生成差異數據int result = create_diff(oldData.data(), oldData.size(), newData.data(), newData.size(), diffData);if (result == 0) {// 差異數據生成成功,你可以保存它或傳輸給其他設備std::cout << "差異數據生成成功!" << std::endl;} else {std::cout << "差異數據生成失敗。" << std::endl;return 1;}// 還原新文件std::vector<uint8_t> restoredData;restoredData.resize(oldData.size() + diffData.size());result = apply_diff(oldData.data(), oldData.size(), diffData.data(), diffData.size(), restoredData.data(), restoredData.size());if (result == 0) {// 新文件已還原,你可以保存它std::cout << "新文件還原成功!" << std::endl;} else {std::cout << "新文件還原失敗。" << std::endl;return 1;}return 0;
    }
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162639.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:一文讀懂智能指針

C11 引入了 3 個智能指針類型&#xff1a; 當使用智能指針時&#xff0c;我們首先需要包含 memory頭文件&#xff0c;這個頭文件包含了 C 標準庫中智能指針的定義。 1.std::unique_ptr<T> &#xff1a;獨占資源所有權的指針。 2.std::shared_ptr<T> &#xff1a;共…

【數據結構初階(4)】棧的基本操作實現

文章目錄 Ⅰ 概念及結構1. 棧的概念2. 棧的操作 Ⅱ 基本操作實現1. 棧的定義2. 初始化棧3. 元素入棧4. 元素出棧5. 獲取棧頂元素6. 獲取棧中有效元素個數7. 判斷棧空8. 銷毀棧 Ⅰ 概念及結構 1. 棧的概念 棧&#xff1a;棧是一種特殊的線性表&#xff0c;其只允許在固定的一端…

STM32分區跳轉問題

項目場景&#xff1a; 在OTA中&#xff0c;FLASH通常被劃分為以下幾種類型 bootloaderiapappbootloaderappapp保存區bootloaderapp1app2 不同的分區方式有不同的有點&#xff0c;但是共同點都是需要執行分區跳轉 問題1描述 但在分區跳轉過程中遇到過使用不同的編譯器不能跳轉…

Java,泛型

目錄 泛型的理解&#xff1a; 在ArrayList中使用泛型&#xff1a; 在Map中使用泛型&#xff1a; 在接口中使用泛型&#xff1a; 自定義泛型類/接口與自定義泛型方法 自定義類/接口&#xff1a; 關于泛型類的子類&#xff1a; 注意點&#xff1a; 注意點&#xff1a; 自…

MATLAB實現灰色預測

久違了&#xff0c;前段時間由于學習壓力大&#xff0c;就沒怎么更新MATLAB相關的內容&#xff0c;今天實在學不進去了&#xff0c;換個內容更新一下~ 本貼介紹灰色預測模型&#xff0c;這也是數學建模競賽常見算法中的一員&#xff0c;和許多預測模型一樣——底層原理是根據已…

監控員工上網有什么軟件丨三款好用的員工上網管理軟件推薦

監控員工上網行為是企業管理中不可或缺的一部分&#xff0c;因此&#xff0c;選擇一款好的監控員工上網的軟件至關重要。目前市場上存在多種監控員工上網的軟件&#xff0c;它們具有各種特點和功能&#xff0c;但企業需要仔細評估和選擇。 一、域之盾軟件 這是一款優秀的監控員…

利用GenericMenu創建上下文菜單或下拉菜單

使用GenericMenu 創建自定義上下文菜單和下拉菜單豐富自己的編輯器功能。 GenericMenu 介紹 變量 allowDuplicateNames 允許菜單具有多個同名的菜單項。 公共函數 AddDisabledItem 向菜單添加已禁用的項。 AddItem 向菜單添加一個項。 AddSeparator 向菜單添加一個分隔符項…

grafana二次啟動失敗

背景 安裝grafana后啟動使用正常&#xff0c;但是關機后再啟動顯示啟動失敗&#xff0c;但是看日志又沒有報錯信息&#xff0c;但是就是啟動不了 原因分析 其實是/var/lib/grafana/grafana.db文件損壞了&#xff0c;所以需要把這個文件刪掉之后重新啟動就正常了&#xff0c;…

如何在AppLink配置金蝶云星空預算使用單流程

上一篇有提到金蝶云星空如何通過AppLink平臺配置銷售訂單操作&#xff0c;這次來演示下如何“保存預算使用單”、“調撥單定時自動審核”以及“預算使用單反審核后刪除”操作。 根據請求數據保存預算使用單 當webhook接收到數據時觸發流程 步驟1&#xff1a;根據webhook的請…

OpenGL YUV 和 RGB 圖像相互轉換出現的偏色問題怎么解決?

未經作者(微信ID:Byte-Flow)允許,禁止轉載 文章首發于公眾號:字節流動 早上知識星球里的一位同學,遇到 yuv2rgb 偏色問題,這個問題比較典型,今天展開說一下。 省流版 首先 yuv2rgb 和 rgb2yuv 之間的轉換要基于相同的標準,轉換使用不同的標準肯定會引起偏色,常見的…

短視頻矩陣系統源碼搭建部署分享

一、 短視頻矩陣系統源碼搭建部署分享 目錄 一、 短視頻矩陣系統源碼搭建部署分享 二、短視頻矩陣系統搭建功能設計 三、 抖音矩陣號矩陣系統功能設計原則 四、 短視頻矩陣開發部分源碼展示 很高興能夠幫助您&#xff0c;以下是短視頻矩陣系統源碼搭建部署分享&#xff1a…

怎么快速卸載office365

怎么快速卸載office365 根據官網提供的兩種解決方案即點即用或MSIMicrosoft Store 根據官網提供的兩種解決方案 官網地址&#xff1a;https://support.microsoft.com/zh-cn/office/%E4%BB%8E-pc-%E5%8D%B8%E8%BD%BD-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8#OfficeVersio…

sql經典練習(包括運行通過代碼)

建庫 導入數據庫并運行 # 學生表 Student&#xff1a; ? create table Student( ? SId varchar(10) , ? Sname varchar(10), ? Sage datetime, ? Ssex varchar(10)); ? insert into Student values(01 , 趙鐵柱 , 1990-01-01 , 男); ? insert into Student values(02 …

智能優化算法 | Matlab實現金豺優化算法(GJO)(內含完整源碼)

文章目錄 效果一覽文章概述源碼設計參考資料效果一覽 文章概述 智能優化算法 | Matlab實現金豺優化算法(GJO)(內含完整源碼) 源碼設計 %%clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000

PHP 正則式 全能匹配URL(UBB)

PHP 正則式 全能匹配URL&#xff08;UBB&#xff09; 語言&#xff1a;PHP 注明&#xff1a;正則式 無語言限制&#xff08;js、PHP、JSP、ASP、VB、.net、C#...&#xff09;一切皆可。 簡介&#xff1a;PHP UBB 正則式 全能匹配URL 自動加超級鏈接。網上找了很多都不匹配或…

數字化轉型過程中面臨最大的問題是什么?如何借助數字化工具實現快速轉型?

在科技快速發展的時代&#xff0c;數字化轉型已經成為企業的重要戰略。當企業努力適應數字化時代并取得成功時&#xff0c;他們可能會面臨各種必須有效應對的挑戰。   數字化轉型不僅僅是將新技術應用到企業的運營中&#xff0c;還需要對企業的運營方式、與客戶的互動方式和價…

數字人直播系統開發要注意的陷阱

數字人做為元宇宙的底層基座&#xff0c;BAT都在跑步進場&#xff0c;目前具有前瞻性的公司都在布局數字人產業。數字人可以應用于很多業務場景&#xff0c;對今年來說&#xff0c;無疑數字人直播系統是最火的。像去年數字人直播SAAS系統定制開發的話沒有個百把萬是下不來的。但…

求臻醫學六周年,我們的故事值得被記錄

6載光陰求臻醫學持續以科技創新推動產業升級在腫瘤精準診療領域持續深耕致力于為腫瘤患者生命續航每一位求臻人都是我們前進的力量也是我們不斷創新的源泉我們不拘泥于一種聲音以多元化的視角探索前行

app小程序定制的重點|軟件定制開發|網站搭建

app小程序定制的重點|軟件定制開發|網站搭建 App小程序定制開發是近年來快速發展的一項技術服務&#xff0c;隨著移動互聯網的普及和用戶需求的不斷升級&#xff0c;越來越多的企業和個人開始關注和需求定制化的小程序開發。那么&#xff0c;對于app小程序定制開發來說&#xf…

基于枚舉實現的橋接模式

基于枚舉實現的橋接模式 這里是基于枚舉方式來維護的橋接模式&#xff0c;維護抽象化和實現化的關系。 橋接模式的應用場景&#xff1a; 當一個類內部具備兩種或多種變化維度時&#xff0c;使用橋接模式可以解耦這些變化的維度&#xff0c;使高層代碼架構穩定。 橋接模式通常…