当前位置: 首页 > news >正文

差分升级在物联网水表上的实现与应用(学习)

摘要

当越来越多的物联网水表加入抄表系统后,实现了水表数据的信息化,并且当水表终端需要技术更新时,通过网络方式来升级产品可以高效修复设备面临的问题,减少用户损失,降低维护成本,但同时也对有限的网络资源形成负担。

当前终端的无线远程升级技术多采用单一的整包升级策略,存储空间占用率高,网络资源占用量大,升级成功率不高。

针对上述问题,引入了应用于Android端的开源差分算法HdiffPatch,介绍了差分升级在物联网抄表系统中的实现架构和方法,并通过重编译实现算法在Windows服务器端及嵌入式水表终端的应用。

引言

物联网水表指的是在计量基表的基础上,加入无线远传模块(GPRS、NB-IoT等),组成的新型智能水表,它实现了集流量计量、流量采集、数据存储及无线传输于一体的强大功能。

当越来越多的物联网水表加入抄表系统后,对用水片区的水量管理及数据分析提供了可靠的依据,为用户用水行为管控提供了及时有效的操作机制,也为水表设备运行的远程监测提供了方便的平台,但同时也对抄表系统的网络带宽提出了一定的要求。

当设备投入市场之后,由于相关技术的迭代,设备运行可能会暴露其软件代码中的某些致命弊端;由于客户需求更新,设备软件需要升级以增加或者修改原来的功能。

当物联网设备投入市场后,厂家开发安全有效的空中升级方案,只需要在网络平台上把升级软件通过无线方式下发给设备,实现设备中的可执行代码更新。

无线升级面临着几个考验:

  1. 网络平台资源紧张,尤其对物联网水表等这类小设备,有些运营商限制了其网络端口并发量,因此空中升级庞大的数据流量会引起网络拥塞,造成升级失败;
  2. 物联网设备多采用电池供电,尽量保持低功耗是保证其寿命的重要手段,空中升级的有限速率导致电池供电设备对耗电极为敏感。
  3. 受网络信号的影响,当无线升级失败时,想要设备继续进入运行状态,必须对接收到的新代码另行存储,以避免对原代码的覆盖,并且要具备重传机制,待网络稳定时,从断开处开始传输,避免重新传输,造成资源浪费。
  4. 当更新数据量大时,对设备 CPU 的 FLASH 空间及 RAM 提出了更高的要求[3]。

目前国内外固件设备的无线升级方案按照实现策略可分为整包升级和差分升级。

整包升级需要将新版本的完整软件包进行打包,设备接收完所有升级包,经过校验算法验证包的有效性和完整性后,替换旧版本的应用代码。

整包升级的方式接近于整个固件的镜像,操作简单,易于实现,对网络平台及设备端的设计实现要求不高。

差分升级算法

差分升级又叫增量升级,是将固件的新旧版本的程序数据文件做差异,形成升级需要增量包,而对于两个版本中相同部分则不需要做升级处理,以此通过传输更少的数据实现同样的升级效果。

在实现架构上,差分升级系统需要在升级服务器侧和终端设备上分别部署差分算法,服务器比较新版本文件对旧版本文件所作的修改,并通过差分算法对这些数据以特定的格式打包、优化压缩,形成差分文件(patch文件);然后通过指定的协议,设备端接收完该差分文件,校验完成后,利用差分算法还原差分文件,并通过组合旧版本程序文件,得到目标数据文件,实现升级。

在这里插入图片描述
显然,经过服务器侧后生成的patch文件,远远小于新版本程序文件,而对于固件资源受限的设备终端来说,如何寻找一种高效的差分算法,实现以最小数据量来描述差分信息,并且以有效稳定的方法进行信息传递和文件还原,是差分升级的重要研究内容。

在构造差分增量包中,常见的算法有Bsdiff算法、Xdelta算法、Hdiffpatch算法等。

Bsdiff算法

在匹配新旧文件过程中,有部分源代码内容完全相同,有部分源代码相似度很高,只有部分字节作了稀疏改动,另有一些源代码内容相同,但是存储地址存在一个固定的偏移量,对于这一特性的源代码数据,具有高度的可压缩性。Bsdiff算法引入了diff string的概念,在新旧文件中找到这样的两部分内容,求出字节的差异,作为diff string进行压缩。而对于不符合要求的新文件源码中新增部分,作为extra string进行保存。

Bsdiff算法在匹配时,先对旧文件的所有字符进行后缀排序形成一个字典,然后使用二分查找算法找到最优的匹配长度,依次得到整个文档所有的diff string和extra string,把这些文件信息以bzib2的方式压缩成升级增量文件。

Bsdiff算法的增量文件中的数据由四部分组成:Header,ctrl block,diff block,extra block。

  • Header 头文件包含了目标文件的起始地址,新文件大小,控制长度等。
  • ctrl block提供控制部分信息,指示旧文件中保留的长度,以 及 需 要 从 diff block 和 extra block 中提取的信息,在旧文件中信息的地址偏移量等。
  • diff block,extra block 分别包含所有的 diff string和 extra string。

设备端在接收到patch文件后,解压文件,并根据差分文件的组成格式,通过bspatch算法,还原生成新文件。

由Bsdiff算法原理可知,它所生成的patch文件并不会比源文件小,但是文件结构压缩性强,导致传输的升级数据量比完整升级要小很多,有效减少了冗余数据传输量。Bsdiff 算法高度依赖压缩算法,当升级文件修改的内容小概率地满足稀疏变化时,差分文件的压缩效率降低,相比整包升级的优势不明显。

Xdelta算法

Xdelta 和其他的差分升级算法一样,也需要对新文件和旧文件进行比较匹配作差分。在产生 patch 包时,Xdelta 可采用 hash 或者 suffix trees 等算法来寻找最大的匹配长度的字符串。

Xdelta 差分算法的 patch文件中用到了 add、run 及 copy 三种命令。其中 add 用于将匹配到的指定长度的字符串从源文件拷到目标文
件,run 用于在目标文件中加入新文件的增加部分,copy 将匹配到的文件成块的移动到目标文件中的目标地址上。

Xdelta 对增量文件采用 Vcdiff 格式的编码方式,用 128 进制的数据表示形式,经过重编码的字符,相较于原数据节省了存储空间,达到了高效压缩的目的[9]。

Xdelta 算法的 patch 生成过程可通过其他算法来优化,考虑到设备端的内存消耗,patch 过程引入了Windows 块技术,随着 Windows 块变大,可达到的最长字符串的匹配结果越精确,产生的 patch 文件越小,但同时也会消耗更多的内存资源。因此,采用高效的匹配优化算法和适合的 Windows 块大小,是 Xdelta 算法的关键。

Hdiffpatch

Hdiffpatch是一种高效的增量算法,在运行时间复杂度及内存空间占用率上相较于前两种算法存在很大的优势。

Hdiffpatch在差异文件生成阶段引入了覆盖线C的概念,用于标志新旧版本文件的匹配度。

算法将两版本程序文件看成两个具有不同长度的数组,分别表示newData[m]和oldData[n]。

覆盖线C是点Ei.jj的集合,其中newData[i] = oldDta[j]。
如果C = {Ei,j,Ei+1,j+1,…,eI+K,J+K},表示该覆盖线的长度为k。
由此可知,经过匹配之后存在许多长度不等的覆盖线,根据差分包制作经验,当覆盖线长度大于7时,增量算法优势明显。
patch文件就是所有满足要求的覆盖线和newData[m]中没有被匹配上的数据组成的文档。

其中覆盖线表示信息结构包括:newPos,表示在新文档中的起始位置i;oldPos,表示在旧文件中的起始位置j;length,表示覆盖线长度k。

Hdiffpatch算法对匹配的覆盖线采取优化措施。其中包括:

  1. 覆盖线包含。如果覆盖线a被另外一条完全包含,则在C中删除a信息,以减小重复信息来简化差分文件。
  2. 覆盖线合并。对于在一条直线上的两段覆盖线,如果它们之间的间隔长度小于某一值,则把这两条覆盖线合并成一条,其中的延长部分数据作为patch文件的一部分。
  3. 覆盖线删除。对于某些单独的覆盖线,做扩展成本比较大,无法进一步优化,在patch文件生成时,对此进行直接删除,以减小存储及升级的控制代价。

差分升级的实现

Hdiffpatch算法产生了较小的升级包,当水表终端接收到升级包并且还原成最新文件后,需要对控制CPU中的执行代码进行更新升级。

本方案中采用的智能水表终端使用 STM32L071,其具有 192KB 的 FLASH,6KB 的片内 EEPROM,20KB的 RAM,能够实现多种低功耗运行模式,完全满足智能水表终端在实现流量数据计量、存储及与无线服务器通信功能的基础上,加入差分升级的功能。

而在加入差分升级之后,bootloader 中还将包含 Hdiffpatch 算法及与服务器进行patch 差分包传输通信所有流程。

由于在 Hdiffpatch 算法中需要在旧文件的基础上作新程序文件还原,因此会存在两个版本的文件同时存在于 FLASH 的情况,这对于升级失败时,设备还能继续正常运行起到保障作用。对于 CPU 的存储区,水表终端作了如下划分[14]:
在这里插入图片描述
终端升级流程实现
终端升级实现是差分升级系统中的关键部分,它负责增量升级文件的接收、差分算法的还原及固件的更新。

基于终端控制器CPU的RAM区容量的限制,水表设备不能一次性接收升级文件,而是采用分帧多包的模式。
当所有帧都接收完全后,CPU按照Hdiffpatch算法的patch文件格式解析文档,进行算法还原。

在这里插入图片描述
本方案的协议采用的关键技术包括:

  1. 升级协议起始帧包含了本次升级的新软件版本号、升级的总包数及升级文件的总校验码。终端通过接收下发的版本号与当前的版本号对比,选择是否停止接收、完全接收或断点续传。文件总校验码用于在终端接收完升级文件后,判断文件的有效性。
  2. 水表终端根据总升级包数,向服务器逐条申请升级包,并对接收到相应的升级包进行包序号和校验码的判断。当出现接收超时或者存储空间无法容纳接收的数据时,终端会向服务器发出警告或者请求重传数据。
  3. 水表终端在请求升级数据包时,对每一步的操作进行记录,以实现断点续传的可操作性。
  4. 终端接收完升级文档后,通过Hdiffpatch还原算法,在FLASH的新程序存储区形成新版本代码后,通知服务器,并实行升级操作。服务器监控整个空中升级流程,对水表终端的升级状态也能实时反馈,提高了升级的可控性。

终端升级的低功耗设计

物联网智能水表使用一次性锂电池供电,保证安装及使用的便捷可靠。

在应用程序中,终端控制器合理使用 NB-IoT 的工作模式,并根据使用场景对表计量的频度和方法进行控制,既满足了客户的使用要求,又相对延长了产品电池使用寿命。

空中升级的使用频率相对较低,但是它一次使用的耗电量在所有应用功能中是最大的。
因此,如何采用合理的手段规避不必要的电耗也是空中升级系统要考虑的一个问题。

本方案采用Hdiffpatch算法来产生差分升级文件patch,在很大程度上缩小了空中升级的数据传输量,拉低了升级操作的总耗电量,成为降低升级功耗的关键技术。

升级一开始,服务器查询设备端当前软件版本号,如果与要下发的版本号一致,则认为没有升级的必要,退出升级操作。
这种架构,仅用一个交互信息就实现了升级流程走向,避免了不必要的传输步骤。

当空中传输过程出现网络故障时,终端收不到正确的服务器数据后,在连续申请三次升级包后,设备为了节省电耗,进入休眠模式。
待下一周期,网络恢复后,设备不需要重复传输已经接收完的数据包,而是进入断点续传,减少了冗余的操作,简化了升级步骤

相关文章:

差分升级在物联网水表上的实现与应用(学习)

摘要 当越来越多的物联网水表加入抄表系统后,实现了水表数据的信息化,并且当水表终端需要技术更新时,通过网络方式来升级产品可以高效修复设备面临的问题,减少用户损失,降低维护成本,但同时也对有限的网络…...

ubuntu磁盘管理

show partition information 挂载设备在这 显示文件系统信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用:将/dev/nvme0n1p4 格式化为 ext4 建立交换分区 mkswap -c -v1 /dev/nvme0n1p4 102400-c:check -v1:新版交换分区 -v0&…...

前端处理后端返回的数据中有\n\n字样的换行符标识

后端返回的数据: 上面圈着的部分就是\n,前端需要将数据进行换行,对于这类型的数据,在前端页面是需要进行稍微处理才能正常显示。如果没有经过处理,那么内容是不会在有换行符的位置进行换行显示的 解决办法1&#xff1…...

matlab解常微分方程常用数值解法2:龙格库塔方法

总结和记录一下matlab求解常微分方程常用的数值解法,本文将介绍龙格库塔方法(Runge-Kutta Method)。 龙格库塔迭代的基本思想是: x k 1 x k a k 1 b k 2 x_{k1}x_{k}a k_{1}b k_{2} xk1​xk​ak1​bk2​ k 1 h f ( x k , t …...

数据结构-栈(C语言简单实现)

简介 栈是一种数据结构栈可以用来存放数字一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字栈里到的数字有前后顺序,先进入到的数字在前,后进入的数字在后每次从栈里获取的数字一定是最后面的数字,最后获取的数字一定是…...

山东布谷科技直播软件源码探索高效、稳定直播传输的技术介绍:流媒体传输技术

今天我们探索的是让直播软件源码平台在直播时能够高效、稳定的进行直播传输的技术,而这个技术就是直播软件源码平台的流媒体传输技术,在直播软件源码平台中,流媒体传输技术会将直播的图像、视频、音频等相关的流媒体信号通过网络传递到用户的…...

LeetCode 热题 100 JavaScript -- 74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 …...

任我行 CRM SQL注入漏洞复现(HW0day)

0x01 产品简介 任我行CRM(Customer Relationship Management)是一款专业的企业级CRM软件,旨在帮助企业有效管理客户关系、提升销售效率和提供个性化的客户服务。 0x02 漏洞概述 任我行 CRM SmsDataList 接口处存在SQL注入漏洞,未…...

[CKA]考试之集群故障排查 – kubelet故障

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 一个名为wk8s-node-0的节点状态为NotReady,让其他恢复至正常状态…...

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式

【分享成果,随喜正能量】唯有梦想才配让你不安,唯有行动才能解除你的不安.绳锯木断,水滴石穿。也许你现在做的事情很小,只要你能日积月累的坚持下去,才会发现意义非凡。所谓的成功,便是别人失败的时候你还在…...

ORB-SLAM2第一节---单目地图初始化

单目初始化 1.前提条件(640*480) 参与初始化的两帧各自的特征点数目都需要大于100.两帧特征点成功匹配的数目需要大于或等于100.两帧特征点三角化成功的三维点数目需要大于50. 2.针对条件三 流程如下 记录当前帧和参考帧(第一帧&#xff…...

Postman 汉化及下载

Postman 是一款常用的 API 测试工具,可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化,包括每个步骤的详细说明。 下载安装 Postman 1、打开浏览器,访问 Postman 官网,下载适用于自己系统的…...

【运维】Zabbix简介及其应用领域

文章目录 1. Zabbix的背景与起源1.1. 监控工具的重要性为什么企业和个人需要监控工具?常见的监控挑战与需求 1.2. Zabbix的诞生背景Zabbix的发展历程Zabbix与其他监控工具的对比 2. Zabbix的核心功能2.1. 数据收集支持的数据收集方法数据的存储与历史记录 2.2. 可视…...

vue 设置了表单验证的el-input,在触发验证后无法继续输入的问题解决

问题表现 在项目中碰到的问题&#xff0c;说是input框出现验证提示后&#xff0c;该框就无法输入新的数据了 下面是我的代码&#xff1a; // dom结构 <el-form ref"addForm" :rules"addFormRules" :model"addForm" label-width"100px&…...

基于smardaten无代码开发智能巡检系统,让无人机飞得更准

目录 引言需求背景搭建思路开发过程&#xff08;1&#xff09;无人机设备数据接入&#xff08;2&#xff09;无人机巡检任务管理&#xff08;3&#xff09;无人机三维防控监视&#xff08;4&#xff09;运防一体化大屏设计&#xff08;5&#xff09;异常告警管理&#xff08;6&…...

51项目——智能垃圾桶

51项目——智能垃圾桶 文章目录 51项目——智能垃圾桶项目需求项目材料(实物图可以百度看一看)接线实战编写部分代码(需要打包好的代码可以私我)效果视频结束项目需求 人靠近,垃圾桶开盖,投放垃圾,人离开,垃圾桶自动关盖。 并屏幕显示距离,和垃圾桶开关的状态。 项目材…...

HCIP——堆叠技术

堆叠 一、简介二、堆叠的优势1、提高可靠性2、简化组网3、简化管理4、强大的网络拓展能力 三、堆叠的方式1、堆叠卡堆叠2、业务口堆叠 四、堆叠的原理1、角色2、单机堆叠3、堆叠ID4、堆叠的优先级5、堆叠的建立过程 五、堆叠的配置 一、简介 堆叠技术 — 可以将多台真是得物理…...

芯片工程师求职题目之CPU篇(3)

1. 什么是cache(缓存)&#xff1f;它的工作原理是什么&#xff1f; Cache是少量的快速内存。它位于主存储器和中央处理器之间。每当CPU请求memory位置的内容时&#xff0c;首先检查cache中是否有此数据。如果数据存在于cache中&#xff0c;CPU直接从cache中获得数据。这是更快…...

Grounding dino + segment anything + stable diffusion 实现图片编辑

目录 总体介绍总体流程 模块介绍目标检测&#xff1a; grounding dino目标分割&#xff1a;Segment Anything Model (SAM)整体思路模型结构&#xff1a;数据引擎 图片绘制 集成样例 其他问题附录 总体介绍 总体流程 本方案用到了三个步骤&#xff0c;按顺序依次为&#xff1a…...

如何选择更快更稳定的存储服务器

选择更快、更稳定的存储服务器需要考虑以下几个方面&#xff1a; 存储介质&#xff1a;存储服务器的主要存储介质包括固态硬盘&#xff08;SSD&#xff09;和机械硬盘&#xff08;HDD&#xff09;。相比于机械硬盘&#xff0c;固态硬盘具有更高的读写速度和更低的延迟&#xf…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...