| ESP32 教學 | MicroPython | MQTT Publish 發佈訊息到 Mosquitto Broker | 303 |

MQTT 是在物聯網很常見的通訊協定,micropython 內也有個輕量化的 MQTT Client 模組可以來 pubish 發佈訊息或 subscribe 訂閱主題,這篇將介紹 umqtt.simple 模組的用法,並將 DHT11 感測器的溫濕度資料透過 MQTT協定, Publish 上傳到私有 MQTT Broker。

Tip: 如果對於 MQTT 通訊協定或架設個人 MQTT Broker 不太瞭解的朋友,建議可以參考 JIMI哥寫的這 2 篇:

  1. MQTT 通訊協定與安裝 Mosquitto MQTT Broker 到 Windows 
  2. Mosquitto conf 設定與 MQTT 測試

1. umqtt.simple 模組 – MQTT Publish

umqtt.simple 這個模組已經內建在 micropython 內,所以可以直接匯入使用(有興趣瞭解細節的朋友可以到 micropython umqtt Github: https://github.com/micropython/micropython-lib/tree/master/umqtt.simple),下面是一個 MQTT publish 的範例:

from umqtt.simple import MQTTClient

#mq_server = '172.20.10.2'
#mq_id = 'esp00001' 
#mq_user='james01'
#mq_pass='0101xx'
mqClient0 = MQTTClient(mq_id, mq_server, user=mq_user, password=mq_pass)
mqClient0.connect()

#mq_topic= b'temp'
#mq_message='25'
mqClient0.publish(mq_topic, mq_message)

一開始由 umqtt.simple 匯入 MQTTClient 類別,要建立 MQTTClient 的物件,要先準備好 4 個參數,client_id、mqtt server ip、登入帳號與密碼,除了 client_id 以外的參數應該都很好理解,client_id 就是根據 mqtt 的通訊協定:每個連上Broker 裝置都需要有個獨特的識別碼,同一時間內只允許一個獨特的 ID 連上線。至於要怎麼命名或得到?因為我們此次是要連上自己所架設的 MQTT Broker,id 只要確認與其他裝置的不要重複即可,如果裝置真的很多,可以考慮使用 ESP32 出廠時的硬體 ID 作為區別也可。

MQTTClient 物件連線的方法就是 .connect(),這邊提醒一下,在連線 Broker 前,記得要先透過 wifi 連上 Internet 取得 IP,才不會發生網路錯誤!(😅)。待連線成功後,要發佈訊息則用 .publish (topic,message) 方法,這邊的 topic 需要是 bytes 型別,message 則用一般字串即可。

2.定時上傳溫濕度資訊到 MQTT Broker

此次實驗目標就來使用先前提到的 DHT11感測器,將溫濕度資訊透過 MQTT 通訊協定,上傳到 mosquitto MQTT Broker,並使用 MQTT Client 軟體確認上傳內容。

>> 電路連接

關於電路連接的細節可以直接參考 402 DHT11溫濕度感測器,關鍵的資料腳位使用 ESP32 的 GPIO14,完整線路連接如下:

>> 完整程式碼

from umqtt.simple import MQTTClient
import machine,dht,utime,time,network

mq_server = '192.168.1.120'
mq_id = 'esp00001' 
mq_topic = b'room_status'
mq_user='james01'
mq_pass='0101xx'

d11=dht.DHT11(machine.Pin(14))      # GPIO14 as the DHT11 dataline
wifi= network.WLAN(network.STA_IF)
wifi.active(True)

try:
    wifi.connect('tp_station','xxoo8899')
    print('start to connect wifi')
    for i in range(20):
        print('try to connect wifi in {}s'.format(i))
        utime.sleep(1)
        if wifi.isconnected():
            break          
    if wifi.isconnected():
        print('WiFi connection OK!')
        print('Network Config=',wifi.ifconfig())
    else:
        print('WiFi connection Error')      
    mqClient0 = MQTTClient(mq_id, mq_server, user=mq_user, password=mq_pass)
    mqClient0.connect()
    i=0
    while True:
        d11.measure()
        mq_message='temp{},humid{}'.format(d11.temperature(),d11.humidity())
        mqClient0.publish(mq_topic, mq_message)
        time.sleep(2)
        i=i+1
        print("message publish {}".format(i))
except Exception as e: print(e)

>> 程式解說

from umqtt.simple import MQTTClient
import machine,dht,utime,time,network

mq_server = '192.168.1.120'
mq_id = 'esp00001' 
mq_topic = b'room_status'
mq_user='james01'
mq_pass='0101xx'

d11=dht.DHT11(machine.Pin(14))      # GPIO14 as the DHT11 dataline
wifi= network.WLAN(network.STA_IF)
wifi.active(True)

程式一開始先匯入必要的模組,machine、dht、time、network、MQTTClient,設定 MQTT 連線所需要的各項參數,DHT11 是採用 GPIO14 為資料腳位,最後啟動 wifi 模組功能。

try:
    wifi.connect('tp_station','xxoo8899')
    print('start to connect wifi')
    for i in range(20):
        print('try to connect wifi in {}s'.format(i))
        utime.sleep(1)
        if wifi.isconnected():
            break          
    if wifi.isconnected():
        print('WiFi connection OK!')
        print('Network Config=',wifi.ifconfig())
    else:
        print('WiFi connection Error')  

這段程式碼開始進行 Wifi 連線,利用簡單的 delay 功能(for 迴圈)建立 20 秒左右的連線 TIMEOUT 機制,一旦連線成功,顯示目前的網路狀態,若連線失敗的話,顯示 Wifi 連線異常。

mqClient0 = MQTTClient(mq_id, mq_server, user=mq_user, password=mq_pass)
    mqClient0.connect()
    i=0
    while True:
        d11.measure()
        mq_message='temp{},humid{}'.format(d11.temperature(),d11.humidity())
        mqClient0.publish(mq_topic, mq_message)
        time.sleep(2)
        i=i+1
        print("message publish {}".format(i))
except Exception as e: print(e)

一旦網路順利連上後,建立 MQTTClient 物件,並連線到指定 MQTT Server,這邊的變數 i 是用於累計發佈次數統計。在 while 迴圈內,透過 d11.measure() 方法取得 DHT11的溫濕度值,並放到 mq_message 字串,mqclient0.publish 將 topic+ message 訊息串發佈到 MQTT Broker。time.sleep(2) 延遲兩秒為 DHT11 Datasheet 指定,確保每次都能穩定的更新溫濕度值。 最後將訊息發佈的次數紀錄與顯示,作為標記參考使用。

>> 補充說明

各位在測試上面的 Code 時,不要忘記啟動 Mosquitto MQTT Broker (不然會連線不上😂),至於要怎麼測試是否程式運作 OK? 此時就可以使用 MQTT Client 軟體就可以了,例如使用 MQTT Explorer 連上指定的 Broker後,除了可以觀察最新的主題訊息外,還可以瞭解每個訊息的時間差,驗證ESP32的程式內容。

mqtt publish

3. 總結

這篇主要分享如何使用 MicroPython umqtt.simple 這個輕量化的 MQTT Client模組,並連上自行架設的 Broker 發佈 DHT11 溫濕度資訊,各位朋友可以在熟悉操作後,將此程式模組修改,進而發佈到一些開源的物聯網平台做後端資料收集,滿足不同的開發應用。下一篇會來講講如果要將訊息上傳到 Thingspeak,程式需修改的部分,後續還請大家繼續關注囉!

 今天的內容就到這邊,如果各位有遇到什麼問題,也歡迎在下面留言或寫信與我討論囉~

↓↓↓↓↓↓賣場連結↓↓↓↓↓↓

歡迎大家有需要的話,可以多多支持一下我們的蝦皮賣場喔! 😀 

吉米家官方店-創客機器人材料專賣 https://shopee.tw/jimirobot.tw

Follow JIMI哥 Twitter : https://twitter.com/jimirobot  <–得到最新文章通知

發佈留言

Close Menu