ESP8266 使用 WebREPL 远程更新

本篇新增软件
WebREPL在线版http://micropython.org/webrepl/
下载地址:https://codeload.github.com/micropython/webrepl/zip/master

在MicroPython on ESP8266的开发过程中,做的最多的事情就是上传文件,MicroPython File Uploader 虽然很好用,但是有两个缺点:

  1. 必须将ESP8266开发板与电脑连接
  2. 如果开发板中运行的程序未结束,例如定义了死循环用来监听信号时,文件的上传有可能会失败。

上传失败自不必说,而必须与电脑连接就制约了我们开发的灵活性,想像一下:我们用8266做了一个通过手机控制的接线板控制器,封装后安装进接线板中,然后有一天想要给它增加一个定时开关功能,只需要简单更新几句代码并没有新增硬件设施的前提下,如果使用MicroPython File Uploader,需要从接线板中拆除后再连接电脑进行更新,这无疑会影响体验。ESP8266的官方SDK是支持云升级功能的,即可以通过远程烧写固件的方式对开发板进行固件更新,那MicroPython是否能实现类似的功能呢?今天的主角WebREPL为此而生。

WebREPL客户端是MicroPython官方推荐的更新方式,功能很强大,通过网页的方式读取ESP8266的文件系统,可以上传文件或者下载开发板中已存在的文件,可以输入指令并实时查看开发板中的输出状态,完全取代串口调试。
WebREPL客户端的两种使用方式在本篇开头已经写明,选择任意一种均可以连接开发板。

WebREPL客户端必须与ESP8266开发板在同一局域网下,否则无法正常连接

WebREPL在固件中默认是不启动的,所以在使用之前,需要先将服务打开。

  1. 在输入框输入 import webrepl_setup
  2. 看到当前WebREPL自动启动状态是未开启的
  3. 输入E开启上电时自动启动WebREPL功能
  4. 要开启WebREPL必须先设定密码,密码为4-9个字符
  5. 连续输入两次密码后,确认Web_REPL开启成功,重启开发板

到这一步,按照我的预期,WebREPL服务应该已经是开启状态,而我们可以使用WebREPL客户端来进行连接了,实际情况却是此时如果使用客户端进行连接,将会始终连接失败,所以还需要有第6步。

  1. 输入import webrepl;webrepl.start();
  2. 成功开启WebREPL服务,此时即可通过WebREPL客户端来进行远程连接ESP8266开发板,并上传或下载文件。

接下来使用WebREPL客户端连接开发板

  1. 打开http://micropython.org/webrepl/
    并修改地址为上一步控制台输出的地址,我这里是ws://192.168.2.19:8266

2.点击连接后,输入刚刚设定的密码,输入密码时不会有任何回显,输入完毕直接回车,一切正常的情况即会连接成功。

3.现在已经可以通过WebREPL客户端对ESP8266进行操作,主窗口中输入python代码进行实时调试,右侧有文件上传与下载功能,上传功能与MicroPython File Uploader一样,下载功能可以直接下载ESP8266开发板中存在的文件。

输入import os;os.listdir();,查看当前开发板中的文件名称

将文件名输入到右侧的Get a file输入框中,点击Get from device按钮,即可将开发板中的文件下载到本地

4.webrepl_cfg.py文件中存放着我们之前设定的WebREPL密码,明文的〜!〜

到此,使用WebREPL远程更新ESP8266开发板已经完成,不过虽然前面设置了在开发板启动时自动开启WebREPL服务的功能,实验证明,在开发板断电重启后,WebREPL服务并未开启,经检查,是因为在设置WebREPL服务之前,我们上传了自定义的boot.py文件,而MicroPython在开启WebREPL服务时,会将相关代码直接追加在boot.py文件尾,造成了语法错误,所以要手动更新一下boot.py文件。

更新后的boot.py文件内容如下

import network,webrepl
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
    print("connecting to network...")
    sta_if.active(True)
    sta_if.connect("<ap_name>", "<password>") # Connect to an AP <ap_name>&<password> is your route name&password
    while not sta_if.isconnected(): # Check for successful connection
        pass
print("network config:", sta_if.ifconfig())
webrepl.start()

再也不用把开发板跟电脑相连啦!

作者:四十方知
链接:https://www.jianshu.com/p/f0ff221e7abe
来源:简书



坐沙发

发表评论

你的邮件地址不会公开


*