概述
前言
本文基于乐鑫IDF rtos3.3 SDK进行试验,验证ESP8266通过HTTP/HTTPS进行OTA升级的功能。过程中有借鉴网上诸多资料,难以列出,如有介意联系删除。
目录
- 前言
- 开发环境
- 一、通过 HTTP 进行 OTA
- 1.1、配置8266工程与烧录
- 1.2、搭建 HTTP 服务
- 1.3、OTA升级
- 二、通过 HTTPS 进行 OTA
- 2.1、搭建 HTTPS 服务
- 2.2、配置8266工程与烧录
- 2.3、OTA升级
开发环境
- 系统 ubuntu 20.04
- 乐鑫IDF rtos3.3
- openssl (用于生成CA证书)
sudo apt-get install openssl # 安装 openssl openssl version # 验证是否安装成功
- 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
- 先进入
Example Configuration
下配置的ssid
和pass
为自己的路由器账号密码,配置firmware upgrade url endpoint
为自己架设的 http 服务地址(后续步骤会讲到,我这边配置的是http://192.168.8.100:8081/ota.bin
,其中192.168.8.100
是我自己电脑 IP 地址,具体根据实际情况修改)。- 进入
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.crt
和 server.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修改
然后重新编译烧录,给模块重新上电就没问题了。
最后
以上就是糊涂裙子为你收集整理的ESP8266基于HTTPS/HTTP进行OTA升级前言开发环境一、通过 HTTP 进行 OTA二、通过 HTTPS 进行 OTA的全部内容,希望文章能够帮你解决ESP8266基于HTTPS/HTTP进行OTA升级前言开发环境一、通过 HTTP 进行 OTA二、通过 HTTPS 进行 OTA所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复