ESP8266基于HTTPS/HTTP进行OTA升级

前言

    本文基于乐鑫IDF rtos3.3 SDK进行试验,验证ESP8266通过HTTP/HTTPS进行OTA升级的功能。过程中有借鉴网上诸多资料,难以列出,如有介意联系删除。

开发环境

  1. 系统 ubuntu 20.04
  2. 乐鑫IDF rtos3.3
  3. openssl (用于生成CA证书)
sudo apt-get install openssl # 安装 openssl
openssl version # 验证是否安装成功
  1. golang(用于搭建 http/https 服务,有其他类似工具可不用golang)
sudo apt-get install golang-go # 安装 golang
go version # 验证是否安装成功

一、通过 HTTP 进行 OTA

1.1、配置8266工程与烧录

  • IDF 开发环境搭建的不再赘述,网上很多资料。首先把 OTA 的例程从 SDK 中拷贝出来。例程路径为:${IDF_PATH}/examples/system/ota/simple_ota_example/,这里以拷贝至用户目录下的 test 目录为例。
mkdir ~/test
cp -r ${IDF_PATH}/examples/system/ota/simple_ota_example/ ~/test/
  • 然后进入拷贝例程所在根目录,执行make menuconfig进行相关配置。
make menuconfig
  1. 先进入Example Configuration下配置的ssidpass为自己的路由器账号密码,配置firmware upgrade url endpoint为自己架设的 http 服务地址(后续步骤会讲到,我这边配置的是 http://192.168.8.100:8081/ota.bin,其中192.168.8.100是我自己电脑 IP 地址,具体根据实际情况修改)。在这里插入图片描述
  2. 进入Component config -> ESP HTTPS OTA,选上Allow HTTP for OTA(按Y),最后退出保存。
    在这里插入图片描述
  • make flash烧录程序
make flash
  • make ota编译升级文件,然后把升级文件复制出来改名为ota.bin
cp build/simple_ota.bin ota.bin

1.2、搭建 HTTP 服务

  • 使用vim新建文件server.go,复制代码进去,保存后输入go run server.go执行

    代码如下:

package main

import (
		"fmt"
		"net/http"
)

func main() {
	fmt.Println("start web server on 8081")
	http.Handle("/", http.FileServer(http.Dir(".")))
	err := http.ListenAndServe(":8081", nil)
	fmt.Println(err)
}

    命令如下:

vim server.go
go run server.go

1.3、OTA升级

    至此准备工作都完成了,给8266模块重新上电即可自动进行OTA升级,可看到升级打印的信息,耐心等待一会就升级完成了。
在这里插入图片描述

二、通过 HTTPS 进行 OTA

2.1、搭建 HTTPS 服务

    具体的 https 的基本知识若是不了解去网上先查下,这边不赘述了。单项认证的话我们需要3样东西,分别是 CA根证书、服务端证书、服务端私钥。

  • 制作证书
# 生成 ca根证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=espota.com" -days 5000 -out ca.crt

# 生成 server证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=espota.com" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000

    最后得到如下所示的这些文件:

├── ca.crt
├── ca.key
├── ca.srl
├── server.crt
├── server.csr
└── server.key

    把 ca.crt 复制到例程目录下的server_certs目录里,并更名替换原本的ca_cert.pem。把server.crtserver.key放到和https服务端 go 程序同级目录下。证书也可以下载我制作的:点此下载

cp ca.crt server_certs/ca_cert.pem

    go https服务程序如下

package main

import (
		"fmt"
		"net/http"
)

func main() {
	fmt.Println("start web server on 8081")
	http.Handle("/", http.FileServer(http.Dir(".")))
	err := http.ListenAndServeTLS(":8081", "server.crt", "server.key", nil)
	fmt.Println(err)
}

2.2、配置8266工程与烧录

    配置烧录步骤和 HTTP 方式类似(注意这边先把证书生成好再编译),只是有以下几点需要修改下:

  • firmware upgrade url endpoint 中的http://192.168.8.100:8081/ota.bin改为https://espota.com:8081/bin(域名的话随便自己设置,注意前面生成证书的时候一致就可以了,IP 我试了在生成证书后校验会报 IP SANS 的错,目前还不知道为什么,只有用域名了)。
  • Allow HTTP for OTA关掉(按N)。

    然后即可编译烧录。

2.3、OTA升级

  • 给模块重新上电后,会报错:
    在这里插入图片描述

    这边是之前忘记dns的问题了,这个域名解析到了外网的IP。但是8266又改不了 host,我看了下我的路由器也没有这个设置。没关系,只要思想不滑坡,方法总比困难多,不能解析本地的域名,反正我只是在测试(正式环境就不会有这么多的问题了),我直接把解析结果改成我的IP地址和端口就可以了。

    通过查代码,找到了esp_tls.c这个文件(路径为${IDF_PATH}/components/esp-tls/esp_tls.c)。在函数esp_tcp_connect中修改了dns解析的结果,代码修改前后如下:
    修改前:
在这里插入图片描述
    修改后:
在这里插入图片描述
    可以看到,我增加了176、177两行代码。(注意:测试完记得注释掉这两行

p->sin_port = htons(8081); //  修改端口为 8081 
p->sin_addr.s_addr = inet_addr("192.168.8.100"); // 修改 IP 为 192.168.8.100,根据自己的电脑IP修改

    然后重新编译烧录,给模块重新上电就没问题了。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
基于stm32和esp8266ota在线升级是指通过互联网实现对stm32和esp8266设备固件的远程在线升级。这种方式相比传统的离线升级,具有更高的灵活性和便利性。 OTA(Over The Air)在线升级是一种可以无需物理连线的远程设备固件升级的技术,通过云平台或服务器,将新版本的固件通过无线网络传输到目标设备,实现远程升级操作。对于基于stm32和esp8266的设备,实现OTA升级的过程如下: 首先,需要在stm32和esp8266设备上搭建OTA升级功能的框架。可以利用相应的开发工具或库,编写OTA升级模块代码,以实现设备的OTA功能。 然后,在云平台或服务器端搭建OTA服务器,并将新版本固件上传至服务器。将固件进行版本标识,并提供下载链接。 设备连接到云平台或服务器,检测到有新版本固件时,可以从OTA服务器下载新版本固件。可以通过httphttps协议进行下载,也可以使用mqtt等通讯协议。 下载完毕后,设备会对下载的固件进行校验,以确保固件的完整性和正确性。 之后,设备会将自身重启进入升级模式,加载新版本固件,并开始固件升级。 在固件升级过程中,设备会自动备份旧版本固件,以便在升级失败时进行回滚。 固件升级完成后,设备会重新启动,并加载新版本固件。设备便成功完成了OTA在线升级。 总之,基于stm32和esp8266OTA在线升级,通过云平台或服务器,实现了设备的远程固件升级,提高了固件更新的灵活性和便利性。这为设备终端和应用提供了更好的升级管理和维护方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值