本篇新增軟件
WebREPL在線版http://micropython.org/webrepl/
下載地址:https://codeload.github.com/micropython/webrepl/zip/master
在MicroPython on ESP8266的開發(fā)過程中,做的最多的事情就是上傳文件冰寻,MicroPython File Uploader 雖然很好用,但是有兩個缺點:
- 必須將ESP8266開發(fā)板與電腦連接
- 如果開發(fā)板中運行的程序未結束炫七,例如定義了死循環(huán)用來監(jiān)聽信號時,文件的上傳有可能會失敗惶我。
上傳失敗自不必說,而必須與電腦連接就制約了我們開發(fā)的靈活性,想像一下:我們用8266做了一個通過手機控制的接線板控制器,封裝后安裝進接線板中际插,然后有一天想要給它增加一個定時開關功能碘耳,只需要簡單更新幾句代碼并沒有新增硬件設施的前提下,如果使用MicroPython File Uploader框弛,需要從接線板中拆除后再連接電腦進行更新辛辨,這無疑會影響體驗。ESP8266的官方SDK是支持云升級功能的瑟枫,即可以通過遠程燒寫固件的方式對開發(fā)板進行固件更新斗搞,那MicroPython是否能實現類似的功能呢?今天的主角WebREPL為此而生慷妙。
WebREPL客戶端是MicroPython官方推薦的更新方式僻焚,功能很強大,通過網頁的方式讀取ESP8266的文件系統(tǒng)膝擂,可以上傳文件或者下載開發(fā)板中已存在的文件虑啤,可以輸入指令并實時查看開發(fā)板中的輸出狀態(tài),完全取代串口調試架馋。
WebREPL客戶端的兩種使用方式在本篇開頭已經寫明狞山,選擇任意一種均可以連接開發(fā)板。
WebREPL客戶端必須與ESP8266開發(fā)板在同一局域網下叉寂,否則無法正常連接
WebREPL在固件中默認是不啟動的萍启,所以在使用之前,需要先將服務打開。
- 在輸入框輸入
import webrepl_setup
-
看到當前WebREPL自動啟動狀態(tài)是未開啟的
- 輸入
E
開啟上電時自動啟動WebREPL功能
-
要開啟WebREPL必須先設定密碼勘纯,密碼為4-9個字符
-
連續(xù)輸入兩次密碼后局服,確認Web_REPL開啟成功,重啟開發(fā)板
到這一步屡律,按照我的預期腌逢,WebREPL服務應該已經是開啟狀態(tài),而我們可以使用WebREPL客戶端來進行連接了超埋,實際情況卻是此時如果使用客戶端進行連接搏讶,將會始終連接失敗,所以還需要有第6步霍殴。
- 輸入
import webrepl;webrepl.start();
-
成功開啟WebREPL服務媒惕,此時即可通過WebREPL客戶端來進行遠程連接ESP8266開發(fā)板,并上傳或下載文件来庭。
接下來使用WebREPL客戶端連接開發(fā)板
- 打開http://micropython.org/webrepl/
并修改地址為上一步控制臺輸出的地址妒蔚,我這里是ws://192.168.2.19:8266
2.點擊連接后,輸入剛剛設定的密碼月弛,輸入密碼時不會有任何回顯肴盏,輸入完畢直接回車,一切正常的情況即會連接成功帽衙。
- 現在已經可以通過WebREPL客戶端對ESP8266進行操作菜皂,主窗口中輸入python代碼進行實時調試,右側有文件上傳與下載功能厉萝,上傳功能與MicroPython File Uploader一樣恍飘,下載功能可以直接下載ESP8266開發(fā)板中存在的文件。
輸入
import os;os.listdir();
谴垫,查看當前開發(fā)板中的文件名稱
將文件名輸入到右側的Get a file輸入框中章母,點擊Get from device按鈕,即可將開發(fā)板中的文件下載到本地
4.webrepl_cfg.py文件中存放著我們之前設定的WebREPL密碼翩剪,明文的?乳怎!?
到此,使用WebREPL遠程更新ESP8266開發(fā)板已經完成前弯,不過雖然前面設置了在開發(fā)板啟動時自動開啟WebREPL服務的功能舞肆,實驗證明,在開發(fā)板斷電重啟后博杖,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()
再也不用把開發(fā)板跟電腦相連啦!