赞
踩
本文基于乐鑫IDF rtos3.3 SDK进行试验,验证ESP8266通过HTTP/HTTPS进行OTA升级的功能。过程中有借鉴网上诸多资料,难以列出,如有介意联系删除。
sudo apt-get install openssl # 安装 openssl openssl version # 验证是否安装成功
- 1
- 2
sudo apt-get install golang-go # 安装 golang go version # 验证是否安装成功
- 1
- 2
${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
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
至此准备工作都完成了,给8266模块重新上电即可自动进行OTA升级,可看到升级打印的信息,耐心等待一会就升级完成了。
具体的 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)
}
配置烧录步骤和 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)。然后即可编译烧录。
这边是之前忘记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修改
然后重新编译烧录,给模块重新上电就没问题了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。