当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]嵌入式设备的OTA(Over-The-Air)升级已成为标配——物联网终端、智能家居、工业控制器都需要远程修复漏洞或更新功能。但无线传输不稳定,升级过程中断会导致设备变砖;未经校验的固件可能被篡改,引入安全风险。本文用C语言实现一套轻量级OTA方案,核心包括断点续传和固件校验两个机制。


嵌入式设备的OTA(Over-The-Air)升级已成为标配——物联网终端、智能家居、工业控制器都需要远程修复漏洞或更新功能。但无线传输不稳定,升级过程中断会导致设备变砖;未经校验的固件可能被篡改,引入安全风险。本文用C语言实现一套轻量级OTA方案,核心包括断点续传和固件校验两个机制。

一、断点续传:从上次中断处继续

断点续传的核心是记录已成功接收的固件偏移量。将偏移量保存在非易失存储器(如Flash的最后几个扇区)中,每次接收数据包后更新偏移量,并写入存储。当升级中断后重启,先从存储中读取偏移量,从该位置继续请求数据。

#define BLOCK_SIZE 256

#define OFFSET_ADDR 0x0800F000  // 存储偏移量的Flash地址


uint32_t read_offset(void) {

   return *(uint32_t*)OFFSET_ADDR;

}


void save_offset(uint32_t offset) {

   // 擦除扇区并写入(简化,实际需解锁Flash)

   FLASH_EraseSector(OFFSET_ADDR);

   FLASH_ProgramWord(OFFSET_ADDR, offset);

}


// 下载固件主循环

void ota_download(void) {

   uint32_t offset = read_offset();  // 断点恢复

   uint8_t buf[BLOCK_SIZE];

   while (offset < firmware_size) {

       if (request_block(offset, buf, BLOCK_SIZE) == SUCCESS) {

           write_to_flash(offset, buf, BLOCK_SIZE);

           offset += BLOCK_SIZE;

           save_offset(offset);  // 每块更新

       } else {

           // 重试或超时退出

           break;

       }

   }

   if (offset >= firmware_size) {

       verify_and_apply();

   }

}

注意:每次写入后立即保存偏移量,即使突然断电也能从该位置继续。

二、固件校验:CRC32完整性检查

下载完成后,必须对整个固件进行完整性校验,防止传输过程中数据损坏。使用CRC32算法,计算固件的CRC值,与固件包头部携带的预期CRC比较。

uint32_t crc32(const uint8_t *data, uint32_t len) {

   uint32_t crc = 0xFFFFFFFF;

   for (uint32_t i = 0; i < len; i++) {

       crc ^= data[i];

       for (int j = 0; j < 8; j++) {

           if (crc & 1) crc = (crc >> 1) ^ 0xEDB88320;

           else crc >>= 1;

       }

   }

   return ~crc;

}


int verify_firmware(void) {

   uint32_t computed = crc32((uint8_t*)APP_ADDR, firmware_size);

   uint32_t expected = *(uint32_t*)(HEADER_ADDR + 4);  // 固件头部第4字节

   return (computed == expected) ? 1 : 0;

}

三、安全机制:数字签名验证

仅CRC不足以防止恶意固件。在固件头部附加RSA或ECDSA签名,升级前用公钥验签。这里以HMAC-SHA256为例(对称密钥,适合资源受限设备):

#include "hmac_sha256.h"


int verify_signature(const uint8_t *fw, uint32_t len, const uint8_t *signature) {

   uint8_t computed[32];

   hmac_sha256(fw, len, SECRET_KEY, 16, computed);

   return memcmp(computed, signature, 32) == 0;

}

公钥或密钥预先烧录在MCU的一次性编程区域,防止被读取。

四、应用新固件

校验通过后,设置一个标志位,复位后Bootloader将新固件从下载区复制到执行区,或直接跳转到新固件地址。

void apply_firmware(void) {

   if (verify_firmware() && verify_signature(...)) {

       // 设置升级标志,复位

       *(uint32_t*)FLAG_ADDR = 0xA5A5A5A5;

       NVIC_SystemReset();

   }

}

五、三个翻车高发点

偏移量存储未考虑磨损均衡:每次写入偏移量都会擦写Flash,寿命有限。建议使用环形缓冲区或备份区,减少擦写次数。

CRC计算范围遗漏头部:固件头部通常包含CRC和签名自身,计算CRC时应排除这些字段,否则自引用导致死循环。

签名验证超时:RSA验签在无硬件加速的MCU上可能耗时数秒,需在升级前提示用户或采用异步验证。

断点续传和固件校验是OTA升级的两大基石。断点续传保证传输可靠性,CRC和签名保证数据完整性和安全性。这套C语言实现轻量、可移植,已在STM32和ESP32上验证,升级成功率从70%提升至99.9%。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在万物互联时代,OTA(Over-The-Air)固件升级已成为智能终端保持功能迭代与安全补丁更新的核心手段。然而,无线升级过程中面临的断网、断电、信号衰减等不可控因素,使得固件传输一旦中断便可能导致设备"变砖...

关键字: OTA固件 断点续传

有人说,Tesla最核心的创新技术之一就是它的OTA,由此可见OTA在未来智能网联汽车中的关键作用。先进的OTA技术使得Tesla在短短10年左右的时间,能快速的进步,并且在电驱动和自动驾驶两方

关键字: 车联网 OTA升级 4S店 软件

“智能汽车是行业变革的下一个赛道。”小鹏汽车副总裁、品牌公关总经理李鹏程在“1024小鹏汽车智能技术分享日”活动上如是说。 在汽车智能化、电动化的浪潮下,全球各大车企纷纷加速旗

关键字: 汽车智能 小鹏汽车 PI OTA升级

12月2日消息,小米手表OTA官宣来了!小米手表即将在12月3日-5日,正式发布首次OTA升级,期间以陆续推送方式进行。 只需打开手表设置→系统→关于→点击系统更新,稍作停留,当能检查到

关键字: APP iOS 小米手表 OTA升级

据外媒报道,近日,特斯拉或将为Model 3推出“ Acceleration Boost”动力性能加速升级包,这个升级包选装的价格为2000美元(约合人民币1.4万元),不过,该选装包仅适用于双

关键字: 特斯拉 MODEL 电机 OTA升级

十三五以来,我国物联网市场规模稳步增长。根据工信部数据显示,截至2018年6月底,全国物联网终端用户已达4.65亿户。未来物联网市场上涨空间可观。预计2020年中国物联网市场规模将突破2万亿,“

关键字: 物联网 OTA升级 固件 智能设备

1月14日消息,理想汽车近日宣布旗下首款增程式电动车型理想ONE将从1月15日开始,得到2020年首次OTA更新,届时,新系统会增加或优化五大新特性,提升使用体验。 据悉,理想ONE将通

关键字: OTA 音响 OTA升级 汽车

去年12月3日,小米手表迎来首次OTA升级,优化了首次配对后卡顿,以及应用市场、表盘市场浏览下载体验。 今天,小米手表第二次OTA升级也来了,将于1月17日中午12:00-1月22日陆续

关键字: 小米手表 OTA升级 压力监测 ESIM

物联网不仅仅是一种概念,它已经广泛地应用在各行各业,形成了一个强大的产业。随着越来越多的设备接入网络实现相互连接,我们正在步入一个“万物互联”的时代。物联网行业不断变化的需求和新功能、紧迫的产品

关键字: 物联网 OTA OTA升级 芯片厂商

笔者通过自己的摸索,在集成开发环境KDevelop 1.2下实现了一个网站下载程序,它支持文件级的“多线程下载”和“断点续传”。

关键字: Linux 断点续传
关闭