OTA是什么
OTA是英文Over-the-Air首字母缩写,中文意思是空中下载技术,是通过网络远程对设备程序进行修改,主要进行漏洞修补和程序升级、优化。
做一个项目,由于时间仓促,加之对采用的技术不是很熟悉,又要马上推出项目,急需预留修复程序bug的预案,好在采用了ESP32作核心控制器,此模块具备wifi联网功能,具备了OTA先天条件,而且支持micropython编程。MicroPython是运行在微控制器硬件之上的完全的Python编译器和运行时系统。除了包括选定的核心Python库,MicroPython还包括了给予编程者访问低层硬件的模块,除了实现一系列核心Python库之外,MicroPython还包括用于访问低级硬件的“机器”等模块。
交流分享
** 很多网友、大佬慷慨地贡献出自己在研究过程中的一些心得,使得象我这样的新手,也按着前人的路子,往前走,走到了想要去地方,找到了自己想要的东西。搜索了很文章,下面先介绍几篇对自己开发研究很有帮助的文章,分享出来,并在此表示深深的感谢。
第一篇:手机远程向ESP32推送代码
** 原文链接:https://www.bilibili.com/read/cv15317865/, 作者:天与地-谦信 出处:bilibili**
这篇幅文章短小、简洁,表达清晰,让我感到按着方法能够实现OTA,对开发升级程序将会是非常方便,完全按照作者的办法和示例的代码,我没有实现OTA,连最简单的读取文件 操作都没有做到。但是, 从这篇文章中,我学到两个知识点:
1)需要一个专门的文件 :urequests.py,来实现联网,本文提到的urequests.py进行调试,会报错,因为是新手,我也不知道如何解决。
2)需要有个地方放自己的程序,如文中提到的url=“https://gitee.com/tianyudi/esp32/raw/master/webpush/main.py” 这样才可以OTA。通过模仿学习,我自己也在网上存放自己的测试程序文件:url=“https://gitee.com/wangcj001/rfid-ota/raw/master/main.py”。
期间,为得到一个纯粹的文件链接,还花了很精力的探索。在以下网站注册一自己的账户,上传自己测试代码,点击红圈1 处,有会出现上传的文件源文件,浏览器地址栏就有纯粹的文件链接。真是会者不难,难者不会。
第二篇:micropython,用esp32联网,然后调用urequests.get函数出现错误-202如何解决
** 原文链接:https://ask.csdn.net/questions/7681064,**
我也到官网上下载urequests.py文件,下载时会报错,自己也找不原因, 看不出两个文件的差别,在这篇文章里我完全拷贝了他的urequests.py,没有做任何更改,直接传送到ESP32中,没有报错,也是用这个文件把自己放在网络上的测试文件提取下来了。
成果分享
我建立了三个文件,urequests.py,boot.py,main.py,下图圈黄圈处
在boot.py中增加了两条命令:
exec(open(‘urequests.py’).read(),globals())
exec(open(‘main.py’).read(),globals())
main.py采用以上提到的“第一篇:手机远程向ESP32推送代码”的大部分代码结构,实现wifi连网和提取文件。
main.py
import urequests
from micropython import *
from machine import Pin,Timer
import time
import network
led=Pin(2, Pin.OUT) #将led引脚定义为输出
def blink(t):
led.value(not led.value())
tim = Timer(1) #创建Timer对象
tim.init(period=1000,mode=Timer.PERIODIC, callback=blink) #不断实现呼吸灯功能,持续10毫秒
try:
import usocket as socket
except:
import socket
# 热点名字
#essid = 'CMCC-c4um'
essid = '要连接的wifi名称' #根据自己的情况修改
# 热点密码
password = '要连接的wifi密码' #根据自己的情况修改
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
def do_connect(essid, password):
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(essid, password)
while not wlan.isconnected():
print('connecting to network failed...')
time.sleep(2)
print('network config:', wlan.ifconfig())
# 作者:天与地-谦信 https://www.bilibili.com/read/cv15317865 出处:bilibili
do_connect(essid, password)
time.sleep(2)
url="https://gitee.com/wangcj001/rfid-ota/raw/master/main.py" #测试的文件链接
#url="https://gitee.com/tianyudi/esp32/raw/master/webpush/main.py" #测试的文件链接
# 访问ip地址 api
r = urequests.get(url)
#print(r) #这条语句会报错,待探索
#print(r.content) # 返回响应的内容 #这条语句会报错,待探索
print(r.text) # 以文本方式返回响应的内容,得到文件内容
#print(r.json()) # 返回响应的json编码内容并转为dict类型, #这条语句会报错,待探索
r.close()
wlan.active(False)
在uPyCraft的调试窗中,看到自己放在网络上文件的内容,上图“圈中的内容”是我的代码的最后一条指令,只要得到代码,下面如何做就简单啦!