2024年9月21日 星期六

MicroPython 學習筆記 : ESP8266/ESP32 網路存取測試 (五)

在陳會安老師寫的 "超簡單 Python/MicroPython 物聯網應用" 這本書中提供了一個非常好用的 xtools 模組, 呼叫裡面的 line_msg() 即可傳送 Line Notify 訊息. 但是 line_msg() 只能傳送文字訊息, 無法傳送貼圖與圖片. 

今天參考之前在 PC 上傳送 Line 貼圖的函式, 改寫為可在 MicroPython on ESP8266/ESP32 上執行的函式 line_sticker(), 參考 :

#  Python 學習筆記 : Line Notify 訊息推播 (二) : 貼圖

from xrequests import post 

def line_sticker(token, message, stickerPackageId, stickerId):    
    url="https://notify-api.line.me/api/notify"   
    headers={"Authorization": "Bearer " + token}     
    payload={"message": message,      
             "stickerPackageId" : stickerPackageId,      
             "stickerId": stickerId}   
    r=post(url, headers=headers, params=payload)   
    if r is not None and r.status_code == 200:    
        return "The sticker has been sent."      
    else:     
        return "Error! Failed to send the sticker."

其中 post() 是 xrequests 模組的函式, 須在前面匯入此函式. 注意, 此處要使用可傳參數的 xrequests 模組而非 MicroPython 內建的 urequests 模組, 因為它無法傳遞參數. 

傳送圖片的函式 line_image() 則是參考下面這篇改寫 :


同樣也是要先匯入 xrequests.post() 函式 : 

from xrequests import post 

def line_image(token, message, image):    
    url="https://notify-api.line.me/api/notify"
    headers={"Authorization": "Bearer " + token}
    payload={"message": message, 
             "imageFile" : open(image, 'rb')}    
    r=post(url, headers=headers, params=payload)
    if r is not None and r.status_code == 200:    
        return "The image has been sent."      
    else:     
        return "Error! Failed to send the image."
 
我把上面兩個函式添加到 xtools.py 模組中後測試可送出貼圖 :  

>>> import xtools    
>>> import config  
>>> ip=xtools.connect_wifi_led(config.SSID, config.PASSWORD)  
network config: ('192.168.192.86', '255.255.255.0', '192.168.192.92', '192.168.192.92')  
>>> token=config.LINE_NOTIFY_TOKEN   
>>> message='test'    
>>> xtools.line_sticker(token, message, 1, 4)      
'The sticker has been sent.'
>>> xtools.line_sticker(token, message, 1, 3)   
'The sticker has been sent.'
>>> xtools.line_sticker(token, message, 1, 13)    
'The sticker has been sent.'

結果如下 :




接下來測試傳送圖片, 我先將一張 16KB 大小的圖片 kitten.jpg 上傳到開發板根目錄下  




然後將之前在 PC 上測試的函式修改為如下的 MicroPython 版函式 line_image(), 參考 :


from xrequests import post

def line_image(token, message, image):    
    url="https://notify-api.line.me/api/notify"
    headers={"Authorization": "Bearer " + token}
    payload={"message": message, 
             "imageFile" : open(image, 'rb')}    
    r=post(url, headers=headers, params=payload)
    if r is not None and r.status_code == 200:    
        return "The image has been sent."      
    else:     
        return "Error! Failed to send the image."

此處同樣是要用到 xrequests.post() 送出 POST 請求. 將其添加到 xtools.py 中測試, 結果只有訊息有傳, 圖片沒傳, 而且很常當機須重啟 (不論是 ESP8266/ESP32 皆如此)  :




不知是不是 4MB 記憶體太小所致 (溢位造成重新啟動)? 等有 16MB 的 ESP32 時再來測試, line_image() 就暫且還是放在 xtools.py 裡面吧! 我已更新 GitHub 上的 xtools.py 檔案與 lib.zip : 


沒有留言:

張貼留言