ESP8266基于HTTPS/HTTP进行OTA升级

前言

    本文基于乐鑫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升级

开发环境

  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 地址,具体根据实际情况修改)。ESP8266基于HTTPS/HTTP进行OTA升级_第1张图片
  2. 进入Component config -> ESP HTTPS OTA,选上Allow HTTP for OTA(按Y),最后退出保存。
    ESP8266基于HTTPS/HTTP进行OTA升级_第2张图片
  • 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升级,可看到升级打印的信息,耐心等待一会就升级完成了。
ESP8266基于HTTPS/HTTP进行OTA升级_第3张图片

二、通过 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升级

  • 给模块重新上电后,会报错:
    ESP8266基于HTTPS/HTTP进行OTA升级_第4张图片

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

    通过查代码,找到了esp_tls.c这个文件(路径为${IDF_PATH}/components/esp-tls/esp_tls.c)。在函数esp_tcp_connect中修改了dns解析的结果,代码修改前后如下:
    修改前:
ESP8266基于HTTPS/HTTP进行OTA升级_第5张图片
    修改后:
ESP8266基于HTTPS/HTTP进行OTA升级_第6张图片
    可以看到,我增加了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修改

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

你可能感兴趣的:(https,go,http,嵌入式,物联网)