本发明属于无线通信物联网技术领域,更具体地说,本发明涉及一种传感器节点远程升级方法。
背景技术:
物联网是继计算机、互联网、移动通信网络之后又一项新的信息技术,被认为是世界信息产业的第三次浪潮。当前物联网中的很大一部分应用,如环境信息监测、楼宇监控、智慧城市等,都需要通过终端节点设备使用各种传感器采集所需要的信息,发送给上层的云服务进行处理,节点与节点,节点与云形成了一个无线传感器网络,该网络通常具有以下几点重要特征:1)节点计算资源有限。节点通常由计算资源十分有限的单片机和简单的传感器组成。单片机的计算速度较低,ROM和RAM空间有限,同时对成本十分敏感。2)节点工作环境多样,通常一旦安装很难进行回收。3)节点的网络资源有限。节点传输的数据量很少,同时对功耗极为敏感,不适合传输大量的数据。4)网络部署后,调节,修复和更新功能的需求强烈。
由以上几点可知,能够使用尽量少的软硬件资源对节点进行远程更新是无线传感器网络的一个重要功能。当前无线传感网络的远程升级方案还存在以下问题:1、数据传输量较大,通常需要传输整个固件程序或较大的差分文件,降低了节点的升级速度和使用寿命,传输数据量增大也加大了升级失败的可能。2、通常需要较大的额外FLASH来进行新版本固件的重建,增加了节点的硬件成本,同时这类方法往往需要分别对额外FLASH和单片机内部的程序存储器进行读写,增加了升级过程中的功耗。3、使用差分方式进行远程升级,一旦升级失败,进行修复时通常需要更新整个固件程序,增加了节点修复时间,降低了节点的使用寿命。
技术实现要素:
本发明的一个目的是解决上述问题,并提供至少后面将说明的优点。
本发明还有一个目的是提供一种低功耗传感器节点远程升级方法,其具有数据传输量小,升级时占用额外FLASH小,功耗少的优点。
为了实现根据本发明的这些目的和其它优点,提供了一种传感器节点远程升级方法,其特征在于,包括:
将应用程序分成多个模块并安装至传感器节点;
当需要对应用程序升级时,制作每个模块的差分升级包并发送给传感器节点,并将该差分升级包写入,完成对应用程序的升级;
其中,每个模块均提供接口,各模块之间通过相互调用接口实现应用程序的功能。
优选的是,所述的传感器节点远程升级方法,将传感器节点的存储空间根据每个模块大小分成多个独立区域,并指定每个区域的位置,将应用程序编译后根据指定的位置将每个模块写入对应的区域。
优选的是,所述的传感器节点远程升级方法,为每个模块之间存在相互调用关系的函数或全局变量建立接口表,获取该函数或全局变量的地址,接口表中存放函数或全局变量的地址,每个模块调用函数或全局变量时先通过接口表,再执行函数的功能或访问全局变量;其中,接口表存放在对应模块的区域的起始地址处。
优选的是,所述的传感器节点远程升级方法,多个模块还包括应用描述模块,所述应用描述模块对应的区域存储有其它模块对应区域的起始地址,为每个其它模块之间存在相互调用关系的函数或全局变量建立接口表,将接口表固定在对应模块的区域的起始地址处,接口表中存放函数或全局变量的地址;在调用函数时先通过应用描述模块中存放的该模块的起始地址,调用接口表,通过接口表调用函数的功能或访问全局变量。
优选的是,所述的传感器节点远程升级方法,所述差分升级包的制作包括:将每个模块的目标版本文件分成多段目标版本子文件;
分别计算每段目标版本子文件与每个模块的源版本文件的差分信息;
根据各每段目标版本子文件的差分信息,生成相应的控制命令,按照预定格式对差分信息和优选的是,控制命令进行封装和压缩得到所述差分升级包。
优选的是,所述的传感器节点远程升级方法,根据每段目标版本子文件的控制命令,依次对每个模块的源版本文件进行更新。
优选的是,所述的传感器节点远程升级方法,所述差分信息用于标识每段目标版本子文件与每个模块的源版本文件之间的匹配区域或非匹配区域,当每个模块的每段目标版本子文件与每个模块的源版本文件之间为匹配区域时,生成用来指示数据复制的控制命令;当每个模块的每段目标版本子文件与每个模块的源版本文件之间为非匹配区域时,生成用来指示数据替换的控制命令。
优选的是,所述的传感器节点远程升级方法,网关与网管服务器通讯连接,多个传感器节点均与网关通讯连接;升级前指定需要升级应用程序的传感器节点,并将待升级的应用程序存储至网管服务器并计算生成差分升级包以及升级命令,网管服务器将差分升级包以及升级命令发送给网关,网关先将升级命令发送给传感器节点,传感器节点接收到升级命令后向网关发送的请求升级命令,网关发送的请求升级命令后再将差分升级包发送给传感器节点;其中,升级命令包括预约升级时间。
优选的是,所述的传感器节点远程升级方法,网关接收到升级请求命令后还包括检验网关是否处于空闲状态,如果处于空闲状态则网关根据升级请求命令发送差分升级包至所述传感器节点;否则传感器节点进入休眠时间,休眠时间之后再次发送升级请求命令至网关。
优选的是,所述的传感器节点远程升级方法,网关采用xmodem协议将差分文件升级包发送给传感器节点。
本发明至少包括以下效果:
1、本发明的传感器节点远程升级方法,将待升级的应用程序分成多个模块,每个模块之间的耦合度小,每个模块均可以进行独立升级,这样在升级时仅仅接收需要升级模块的差分升级包,而不需要接收整个应用程序的差分升级包,这样接收的收据少,而且占用的额外FLASH小,开销小。
2、本发明对在制作差分升级包时,对每块模块按照大小分成多段,再对每段对进行差分计算生成相应的控制命令,控制命令可以为数据复制的控制命令或用来指示数据替换的控制命令,传感器节点接收到差分升级包后对其进行解析,根据每组的控制命令将该组对应的目标版本的数据写入到FLASH中对应的位置区域,然后对下一组数据进行更新写入FLASH中对应的位置,这种升级的方法可以大大降低传感器节点需要的额外存储空间。
3、本发明的传感器节点远程升级方法,在升级时还可以设置预约升级时间,这样在当前升级的传感器节点升级过程中,这样不影响待升级的传感器节点正常工作,降低功耗。
附图说明
图1为本明所述的传感器节点远程升级方法中各模块之间相互调用的示意图;
图2为差分升级包生成过程示意图;
图3为传感器节点远程系统示意图;
图4本明实施例的传感器节点远程升级方法的流程图。
具体实施方式
下面结合附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。
应当理解,本文所使用的诸如“具有”、“包含”以及“包括”术语并不排除一个或多个其它元件或其组合的存在或添加。
一种传感器节点远程升级方法,包括:
将应用程序分成多个模块并安装至传感器节点;
当需要对应用程序升级时,制作每个模块的差分升级包并发送给传感器节点,并将该差分升级包写入,完成对应用程序的升级;
其中,每个模块均提供接口,各模块之间通过相互调用接口实现应用程序的功能。
本技术方案将待升级的应用程序按照分成多个模块,每个模块之间通过接口相互调用,相互独立,这样每个模块均可以进行独立升级,这样在升级时仅仅接收需要升级模块的差分升级包,而不需要接收整个应用程序的差分升级包,这样接收的数据少,而且占用的额外FLASH小,开销小。
在另一实施例中,所述的传感器节点远程升级方法,将传感器节点的存储空间根据每个模块大小分成多个独立区域,并指定每个区域的位置,将应用程序编译后根据指定的位置将每个模块写入对应的区域。
完成存储空间划分后,通过编译程序生成对应的bin文件,通过分散加载机制为链接器指定各模块bin文件的区域,这样区域划分以后内部的函数会相互调用,修改功能,这些操作只会影响本区域,不影响其他区域。
在另一实施例中,所述的传感器节点远程升级方法,为每个模块之间存在相互调用关系的函数或全局变量建立接口表,获取该函数或全局变量的地址,接口表中存放函数或全局变量的地址,每个模块调用函数或全局变量时先通过接口表,再执行函数的功能或访问全局变量;其中,接口表存放在对应模块的区域的起始地址处。
为每个模块之间存在相互调用关系的函数或全局变量建立接口表,并放置在模块起始处。程序中各个模块之间首先访问应用描述区获取待访问模块的起始地址,也就是该模块接口表的地址,通过访问模块的接口表来进行相互之间的函数调用,或全局变量访问,以减小模块之间的相互关联。具体做法如下:每个模块将自己需要暴露给外界的函数和全局变量的地址放置在一块结构体常量中作为接口表,并将该结构体常量放置在该模块的开头,即接口表的地址就是该模块的起始地址,如此通过在应用描述区中获取该模块的起始地址,可以找到该模块的接口表。当该模块进行了修改,暴露给外部的函数地址或者全局变量地址可能发生修改,但是函数地址存放在接口表中的位置不变,因此其他模块访问该模块的代码不会随之发生改变,降低了模块之间的关联。如下为某个模块接口表实现的一个示例:
访问该模块中的一个函数时可以通过如下方式:
ModuleDesc_t*desc=(ModuleDesc_t*)DESC_RO_BASE;//获取应用描述模块信息Module1_t*tab=(Module1_t*)(desc->ModuleAddrArray[MODULE_1]);//获取接口表tab->Func1();
本方案为了进一步减小每个模块的联系和耦合度,每个模块通过接口表,来调用存在相互调用关系的函数或全局变量,再执行函数的功能或访问全局变量,实际上接口表仅起到“中间人”的作用,接口表固定在模块的区域的起始地址处,修改相互调用的函数后只会改变本区域的模块,不会影响到调用它的其他区域的模块,从而切断模块之间的连带升级,达到减少应用程序升级范围的目的。
在另一实施例中,多个模块还包括应用描述模块,所述应用描述模块对应的区域存储有其它模块对应区域的起始地址,为每个其它模块之间存在相互调用关系的函数或全局变量建立接口表,将接口表固定在对应模块的区域的起始地址处,接口表中存放函数或全局变量的地址;在调用函数时先通过应用描述模块中存放的该模块的起始地址,调用接口表,通过接口表调用函数的功能或访问全局变量。
如图1所示,应用描述模块中存放有含有应用程序的版本号,应用程序入口,应用程序大小,应用程序校验值,模块数量,指向存放各模块的起始地址数组的指针的常量结构体,应用描述模块放置在应用程序所占用的存储区域的最前端,起始地址为固定值,应用描述模块的头文件中,声明有每个模块地址在存放各模块的起始地址数组中的索引。如此完成编译后应用描述区中的信息都会被编译在一个固定的位置,每个模块的起始地址也会存放在起始地址数组的固定元素中,当模块地址发生变化后,只是起始地址数组中存放的地址值发生了变化,其他模块访问时还是去应用描述区中起始地址数组中的相同位置获取该模块的起始地址,减小了模块之间的耦合度应用程序入口,例如当模块1需要调用模块2中的函数2时,首先模块1需要在应用描述模块的模块起始地址数组中根据模块2在应用描述模块中的索引找到模块2的起始地址,也即模块2的接口表的地址,由于模块2的接口表结构已知,通过接口表的函数2的地址再调用函数2。如下为应用描述模块实现的一个示例:
其中APP_RO_BASE是应用程序存储区域的起始地址,也是应用描述模块存放的起始地址。
几种升级中可能出现的情况:
1、任何修改会导致程序版本更新,应用描述模块都需要进行更新,默认应用描述模块都要进行升级。
2、本区域内增加、删除、修改功能,该功能与其他区域无关联,没有调用关系发生变化。这种情况下只是该接口表中存放的地址值可能发生变化,不会导致其他模块变化,该模块可以独立升级。
3、本区域内增加、删除、修改功能,该功能与其他区域无关联,其他区域需要调用该模块。
如果是删除功能,则说明其他模块对该功能不再有需要,其他模块必然也进行了对应修改,则相关的模块需要进行升级。
如果是修改功能,其他模块不受影响。
如果是添加功能,则在接口表的最后追加功能对应的函数/变量地址,原先调用该模块中其他函数/变量的模块不受影响,对应的需要使用到新增加功能的模块需要一起升级。
4、实现新的模块,调用了新模块中函数/变量的模块需要进行升级。
5、模块整体发生了移动、删除、增加。
模块发生了移动,如原先空间不足,需要移动到另一个新分配的空间中。应用描述模块中存放的模块地址会发生变化,但是如果模块之间的调用关系为发生变化,则不会影响其他模块,只有调用关系发生改变的模块需要升级,类似2,3。
模块被删除、则调用了该模块内函数的模块必然发生了修改,需要一起升级。
增加新的模块,在应用描述模块的最后追加该模块的地址,只有调用了新模块中函数/变量的模块需要进行升级。
在另一实施例中,所述的传感器节点远程升级方法,所述差分升级包的制作包括:将每个模块的目标版本文件分成多段目标版本子文件;
分别计算每段目标版本子文件与每个模块的源版本文件的差分信息;
根据各每段目标版本子文件的差分信息,生成相应的控制命令,按照预定格式对差分信息和控制命令进行封装和压缩得到所述差分升级包。
所述的传感器节点远程升级方法,根据每段目标版本子文件的控制命令,依次对每个模块的源版本文件进行更新。
所述的传感器节点远程升级方法,所述差分信息用于标识每段目标版本子文件与每个模块的源版本文件之间的匹配区域或非匹配区域,当每个模块的每段目标版本子文件与每个模块的源版本文件之间为匹配区域时,生成用来指示数据复制的控制命令;当每个模块的每段目标版本子文件与每个模块的源版本文件之间为非匹配区域时,生成用来指示数据替换的控制命令。
在本技术方案中,获取需要升级的模块源版本和目标版本程序bin文件,如果待升级模块的存储区域发生变化,如移动到另一区域,则将该模块目标版本bin文件本身作为差分升级包;如果模块存储区域不变,则获取传感器节点设置在RAM中构建程序所用的缓存大小,将每个模块的目标版本bin文件按照缓存大小分为多段数据,如果目标版本bin文件大小小于缓存大小则必然不需要分段;使用字节级差分计算算法,本技术使用的是MDCD算法,依次计算每段数据与源版本bin文件之间的差分信息,完成一段数据的差分计算后,使用该段数据覆盖源版本bin文件对应位置的数据,然后进行下一段数据的差分计算,得到整个目标版本bin文件与源版本bin文件之间的差分信息,生成相应的控制命令,如复制命令,替换命令等,按照预定格式对差分信息和控制命令进行封装和压缩得到所述差分升级包。如图2所示,进行计算的每段数据大小等于节点中缓存大小,每段数据均与部分修改的源版本bin文件进行差分计算。由于每次进行差分计算的目标版本bin文件数据段大小都不超过节点中缓存大小,因此传感器节点的bootloader可以在RAM中设置的缓存中根据差分升级包中的控制命令构建模块的每段数据,完成构建后写入FLASH的对应区域,进行差分计算时每完成每段数据的计算后,使用该段数据覆盖源版本bin文件的对应位置的数据,使得该方式可以在存放该模块程序的FLASH区域进行原地构建程序,避免了使用额外的FLASH作为缓存构建新版本程序,大大减少了对FLASH资源的消耗。
在另一种实施例中,所述的传感器节点远程升级方法,网关与网管服务器通讯连接,多个传感器节点均与网关通讯连接;升级前指定需要升级应用程序的传感器节点,并将待升级的应用程序存储至网管服务器并计算生成差分升级包以及升级命令,网管服务器将差分升级包以及升级命令发送给网关,网关先将升级命令发送给传感器节点,传感器节点接收到升级命令后向网关发送的请求升级命令,网关发送的请求升级命令后再将差分升级包发送给传感器节点;其中,升级命令包括预约升级时间。
在另一种实施例中,所述的传感器节点远程升级方法,网关接收到升级请求命令后还包括检验网关是否处于空闲状态,如果处于空闲状态则网关根据升级请求命令发送差分升级包至所述传感器节点;否则传感器节点进入休眠时间,休眠时间之后再次发送升级请求命令至网关,所述休眠时间由差分文件升级包数据大小除以传输速率得到。
如图3、图4所示,本发明的还包括传感器节点远程系统:包括,网关、网管服务器,多个传感器节点,网关与网管服务器通讯连接,每个传感器节点均与网关通讯连接;其中应用程序的升级是指传感器节点中MCU的应用程序升级,并需要升级时,指定待升级的传感器节点,同时将需要升级应用程序上传至网管服务器并由网管服务器计算生成每个模块的差分升级包以及升级命令,传感器节点中MCU的还包括bootloader区;网管服务器将差分升级包以及升级命令发送至网关,网关接收到差分升级包以及升级命令之后,先将升级命令发送至传感器节点,传感器节点接收到升级命令后进入bootloader区,并等待升级传感器节点发出请求升级命令请求开始一次升级,当网关接收到待升级传感器节点发出的升级请求时,如果网关处于可以进行升级的状态即处于空闲状态,则发送待升级模块的相关信息如:控制命令,模块起始地址,长度,crc32校验值,给传感器节点,并进入xmodem模式将差分升级包发送至对应模块完成升级。当完成一次升级包传输后,网关等待下一个传感器节点的升级请求;在一个传感器节点完成升级之前,如果网关接收到其他传感器节点的升级请求,则计算升级大致剩余的时间,发送给传感器节点令其休眠,休眠时间之后再次发送升级请求命令至网关,本实施例中所述休眠时间由差分文件升级包数据大小除以传输速率得到。升级命令包括预约升级时间,即升级命令到达传感器节点之后到传感器节点向网关发送请求升级命令之间等待的时间,这样不影响网关对当前需要升级的传感器节点的正常工作,降低了功耗。
在另一种实施例中所述的传感器节点远程升级方法,网关采用xmodem协议将差分文件升级包发送给传感器节点。
传感器节点使用预先固化在节点中的bootloader区接收差分升级包,并解析差分升级包,完成对模块的升级。节点使用xmodem协议接收差分升级包,需要注意这里的xmodem数据包是打包在节点运行的网络协议中的。如果待升级模块存放的区域发生了改变,则每接收到一个xmodem数据包后,将数据包中的内容依次写入目标区域的对应位置中;如果待升级模块存放的区域没有发生变化,则认为xmodem数据包中存放的是控制命令,每接收到一个xmodem数据包后bootloader解析xmodem数据包中的控制命令后按照命令在RAM中设置的缓存中构建目标程序,每当缓存填满或解析并执行完最后一个xmodem数据包中的控制命令后,将缓存中的数据写入目标区域的对应位置中,如此完成一个模块的更新。如此,bootloader进行升级时只存储了一个xmodem数据包的内容,不需要接收整个差分升级程序再进行处理,同时程序构建在RAM中完成,不需要额外的FLASH空间,大大减少了对FLASH资源的消耗。
本发明的远程升级方法还可以在传感器节点收到升级命令后,将传感器节点升级标志写入EERPOM并将升级标志标记为待升级。传感器节点在向网关发出请求升级命令之前检验升级标志是否为待升级,如果是待升级则发出请求升级命令;升级完成后清除待升级标志。
尽管本发明的实施方案已公开如上,但其并不仅仅限于说明书和实施方式中所列运用,它完全可以被适用于各种适合本发明的领域,对于熟悉本领域的人员而言,可容易地实现另外的修改,因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于特定的细节和这里示出与描述的图例。