MQTT 是在物聯網很常見的通訊協定,micropython 內也有個輕量化的 MQTT Client 模組可以來 pubish 發佈訊息或 subscribe 訂閱主題,這篇將介紹 umqtt.simple 模組的用法,並將 DHT11 感測器的溫濕度資料透過 MQTT協定, Publish 上傳到私有 MQTT Broker。
Tip: 如果對於 MQTT 通訊協定或架設個人 MQTT Broker 不太瞭解的朋友,建議可以參考 JIMI哥寫的這 2 篇:
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的程式內容。
3. 總結
這篇主要分享如何使用 MicroPython umqtt.simple 這個輕量化的 MQTT Client模組,並連上自行架設的 Broker 發佈 DHT11 溫濕度資訊,各位朋友可以在熟悉操作後,將此程式模組修改,進而發佈到一些開源的物聯網平台做後端資料收集,滿足不同的開發應用。下一篇會來講講如果要將訊息上傳到 Thingspeak,程式需修改的部分,後續還請大家繼續關注囉!
今天的內容就到這邊,如果各位有遇到什麼問題,也歡迎在下面留言或寫信與我討論囉~
↓↓↓↓↓↓賣場連結↓↓↓↓↓↓
歡迎大家有需要的話,可以多多支持一下我們的蝦皮賣場喔! 😀
吉米家官方店-創客機器人材料專賣 https://shopee.tw/jimirobot.tw
Follow JIMI哥 Twitter : https://twitter.com/jimirobot <–得到最新文章通知