[精讚] [會員登入]
759

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

若是要多點對多點傳輸資料,那使用 MQTT 即可快速的達成我們所需的目的

分享此文連結 //n.sfs.tw/15718

分享連結 【Arduino/LinkIt 7697】實作小小的 MQTT Publish & Subscribe@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2023-01-11 21:10:44 最後編修
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 系統的文章程式碼都一堆。

END

你可能感興趣的文章

【C++】一些好用的C++小功能 —— 貳 承襲上一篇的C++小功能,筆記下來以免自己以後忘記了。

【無料版模】﹝CSS&HTML﹞製作epub電子書版模免費下載&附使用教學 一個專門用來製作epub的簡單CSS檔案,基本上已經可以做出一本還不錯的電子書,讓妳的電子書不在只有預設的字體、樣式

【Wicket】[URI]使用Java取得目前網址 這是個還滿常用的功能,可惜 Wicket 沒有內建函式可以快速取得我們要的部分,只能依靠我們自己後期的字串剖析

【MEGAcmd】[Linux] 如何解決Unable to connect to service: error=2 用了好久的軟體突然停止一切的運作了。

【Maven】如何創建一個簡單可執行的JAR檔 滿重要的一個小功能,畢竟有時候是要傳遞的是JAR檔,而不是直接透過Maven直接部屬之類的

【Wicket】[Cookie]如何讀取和設定客戶端的Cookie 對於某些參數需要給予使用者,我們可以使用 Cookie 來讓客戶端記著,之後再跟伺服器裡的比對來達到驗證的目的

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

高捷少女:地下城的探險少女⑤ 小穹寫好後,耐耐看了一遍。「我想我應該辦得到。」她說完跪坐在地上,然後把古箏安放在大腿上,並將樂譜放在前面的地板。「要開始囉。」耐耐閉上眼睛,深呼吸一口氣,小穹等人在一旁看著她,心中暗自替她打氣。

高捷少女:地下城的探險少女(終)  小穹眨眨眼睛,然後說了出來。「其實,從剛剛開始,我就在想了……是在看過這本日記之後。」她拿出日記。「我想……我們尋找寶藏的想法,是不是真的正確的?」「怎麼說呢?」耐耐好奇地問。「這個埋藏寶藏的人,在

高捷少女:美麗島的守護者② 這是在亦晨離開前的下午拍的,當時亦晨在美麗島跟小穹艾米等人在美麗島散步,為離開前補充一些回憶,這時剛好經過的小雅被艾米抓過來,做為同樣是高捷新人的她倆一同拍了一張紀念照。說起來她跟亦晨並不太熟,不過也

高捷少女:耐耐的新年驚喜② 「各位,我跟爸媽聊完了……」耐耐走進客廳,看到大家在看自己的相簿,臉蛋立刻紅了。「哇啊啊,不要看那個!」她三步併作兩步地走向少女們,將相簿拿走。「為什麼啊?小時候的耐耐很可愛啊。」婕兒不解地說。

【日翻中歌詞】ピースサイン(Peace Sign) 那一天從我們的頭頂 輕掠而過的那架飛機 有點不可思議 還記得 為何呢?毫無意義