【Arduino/LinkIt 7697】實作小小的 MQTT Publish & Subscribe

URL Link //n.sfs.tw/15718

2022-03-30 19:31:26 By 過路君子

大家好,這裡是又發現新大陸的小編過路君子

真的運氣很好,同個關卡會掉兩種素材,機率各 50%,結果一直掉另一個小編不需要的素材......

 

 

當我們今天有一百個感測器且有一百個接收站,但是每個接收站所要接收的資料又各異,有什麼方式能讓我們快速達成任務呢?

那我們能簡單想出的方法大概是:http 或是 udp 吧。但是這時就變成要我們主動地去處理收發的問題,有點麻煩。

當只有一個工程師這樣想的時候,他會自己寫一個;當有三位工程師這樣想的時候,就會變出了一個套件,而這就是我們今天的主題 —— MQTT 協定。

 

那我們照慣例,在開始之前先付上小編所使用的設備、軟體規格。

小編在這裡是使用 LinkIt 7697,事實上程式碼跟 Arduino 一模一樣,基本上可以直接移植,只有接線不同而已。

但如果不是使用麵包版,是使用 Grove 模組的話,那基本上......一模一樣。

軟體名稱 版本或發行商
MQTT.fx 1.7.1
LinkIt 7697 聯發科技
USB Driver CP210x
Arduino IDE 1.8.19
PubSubClient 2.6.0

 

 

Step.1 安裝 PubSubClient

因為我們在使用 MQTT 的時候會使用到第三方函式庫 PubSubClient,而該函式庫從 2.7.0 開始有使用到非標準的 C 函式庫,又由於 LinkIt 7697 實在過於老舊,所以最高只能使用到 2.6.0。

所以我們先來安裝 PubSubClient 吧!

(所有圖片點擊都可以放大、變高清)

唯一要注意的就只有不要選到 2.6.0 以後的版本就好了,這邊快速帶過。

看到上圖就代表安裝好了,可以關閉這個畫面了。

更新的按鈕雖然很誘人,但是我們不能按,各位忍住誘惑啊!

 

 

Step2. 安裝 MQTT.fx

那既然是 MQTT 就一定會有 broker、publisher 和 subscriber 這三個角色,而我們今天只會實作 publisher 和 subscriber。

所以 broker 的部分我們會使用第三方公開的,那既然是第三方的,請各位實作的時候千萬別太頻繁的送出 publish,約莫一秒一次 publish 即可,否則會被當成 DDoS 攻擊而封鎖無法使用。

請各位從下方選取或使用自己習慣的第三方 broker 網址來用吧,埠都是 1883。

1. broker.emqx.io
2. test.mosquitto.org
3. broker.hivemq.com

小編會以使用 test.mosquitto.org 來做示範,因為下方的程式碼也是使用這個網站,這樣就不需要再另外做更改。

 

選好了嗎?那因為我們還需要一個監控畫面來查看我們的 LinkIt 7697 是否有成功將訊息 publish 出去。

那小編在這裡使用的軟體是 MQTT.fx 1.7.1,所以我們先來下載並安裝一下。

下載點:https://www.jensd.de/wordpress/?p=2746

然後因為小編是使用 Window 10 的,所以選倒數第二個來下載。

下載好了之後,點擊該執行檔並依照指示一直按 Next 即可。

 

 

Step3. 將溫度濕度模組接到LinkIt 7697上

因為原作者在程式碼中是將溫濕度感測器接在 D3,那小編也懶得去改,所以直接沿用。

 

 

Step4. 寫入程式並燒錄到LinkIt 7697內

相關的程式碼小編式直接找別人現成的程式碼來用,那原出處在這:ghliaw / NPTU-Shore-Course-MQTT-NodeRED

下載下來會是一個壓縮檔,直接解壓縮即可,解壓縮完畢之後點進去應該可以發現一個「01_MQTT_DHT11」的資料夾。

再點進去,就可以看到我們要的檔案躺在裡面了喔~

 

基本上程式碼可以被我們拿來直接使用,我們只需要小小的修改幾處地方即可。

刪除 #include<SPI.h> 和  #include <WiFiNINA.h>,並替換成 #include <LWiFi.h>。

 

將 DHTTYPE 後面接的值換成我們溫濕度模組的型號,Github上的預設是 DHT11,那因為小編手上拿到的是 DHT22,所以小編在這邊改成 DHT22。

至於各位是否要更改就請自行確認手上的溫濕度模組是否是 DHT11 囉。

 

原作者是跟他自己的 WiFi 機做連線,所以使用的當然是他的 WiFi 登入密碼。

所以我們要換成我們自己本身的 WiFI 名稱(ssid)和密碼(password)。

 

對於 broker 來說,client_id 是唯一的,當今天有第二個相同 ID 的使用者連線進來時,broker 會自動踢掉先加入的那位,留下後加入的那位。

那畢竟此程式碼是公開的,所以如果不修改有可能會被不知名的人士踢掉,所以我們修改一下,值無所謂,只要不跟其他人重複即可。

 

這邊也是怕有人跟我們同時使用此程式碼,造成我們的資料相互汙染,所以將最前面的「ghliaw」改成隨便的一個字串即可。

至此,程式碼準備工作結束,可以直接燒錄了。

 

 

Step5. 設定 MQTT.fx

進入設定介面。

MQTT.fx 有提供產生隨機 ID 的功能,那我們就給他產生一下,千萬別用預設值,要不不知道什麼時候就會被不明人士踢掉。

當我們將這一切都準備好之後,就可以讓 MQTT.fx 正式的跟公開公用的 broker 來取得連線。

接下來就是要來 Subscribe 主題了。

剛剛在更改程式碼的時候,有一部分是要將「ghliaw」改成我們自己喜歡的字串,那這邊的 xxx 也是。

 

 

Step 6. 啟動 LinkIt 7697 的 MQTT 服務

只要將序列埠監控視窗打開即可。

從 WiFi 連線上到感應器送出第一條訊息的這段時間,大約十秒,所以如果接下來沒訊息並不是出錯,給他一點時間。

實際收到訊息的效果如上圖,其中的 temp 就是溫度,而 hum 則是濕度,各位可以比較看看是否跟序列埠監控視窗上的數值一致呢。

 

 

Step 7. 使用 MQTT 控制 LinkIt 7697 上的 LED

此程式碼的作者並非僅有提供單向的傳輸,也提供了讓 LinkIt 7697 去 Subscribe 某一主題,並針對該主題去執行相對應的動作。

各位有沒有發現原本是熄滅的內建 LED 燈泡亮起來了呢?原作者提供了三種操作方式:

0 1 2
關閉 LED 燈 開啟 LED 燈 使 LED 燈閃爍

 

除此之外也可以偷偷回去看一眼序列埠監控視窗喔。

 

 

至此,全部結束!

原作者寫的這個小小的範例基本上就包含了所有 MQTT Client 的行為,只要稍稍修改,便可以拿來玩出很多花樣。

例如:裝一個接著馬達的 LinkIt 7697 在電燈開關旁邊,使用 MQTT Publish 指令出去讓他自動敲擊電燈開關,這樣晚上躺在床上要關燈時就方便很多了。

 

 

 

後記

寫 Windows 系統的文章圖片都一堆,寫 Linux 系統的文章程式碼都一堆。