精华内容
下载资源
问答
  • 智能网联汽车的OTA升级方案,详细讲解了云端,终端,要实现OTA升级需要实现的技术,想了解OTA升级的朋友,看此文就可以待大家基本了解OTA升级了。
  • 远程FPGA在线升级方案

    2018-10-30 20:44:06
    远程FPGA在线升级方案,需要的朋友可以下载参考哈,。
  • 方案为本人将近两个月的思索改进成果,文档由一开始的创建到升级功能的一步步增加,最终完成了方案明确,思路明确,格式正规,考虑周全的文档
  • 移动网关架构升级方案--泛化service解耦 - 架构升级。
  • 写的应用程序自动升级完整方案(源码),更换成自己的ftp服务地址、端口、用户、密码后即可使用,updateTest为ftp服务器端放置的升级文件,内含QNetworkAccessManager批量下载示例,启动外部exe,文件拷贝删除相关操作...
  • WebLogic 12c(12.2.1.2)升级方案:从weblogic 8.1升级到最新版本 12.2.1.3
  • 方案中详细介绍了某大型企业的exchange升级方案,对于升级规划和升级步骤都有清晰介绍,是实施该类方案的非常好的参考书。
  • HDP安装升级方案-初版

    2015-11-21 13:16:29
    通过Ambari安装HDP,以及对应的滚动升级HDP方案和手动升级HDP方案;手动安装HDP,以及对应的升级HDP方案;其中包含了安装失败处、升级回退的机制和处理方案。主要包括下面几个部分:基础环境的安装与配置,安装方案...
  • 工业以太网交换机升级方案doc,提供“工业以太网交换机升级方案”免费资料下载,主要包括工业以太网概况 、工业以太网升级必要性、升级前准备、升级方法及步骤、升级实施计划表等内容,可供学习使用。
  • SVC微码升级方案

    2013-10-09 09:40:34
    【项目名称】 广东移动企业级处理中心SVC微码升级方案 【变更简介】 将4节点SVC的微码由 V6.2.0.5 在线升级到 V6.4.1.5 V6.2.0.5补丁的描述如下:
  • STM32 IAP升级方案 完全教程 详细的讲述了如何一步一步的进行IAP工程的移植
  • ESXi_server的在线升级方案,比较有用的资料。
  • 灰度升级方案

    千次阅读 2019-02-26 18:06:44
    monitor灰度升级方案如下: 首先,需要push服务器做配合,因为monitor主要是用来管理push,没有push的支持,也很难测试monitor的功能。 比如有5台push服务器,那么拿出2台push配合monitor做灰度升级。 如果...

    首要目的:利用线上服务器、线上数据,做系统的测试(主要是功能测试)。

    其他目的:利用线上服务器、线上数据,做一个特殊用途的应用(只是客户端不一样,内部处理流程都和正式系统一样)。

     

    必要原则:

    1、灰度系统的主要程序流程和正式环境一样,否则灰度系统没有测试和验证的意义

    2、从灰度环境,不用再次上线,能够快速地切换到正式环境

     

    关键思路:

    1、把少部分数据引入灰度系统,数据的结果不影响正式系统。

        限定这一部分数据,只能由某些服务器处理。

    filter端:比如有5台服务器,其中2台为灰度用。这两台灰度filter只处理指定的部分数据,其他数据交给非灰度filter服务器去处理。这种方案有严重的性能问题。假如每台filter每秒处理2000条数据,那么这种方案下,灰度filter的2000条数据就要通过http转发给正式filter去处理,每秒都会发送2000条数据,kafka是高性能的消息处理系统,但是filter不是,kafka有能力每秒钟给filter传2000条数据,但是filter不是专业的MQ,它没办法有效的保证每秒把2000条数据传给另一个系统。

    所以要换种思路:filter做灰度的意义何在?filter本来就是一个简单系统,一旦做好之后,核心功能很少会有变更。唯一变更得可能多一点的是筛选逻辑,而这个逻辑,只需要一个类实现一个接口就搞定。也就是说,filter的上线,基本上就是更新这个接口的实现类。

     

    再说一种更好的思路:filter不是数据的入口,filter的上游数据源才是。我们目的是限制某台filter只处理特定数据,换种思路,我们只给这台filter特定数据那不就完了。只是数据源变了,filter内部逻辑全都不变。

     

    再换一种思路:切换一下filter的配置,让灰度filter只处理某些app的数据,而非灰度filter不处理这些app的数据。则只需要灰度filter跟非灰度filter的kafka groupId不一样即可。

     

    2、最终数据流出可控。

    单独拿一台push做灰度用,monitor控制指定app固定分配到这台push上。这台push不加入push集群,单独存在,它也不在monitor监控范围,没有负载均衡、故障转移等功能。

    这台push在monitor做任务分配时,需要特殊处理。其他地方都和正常的push一样对待。

     

    3、monitor升级方案

    minitor如果要做灰度升级也可以,但是比较麻烦。关键是,monitor值不值得做灰度升级,有没有必要?

    -- monitor的核心功能稳定之后,应该不会有大的改动,如果要改,多半也涉及集群,很难将单台monitor独立工作。

    monitor灰度升级方案如下:

    首先,需要push服务器做配合,因为monitor主要是用来管理push,没有push的支持,也很难测试monitor的功能。

    比如有5台push服务器,那么拿出2台push配合monitor做灰度升级。

    如果有4台monitor服务器,拿出其中2台monitor做灰度升级。

    拿出来的2台push和2台monitor组成一个灰度环境集群。剩下的3台push和2台monitor继续提供正常服务。

    等灰度环境的monitor和push验证OK后,再无缝切换成正式服务,切换方法:

        将灰度环境的monitor和push停掉,然后启动monitor和正常服务的另外两台组成4台monitor的集群(此时leader仍在旧monitor上)。然后启动push,然后关闭另外两台没有更新的monitor(此时leader转移到新monitor上),然后更新停掉的这两台monitor并启动重启。

     

    最终方案:

    分步实现,在第一期的方案里面,我们只实现filter的灰度升级。具体如下:

    一期方案:实现filter的灰度升级,保证filter的逻辑可以通过灰度环境去验证,灰度的控制级别是appId级别。

    二期方案:实现push的灰度升级,特定app的数据可以固定到灰度push服务器去处理。同时monitor做配合改造。

    三期方案:实现monitor的灰度升级,以及monitor+push的同时升级。push做配合改造,(kop做配合测试)。

     

    一期方案内容:

    首先,filter数据筛选模块,做成组件化,甚至热加载,新增数据筛选项,只需要在原有filter的基础上增加一个jar包即可。这样对filter改动小,且不影响已有功能。

    其次,定义一台灰度filter,灰度filter跟非灰度filter的kafka groupId不一样,各消费各的,但是让灰度filter只处理某些app的数据,而非灰度filter不处理这些app的数据。

     

    二期方案内容:

    定义一台灰度push,控制monitor只给灰度push分配特定appId的数据。需要在monitor分配app任务时,加一个类似于AOP的拦截,在统一配置中心里面配置。

     

    三期方案内容:

    定义一组monitor和push组成灰度环境集群,与正常服务的monitor和push在不同的集群下面。人工或者利用灰度KOP给灰度monitor引入特定的测试APP,验证OK后再将灰度环境无缝切换成正式环境。

     

    展开全文
  • 关于对XXX项目XXX软件进行变更/升级的部署方案 1涉及升级设备与停机业务名称 序号 设备名称/型号 业务名称 数量台 01 02 2参与人员 序号 人员 单位 主要工作 备注 01 业主 02 业主 03 监理 04 施工 05 厂商 06 施工 ...
  • 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C /S结构的程序可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素。有很多企业用户就是...
  • 最近不少人问我如何给单片机升级,如何给arm板升级。也有些人说网上很多工具可以参考或者移植。我当时回答时,如果做功能,自己想怎么玩即可,如果要做成量化的产品最好自己做一套协议。 因为应用场合不同,对于...

    描述

           最近不少人问我如何给单片机升级,如何给arm板升级。也有些人说网上很多工具可以参考或者移植。我当时回答时,如果做功能,自己想怎么玩即可,如果要做成量化的产品最好自己做一套协议。

        因为应用场合不同,对于一些特殊的功能尽量还是要在可控制中。移植不一定适合所有平台资源。所以我分享了我自己实现过的一套方案。

     

             本文档主要描述其他平台采用uart给单片机升级方案。可以用于pc给pc,pc给其他处理器平台参考,同时通讯接口可以采用网络,无线,uart,i2c,spi等,都可以参考,不受限底层物理通讯工具。

        同时基于此文档,可以加深底层通讯理解,文件理解,底层逻辑配合理解,理解产品和功能的不同。

         文章大致可分为以下几个步骤:

    1. 方案实际案例的需求描述;
    2. 方案描述;
    3. 升级端实现方案描述;
    4. 被升级端实现方案描述。

    详细如下:

     

    方案案例需求

    当前需求实现采用一款linux终端对挂载uart485端口下的各个控制模块进行在线升级(是否类似于物联网、工业\民用仪表现场、楼宇自动化等)。
        升级时间尽量短,不能由于一个模块没有升级影响使用,甚至影响整个linux终端或者其他完成升级的模块使用。
                                                                             


        根据上述总体需求,则拆分出的硬件需求是保持线路稳定,尽量不要破坏升级环境,带来升级失败,且各个模块独立,这些其实如果模块做到了独立即可,只需要总线匹配即可,所以不需要累述。
        拆分出的软件的需求是:

    •     能实现1对1升级;
    •     能实现1对多升级;
    •     能实现部分升级失败后,未升级成功的模块仍能使用;
    •     未升级的模块和升级的模块相互不干扰;
    •     升级速度尽量快,保证现场尽快恢复。

    三、    方案描述

                                                                                                             

     

              如上图所示,一个bin文件告知升级平台后,升级平台会将此文件解析出有效数据,然后将此类数据进行重新解析编译,得出相应的帧数,将数据下发给单片机部分。单片机获取到数据后,校验正确后,烧录到flash中,如果flash烧写并读取校验对比成功,证明一帧数据烧写完成,将对应的状态位置1.
           考虑到1对多情况,所以并不会每帧数据都是抄送的方式。


    四、    升级端实现方案


        所有文件皆数据,无论是音频也好,还是bin文件也好,最终是一个个二进制按照对应格式协议组成。升级即传输,将程序搬运到指定的地方。那么对于传输通讯而言,这些升级程序即一个个二进制数据。
        无论是任何通讯接口,多快多慢,在合理的协议下,都能将数据搬运成功,只是时间长短问题。
        当前升级端拿到文件后,首先需要获知这个文件有效数据,数据大小多少,并获取个一个相应的总校验字。然后根据被升级端的响应时间和存储性能来规划两个要素,一个是一帧大小是多少,决定当前文件可以划分多少帧;第二是每帧的间隔时间大致是多少。
        当升级端处理上述问题后,开始“传功”,不对是升级。首先逐个告诉被升级端“兄弟,可以高升了,新的技能有好大,我要分好多阶段传给你”;一旦它的各个兄弟回答“得了,my 师傅,开干吧”,那么升级端就会按照间隔时间节拍,逐帧打包校验字后发送,不需要任何应答,升级完成后,就会逐步扫描下面各个设备,“小弟1号,我的功夫得了几成,那个没有学到!”,对应设备就会应答“teacher,我已神功大成,可以陪你练了”,那么升级端就会找另外一个设备;如果设备应答了“teacher,这第二式俺不会!”,升级端会将第二帧数据重发,此时所有设备都会再次接受,其他没有接收到的也会更新当前现场,但是只有指定设备才会去应答。采用这样的方式,一次完成最终的升级。


        具体步骤如下:

    •     获取bin的大小,获取总校验字,并获取即将拆分的帧数;
    •     逐个告知要升级的设备即将升级,告知升级的大小,总校验字,和升级帧数。需要逐个告知,待对方应答了,再告知另外一个对象,确保每个待升级的设备准备升级,如果对方没有应答准备好,根据对应情况,可以判定此设备异常不需要升级,跳过;
    •     按照udp方式(无应答)逐帧按照一定的时间节拍发出去;
    •     发送完毕后,逐个设备查询应答方式检查是否接受完成;
    •     如果对应设备应答完成,则查询另外一个设备;
    •     如果对应设备未完成,会应答当前未接受到最小帧号;
    •     升级端就会将对应帧号发下去,坐等对应设备应答,在这个同时,其他设备也会同步接受,如果没有收到此帧号,就会更新,如果收到了,不处理;
    •     逐个帧号补差完毕后,跳入下个设备。

    五、    被升级端实现方案


        要完成设备在线升级,且升级出现异常后,还能运行最后一次成功程序,那么就有几个需求:
        第一,升级程序是独立的;
        第二,实际运行程序有两块存储地。
    硬盘的格式如下:
                                                    

        这里bootloader为升级对接的程序。即待升级平台上电程序就是它,如果没有当前没有需要升级模式,直接根据APP状态来切换即将运行的新程序。这里APP运行标志位即当前bootloader将跳入到那个APP存储地运行。
        APP存储地即存储实际运行程序的地方,有两个地方,一个存储,另外一个即升级备用,一旦一个升级成功,另外一个变成备用,升级时用那个也是APP运行状态来决定。

        这里只谈升级。所以步骤如下:

    •     进入升级模式,创建一个最大容量的升级状态字表;
    •     等待上位机找我升级确认;
    •     获取上位机的升级程序大小,程序的校验字,帧数后,应答ok;
    •     当上位机广播式发送数据时,逐帧接受数据;
    •     帧校验成功后,根据帧号,烧录到对应的flash地址中(可以按照扇区来操作,一般一个扇区对应一个帧号);
    •     烧录flash成功后,读取flash刚刚烧写的位置,对比烧录的内容和帧数据是否相同,如果相同,证明成功,将此帧号对应的升级状态字表对应位置1;
    •     当上位机发送查询命令时,如果查询不是当前设备则不应答;如果是当前设备则根据升级状态字表的最小未置位的位得出对应帧号应答给上位机;
    •     上位机补差帧号内容时,如果不是当前设备,则判断当前是否缺此帧,如果缺,则补齐,如果不缺不处理,但不应答;如果是当前设备,则接受,校验,烧录,烧录校验,然后成功后置状态字,应答下一个未接受到的帧号,如果失败则再次应答当前帧号;
    •     依照上述流程完成最终升级。
       

    总结

          要完成上述功能,以及以后产品迭代,第一协议不要随意更改,第二要有一个很好的协议业务关系。具体通讯协议,待有空更新分享一下。

          我有一个qq群,744140106.感兴趣可以撩一下。

     

    展开全文
  • Android 应用升级方案

    千次阅读 2017-03-16 15:16:48
    转:http://www.jianshu.com/p/abbaddcf449f ... 一、全量升级 全量升级Demo 现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:   当我们点击检查更新

    转:http://www.jianshu.com/p/abbaddcf449f

    http://blog.csdn.net/u013718120/article/details/53018801


    一、全量升级

    全量升级Demo

    现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:

                     

    当我们点击检查更新的时候,就会向服务器发起版本检测的请求。一般的处理方式是:服务器返回的App版本与当前手机安装的版本号进行对比。

    (1)如果服务器所返回的版本号大于当前App版本号那么此时手机所安装的App不是最新版。可以提示用户升级。

    (2)如果不大于当前版本号,可以提示用户为最新版本:

                   

    版本升级,也分为两种处理方式:

    (1)跳转到App某市场(例如:360手机助手),然后根据包名在市场定位到该App,通过市场下载更新安装。

    (2)在本App中实现Apk下载,下载完成后更新安装。

    本篇博客的内容将围绕如何实现Apk下载,下载完成后更新安装来展开。

    下面我将内容大致分为以下几个部分:

    (1)App版本检测

    (2)Apk下载

    (3)Apk更新安装

    (4)对以上功能进行封装

    基于以上4部分,我们逐一展开。

    1.App版本检测:

    要实现App的更新下载,我们上面介绍了,前提是服务器要保存一个App的版本号(通常的方式是保存versionCode,当然你要对比versionName也没关系)。当用户去手动检测版本,或者进入首页自动检测时,第一步是需要请求服务器的版本号,拿到版本号之后与当前App版本号(当前版本号可通过PackageInfo获取)进行对比。服务器返回的版本号大于当前App版本号,证明App已经有更新,那么进入第2步。

    2.Apk下载

    Apk文件是保存在服务器的。我们可以通过Http流将其下载到本地手机,然后更新安装。Android中下载的方式很多种:HttpUrlConnection,Retrofit,okHttp,以及Android原生的下载工具类DownLoadManager 等等。我们采用的方式是Google推荐的下载工具类DownLoadManager。关于DownLoadManager的使用其实很简单,简单概括如下:

    (1)通过getSystemService获取DownLoadManager。

    (2)初始化DownLoadManager的Request,构建下载请求。

    (3)调用DownLoadManager的enqueue异步发起请求,该方法返回值为标识当前下载任务的id,即downloadId。

    (4)当下载完成后,系统会发出条件为android.intent.action.DOWNLOAD_COMPLETE的广播,我们可以自定义广播接受器,然后在onReceive中处理下载完成的逻辑即可。

    详细使用方式大家可以参考网上的教程,此处就不再赘述。

    上面通过下载啰嗦了一堆。此时我们要想一个问题:当我们下载完成后,并没有安装。当用户再次进入App时该如何操作?

    有朋友会说,那就再去下载一次,然后继续执行更新安装呀!哈哈,这种方式是没有错误的,但是如果用户恶意行为,每次下载完成都不安装,那我们岂不是每次都要去下载100次,1000次。。(然后手机boom!!!)这种方式肯定是不能采用的。那么我们该如何解决呢?

    很简单,当我们在下载之前,先去指定的文件夹下查看有木有已经下载好的Apk,并且该Apk的版本是高于本App的版本,此时我们就去执行安装操作。如果上面条件不成立,此时再去执行下载操作。

    3.Apk更新安装

    相信大家对于如何安装一个Apk都比较熟悉吧,原理也是比较简单的。

    (1)通过downloadId获取下载的Uri。

    (2)将Uri设置到Itent的setDataAndType作为启动条件。

    (3)调用startActivity启动对应Intent即可。

    以上3步,即可完成App的更新功能。

    整体的流程很清晰:

    版本检测 → Apk下载 (检查是否存在未安装的Apk) → Apk安装 → 完成更新

    下面,通过代码来具体分析整个流程:

    关于App版本检测其实就是一个Http请求,不再多说。我们从Apk下载开始:

    上面我们提到,在下载之前需要去检测是否存在已经下载的Apk。通过什么获取呢?没错,肯定是downloadId了。

    1> 如果存在downloadId,那么我们通过downloadId获取当前下载的状态status。status分为成功,失败两种状态。

    (1)当status为成功状态时,即已经下载完成,我们就通过downloadId获取下载文件的Uri。然后可以通过Uri获取PackageInfo,与当前App进行包名和版本号的对比,当包名相同,并且当前版本号是小于下载的Apk版本号两个条件同时成立时,直接执行安装操作。否则,执行remove,通过downloadId删除下载任务以及文件,继续执行下载。

    (2)当status为失败状态时,即下载未完成,我们就直接执行重新下载即可。

    2> 如果不存在downloadId,即没有下载过Apk,执行下载即可。

    核心代码如下:

    下载完成后,系统会发出广播,在广播中,我们对比downloadId是否相同,相同情况下,直接通过downloadId获取Uri,然后跳转到安装界面,提示用户安装即可:


    所以,别忘了在下载之前要先将该大喇叭(广播接受器)注册。

    最后,当我们安装完成后,再次进入App,就将其已下载的Apk文件进行删除(将该方法放在onCreate生命周期中即可):


    上面通过downloadApk获取下载文件的地址。downloadApk地址是在下载完成后广播接收器中保存的。

    通过上面的步骤,我们就完成了App更新下载安装的全部工作。相信大家也有了更深的认识和理解。


    二、以下为增量升级

    增量升级原理

    首先,两句话简单概括增量升级原理:

    1. 服务端通过比对最新升级包,和当前应用包,生成差分升级包;
    2. 客户端将差分升级包和当前应用包合并,生成最新升级包。

    接下来,简单介绍下增量升级的原理:

    1. 首先,客户端获取当前应用的Version Code和应用APK文件的MD5值,发送给服务器;
    2. 服务器根据既定策略,给用户返回更新包信息。
      1. 通过MD5值没有查询到旧有APK应用信息,返回全量升级包网址,全量升级包MD5值;
      2. 需要返回patch包,但还没有生成patch包时,后台去生成patch包,并返回全量升级包网址,全量升级包MD5值;
      3. 需要返回patch包,并且已经生成patch包时,返回patch包网址,patch包MD5值,全量升级包网址,全量升级包MD5值;
      4. 不需要返回patch包,则返回全量升级包网址,全量升级包MD5值;
    3. 客户端根据返回信息进行更新操作。
      1. 如果只有全量升级包相关信息,则下载全量升级包,并在校验MD5值后,安装更新包;
      2. 如果有差分升级包(patch包),则下载差分升级包。校验差分升级包的MD5值。如果校验失败,走上面一个步骤。如果校验成功,则将差分升级包和当前版本的APK进行合并操作,生成新的应用包。校验新的应用包MD5值。校验通过,这安装这个生成的新应用包。如果校验失败,则走上面一个步骤。

    以上只是简单介绍了增量升级的原理,实际应用中还需要细化,考虑更多的场景。

    注意: 下载过程中,必须支持断点续传策略。防止网络不畅时,不断重试,造成的流量浪费。

    增量升级方案

    增量升级方案的核心就是使用Diff/Patch算法来对新旧APK进行diff/patch操作。
    目前主流的Diff/Patch算法是bsdiff/bspatch,来自:http://www.daemonology.net/bsdiff/

    另外,我了解到,国内有人开源了另外一种Diff/Patch算法,名字叫做HDiffPatch,来自:https://github.com/sisong/HDiffPatch

    据说,比bsdiff/bspatch更高效呢?详见《HDiff1.0和BSDiff4.3的对比测试》

    我将bsdiff/bspatch和HDiffPatch,使用jni封装成so库,供android调用。项目地址:https://github.com/snowdream/android-diffpatch
    在封装HDiffPatch过程中遇到问题,得到作者@sisong的支持和帮助,在此表示感谢。

    bsdiff/bspatch和HDiffPatch算法都是开源的,服务端可以根据源文件来进行编译集成。
    这里我主要在Android客户端的角度,介绍下bsdiff/bspatch和HDiffPatch怎么使用。

    BsDiffPatch

    1. 在build.gradle文件中自定义jnilib目录
      sourceSets {
       main {
           jniLibs.srcDirs = ['libs']
       }
      }
    2. 将 app/libs/armeabi-v7a/libbsdiffpatch.so 拷贝到你的工程对应目录下。
    3. 将 app/src/main/java/com/github/snowdream/bsdiffpatch 和 app/src/main/java/com/github/snowdream/diffpatch 拷贝到你的工程对应目录下,包名和文件名都不能改变。
    4. 在Java文件中参考以下代码进行调用。
      IDiffPatch bsDiffPatch = new BSDiffPatch();
      bsDiffPatch.init(getApplicationContext()); 
      //diff
      bsDiffPatch.diff(oldFilePath, newFilePath, diffFilePath);
      //patch
      bsDiffPatch.patch(oldFilePath, diffFilePath, gennewFilePath);

    HDiffPatch

    1. 在build.gradle文件中自定义jnilib目录
      sourceSets {
       main {
           jniLibs.srcDirs = ['libs']
       }
      }
    2. 将 app/libs/armeabi-v7a/libhdiffpatch.so 拷贝到你的工程对应目录下。
    3. app/src/main/java/com/github/snowdream/hdiffpatch 和 app/src/main/java/com/github/snowdream/diffpatch 拷贝到你的工程对应目录下,包名和文件名都不能改变。
    4. 在Java文件中参考以下代码进行调用。
      IDiffPatch hDiffPatch = new HDiffPatch();
      hDiffPatch.init(getApplicationContext()); 
      //diff
      hDiffPatch.diff(oldFilePath, newFilePath, diffFilePath);
      //patch
      hDiffPatch.patch(oldFilePath, diffFilePath, gennewFilePath);

    BsDiffPatch vs HDiffPatch

    这里我选择高德地图Android客户端的两个版本来进行测试。

    • 测试来源:http://www.autonavi.com/
    • 测试版本: Amap_Android_V7.7.4.2128_GuanWang.apk 和 Amap_Android_V7.3.0.2036_GuanWang.apk (注:版本跨度大,差异大)
    • 对比算法: BsDiffPatch vs HDiffPatch
    • 测试结果:(详见下图)
      1. BsDiffPatch生成的patch包稍小。
      2. 两者的diff操作都非常耗资源,耗时间,无法忍受。(当然diff操作一般在服务端进行)
      3. 两者的patch操作都比较快。通过大概五次测试,BsDiffPatch的patch操作需要13s左右,而HDiffPatch的patch操作仅仅需要1s左右。

    以上结果仅供参考。

    • 测试结论:
      1. BsDiffPatch应用更广泛
      2. HDiffPatch看起来更高效

    test.png

    扩展

    以上算是比较成熟的增量升级方案了,但是仔细想想,可能还存在一些问题:

    1. 由于多渠道,多版本造成非常多Patch包
    2. bs diff/patch算法性能和内存开销太高
      第一个问题可以通过服务器策略进行限制。比如,只有最新版5个版本内的升级采用增量升级,其他的仍然采用全量升级。
      据说,还有一种更强大的算法,可以解决以上问题。大家有兴趣的话,可以自己去了解。


    展开全文
  • 在物联网开发中,OTA升级(firmware update Over The Air)是模组必备的功能,本文将以RTL8711、乐鑫8266 、庆科3186 wifi模块为例介绍几种的常见的... RTL8711 ota升级方案 方案简介 8711flash分区如下图:  ...

    在物联网开发中,OTA升级(firmware update Over The Air)是模组必备的功能,本文将以RTL8711、乐鑫8266 、庆科3186 wifi模块为例介绍几种的常见的ota方案,并进行对比总结。

     

                                           RTL8711 ota升级方案

    方案简介

    8711flash分区如下图:

                                                

     

    RTL 8711AF flash分为bootloader、校验信息区、系统信息区、默认固件区,可升级固件区,用户区,默认固件区存放通过烧录方式更新的固件,可升级固件区存放通过ota升级方式更新的固件。这两个区只有可升级固件区是可以用于ota升级的。ota固件升级其实就是IAP(In ApplicationProgramming)应用编程,一般包含两个程序:Bootloader程序和APP程序。以RTL8711AF为例,芯片上电后固定从Bootloader启动。

     

    Bootloader主要负责:

    (1)读取每个区应用程序签名信息;

    (2)判断应用程序该从哪个区启动;

    (3)把对应的falsh区的应用程序拷贝到SRAM,跳转到SRAM运行应用程序。

    APP程序负责:

    (1)定期发送http请求向服务器获取最新固件信息;

    (2)和当前固件对比,确定是否需要更新,如果需要更新从服务器下载最新固件到用于ota的flash区;

    (3)更新flash区签名,软件复位。

     

    固件下载的过程中会对固件进行校验检查以确认下载的固件是完整正确的包。

     

    8711 bootloader 程序流程如下图,从系统参数中获取到两个存固件的flash区的地址后,去读取这两个区的签名,在看哪个区的签名是“81958711”便从哪个区启动。

                                             

     

    8711 ota APP程序流程图下图,从系统参数获取了可升级区的地址后,去擦除该区,再从服务器下载新的固件写到flash去,最后对该区签名进行更新,并把另一区的签名也更新。

                                               

                                    

     

    8711  ota方案优缺点

    8711ota方案把flash分成两个区,一个区固定用于烧录,一个区用于ota升级,比较简单,容易实现;缺点是产品出厂后,若某次ota升级过程断电或断网升级失败flash被破坏,再次上电只能跑另一个烧录区固件,即出厂时烧录的第一个固件版本,无法跑上一个版本。

     

    那能不能两个区都用于ota升级,这次升级A区下次升级B区,交替升级,当升级失败跑另一个区?此时就是上一个版本了。可以,需要重新设计整个方案。

     

    固定一个区烧录一个区ota升级这样实现起来简单,若设计成两个区交替升级是否可以?比较复杂,原因是:

    1、不同区的固件编译条件是不同的,编译时要设置相应flash区的起始地址和大小,所以生成的固件也不同,发布版本时需要发布两个固件。       

    2、如果要设计成两个区都可ota升级,需要有系统信息记录目前程序跑的分区,ota升级时先获取目前程序跑在哪个区,再从服务器下载另一个区对应的固件,bootloader启动时也需要知道应该从哪个区去启动,比较繁琐。

                                      

     

                                        乐鑫ESP8266 ota方案

    方案简介

    乐鑫方案采用的就是上文说的双区交替升级方案,下图为乐鑫8266 flash分区图,分区1和分区2都是可以进行ota升级的。

                                          

     

    系统参数区存储了一个标志位,标识系统起来后应该去跑哪个区(即图中user1.bin或user2.bin)。系统启动时先去运行boot,boot读取该标志位,然后再到对应的区去读取固件运行。

     

    举个例子,初始状态运行版本V0.1的user1.bin,系统参数区标志位为使用user1.bin。当需要升级时,上传V0.2版本的固件suer1.bin和user2.bin到云端服务器,ESP8266 wifi板执行升级时,先读取系统标志位,确定当前用的是user1.bin,然后从服务器端下载user2.bin存储到分区2,如果user2.bin是正确无误的固件,且下载成功,修改系统参数区标志位为分区2然后重启。重启后首先去读取该标志位,读到是分区2,然后从分区2启动。

     

     如果下载固件过程中断网或断电造成下载失败,则系统再次启动时,分区标志位为使用user1.bin,此时跑的就是上一个版本,而不是出厂时的第一个版本。

     

    乐鑫方案优缺点

    乐鑫方案的优点是可以实现升级失败时回到上一个版本,而不是回到第一个版本。缺点就是每次发布版本要同时发布两个升级文件,有点繁琐,万一发布错了,user1.bin和user2.bin搞反了,导致某次升级下载的升级文件与分区不匹配,那wifi板就直接变砖头了没有挽救的余地。

                                      

     

                                                   庆科EMW3165方案

    方案简介

    庆科方案不但解决了升级失败时无法回到上一版本的问题,还很简单。跟上述一样分为bootloader和app程序,不一样的是固件启动运行时步骤稍有不同。

     

    同样在APP程序中发起HTTP请求查询服务器是否有新的固件版本并进行下载,并固定存储到片外的flash区、修改固件的参数信息、重启。重启后做的第一件事是去检查固件参数信息,是否有新的固件?若有将片外flash区的固件搬运到片内flash区,跳转到那里运行。

     

    庆科3165的flash区域规划如下图:

     

                                    

     

    Bootloader放置在片内Flash的0x08000000地址,大小为64K,设备上电后首先跳到这里执行;

    Application放置在片内Flash的0x08010000地址;PARAMETER_1和PARAMETER_2(备份用)记录固件参数信息的区域,它们放在片外Flash;

    OTA_TEMP区域为OTA固件存储区域,放在片外Flash,Application从网络下载bin文件然后写到该区域,而Bootloader从这个区域搬运固件到Application区域。

    升级过程:

    (1)Application查询服务器是否有新的固件需要下载,若有下载到OTA_TEMP区;

    (2)修改PARAMETER_1参数,记录固件信息;

    (3)重启

    (4)Bootloader读取PARAMETER_1参数,判断OTA_TEMP区是否有新固件需要更新;

    (5)若有把OTA_TEMP区的固件搬运到内置flash区;

    (6)跳转到Application程序去执行。

     

    庆科方案优缺点

    优点很明显了,这种方式既保证了升级过程失败再次上电跑的是上一版本,又很简单,发版本时只需发一个固件就好不像乐鑫那么复杂。

    聪明之处在于分开两个flash区,一个专门用于下载存储固件,另一个专门运行程序。这样就避免了发版本时要发两个固件,又避免了上电启动需要判断从哪个区去启动。下载固件过程若断电下载失败,再次启动先去读取固件参数,发现没有新版本,那此时跑原来片内flash的固件即上一版本固件。

    缺点暂时没有发现,可能是上电后需要去搬运固件时间会稍微长一点?古北的模块用的也是这种方案,从使用体验上来看并没有明显感觉时间长。

                                                                                

    如果你觉得本篇不错,如上图,转起来~

    展开全文
  • linux下系统升级方案

    千次阅读 2019-03-12 16:11:56
    当我们上线一个系统后,后续通常还需要对该系统做对应的升级,或者通过补丁包修复现网上的bug,本篇博客内容是帮助大家了解升级系统的流程。 1.做好备份 备份分两块;一是将Linux上的整个项目文件夹备份,命令如下...
  • 针对煤矿井下安全监控分站升级和维护难的问题,提出了一种基于LPC2114处理器的煤矿安全监控分站远程升级方案;阐述了IAP技术原理,介绍了远程升级方案的思路、实现方法以及设计时应注意的关键问题。该方案一方面可保障...
  • 非常实用的网络方案,可以拿去参考规划。 采用成熟的网络技术  采用初步的安全的防护措施  采用成熟稳定的网络产品  采用成熟的布线结构和布线设施
  • 现在修改为thinkphp 5 通用解决方案 优化代码 提高了重用性 及通用性.............................
  • Flutter项目之app升级方案

    千次阅读 2019-02-11 02:19:14
    本篇文章用于讲解基于Flutter的app项目的升级方案。此文只有安卓版。 在我接触Flutter之前,做过一个比较失败的基于DCloud的HTML5+技术的app,做过几个RN项目。在这两种不同机制的app升级方案中,RN采用的是微软的...
  • FPGA远程升级方案

    千次阅读 2020-03-12 19:11:03
    为了能使系统得到更灵活的应用,充分发挥FPGA的灵活性、高效性,FPGA的软硬件程序都需要方便的更新和升级功能;而当形成产品后,通过JTAG和NiosII IDE工具来联合完成对EPCS Flash的更新烧写很不方便。为此,本文...
  • 物联网智能设备终端OTA远程升级方案

    千次阅读 热门讨论 2020-03-02 13:52:57
    FOTA(Firmware Over-The-Air),即利用无线通信技术,云服务器来实现远程的固件更新,包含以下几部分内容,节点端,FOTA服务器,升级方式,文件类型.bin,升级过程管理,安全性。 1 硬件环境 设备主控为Stm32f103VE ...
  • 根据司法局现有设施对应《智能化现代文明XX创建标准》,对XX原有不符合创建标准的系统和未有实施的系统进行扩建、改造升级。拟将xx建设成智能化现代文明XX为目标。
  • Electron 在线热升级方案

    千次阅读 2019-03-15 07:19:37
    2018-03-25一个项目正式交付客户使用了,对于版本的升级和代码更新是个一直困扰的问题,由于之前一直都是内部人员使用,可以让他们每次都下载完整压缩包(压缩后大概 40-50MB),但对于正式的终端用户,这个体验是不...
  • 嵌入式设备差分升级方案讨论

    千次阅读 热门讨论 2018-03-26 13:54:53
    如题,嵌入式设备,比如通信模组等,往往在使用中需要固件升级,但当设备已经部署出去后,再想通过工厂烧录的方式进行升级时不太现实的,一般采用FOTA升级,但当固件size太大的时候,使用蜂窝网进行升级会消耗过多的...
  • 基于WiFi和云端的无线远程升级方案

    千次阅读 2018-08-15 00:07:30
     方案目标 基于WiFi和云端完成无线远程对产品WiFi固件和MCU固件分别进行升级刷新,当产品售出后需要维护时,该方法具有较强实际意义。  总体方案 利用机智云云端OTA技术+产品主控MCU(STM32)的IAP功能来实现。...
  • 本文对于从IPv4到IPv6的升级过渡技术进行了全面的介绍,并重点分析了目前常用的隧道技术、协议翻译技术和双协议栈技术的优点、缺点,然后提出具体的升级解决方案。最后做出了归纳总结,说明进一步要做的相关工作。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 377,856
精华内容 151,142
关键字:

升级方案