2024年9月21日 星期六

MicroPython v1.23.0 出現 no module named 'ussl' 問題

昨晚用 Witty Cloud (ESP8266) 開發板重新測試 xtools 的 Line Notify 函式 line_msg() 時出現 "no module named 'ussl'" 的錯誤訊息 : 

>>> import config    
>>> import xtools      
>>> message='這是 MicroPython 開發板送出的訊息'     
>>> token=config.LINE_NOTIFY_TOKEN    
>>> xtools.line_msg(token, message)       
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "xtools.py", line 99, in line_msg
  File "xrequests.py", line 1, in <module>
ImportError: no module named 'ussl'    

奇怪, 我在 2022 年用 v1.19.1 版韌體測試 xtools 模組時 line_msg() 沒問題啊! 於是找了另一顆之前燒錄 v1.18 韌體的 Witty Cloud 改燒錄 v1.19 測試呼叫 line_msg() 正常, 因此確認是 v1.23 韌體的問題. 

檢視 xrequests 模組, 發現是其中的 request() 函式會用到 ussl 模組, 只要是用到 https 協定就會用到 ussl 模組 : 

def request(method, url, data=None, json=None, headers={}, stream=None):
    try:
        proto, dummy, host, path = url.split("/", 3)
    except ValueError:
        proto, dummy, host = url.split("/", 2)
        path = ""
    if proto == "http:":
        port = 80
    elif proto == "https:":
        import ussl   
        port = 443
    else:
        raise ValueError("Unsupported protocol: " + proto)

查詢谷歌找到下面這篇, 看來是 v1.23 版韌體編譯時不再納入 ussl 模組 : 


作者的作法是下載原始碼自行加入 ussl 後重新編譯. 我回頭查看 v1.23 版的更新日誌 :


裡面有提到 v1.23 版加入一個新的安全連接模組 tls, 這是 ssl 的進化版, 言下之意是 ussl 已經被 tls 模組取代而移除了 : 

"Similarly the new tls module is an evolution of the ssl module, whereby all the existing functionality in ssl has been moved to the tls module. This is done because MicroPython's SSL interface is becoming increasingly different to CPython's and moving this SSL/TLS functionality to a new tls module gives it room to grow and obtain new features that are useful for embedded applications."

我將開發板韌體燒回 v1.19 版或 v.1.22 版再測試 line_msg() 就可正常發出 Line 訊息, 所以在 ussl 問題解決之前, 如果要使用 xtools 模組必須使用 v1.23 之前的韌體. 

參考 :


沒有留言 :