物联网燃气表远程升级的研究与实现

2021-06-17 07:56高柱荣蒋昌茂刘洪林
自动化仪表 2021年5期
关键词:燃气表固件终端

高柱荣,蒋昌茂,刘洪林

(1.桂林市利通电子科技有限责任公司,广西 桂林 541004;2.桂林师范高等专科学校,广西 桂林 541001;3.桂林航天工业学院计算机科学与工程学院,广西 桂林 541004)

0 引言

智能燃气表已成为居民生活用气的一种主要计量仪表,被广泛应用并分散地安装在各户居民家中,其设计缺陷修补、功能改进或性能提升等需求,在物联网时代将变得简单可行。本文基于窄带物联网(narrow band-intemet of things,NB-IoT)燃气表项目,研究设计了一种安全、可靠的远程升级方案。

1 系统组成

物联网燃气表由主控微控制器(micro controller,MCU)、窄带(narrow band,NB)通信模组、计量单元、阀控单元、液晶显示器(liquid crystal display,LCD)、蜂鸣器、按键、实时时钟、供电单元等组成,主要实现燃气使用量的采集计量、连网上报数据和接收服务器下发的命令数据等功能。而远程升级功能则是利用物联网燃气表自身具有的网络连接特性,通过远程操控实现对燃气表固件程序的更新:即更新主控MCU内的程序,以达到改进和提升的目的。本文的升级系统由业务服务器、燃气表终端和升级服务器三部分组成。

2 升级原理

STM32L0 MCU是意法半导体公司推出的、基于ARM Cortex-M0+内核的系列微控制器[1],具有集成外设单元丰富、高性能与超低能耗完美平衡等特性,同时具有低成本的优势,非常适合由电池供电或由能量收集供电的物联网应用。本文选择STM32L073RZ作为物联网燃气表的主控MCU。

应用程序编程(in application programming,IAP)技术是指MCU允许正在运行的程序对片内Flash的部分区域进行编程更新,更新后可以执行新的程序,从而实现程序的升级[2-4]。STM32L0芯片有三种启动模式可选,需要配置为:从Flash主存储器启动,才能启用IAP功能。

升级系统组成如图1所示。

图1 升级系统组成图

IAP的具体应用可通过多种不同的方式实现。文献[5]~文献[6]把Flash分成一个Bootloader程序区和一个APP程序区。在APP程序中接收升级数据包,临时存储在EEPROM中,接收完成后重启系统。在Bootloader程序中,将数据从EEPROM拷贝到Flash的APP程序区完成升级[5-6]。该方案的缺点是需要额外的存储器硬件、增加了成本,而且升级固件存储在EEPROM中容易被非法访问和复制。对比文献[5],文献[7]~文献[8]在Flash中多划分出了一个文件存储区,代替EEPROM存储升级数据包[7-8],较好地解决了额外增加硬件成本和固件数据文件安全的问题。但该方法仍然需要在Bootloader程序中更新APP程序,增加了Bootloader程序的复杂性和升级失败机率。

针对上述方案的不足,本文作了进一步的改进,程序设计成Bootloader和APP两个独立的工程。APP工程在编译前通过设置不同的起始地址,编译生成两个固件:APP-A和APP-B。升级时,如果MCU正在运行的是APP-A,则仅更新最新版本APP-B到其对应的Flash地址中,不更改原版APP-A固件程序,反之亦然。该设计可彻底解决升级过程中因意外失败,导致不可回退到原版本程序的问题。

3 系统设计

3.1 Flash分区

STM32L073RZ芯片属于大容量产品,具有192 KB的片内Flash存储器和20 KB的 RAM。Flash的起止地址为0x08000000~0x0802FFFF,共分为1 536页。每页大小为128 B。而每扇区则由32页4 KB组成。

为实现IAP升级,需要把Flash人为地分成几个部分:一部分存储引导程序,即Bootloader程序区;另一部分存储用户应用程序,即APP程序区;还有一部分存储升级标志或用户程序标志,简称配置信息区。本设计把Flash分成Bootloader程序区、配置信息区、APP-A程序区和APP-B程序区四个部分。Flash存储器分区如表1所示。

表1 Flash存储器分区

在Keil MDK-ARM开发环境中,编译BootLoader程序工程时,其起始地址需设置为0x8000000,空间大小为0x3000。

APP程序工程则需要编译两次,得到两个固件程序。APP-A程序的起始地址设置为0x8004000,空间大小为0x16000。APP-B程序的起始地址设置为0x801A000,空间大小为0x16000。另外,还需要将APP程序工程编译生成的Axf文件,转换成升级固件程序Bin文件,用于实际烧入MCU。设置User选项卡下的After Build/Rebuildr的Run #1选项为:C:Keil_v5ARMARMCCinfromelf.exe-bin-o.ReleaseTG134_SRC.bin.ReleaseTG134_SRC.axf。编译后自动转换生成一个TG134_SRC.bin二进制文件。

Bootloader程序工程编译生成的Bootloader.hex文件,需要与APP程序工程生成的APP-A.hex文件合并,生成一个新的HEX文件,用于产品生产时烧录到MCU中。推荐使用优秀的合并工具SEGGER J-Flash进行合并。经转换生成的APP-A.bin和APP-B.bin文件,需要再经过加密才能用于升级,而且加密算法最好使用3DES或SM4以上级别的算法,安全才有保障。

3.2 Bootloader程序设计

在通常的升级方案中,Bootloader程序是整个方案中的关键部分,需完成初始化程序、升级文件检测、固件更新以及程序跳转等工作。特别是固件更新,一般耗时较长,容易受到电源不稳或外部干扰的影响,造成不可回退的升级失败。本方案中,Bootloader程序仅从配置信息区读取最新版APP程序的存储地址,然后把程序跳转到对应的地址执行APP程序;其他的升级功能操作放到APP程序中实现。

以下是程序完整的Bootloader代码。

Typedef void(*pFunction)(void);

//定义函数指针类型

pFunction JumpToApplication;

//定义函数指针

uint32_t u32JumpAddress;

//32位跳转地址

#define CONFIG_ADDRESS(uint32_t)0x08003000

#define APP_A_ADDRESS (uint32_t)0x08004000

#define APP_B_ADDRESS (uint32_t)0x0801A000

void IAP_StartUserApp(uint32_t appAddr)

{

//STM32L073RZ的栈顶地址值必须在此范围内

if((*(__IO uint32_t *)appAddr >=0x20000000)&&\(*(__IO uint32_t *)appAddr<=0x20004FFF))

{

//读取程序跳转地址

u32JumpAddress =*(__IO uint32_t *)(appAddr+4);

//初始化函数指针

JumpToApplication=(pFunction)u32JumpAddress;

//初始化栈顶指针

_set_MSP(*(__IO uint32_t *)appAddr);JumpToApplication();

//跳转到用户应用程序

}

}

int main(void)

{

第四,从上述政治与文学的关系研究进一步拓展,则体现为东方主义视域下的明治文学家/文人(如:夏目漱石、内藤湖南、依田学海)的中国观(包括中国形象)或战争观研究。如:李雁南、泊功、宋刚等学者的研究。[56-58]

uint32_t u32AppAddress = 0;

HAL_Init();

SystemClock_Config();

//读取最新版本APP程序的存储地址

u32AppAddress=*(__IO uint32_t *)CONFIG_ADDRESS;

if(APP_B_ADDRESS == u32AppAddress)

//跳转到APP-B程序执行

IAP_StartUserApp(APP_B_ADDRESS);else

//跳转到APP-A程序执行

IAP_StartUserApp(APP_A_ADDRESS);while(1){}

}

3.3 APP程序设计

3.3.1 重定向中断向量表

STM32芯片内部通过中断向量表响应中断。中断向量表的起始地址是0x08000004。在程序正常运行过程中,如果有中断发生,芯片内部硬件机制会将PC指针强制指向中断向量表,并根据中断源取出对应中断向量执行中断服务程序[9]。然而,APP程序是一套完整独立的程序,自有另外一张中断向量表。其起始地址是APP程序首地址+4,与原Flash中存储的中断向量表已发生了偏移。在APP程序执行过程中,如果有中断请求发生,PC指针仍然被强制跳转到0x08000004地址的中断向量表,而不是APP程序自己的中断向量表。因此,需要对中断向量表进行重定向,即配置向量表偏移量寄存器,使之指向APP程序的向量表[10]。

在APP程序的main()函数中,第一件要做的事情就是重定向中断向量表,从配置信息区读取当前APP程序自身的存储地址,把地址值设置为APP程序的中断向量表偏移量。

程序代码如下。

int main(void)

{

sIAP.CurrAppAddr = *(__IO uint32_t *)CONFIG_ADDRESS;

//读取当前APP程序的存储地址

if((APP_A_ADDRESS != sIAP.CurrAppAddr)&& \(APP_B_ADDRESS != sIAP.CurrAppAddr))

{

//未设置则默认为APP_A

sIAP.CurrAppAddr = APP_A_ADDRESS;IAP_WriteConfig(CONFIG_ADDRESS,sIAP.CurrAppAddr);

//把APP-A的址址写入配置信息区

}

//设置中断向量表偏移量

SCB->VTOR = sIAP.CurrAppAddr;HAL_Init();

SystemClock_Config();

//以下是应用业务和升级包处理程序

}

3.3.2 固件安全传输与更新

升级流程如图2所示。

图2 升级流程图

固件升级服务的安全直接关系到整个系统的安全,因为此服务能彻底更改终端的运行程序。首先,必须保证新版本固件程序本身经过严格测试才能发布到升级服务器中。特别是新固件程序自身的再次升级的功能,必须确保升级后的程序,即使有错误也有继续升级的能力。另一个重点是对内部和外部恶意攻击的提防,如嗅探攻击、瘫痪升级服务器攻击和提供假冒升级固件程序攻击等。

因此,升级服务由业务系统对特定的终端实施单独开放,仅有业务系统发送升级命令,并为该终端标记升级允许标志后,才允许该终端进行升级。升级服务器的IP、端口等信息也由业务系统伴随升级命令一起发送给终端,终端内不固定存储升级服务器的IP及端口。固件程序必须经过加密和验证后,才能存入升级服务器:即服务器内不存储固件程序Bin文件,仅存储加密后的Bin文件,保障服务器端不泄露程序的Bin文件。

燃气表终端主动与业务服务器连接,在完成正常的抄表、充值等业务之后,如果有新版本固件需要升级到终端,则开启升级。

①由业务服务器发送允许升级命令给终端,通知终端在一定的时间内允许升级。

②收到终端的应答之后,业务服务器再通知升级服务器在一定的时间内允许某个终端来申请升级。

③收到升级服务器的应答之后,业务服务器给终端发送升级命令,同时把升级服务器的IP和端口号通知终端。

④终端主动断开与业务服务器的连接,重新连接到升级服务器,并发送自己当前的固件版本信息给升级服务器,申请升级。

⑤升级服务器根据终端当前版本信息,选择一个新版APP固件程序。如果终端当前版本为APP-A,则选择新版APP-B;否则,选择新版APP-A,把选择的新版固件程序文件大小等信息反馈给终端。

⑥终端从逻辑地址0开始,按合适的长度请求下载第一包固件数据,升级服务器按请求地址和长度取出固件数据返回给终端。

⑦终端把接收到的固件数据,经过校验和解密之后,写入Flash中对应的APP程序区内,继续请求下载下一包固件数据。

⑧当终端接收到最后一包固件数据并写入Flash之后,校验整个新版APP固件程序的合法性。最后,更新配置信息区的最新版APP程序存储地址选项的值。这是整个升级过程最为关键的一步。但只更新一个字的内容,失败的机率可以忽略不计。即使失败了,终端还可以继续运行旧版的程序。

⑨终端主动断开与升级服务器的连接,复位系统。

⑩终端重启后,连接到业务服务器,通知业务服务器该终端已成功完成升级。

升级过程中,由于网络信号质量或其他的原因,终端有可能会收不到来自服务器的应答,或收到不完整的数据。因此,终端需要做很多的容错措施,如最多3次请求下载同一个数据包等。如果本次升级没有成功,则可等待到下一次连接时再进行升级。

4 验证测试

本课题项目已在国内某市安装的NB-IoT物联网燃气表上进行了验证测试,一共测试100台。一次连接升级就成功的有97台,其中有92台的升级耗时在4 min之内,另外5台耗时在4~6 min之间。升级失败的3台,再次启动连接进行第2次升级测试,在6 min内全部成功完成升级。最后,查看服务器后台数据,发现未能在4 min内完成升级的燃气表有8台。其信号强度值都没有超过10(0~31,值越大表示信号越好),并且都有多次请求下载同一数据包的情况;同时,且其安装位置环境都是较为封闭、屏蔽物较多。由此可知,物联网燃气表的网络信号质量对升级的成功与否影响较大。

5 结论

本文主要根据安全和可靠的要求,充分考虑了终端设备的安全、固件程序的安全、升级服务器的安全和升级意外失败的回退等多个方面的需求,开展整个升级方案的设计工作。对Flash进行了科学的分区,在程序设计上把不可更新的Bootloader程序极简化,把可重复升级更新的APP程序精准化。对终端的升级操作引入了时效性,而升级服务器IP地址则隐藏化。该方案已在实际应用中得到了验证,对其他物联网终端的远程升级设计有一定的参考价值。

猜你喜欢
燃气表固件终端
采用虚拟计数器的电子式膜式燃气表
膜式燃气表计量信息采集技术
物联网智能燃气表电量自补给装置
X美术馆首届三年展:“终端〉_How Do We Begin?”
通信控制服务器(CCS)维护终端的设计与实现
多功能北斗船载终端的开发应用
基于固件的远程身份认证
流量均匀性对膜式燃气表检定的影响研究
提取ROM固件中的APP
一种通过USB接口的可靠固件升级技术