本篇新增软件
WebREPL在线版http://micropython.org/webrepl/
下载地址:https://codeload.github.com/micropython/webrepl/zip/master
在MicroPython on ESP8266的开发过程中,做的最多的事情就是上传文件,MicroPython File Uploader 虽然很好用,但是有两个缺点:
- 必须将ESP8266开发板与电脑连接
- 如果开发板中运行的程序未结束,例如定义了死循环用来监听信号时,文件的上传有可能会失败。
上传失败自不必说,而必须与电脑连接就制约了我们开发的灵活性,想像一下:我们用8266做了一个通过手机控制的接线板控制器,封装后安装进接线板中,然后有一天想要给它增加一个定时开关功能,只需要简单更新几句代码并没有新增硬件设施的前提下,如果使用MicroPython File Uploader,需要从接线板中拆除后再连接电脑进行更新,这无疑会影响体验。ESP8266的官方SDK是支持云升级功能的,即可以通过远程烧写固件的方式对开发板进行固件更新,那MicroPython是否能实现类似的功能呢?今天的主角WebREPL为此而生。
WebREPL客户端是MicroPython官方推荐的更新方式,功能很强大,通过网页的方式读取ESP8266的文件系统,可以上传文件或者下载开发板中已存在的文件,可以输入指令并实时查看开发板中的输出状态,完全取代串口调试。
WebREPL客户端的两种使用方式在本篇开头已经写明,选择任意一种均可以连接开发板。
WebREPL客户端必须与ESP8266开发板在同一局域网下,否则无法正常连接
WebREPL在固件中默认是不启动的,所以在使用之前,需要先将服务打开。
- 在输入框输入
import webrepl_setup
输入 import webrepl_setup -
看到当前WebREPL自动启动状态是未开启的
提示 webrepl未开启自动启动功能 - 输入
E
开启上电时自动启动WebREPL功能
输入E开启 -
要开启WebREPL必须先设定密码,密码为4-9个字符
连续输入两次4-9位的密码 -
连续输入两次密码后,确认Web_REPL开启成功,重启开发板
webrepl已开启自动启动功能
到这一步,按照我的预期,WebREPL服务应该已经是开启状态,而我们可以使用WebREPL客户端来进行连接了,实际情况却是此时如果使用客户端进行连接,将会始终连接失败,所以还需要有第6步。
- 输入
import webrepl;webrepl.start();
输入import webrepl;webrepl.start(); -
成功开启WebREPL服务,此时即可通过WebREPL客户端来进行远程连接ESP8266开发板,并上传或下载文件。
开始WebREPL成功
接下来使用WebREPL客户端连接开发板
- 打开http://micropython.org/webrepl/
并修改地址为上一步控制台输出的地址,我这里是ws://192.168.2.19:8266
改为ESP8266开发板ip地址
2.点击连接后,输入刚刚设定的密码,输入密码时不会有任何回显,输入完毕直接回车,一切正常的情况即会连接成功。
连接成功
- 现在已经可以通过WebREPL客户端对ESP8266进行操作,主窗口中输入python代码进行实时调试,右侧有文件上传与下载功能,上传功能与MicroPython File Uploader一样,下载功能可以直接下载ESP8266开发板中存在的文件。
输入
查看文件名import os;os.listdir();
,查看当前开发板中的文件名称
将文件名输入到右侧的Get a file输入框中,点击Get from device按钮,即可将开发板中的文件下载到本地
下载webrepl_cfg.py文件
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()
再也不用把开发板跟电脑相连啦!
网友评论