[精讚] [會員登入]
658

【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

你可能感興趣的文章

【SeaChest & Synology】512e(Advanced Format / AF) 轉換至 4Kn 好不容易入手了一顆硬碟,但是卻無法使用,除了賣掉還有更好的方法嗎?

【Wickct】(縮短網址) 如何將網頁掛載到特定路徑下 Wildfly的預設網址又臭又長又不好記,而且會被看到後端的目錄路徑安排,當然能藏就盡量藏起來啦

【Wicket】[Header]如何讀取來自客戶端地檔頭和傳送自訂擋頭至客戶端 當需要設定檔頭或是讀取來自客戶端的檔頭時,這些程式碼就很好用

【JAVA】[java.lang.Class]如何不透過new來實體化class 在某些極端狀態下,我們沒有辦法直接將實體化後的 Object 傳入函數內,只能採用傳入 Class 在實體化成物件這種極端的方式來進行

【Linux】[CentOS 8]如何更新sudo指令 上次會想要更新sudo這個指令的時間應該是2017年了吧?轉眼間就2021了耶

【C++】使用SFML創建新視窗和新增圖標(ICON)並隱藏DOS 筆記,怕自己以後忘記怎麼創建並開啓一個新視窗

我有話要說

>>

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

訪客留言

[無留言]

隨機好文

高捷少女:地下城的探險少女③ 過了十分鐘後,前方的天花板滴下一滴水珠,發出「噠」一聲響亮地落在石地上,讓大家嚇一跳。     「什麼嘛,只是水珠而已。」艾米撫著胸口噓了一聲。     忽然間,耐耐的臉色發白起來。「各位,你們看

高捷少女:耐耐的新年驚喜① 耐耐拿出手機。「我回來囉。」她說。幾分鐘後,木門緩緩打開。當它完全開啟的那一刻,小穹手中的包包掉到地上;艾米揉揉雙眼,確定自己看見的景象;婕兒的三魂七魄飛到了九霄雲外。

【歌評】蓮台野夜行 - 幻視之夜 ~ Ghostly Eyes 若有什麼是在聽到boss曲前的鋪襯,那一定就是每個系列的道中曲

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

【日翻中歌詞】LOSER 一如往常的孤身一人 早就已經被折磨殆盡 明明就已經無處可去 卻作著白日夢 晚安 無論何時都是這個樣子 對懵懂夜晚早感到噁心