iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
0
自我挑戰組

Micropython x ESP H/W 之三十個錦囊妙計系列 第 28

[錦囊-貳拾捌] MicroPython x ESP 設定之一鍵佈署

  • 分享至 

  • xImage
  •  

筆者在前幾篇文章曾經提過, 如果使用好的硬體燒錄工具 就不需要在每個行為做熱插拔後再進行.

前置作業
0. 購買ESP LINK v1.0 (ESP8266 WIFI模組下載器)
https://ithelp.ithome.com.tw/upload/images/20181207/20103824eXOkxBtymY.png
[秘訣] 這款新的ESP Linker 可以同時做到燒錄/ 傳輸跟即時除錯的部分, 所以可以設計燒錄-設定-執行程式 (一氣呵成)

  1. 修改燒錄的腳本, 將**read -p ... **全部移除
    https://ithelp.ithome.com.tw/upload/images/20181112/20103824Xw506lvpQa.png
  2. 抓取每個裝置的MAC address後轉成英文字母大寫並且使用標籤記錄在檔案中
    https://ithelp.ithome.com.tw/upload/images/20181112/20103824rqZRKDzSAG.png
  3. 檢查抓取及設定標籤的紀錄檔
root@ctt:/opt/micropython/bin# cat t_macaddr 
S1: 68:C6:3A:DA:FC:78
S2: 84:F3:EB:11:11:3A
S3: 68:C6:3A:DA:DE:42

[秘訣]
(1) 經過自訂義的標籤名稱加上各裝置的 MAC address 記錄下來後有利於未來做自動化使用
(2) 細節請參考筆者的Gist
4. 這樣燒錄的動作就可以做到一鍵完成

[實作] 一鍵部署之 ESP 裝置上的Micropython 設定 (以自動設定webrepl Server為例)

  1. 搜尋及安裝pyexpect 模組
>>> pip3 search pexpect
pexpect (4.6.0)        - Pexpect allows easy control of interactive
                         console applications
>>> pip3 install pexpect

[秘訣] Expect 腳本語言是常被應用在開發各種互動式Shell中的自動化, 筆者發現這個好用的腳本語言也存在python的第三方呼叫模組

  1. 確認pexpect 安裝成功及可以被使用
>>> ipython3
In [1]: import pexpect
In [2]: 
  1. 撰寫pexpect前必須先手動驗證操作流程是否正確
    (1) 使用picocom 連入ESP裝置
    (2) 下達Enter 兩次
    (3) 匯入webrepl_setup 模組
    (4) 輸入E設定密碼
    (5) 輸入自訂密碼 , 再次輸入自訂密碼
    (6) 輸入y 以重新啟動 ESP裝置
    (7) 輸入組合鍵 Ctrl-A, Ctrl-X 離開Picocom
    https://ithelp.ithome.com.tw/upload/images/20181112/20103824RFFFPAvyWB.png
    [秘訣] 每個手動步驟都有是否執行成功的判斷條件, 而細節將在下面的腳本中直接說明
  2. 使用spawn讓picocom 可以在子程序中執行
>>> esp = pexpect.spawn('picocom /dev/ttyUSB0 -b 115200')
  1. 建立發送模組 (發送前先檢查是否已經 ready)
def sendto(cmd):
    while True:
        if esp.waitnoecho() == true:
            esp.sendline("{0}\r".format(cmd))
            break
        else:
            time.sleep(1)
  1. 依序撰寫需要的部分
* Press Enter key once
sendto('\r') 
* 搜尋>>> 是否存在
index = esp.expect('>>>') 
if index == 0:
    sendto("import webrepl_setup")
if esp.expect('[Empty]') == 0:
    sendto("E")
if esp.expect('[New password (4-9 chars):]') == 0:
    sendto("password")
    sendto("password")
if esp.expect('[Woule you like to reboot now? (y/n)]') == 0:
    sendto("y")
    time.sleep(1)
if esp.waitnocho() == True:
    if esp.exp('[>>>]') == 0:
        esp.send('\x01')   # Ctrl-A
        esp.send('\x18')   # Ctrl-X

[秘訣] pexpect檢查符合字串的部分有兩種寫法

  • 部分符合: '[您想要查找的內容]'
  • 完全符合: '完整的內容'
  1. 這樣就完成一份pexpect 寫出來的互動式腳本

[秘訣]
(1) pexpect 完整的說明請參考 pexpect man page
(2) 完整程式碼請參考: one-click


上一篇
[錦囊-貳拾柒] MicroPython webhook 拆雷之旅 + Line notify 實作
下一篇
[錦囊-貳拾玖] 可視化訊號實作 (以ThinkSpeak為例)
系列文
Micropython x ESP H/W 之三十個錦囊妙計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言